X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/7f203aa1fde2bc9ec43aa05a939525cdab149832..ad8a47b89fc3c5a3302255f318b1ed805838cf72:/src/w32term.c diff --git a/src/w32term.c b/src/w32term.c index 617492e189..ba336b5c65 100644 --- a/src/w32term.c +++ b/src/w32term.c @@ -84,9 +84,6 @@ static int last_mousemove_y = 0; static int any_help_event_p; -/* Last window where we saw the mouse. Used by mouse-autoselect-window. */ -static Lisp_Object last_window; - extern unsigned int msh_mousewheel; extern void free_frame_menubar (struct frame *); @@ -102,13 +99,6 @@ extern Cursor w32_load_cursor (LPCTSTR name); struct w32_display_info one_w32_display_info; struct w32_display_info *x_display_list; -/* This is a list of cons cells, each of the form (NAME . FONT-LIST-CACHE), - one for each element of w32_display_list and in the same order. - NAME is the name of the frame. - FONT-LIST-CACHE records previous values returned by x-list-fonts. */ -Lisp_Object w32_display_name_list; - - #if _WIN32_WINNT < 0x0500 && !defined(_W64) /* Pre Windows 2000, this was not available, but define it here so that Emacs compiled on such a platform will run on newer versions. @@ -143,14 +133,23 @@ BOOL (WINAPI *pfnSetLayeredWindowAttributes) (HWND, COLORREF, BYTE, DWORD); #define WS_EX_LAYERED 0x80000 #endif -/* This is a frame waiting to be autoraised, within w32_read_socket. */ -struct frame *pending_autoraise_frame; +/* SM_CXVIRTUALSCREEN and SM_CYVIRTUALSCREEN are not defined on 95 and + NT4. */ +#ifndef SM_CXVIRTUALSCREEN +#define SM_CXVIRTUALSCREEN 78 +#endif +#ifndef SM_CYVIRTUALSCREEN +#define SM_CYVIRTUALSCREEN 79 +#endif /* The handle of the frame that currently owns the system caret. */ HWND w32_system_caret_hwnd; int w32_system_caret_height; int w32_system_caret_x; int w32_system_caret_y; +struct window *w32_system_caret_window; +int w32_system_caret_hdr_height; +int w32_system_caret_mode_height; DWORD dwWindowsThreadId = 0; HANDLE hWindowsThread = NULL; DWORD dwMainThreadId = 0; @@ -165,31 +164,6 @@ int last_scroll_bar_drag_pos; /* Keyboard code page - may be changed by language-change events. */ int w32_keyboard_codepage; -/* Mouse movement. */ - -/* Where the mouse was last time we reported a mouse event. */ -static RECT last_mouse_glyph; -static FRAME_PTR last_mouse_glyph_frame; - -/* The scroll bar in which the last motion event occurred. - - If the last motion event occurred in a scroll bar, we set this - so w32_mouse_position can know whether to report a scroll bar motion or - an ordinary motion. - - If the last motion event didn't occur in a scroll bar, we set this - to Qnil, to tell w32_mouse_position to return an ordinary motion event. */ -static Lisp_Object last_mouse_scroll_bar; -static int last_mouse_scroll_bar_pos; - -/* This is a hack. We would really prefer that w32_mouse_position would - return the time associated with the position it returns, but there - doesn't seem to be any way to wrest the time-stamp from the server - along with the position query. So, we just keep track of the time - of the last movement we received, and return that in hopes that - it's somewhat accurate. */ -static Time last_mouse_movement_time; - /* Incremented by w32_read_socket whenever it really tries to read events. */ static int volatile input_signal_count; @@ -198,7 +172,6 @@ static int volatile input_signal_count; int w32_message_fd = -1; #endif /* CYGWIN */ -static void x_update_window_end (struct window *, int, int); static void w32_handle_tool_bar_click (struct frame *, struct input_event *); static void w32_define_cursor (Window, Cursor); @@ -207,14 +180,12 @@ void x_lower_frame (struct frame *); void x_scroll_bar_clear (struct frame *); void x_wm_set_size_hint (struct frame *, long, bool); void x_raise_frame (struct frame *); -void x_set_window_size (struct frame *, int, int, int); +void x_set_window_size (struct frame *, int, int, int, bool); void x_wm_set_window_state (struct frame *, int); void x_wm_set_icon_pixmap (struct frame *, int); static void w32_initialize (void); static void x_update_end (struct frame *); static void w32_frame_up_to_date (struct frame *); -static void w32_set_terminal_modes (struct terminal *); -static void w32_reset_terminal_modes (struct terminal *); static void x_clear_frame (struct frame *); static void frame_highlight (struct frame *); static void frame_unhighlight (struct frame *); @@ -229,7 +200,8 @@ static void x_frame_rehighlight (struct w32_display_info *); static void x_draw_hollow_cursor (struct window *, struct glyph_row *); static void x_draw_bar_cursor (struct window *, struct glyph_row *, int, enum text_cursor_kinds); -static void w32_clip_to_row (struct window *, struct glyph_row *, int, HDC); +static void w32_clip_to_row (struct window *, struct glyph_row *, + enum glyph_row_area, HDC); static BOOL my_show_window (struct frame *, HWND, int); static void my_set_window_pos (HWND, HWND, int, int, int, int, UINT); #if 0 @@ -237,7 +209,7 @@ static void my_set_focus (struct frame *, HWND); #endif static void my_set_foreground_window (HWND); static void my_destroy_window (struct frame *, HWND); -static void w32fullscreen_hook (FRAME_PTR); +static void w32fullscreen_hook (struct frame *); #ifdef GLYPH_DEBUG static void x_check_font (struct frame *, struct font *); @@ -438,7 +410,7 @@ w32_draw_rectangle (HDC hdc, XGCValues *gc, int x, int y, /* Draw a filled rectangle at the specified position. */ void -w32_fill_rect (FRAME_PTR f, HDC hdc, COLORREF pix, RECT *lprect) +w32_fill_rect (struct frame *f, HDC hdc, COLORREF pix, RECT *lprect) { HBRUSH hb; @@ -448,7 +420,7 @@ w32_fill_rect (FRAME_PTR f, HDC hdc, COLORREF pix, RECT *lprect) } void -w32_clear_window (FRAME_PTR f) +w32_clear_window (struct frame *f) { RECT rect; HDC hdc = get_frame_dc (f); @@ -470,7 +442,7 @@ w32_clear_window (FRAME_PTR f) void x_set_frame_alpha (struct frame *f) { - struct w32_display_info *dpyinfo = FRAME_W32_DISPLAY_INFO (f); + struct w32_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); double alpha = 1.0; double alpha_min = 1.0; BYTE opac; @@ -516,18 +488,24 @@ x_set_frame_alpha (struct frame *f) int x_display_pixel_height (struct w32_display_info *dpyinfo) { - HDC dc = GetDC (NULL); - int pixels = GetDeviceCaps (dc, VERTRES); - ReleaseDC (NULL, dc); + int pixels = GetSystemMetrics (SM_CYVIRTUALSCREEN); + + if (pixels == 0) + /* Fallback for Windows 95 or NT 4.0. */ + pixels = GetSystemMetrics (SM_CYSCREEN); + return pixels; } int x_display_pixel_width (struct w32_display_info *dpyinfo) { - HDC dc = GetDC (NULL); - int pixels = GetDeviceCaps (dc, HORZRES); - ReleaseDC (NULL, dc); + int pixels = GetSystemMetrics (SM_CXVIRTUALSCREEN); + + if (pixels == 0) + /* Fallback for Windows 95 or NT 4.0. */ + pixels = GetSystemMetrics (SM_CXSCREEN); + return pixels; } @@ -544,7 +522,7 @@ x_display_pixel_width (struct w32_display_info *dpyinfo) static void x_update_begin (struct frame *f) { - struct w32_display_info *display_info = FRAME_W32_DISPLAY_INFO (f); + struct w32_display_info *display_info = FRAME_DISPLAY_INFO (f); if (! FRAME_W32_P (f)) return; @@ -559,9 +537,7 @@ x_update_begin (struct frame *f) } -/* Start update of window W. Set the global variable updated_window - to the window being updated and set output_cursor to the cursor - position of W. */ +/* Start update of window W. */ static void x_update_window_begin (struct window *w) @@ -575,8 +551,7 @@ x_update_window_begin (struct window *w) SendMessage (w32_system_caret_hwnd, WM_EMACS_HIDE_CARET, 0, 0); } - updated_window = w; - set_output_cursor (&w->cursor); + w->output_cursor = w->cursor; block_input (); @@ -646,7 +621,33 @@ w32_draw_vertical_window_border (struct window *w, int x, int y0, int y1) } -/* End update of window W (which is equal to updated_window). +/* Draw a window divider from (x0, y0) to (x1, y1) */ + +static void +w32_draw_window_divider (struct window *w, int x0, int x1, int y0, int y1) +{ + struct frame *f = XFRAME (WINDOW_FRAME (w)); + RECT r; + HDC hdc; + struct face *face; + + r.left = x0; + r.right = x1; + r.top = y0; + r.bottom = y1; + + hdc = get_frame_dc (f); + face = FACE_FROM_ID (f, WINDOW_DIVIDER_FACE_ID); + if (face) + w32_fill_rect (f, hdc, face->foreground, &r); + else + w32_fill_rect (f, hdc, FRAME_FOREGROUND_PIXEL (f), &r); + + release_frame_dc (f, hdc); +} + + +/* End update of window W. Draw vertical borders between horizontally adjacent windows, and display W's cursor if CURSOR_ON_P is non-zero. @@ -660,22 +661,25 @@ w32_draw_vertical_window_border (struct window *w, int x, int y0, int y1) here. */ static void -x_update_window_end (struct window *w, int cursor_on_p, - int mouse_face_overwritten_p) +x_update_window_end (struct window *w, bool cursor_on_p, + bool mouse_face_overwritten_p) { - Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (XFRAME (w->frame)); - if (!w->pseudo_window_p) { block_input (); if (cursor_on_p) - display_and_set_cursor (w, 1, output_cursor.hpos, - output_cursor.vpos, - output_cursor.x, output_cursor.y); + display_and_set_cursor (w, 1, + w->output_cursor.hpos, w->output_cursor.vpos, + w->output_cursor.x, w->output_cursor.y); if (draw_window_fringes (w, 1)) - x_draw_vertical_border (w); + { + if (WINDOW_RIGHT_DIVIDER_WIDTH (w)) + x_draw_right_divider (w); + else + x_draw_vertical_border (w); + } unblock_input (); } @@ -684,6 +688,8 @@ x_update_window_end (struct window *w, int cursor_on_p, XTframe_up_to_date to redisplay the mouse highlight. */ if (mouse_face_overwritten_p) { + Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (XFRAME (w->frame)); + hlinfo->mouse_face_beg_row = hlinfo->mouse_face_beg_col = -1; hlinfo->mouse_face_end_row = hlinfo->mouse_face_end_col = -1; hlinfo->mouse_face_window = Qnil; @@ -696,8 +702,6 @@ x_update_window_end (struct window *w, int cursor_on_p, { SendMessage (w32_system_caret_hwnd, WM_EMACS_SHOW_CARET, 0, 0); } - - updated_window = NULL; } @@ -715,9 +719,8 @@ x_update_end (struct frame *f) } -/* This function is called from various places in xdisp.c whenever a - complete update has been performed. The global variable - updated_window is not available here. */ +/* This function is called from various places in xdisp.c + whenever a complete update has been performed. */ static void w32_frame_up_to_date (struct frame *f) @@ -729,15 +732,13 @@ w32_frame_up_to_date (struct frame *f) /* Draw truncation mark bitmaps, continuation mark bitmaps, overlay arrow bitmaps, or clear the fringes if no bitmaps are required - before DESIRED_ROW is made current. The window being updated is - found in updated_window. This function is called from + before DESIRED_ROW is made current. This function is called from update_window_line only if it is known that there are differences between bitmaps to be drawn between current row and DESIRED_ROW. */ static void -x_after_update_window_line (struct glyph_row *desired_row) +x_after_update_window_line (struct window *w, struct glyph_row *desired_row) { - struct window *w = updated_window; struct frame *f; int width, height; @@ -748,7 +749,7 @@ x_after_update_window_line (struct glyph_row *desired_row) /* When a window has disappeared, make sure that no rest of full-width rows stays visible in the internal border. Could - check here if updated_window is the leftmost/rightmost window, + check here if updated window is the leftmost/rightmost window, but I guess it's not worth doing since vertically split windows are almost never used, internal border is rarely set, and the overhead is very small. */ @@ -807,8 +808,7 @@ w32_draw_fringe_bitmap (struct window *w, struct glyph_row *row, if (sb_width > 0) { int bar_area_x = WINDOW_SCROLL_BAR_AREA_X (w); - int bar_area_width = (WINDOW_CONFIG_SCROLL_BAR_COLS (w) - * FRAME_COLUMN_WIDTH (f)); + int bar_area_width = WINDOW_CONFIG_SCROLL_BAR_WIDTH (w); if (bx < 0) { @@ -845,7 +845,7 @@ w32_draw_fringe_bitmap (struct window *w, struct glyph_row *row, } /* Must clip because of partially visible lines. */ - w32_clip_to_row (w, row, -1, hdc); + w32_clip_to_row (w, row, ANY_AREA, hdc); if (p->which && p->which < max_fringe_bmp) { @@ -930,28 +930,6 @@ w32_destroy_fringe_bitmap (int which) fringe_bmp[which] = 0; } - - -/* This is called when starting Emacs and when restarting after - suspend. When starting Emacs, no window is mapped. And nothing - must be done to Emacs's own window if it is suspended (though that - rarely happens). */ - -static void -w32_set_terminal_modes (struct terminal *term) -{ -} - -/* This is called when exiting or suspending Emacs. Exiting will make - the W32 windows go away, and suspending requires no action. */ - -static void -w32_reset_terminal_modes (struct terminal *term) -{ -} - - - /*********************************************************************** Display Iterator ***********************************************************************/ @@ -1026,14 +1004,14 @@ x_set_cursor_gc (struct glyph_string *s) xgcv.font = s->font; mask = GCForeground | GCBackground | GCFont; - if (FRAME_W32_DISPLAY_INFO (s->f)->scratch_cursor_gc) - XChangeGC (NULL, FRAME_W32_DISPLAY_INFO (s->f)->scratch_cursor_gc, + if (FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc) + XChangeGC (NULL, FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc, mask, &xgcv); else - FRAME_W32_DISPLAY_INFO (s->f)->scratch_cursor_gc + FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc = XCreateGC (NULL, s->window, mask, &xgcv); - s->gc = FRAME_W32_DISPLAY_INFO (s->f)->scratch_cursor_gc; + s->gc = FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc; } } @@ -1075,14 +1053,14 @@ x_set_mouse_face_gc (struct glyph_string *s) xgcv.font = s->font; mask = GCForeground | GCBackground | GCFont; - if (FRAME_W32_DISPLAY_INFO (s->f)->scratch_cursor_gc) - XChangeGC (NULL, FRAME_W32_DISPLAY_INFO (s->f)->scratch_cursor_gc, + if (FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc) + XChangeGC (NULL, FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc, mask, &xgcv); else - FRAME_W32_DISPLAY_INFO (s->f)->scratch_cursor_gc + FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc = XCreateGC (NULL, s->window, mask, &xgcv); - s->gc = FRAME_W32_DISPLAY_INFO (s->f)->scratch_cursor_gc; + s->gc = FRAME_DISPLAY_INFO (s->f)->scratch_cursor_gc; } eassert (s->gc != 0); @@ -1646,7 +1624,7 @@ w32_setup_relief_color (struct frame *f, struct relief *relief, double factor, unsigned long mask = GCForeground; COLORREF pixel; COLORREF background = di->relief_background; - struct w32_display_info *dpyinfo = FRAME_W32_DISPLAY_INFO (f); + struct w32_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); /* TODO: Free colors (if using palette)? */ @@ -1654,10 +1632,7 @@ w32_setup_relief_color (struct frame *f, struct relief *relief, double factor, xgcv.foreground = default_pixel; pixel = background; if (w32_alloc_lighter_color (f, &pixel, factor, delta)) - { - relief->allocated_p = 1; - xgcv.foreground = relief->pixel = pixel; - } + xgcv.foreground = relief->pixel = pixel; if (relief->gc == 0) { @@ -2342,7 +2317,7 @@ x_draw_stretch_glyph_string (struct glyph_string *s) static void x_draw_glyph_string (struct glyph_string *s) { - int relief_drawn_p = 0; + bool relief_drawn_p = 0; /* If S draws into the background of its successor, draw the background of the successor first so that S can draw into it. @@ -2647,11 +2622,7 @@ x_clear_frame (struct frame *f) /* Clearing the frame will erase any cursor, so mark them all as no longer visible. */ mark_window_cursors_off (XWINDOW (FRAME_ROOT_WINDOW (f))); - output_cursor.hpos = output_cursor.vpos = 0; - output_cursor.x = -1; - /* We don't set the output cursor here because there will always - follow an explicit cursor_to. */ block_input (); w32_clear_window (f); @@ -2689,19 +2660,6 @@ w32_ring_bell (struct frame *f) unblock_input (); } - -/* Specify how many text lines, from the top of the window, - should be affected by insert-lines and delete-lines operations. - This, and those operations, are used only within an update - that is bounded by calls to x_update_begin and x_update_end. */ - -static void -w32_set_terminal_window (struct frame *f, int n) -{ - /* This function intentionally left blank. */ -} - - /*********************************************************************** Line Dance ***********************************************************************/ @@ -2732,7 +2690,7 @@ x_scroll_run (struct window *w, struct run *run) /* Get frame-relative bounding box of the text display area of W, without mode lines. Include in this box the left and right fringes of W. */ - window_box (w, -1, &x, &y, &width, &height); + window_box (w, ANY_AREA, &x, &y, &width, &height); /* If the fringe is adjacent to the left (right) scroll bar of a leftmost (rightmost, respectively) window, then extend its @@ -2747,8 +2705,7 @@ x_scroll_run (struct window *w, struct run *run) if (sb_width > 0) { int bar_area_x = WINDOW_SCROLL_BAR_AREA_X (w); - int bar_area_width = (WINDOW_CONFIG_SCROLL_BAR_COLS (w) - * FRAME_COLUMN_WIDTH (f)); + int bar_area_width = WINDOW_CONFIG_SCROLL_BAR_WIDTH (w); if (bar_area_x + bar_area_width == x) { @@ -2788,7 +2745,6 @@ x_scroll_run (struct window *w, struct run *run) block_input (); /* Cursor off. Will be switched on again in x_update_window_end. */ - updated_window = w; x_clear_cursor (w); { @@ -2864,9 +2820,9 @@ x_new_focus_frame (struct w32_display_info *dpyinfo, struct frame *frame) x_lower_frame (old_focus); if (dpyinfo->w32_focus_frame && dpyinfo->w32_focus_frame->auto_raise) - pending_autoraise_frame = dpyinfo->w32_focus_frame; + dpyinfo->w32_pending_autoraise_frame = dpyinfo->w32_focus_frame; else - pending_autoraise_frame = 0; + dpyinfo->w32_pending_autoraise_frame = NULL; } x_frame_rehighlight (dpyinfo); @@ -2894,9 +2850,15 @@ x_focus_changed (int type, int state, struct w32_display_info *dpyinfo, && CONSP (Vframe_list) && !NILP (XCDR (Vframe_list))) { - bufp->kind = FOCUS_IN_EVENT; - XSETFRAME (bufp->frame_or_window, frame); + bufp->arg = Qt; + } + else + { + bufp->arg = Qnil; } + + bufp->kind = FOCUS_IN_EVENT; + XSETFRAME (bufp->frame_or_window, frame); } frame->output_data.x->focus_state |= state; @@ -2911,7 +2873,10 @@ x_focus_changed (int type, int state, struct w32_display_info *dpyinfo, { dpyinfo->w32_focus_event_frame = 0; x_new_focus_frame (dpyinfo, 0); - } + + bufp->kind = FOCUS_OUT_EVENT; + XSETFRAME (bufp->frame_or_window, frame); + } /* TODO: IME focus? */ } @@ -2962,7 +2927,7 @@ w32_frame_rehighlight (struct frame *frame) { if (! FRAME_W32_P (frame)) return; - x_frame_rehighlight (FRAME_W32_DISPLAY_INFO (frame)); + x_frame_rehighlight (FRAME_DISPLAY_INFO (frame)); } static void @@ -3339,47 +3304,47 @@ queue_notifications (struct input_event *event, W32Msg *msg, struct frame *f, the mainstream emacs code by setting mouse_moved. If not, ask for another motion event, so we can check again the next time it moves. */ -static MSG last_mouse_motion_event; -static Lisp_Object last_mouse_motion_frame; - static int -note_mouse_movement (FRAME_PTR frame, MSG *msg) +note_mouse_movement (struct frame *frame, MSG *msg) { + struct w32_display_info *dpyinfo; int mouse_x = LOWORD (msg->lParam); int mouse_y = HIWORD (msg->lParam); - - last_mouse_movement_time = msg->time; - memcpy (&last_mouse_motion_event, msg, sizeof (last_mouse_motion_event)); - XSETFRAME (last_mouse_motion_frame, frame); + RECT *r; if (!FRAME_X_OUTPUT (frame)) return 0; + dpyinfo = FRAME_DISPLAY_INFO (frame); + dpyinfo->last_mouse_movement_time = msg->time; + dpyinfo->last_mouse_motion_frame = frame; + dpyinfo->last_mouse_motion_x = mouse_x; + dpyinfo->last_mouse_motion_y = mouse_y; + if (msg->hwnd != FRAME_W32_WINDOW (frame)) { frame->mouse_moved = 1; - last_mouse_scroll_bar = Qnil; + dpyinfo->last_mouse_scroll_bar = NULL; note_mouse_highlight (frame, -1, -1); - last_mouse_glyph_frame = 0; + dpyinfo->last_mouse_glyph_frame = NULL; return 1; } /* Has the mouse moved off the glyph it was on at the last sighting? */ - if (frame != last_mouse_glyph_frame - || mouse_x < last_mouse_glyph.left - || mouse_x >= last_mouse_glyph.right - || mouse_y < last_mouse_glyph.top - || mouse_y >= last_mouse_glyph.bottom) + r = &dpyinfo->last_mouse_glyph; + if (frame != dpyinfo->last_mouse_glyph_frame + || mouse_x < r->left || mouse_x >= r->right + || mouse_y < r->top || mouse_y >= r->bottom) { frame->mouse_moved = 1; - last_mouse_scroll_bar = Qnil; + dpyinfo->last_mouse_scroll_bar = NULL; note_mouse_highlight (frame, mouse_x, mouse_y); /* Remember the mouse position here, as w32_mouse_position only gets called when mouse tracking is enabled but we also need to keep track of the mouse for help_echo and highlighting at other times. */ - remember_mouse_glyph (frame, mouse_x, mouse_y, &last_mouse_glyph); - last_mouse_glyph_frame = frame; + remember_mouse_glyph (frame, mouse_x, mouse_y, r); + dpyinfo->last_mouse_glyph_frame = frame; return 1; } @@ -3392,22 +3357,12 @@ note_mouse_movement (FRAME_PTR frame, MSG *msg) ************************************************************************/ static struct scroll_bar *x_window_to_scroll_bar (Window); -static void x_scroll_bar_report_motion (FRAME_PTR *, Lisp_Object *, +static void x_scroll_bar_report_motion (struct frame **, Lisp_Object *, enum scroll_bar_part *, Lisp_Object *, Lisp_Object *, unsigned long *); static void x_check_fullscreen (struct frame *); -static void -redo_mouse_highlight (void) -{ - if (!NILP (last_mouse_motion_frame) - && FRAME_LIVE_P (XFRAME (last_mouse_motion_frame))) - note_mouse_highlight (XFRAME (last_mouse_motion_frame), - LOWORD (last_mouse_motion_event.lParam), - HIWORD (last_mouse_motion_event.lParam)); -} - static void w32_define_cursor (Window window, Cursor cursor) { @@ -3434,15 +3389,16 @@ w32_define_cursor (Window window, Cursor cursor) movement. */ static void -w32_mouse_position (FRAME_PTR *fp, int insist, Lisp_Object *bar_window, +w32_mouse_position (struct frame **fp, int insist, Lisp_Object *bar_window, enum scroll_bar_part *part, Lisp_Object *x, Lisp_Object *y, unsigned long *time) { - FRAME_PTR f1; + struct frame *f1; + struct w32_display_info *dpyinfo = FRAME_DISPLAY_INFO (*fp); block_input (); - if (! NILP (last_mouse_scroll_bar) && insist == 0) + if (dpyinfo->last_mouse_scroll_bar && insist == 0) x_scroll_bar_report_motion (fp, bar_window, part, x, y, time); else { @@ -3454,26 +3410,18 @@ w32_mouse_position (FRAME_PTR *fp, int insist, Lisp_Object *bar_window, FOR_EACH_FRAME (tail, frame) XFRAME (frame)->mouse_moved = 0; - last_mouse_scroll_bar = Qnil; + dpyinfo->last_mouse_scroll_bar = NULL; GetCursorPos (&pt); /* Now we have a position on the root; find the innermost window containing the pointer. */ { - if (FRAME_W32_DISPLAY_INFO (*fp)->grabbed && last_mouse_frame - && FRAME_LIVE_P (last_mouse_frame)) - { - /* If mouse was grabbed on a frame, give coords for that frame - even if the mouse is now outside it. */ - f1 = last_mouse_frame; - } - else - { - /* Is window under mouse one of our frames? */ - f1 = x_any_window_to_frame (FRAME_W32_DISPLAY_INFO (*fp), - WindowFromPoint (pt)); - } + /* If mouse was grabbed on a frame, give coords for that + frame even if the mouse is now outside it. Otherwise + check for window under mouse on one of our frames. */ + f1 = (x_mouse_grabbed (dpyinfo) ? dpyinfo->last_mouse_frame + : x_any_window_to_frame (dpyinfo, WindowFromPoint (pt))); /* If not, is it one of our scroll bars? */ if (! f1) @@ -3500,16 +3448,17 @@ w32_mouse_position (FRAME_PTR *fp, int insist, Lisp_Object *bar_window, on it, i.e. into the same rectangles that matrices on the frame are divided into. */ + dpyinfo = FRAME_DISPLAY_INFO (f1); ScreenToClient (FRAME_W32_WINDOW (f1), &pt); - remember_mouse_glyph (f1, pt.x, pt.y, &last_mouse_glyph); - last_mouse_glyph_frame = f1; + remember_mouse_glyph (f1, pt.x, pt.y, &dpyinfo->last_mouse_glyph); + dpyinfo->last_mouse_glyph_frame = f1; *bar_window = Qnil; *part = 0; *fp = f1; XSETINT (*x, pt.x); XSETINT (*y, pt.y); - *time = last_mouse_movement_time; + *time = dpyinfo->last_mouse_movement_time; } } } @@ -3669,7 +3618,7 @@ my_create_scrollbar (struct frame * f, struct scroll_bar * bar) /*#define ATTACH_THREADS*/ static BOOL -my_show_window (FRAME_PTR f, HWND hwnd, int how) +my_show_window (struct frame *f, HWND hwnd, int how) { #ifndef ATTACH_THREADS return SendMessage (FRAME_W32_WINDOW (f), WM_EMACS_SHOWWINDOW, @@ -3738,7 +3687,7 @@ x_scroll_bar_create (struct window *w, int top, int left, int width, int height) HWND hwnd; SCROLLINFO si; struct scroll_bar *bar - = XSCROLL_BAR (Fmake_vector (make_number (VECSIZE (struct scroll_bar)), Qnil)); + = ALLOCATE_PSEUDOVECTOR (struct scroll_bar, fringe_extended_p, PVEC_OTHER); Lisp_Object barobj; block_input (); @@ -3751,7 +3700,7 @@ x_scroll_bar_create (struct window *w, int top, int left, int width, int height) XSETINT (bar->start, 0); XSETINT (bar->end, 0); bar->dragging = Qnil; - bar->fringe_extended_p = Qnil; + bar->fringe_extended_p = 0; /* Requires geometry to be set before call to create the real window */ @@ -3789,7 +3738,7 @@ x_scroll_bar_create (struct window *w, int top, int left, int width, int height) static void x_scroll_bar_remove (struct scroll_bar *bar) { - FRAME_PTR f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window))); + struct frame *f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window))); block_input (); @@ -3815,12 +3764,12 @@ w32_set_vertical_scroll_bar (struct window *w, struct scroll_bar *bar; int top, height, left, sb_left, width, sb_width; int window_y, window_height; - int fringe_extended_p; + bool fringe_extended_p; /* Get window dimensions. */ - window_box (w, -1, 0, &window_y, 0, &window_height); + window_box (w, ANY_AREA, 0, &window_y, 0, &window_height); top = window_y; - width = WINDOW_CONFIG_SCROLL_BAR_COLS (w) * FRAME_COLUMN_WIDTH (f); + width = WINDOW_CONFIG_SCROLL_BAR_WIDTH (w); height = window_height; /* Compute the left edge of the scroll bar area. */ @@ -3839,16 +3788,7 @@ w32_set_vertical_scroll_bar (struct window *w, else sb_left = left + (WINDOW_LEFTMOST_P (w) ? 0 : width - sb_width); - if (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (w)) - fringe_extended_p = (WINDOW_LEFTMOST_P (w) - && WINDOW_LEFT_FRINGE_WIDTH (w) - && (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w) - || WINDOW_LEFT_MARGIN_COLS (w) == 0)); - else - fringe_extended_p = (WINDOW_RIGHTMOST_P (w) - && WINDOW_RIGHT_FRINGE_WIDTH (w) - && (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w) - || WINDOW_RIGHT_MARGIN_COLS (w) == 0)); + fringe_extended_p = WINDOW_FRINGE_EXTENDED_P (w); /* Does the scroll bar exist yet? */ if (NILP (w->vertical_scroll_bar)) @@ -3877,11 +3817,11 @@ w32_set_vertical_scroll_bar (struct window *w, hwnd = SCROLL_BAR_W32_WINDOW (bar); /* If already correctly positioned, do nothing. */ - if ( XINT (bar->left) == sb_left - && XINT (bar->top) == top - && XINT (bar->width) == sb_width - && XINT (bar->height) == height - && !NILP (bar->fringe_extended_p) == fringe_extended_p ) + if (XINT (bar->left) == sb_left + && XINT (bar->top) == top + && XINT (bar->width) == sb_width + && XINT (bar->height) == height + && bar->fringe_extended_p == fringe_extended_p) { /* Redraw after clear_frame. */ if (!my_show_window (f, hwnd, SW_NORMAL)) @@ -3907,8 +3847,7 @@ w32_set_vertical_scroll_bar (struct window *w, /* Make sure scroll bar is "visible" before moving, to ensure the area of the parent window now exposed will be refreshed. */ my_show_window (f, hwnd, SW_HIDE); - MoveWindow (hwnd, sb_left + VERTICAL_SCROLL_BAR_WIDTH_TRIM, - top, sb_width - VERTICAL_SCROLL_BAR_WIDTH_TRIM * 2, + MoveWindow (hwnd, sb_left, top, sb_width, max (height, 1), TRUE); si.cbSize = sizeof (si); @@ -3931,7 +3870,7 @@ w32_set_vertical_scroll_bar (struct window *w, unblock_input (); } } - bar->fringe_extended_p = fringe_extended_p ? Qt : Qnil; + bar->fringe_extended_p = fringe_extended_p; w32_set_scroll_bar_thumb (bar, portion, position, whole); XSETVECTOR (barobj, bar); @@ -3952,7 +3891,7 @@ w32_set_vertical_scroll_bar (struct window *w, `*redeem_scroll_bar_hook' is applied to its window before the judgment. */ static void -w32_condemn_scroll_bars (FRAME_PTR frame) +w32_condemn_scroll_bars (struct frame *frame) { /* Transfer all the scroll bars to FRAME_CONDEMNED_SCROLL_BARS. */ while (! NILP (FRAME_SCROLL_BARS (frame))) @@ -4020,7 +3959,7 @@ w32_redeem_scroll_bar (struct window *window) last call to `*condemn_scroll_bars_hook'. */ static void -w32_judge_scroll_bars (FRAME_PTR f) +w32_judge_scroll_bars (struct frame *f) { Lisp_Object bar, next; @@ -4078,9 +4017,7 @@ w32_scroll_bar_handle_click (struct scroll_bar *bar, W32Msg *msg, y = si.nPos; bar->dragging = Qnil; - - - last_mouse_scroll_bar_pos = msg->msg.wParam; + FRAME_DISPLAY_INFO (f)->last_mouse_scroll_bar_pos = msg->msg.wParam; switch (LOWORD (msg->msg.wParam)) { @@ -4158,14 +4095,15 @@ w32_scroll_bar_handle_click (struct scroll_bar *bar, W32Msg *msg, on the scroll bar. */ static void -x_scroll_bar_report_motion (FRAME_PTR *fp, Lisp_Object *bar_window, +x_scroll_bar_report_motion (struct frame **fp, Lisp_Object *bar_window, enum scroll_bar_part *part, Lisp_Object *x, Lisp_Object *y, unsigned long *time) { - struct scroll_bar *bar = XSCROLL_BAR (last_mouse_scroll_bar); + struct w32_display_info *dpyinfo = FRAME_DISPLAY_INFO (*fp); + struct scroll_bar *bar = dpyinfo->last_mouse_scroll_bar; Window w = SCROLL_BAR_W32_WINDOW (bar); - FRAME_PTR f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window))); + struct frame *f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window))); int pos; int top_range = VERTICAL_SCROLL_BAR_TOP_RANGE (f, XINT (bar->height)); SCROLLINFO si; @@ -4182,13 +4120,13 @@ x_scroll_bar_report_motion (FRAME_PTR *fp, Lisp_Object *bar_window, pos = si.nPos; top_range = si.nMax - si.nPage + 1; - switch (LOWORD (last_mouse_scroll_bar_pos)) + switch (LOWORD (dpyinfo->last_mouse_scroll_bar_pos)) { case SB_THUMBPOSITION: case SB_THUMBTRACK: *part = scroll_bar_handle; if (VERTICAL_SCROLL_BAR_TOP_RANGE (f, XINT (bar->height)) <= 0xffff) - pos = HIWORD (last_mouse_scroll_bar_pos); + pos = HIWORD (dpyinfo->last_mouse_scroll_bar_pos); break; case SB_LINEDOWN: *part = scroll_bar_handle; @@ -4203,9 +4141,9 @@ x_scroll_bar_report_motion (FRAME_PTR *fp, Lisp_Object *bar_window, XSETINT (*y, top_range); f->mouse_moved = 0; - last_mouse_scroll_bar = Qnil; + dpyinfo->last_mouse_scroll_bar = NULL; - *time = last_mouse_movement_time; + *time = dpyinfo->last_mouse_movement_time; unblock_input (); } @@ -4217,7 +4155,7 @@ x_scroll_bar_report_motion (FRAME_PTR *fp, Lisp_Object *bar_window, redraw them. */ void -x_scroll_bar_clear (FRAME_PTR f) +x_scroll_bar_clear (struct frame *f) { Lisp_Object bar; @@ -4286,7 +4224,6 @@ w32_read_socket (struct terminal *terminal, struct frame *f; struct w32_display_info *dpyinfo = &one_w32_display_info; Mouse_HLInfo *hlinfo = &dpyinfo->mouse_highlight; - static char buf[1]; block_input (); @@ -4333,8 +4270,9 @@ w32_read_socket (struct terminal *terminal, SET_FRAME_VISIBLE (f, 1); SET_FRAME_ICONIFIED (f, 0); SET_FRAME_GARBAGED (f); - DebPrint (("frame %p (%s) reexposed by WM_PAINT\n", f, - SDATA (f->name))); + if (!f->output_data.w32->asked_for_visible) + DebPrint (("frame %p (%s) reexposed by WM_PAINT\n", f, + SDATA (f->name))); /* WM_PAINT serves as MapNotify as well, so report visibility changes properly. */ @@ -4523,11 +4461,8 @@ w32_read_socket (struct terminal *terminal, previous_help_echo_string = help_echo_string; help_echo_string = Qnil; - if (dpyinfo->grabbed && last_mouse_frame - && FRAME_LIVE_P (last_mouse_frame)) - f = last_mouse_frame; - else - f = x_window_to_frame (dpyinfo, msg.msg.hwnd); + f = (x_mouse_grabbed (dpyinfo) ? dpyinfo->last_mouse_frame + : x_window_to_frame (dpyinfo, msg.msg.hwnd)); if (hlinfo->mouse_face_hidden) { @@ -4540,18 +4475,16 @@ w32_read_socket (struct terminal *terminal, /* Generate SELECT_WINDOW_EVENTs when needed. */ if (!NILP (Vmouse_autoselect_window)) { - Lisp_Object window; - int x = LOWORD (msg.msg.lParam); - int y = HIWORD (msg.msg.lParam); - - window = window_from_coordinates (f, x, y, 0, 0); + static Lisp_Object last_mouse_window; + Lisp_Object window = window_from_coordinates + (f, LOWORD (msg.msg.lParam), HIWORD (msg.msg.lParam), 0, 0); /* Window will be selected only when it is not selected now and last mouse movement event was not in it. Minibuffer window will be selected only when it is active. */ if (WINDOWP (window) - && !EQ (window, last_window) + && !EQ (window, last_mouse_window) && !EQ (window, selected_window) /* For click-to-focus window managers create event iff we don't leave the @@ -4563,8 +4496,8 @@ w32_read_socket (struct terminal *terminal, inev.kind = SELECT_WINDOW_EVENT; inev.frame_or_window = window; } - - last_window = window; + /* Remember the last window where we saw the mouse. */ + last_mouse_window = window; } if (!note_mouse_movement (f, &msg.msg)) help_echo_string = previous_help_echo_string; @@ -4601,15 +4534,12 @@ w32_read_socket (struct terminal *terminal, { /* If we decide we want to generate an event to be seen by the rest of Emacs, we put it here. */ - int tool_bar_p = 0; + bool tool_bar_p = 0; int button; int up; - if (dpyinfo->grabbed && last_mouse_frame - && FRAME_LIVE_P (last_mouse_frame)) - f = last_mouse_frame; - else - f = x_window_to_frame (dpyinfo, msg.msg.hwnd); + f = (x_mouse_grabbed (dpyinfo) ? dpyinfo->last_mouse_frame + : x_window_to_frame (dpyinfo, msg.msg.hwnd)); if (f) { @@ -4648,7 +4578,7 @@ w32_read_socket (struct terminal *terminal, else { dpyinfo->grabbed |= (1 << button); - last_mouse_frame = f; + dpyinfo->last_mouse_frame = f; /* Ignore any mouse motion that happened before this event; any subsequent mouse-movement Emacs events should reflect only motion after @@ -4665,11 +4595,8 @@ w32_read_socket (struct terminal *terminal, case WM_MOUSEWHEEL: case WM_MOUSEHWHEEL: { - if (dpyinfo->grabbed && last_mouse_frame - && FRAME_LIVE_P (last_mouse_frame)) - f = last_mouse_frame; - else - f = x_window_to_frame (dpyinfo, msg.msg.hwnd); + f = (x_mouse_grabbed (dpyinfo) ? dpyinfo->last_mouse_frame + : x_window_to_frame (dpyinfo, msg.msg.hwnd)); if (f) { @@ -4686,7 +4613,7 @@ w32_read_socket (struct terminal *terminal, ButtonPress. */ f->mouse_moved = 0; } - last_mouse_frame = f; + dpyinfo->last_mouse_frame = f; last_tool_bar_item = -1; } break; @@ -4733,13 +4660,7 @@ w32_read_socket (struct terminal *terminal, f = x_window_to_frame (dpyinfo, msg.msg.hwnd); if (f && !FRAME_ICONIFIED_P (f)) - { - int x, y; - - x_real_positions (f, &x, &y); - f->left_pos = x; - f->top_pos = y; - } + x_real_positions (f, &f->left_pos, &f->top_pos); check_visibility = 1; break; @@ -4751,7 +4672,7 @@ w32_read_socket (struct terminal *terminal, if (!msg.msg.wParam && msg.msg.hwnd == tip_window) { tip_window = NULL; - redo_mouse_highlight (); + x_redo_mouse_highlight (dpyinfo); } /* If window has been obscured or exposed by another window @@ -4788,7 +4709,6 @@ w32_read_socket (struct terminal *terminal, break; case SIZE_MAXIMIZED: - case SIZE_RESTORED: { bool iconified = FRAME_ICONIFIED_P (f); @@ -4822,6 +4742,51 @@ w32_read_socket (struct terminal *terminal, in case this is the second frame. */ record_asynch_buffer_change (); } + + if (EQ (get_frame_param (f, Qfullscreen), Qnil)) + set_frame_param (f, Qfullscreen, Qmaximized); + else if (! EQ (get_frame_param (f, Qfullscreen), Qmaximized)) + set_frame_param (f, Qmaximized, Qmaximized); + + break; + + case SIZE_RESTORED: + { + bool iconified = FRAME_ICONIFIED_P (f); + + if (iconified) + SET_FRAME_VISIBLE (f, 1); + SET_FRAME_ICONIFIED (f, 0); + + /* wait_reading_process_output will notice this + and update the frame's display structures. */ + SET_FRAME_GARBAGED (f); + + if (iconified) + { + /* Reset top and left positions of the Window + here since Windows sends a WM_MOVE message + BEFORE telling us the Window is minimized + when the Window is iconified, with 3000,3000 + as the co-ords. */ + x_real_positions (f, &f->left_pos, &f->top_pos); + + inev.kind = DEICONIFY_EVENT; + XSETFRAME (inev.frame_or_window, f); + } + else if (! NILP (Vframe_list) + && ! NILP (XCDR (Vframe_list))) + /* Force a redisplay sooner or later + to update the frame titles + in case this is the second frame. */ + record_asynch_buffer_change (); + } + + if (EQ (get_frame_param (f, Qfullscreen), Qmaximized)) + set_frame_param (f, Qfullscreen, Qnil); + else if (! EQ (get_frame_param (f, Qmaximized), Qnil)) + set_frame_param (f, Qmaximized, Qnil); + break; } } @@ -4829,16 +4794,14 @@ w32_read_socket (struct terminal *terminal, if (f && !FRAME_ICONIFIED_P (f) && msg.msg.wParam != SIZE_MINIMIZED) { RECT rect; - int rows; - int columns; - int width; - int height; + int rows, columns, width, height, text_width, text_height; GetClientRect (msg.msg.hwnd, &rect); height = rect.bottom - rect.top; width = rect.right - rect.left; - + text_width = FRAME_PIXEL_TO_TEXT_WIDTH (f, width); + text_height = FRAME_PIXEL_TO_TEXT_HEIGHT (f, height); rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, height); columns = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, width); @@ -4848,16 +4811,18 @@ w32_read_socket (struct terminal *terminal, not changed, the font size may have changed, so we need to check the pixel dimensions as well. */ - if (columns != FRAME_COLS (f) - || rows != FRAME_LINES (f) - || width != FRAME_PIXEL_WIDTH (f) - || height != FRAME_PIXEL_HEIGHT (f)) + if (width != FRAME_PIXEL_WIDTH (f) + || height != FRAME_PIXEL_HEIGHT (f) + || text_width != FRAME_TEXT_WIDTH (f) + || text_height != FRAME_TEXT_HEIGHT (f)) { - change_frame_size (f, rows, columns, 0, 1, 0); + change_frame_size (f, text_width, text_height, 0, 1, 0, 1); SET_FRAME_GARBAGED (f); cancel_mouse_face (f); - FRAME_PIXEL_WIDTH (f) = width; - FRAME_PIXEL_HEIGHT (f) = height; + /* Do we want to set these here ???? */ +/** FRAME_PIXEL_WIDTH (f) = width; **/ +/** FRAME_TEXT_WIDTH (f) = text_width; **/ +/** FRAME_PIXEL_HEIGHT (f) = height; **/ f->win_gravity = NorthWestGravity; } } @@ -4894,16 +4859,11 @@ w32_read_socket (struct terminal *terminal, break; case WM_KILLFOCUS: + w32_detect_focus_change (dpyinfo, &msg, &inev); f = x_top_window_to_frame (dpyinfo, msg.msg.hwnd); if (f) { - if (f == dpyinfo->w32_focus_event_frame) - dpyinfo->w32_focus_event_frame = 0; - - if (f == dpyinfo->w32_focus_frame) - x_new_focus_frame (dpyinfo, 0); - if (f == hlinfo->mouse_face_mouse_frame) { /* If we move outside the frame, then we're @@ -4950,7 +4910,7 @@ w32_read_socket (struct terminal *terminal, if (f) { extern void menubar_selection_callback - (FRAME_PTR f, void * client_data); + (struct frame *f, void * client_data); menubar_selection_callback (f, (void *)msg.msg.wParam); } @@ -5028,12 +4988,11 @@ w32_read_socket (struct terminal *terminal, } /* If the focus was just given to an autoraising frame, - raise it now. */ - /* ??? This ought to be able to handle more than one such frame. */ - if (pending_autoraise_frame) + raise it now. FIXME: handle more than one such frame. */ + if (dpyinfo->w32_pending_autoraise_frame) { - x_raise_frame (pending_autoraise_frame); - pending_autoraise_frame = 0; + x_raise_frame (dpyinfo->w32_pending_autoraise_frame); + dpyinfo->w32_pending_autoraise_frame = NULL; } /* Check which frames are still visible, if we have enqueued any user @@ -5047,7 +5006,7 @@ w32_read_socket (struct terminal *terminal, FOR_EACH_FRAME (tail, frame) { - FRAME_PTR f = XFRAME (frame); + struct frame *f = XFRAME (frame); /* The tooltip has been drawn already. Avoid the SET_FRAME_GARBAGED below. */ if (EQ (frame, tip_frame)) @@ -5123,7 +5082,8 @@ w32_read_socket (struct terminal *terminal, mode lines must be clipped to the whole window. */ static void -w32_clip_to_row (struct window *w, struct glyph_row *row, int area, HDC hdc) +w32_clip_to_row (struct window *w, struct glyph_row *row, + enum glyph_row_area area, HDC hdc) { RECT clip_rect; int window_x, window_y, window_width; @@ -5156,7 +5116,10 @@ x_draw_hollow_cursor (struct window *w, struct glyph_row *row) the current matrix is invalid or such, give up. */ cursor_glyph = get_phys_cursor_glyph (w); if (cursor_glyph == NULL) - return; + { + DeleteObject (hb); + return; + } /* Compute frame-relative coordinates for phys cursor. */ get_phys_cursor_geometry (w, row, cursor_glyph, &left, &top, &h); @@ -5290,8 +5253,8 @@ w32_clear_frame_area (struct frame *f, int x, int y, int width, int height) static void w32_draw_window_cursor (struct window *w, struct glyph_row *glyph_row, - int x, int y, int cursor_type, int cursor_width, - int on_p, int active_p) + int x, int y, enum text_cursor_kinds cursor_type, + int cursor_width, bool on_p, bool active_p) { if (on_p) { @@ -5328,6 +5291,9 @@ w32_draw_window_cursor (struct window *w, struct glyph_row *glyph_row, w32_system_caret_y = (WINDOW_TO_FRAME_PIXEL_Y (w, w->phys_cursor.y) + glyph_row->ascent - w->phys_cursor_ascent); + w32_system_caret_window = w; + w32_system_caret_hdr_height = WINDOW_HEADER_LINE_HEIGHT (w); + w32_system_caret_mode_height = WINDOW_MODE_LINE_HEIGHT (w); PostMessage (hwnd, WM_IME_STARTCOMPOSITION, 0, 0); @@ -5513,7 +5479,8 @@ x_new_font (struct frame *f, Lisp_Object font_object, int fontset) doing it because it's done in Fx_show_tip, and it leads to problems because the tip frame has no widget. */ if (NILP (tip_frame) || XFRAME (tip_frame) != f) - x_set_window_size (f, 0, FRAME_COLS (f), FRAME_LINES (f)); + x_set_window_size (f, 0, FRAME_COLS (f) * FRAME_COLUMN_WIDTH (f), + FRAME_LINES (f) * FRAME_LINE_HEIGHT (f), 1); } /* X version sets font of input methods here also. */ @@ -5578,13 +5545,13 @@ x_calc_absolute_position (struct frame *f) /* Treat negative positions as relative to the rightmost bottommost position that fits on the screen. */ if (flags & XNegative) - f->left_pos = (x_display_pixel_width (FRAME_W32_DISPLAY_INFO (f)) + f->left_pos = (x_display_pixel_width (FRAME_DISPLAY_INFO (f)) - FRAME_PIXEL_WIDTH (f) + f->left_pos - (left_right_borders_width - 1)); if (flags & YNegative) - f->top_pos = (x_display_pixel_height (FRAME_W32_DISPLAY_INFO (f)) + f->top_pos = (x_display_pixel_height (FRAME_DISPLAY_INFO (f)) - FRAME_PIXEL_HEIGHT (f) + f->top_pos - (top_bottom_borders_height - 1)); @@ -5651,7 +5618,7 @@ x_check_fullscreen (struct frame *f) when setting WM manager hints. */ if (FRAME_COLS (f) != width || FRAME_LINES (f) != height) { - change_frame_size (f, height, width, 0, 1, 0); + change_frame_size (f, width, height, 0, 1, 0, 0); SET_FRAME_GARBAGED (f); cancel_mouse_face (f); @@ -5662,7 +5629,7 @@ x_check_fullscreen (struct frame *f) } static void -w32fullscreen_hook (FRAME_PTR f) +w32fullscreen_hook (struct frame *f) { if (FRAME_VISIBLE_P (f)) { @@ -5687,7 +5654,9 @@ w32fullscreen_hook (FRAME_PTR f) w32_fullscreen_rect (hwnd, f->want_fullscreen, FRAME_NORMAL_PLACEMENT (f).rcNormalPosition, &rect); FRAME_PREV_FSMODE (f) = f->want_fullscreen; - if (f->want_fullscreen == FULLSCREEN_BOTH) + if (f->want_fullscreen == FULLSCREEN_MAXIMIZED) + PostMessage (FRAME_W32_WINDOW (f), WM_SYSCOMMAND, 0xf030, 0); + else if (f->want_fullscreen == FULLSCREEN_BOTH) { SetWindowLong (hwnd, GWL_STYLE, dwStyle & ~WS_OVERLAPPEDWINDOW); SetWindowPos (hwnd, HWND_TOP, rect.left, rect.top, @@ -5713,20 +5682,28 @@ w32fullscreen_hook (FRAME_PTR f) Otherwise we leave the window gravity unchanged. */ void -x_set_window_size (struct frame *f, int change_gravity, int cols, int rows) +x_set_window_size (struct frame *f, int change_gravity, int width, int height, bool pixelwise) { int pixelwidth, pixelheight; block_input (); - check_frame_size (f, &rows, &cols); + check_frame_size (f, &width, &height, pixelwise); f->scroll_bar_actual_width = FRAME_SCROLL_BAR_COLS (f) * FRAME_COLUMN_WIDTH (f); compute_fringe_widths (f, 0); - pixelwidth = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, cols); - pixelheight = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, rows); + if (pixelwise) + { + pixelwidth = FRAME_TEXT_TO_PIXEL_WIDTH (f, width); + pixelheight = FRAME_TEXT_TO_PIXEL_HEIGHT (f, height); + } + else + { + pixelwidth = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, width); + pixelheight = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, height); + } f->win_gravity = NorthWestGravity; x_wm_set_size_hint (f, (long) 0, 0); @@ -5777,7 +5754,7 @@ x_set_window_size (struct frame *f, int change_gravity, int cols, int rows) We pass 1 for DELAY since we can't run Lisp code inside of a BLOCK_INPUT. */ - change_frame_size (f, rows, cols, 0, 1, 0); + change_frame_size (f, width, height, 0, 1, 0, 0); FRAME_PIXEL_WIDTH (f) = pixelwidth; FRAME_PIXEL_HEIGHT (f) = pixelheight; @@ -5843,7 +5820,7 @@ x_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y) /* focus shifting, raising and lowering. */ void -x_focus_on_frame (struct frame *f) +x_focus_frame (struct frame *f) { struct w32_display_info *dpyinfo = &one_w32_display_info; @@ -5859,11 +5836,6 @@ x_focus_on_frame (struct frame *f) unblock_input (); } -void -x_unfocus_frame (struct frame *f) -{ -} - /* Raise frame F. */ void x_raise_frame (struct frame *f) @@ -5939,7 +5911,7 @@ x_lower_frame (struct frame *f) } static void -w32_frame_raise_lower (FRAME_PTR f, int raise_flag) +w32_frame_raise_lower (struct frame *f, int raise_flag) { if (! FRAME_W32_P (f)) return; @@ -5962,13 +5934,9 @@ w32_frame_raise_lower (FRAME_PTR f, int raise_flag) void x_make_frame_visible (struct frame *f) { - Lisp_Object type; - block_input (); - type = x_icon_type (f); - if (!NILP (type)) - x_bitmap_icon (f, type); + x_set_bitmap_icon (f); if (! FRAME_VISIBLE_P (f)) { @@ -6055,8 +6023,8 @@ void x_make_frame_invisible (struct frame *f) { /* Don't keep the highlight on an invisible frame. */ - if (FRAME_W32_DISPLAY_INFO (f)->x_highlight_frame == f) - FRAME_W32_DISPLAY_INFO (f)->x_highlight_frame = 0; + if (FRAME_DISPLAY_INFO (f)->x_highlight_frame == f) + FRAME_DISPLAY_INFO (f)->x_highlight_frame = 0; block_input (); @@ -6078,24 +6046,23 @@ x_make_frame_invisible (struct frame *f) void x_iconify_frame (struct frame *f) { - Lisp_Object type; - /* Don't keep the highlight on an invisible frame. */ - if (FRAME_W32_DISPLAY_INFO (f)->x_highlight_frame == f) - FRAME_W32_DISPLAY_INFO (f)->x_highlight_frame = 0; + if (FRAME_DISPLAY_INFO (f)->x_highlight_frame == f) + FRAME_DISPLAY_INFO (f)->x_highlight_frame = 0; if (FRAME_ICONIFIED_P (f)) return; block_input (); - type = x_icon_type (f); - if (!NILP (type)) - x_bitmap_icon (f, type); + x_set_bitmap_icon (f); /* Simulate the user minimizing the frame. */ SendMessage (FRAME_W32_WINDOW (f), WM_SYSCOMMAND, SC_MINIMIZE, 0); + SET_FRAME_VISIBLE (f, 0); + SET_FRAME_ICONIFIED (f, 1); + unblock_input (); } @@ -6105,7 +6072,7 @@ x_iconify_frame (struct frame *f) void x_free_frame_resources (struct frame *f) { - struct w32_display_info *dpyinfo = FRAME_W32_DISPLAY_INFO (f); + struct w32_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f); block_input (); @@ -6121,17 +6088,6 @@ x_free_frame_resources (struct frame *f) free_frame_menubar (f); - unload_color (f, FRAME_FOREGROUND_PIXEL (f)); - unload_color (f, FRAME_BACKGROUND_PIXEL (f)); - unload_color (f, f->output_data.w32->cursor_pixel); - unload_color (f, f->output_data.w32->cursor_foreground_pixel); - unload_color (f, f->output_data.w32->border_pixel); - unload_color (f, f->output_data.w32->mouse_pixel); - if (f->output_data.w32->white_relief.allocated_p) - unload_color (f, f->output_data.w32->white_relief.pixel); - if (f->output_data.w32->black_relief.allocated_p) - unload_color (f, f->output_data.w32->black_relief.pixel); - if (FRAME_FACE_CACHE (f)) free_frame_faces (f); @@ -6144,16 +6100,8 @@ x_free_frame_resources (struct frame *f) dpyinfo->w32_focus_event_frame = 0; if (f == dpyinfo->x_highlight_frame) dpyinfo->x_highlight_frame = 0; - if (f == hlinfo->mouse_face_mouse_frame) - { - hlinfo->mouse_face_beg_row - = hlinfo->mouse_face_beg_col = -1; - hlinfo->mouse_face_end_row - = hlinfo->mouse_face_end_col = -1; - hlinfo->mouse_face_window = Qnil; - hlinfo->mouse_face_mouse_frame = 0; - } + reset_mouse_highlight (hlinfo); unblock_input (); } @@ -6163,7 +6111,7 @@ x_free_frame_resources (struct frame *f) void x_destroy_window (struct frame *f) { - struct w32_display_info *dpyinfo = FRAME_W32_DISPLAY_INFO (f); + struct w32_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); x_free_frame_resources (f); dpyinfo->reference_count--; @@ -6187,27 +6135,11 @@ x_wm_set_size_hint (struct frame *f, long flags, bool user_position) SetWindowLong (window, WND_FONTWIDTH_INDEX, FRAME_COLUMN_WIDTH (f)); SetWindowLong (window, WND_LINEHEIGHT_INDEX, FRAME_LINE_HEIGHT (f)); SetWindowLong (window, WND_BORDER_INDEX, FRAME_INTERNAL_BORDER_WIDTH (f)); - SetWindowLong (window, WND_SCROLLBAR_INDEX, f->scroll_bar_actual_width); + SetWindowLong (window, WND_SCROLLBAR_INDEX, FRAME_SCROLL_BAR_AREA_WIDTH (f)); leave_crit (); } -/* Window manager things */ -void -x_wm_set_icon_position (struct frame *f, int icon_x, int icon_y) -{ -#if 0 - Window window = FRAME_W32_WINDOW (f); - - f->display.x->wm_hints.flags |= IconPositionHint; - f->display.x->wm_hints.icon_x = icon_x; - f->display.x->wm_hints.icon_y = icon_y; - - XSetWMHints (FRAME_X_DISPLAY (f), window, &f->display.x->wm_hints); -#endif -} - - /*********************************************************************** Fonts ***********************************************************************/ @@ -6239,15 +6171,10 @@ void w32_initialize_display_info (Lisp_Object display_name) { struct w32_display_info *dpyinfo = &one_w32_display_info; - Mouse_HLInfo *hlinfo = &dpyinfo->mouse_highlight; memset (dpyinfo, 0, sizeof (*dpyinfo)); - /* Put it on w32_display_name_list. */ - w32_display_name_list = Fcons (Fcons (display_name, Qnil), - w32_display_name_list); - dpyinfo->name_list_element = XCAR (w32_display_name_list); - + dpyinfo->name_list_element = Fcons (display_name, Qnil); dpyinfo->w32_id_name = xmalloc (SCHARS (Vinvocation_name) + SCHARS (Vsystem_name) + 2); sprintf (dpyinfo->w32_id_name, "%s@%s", @@ -6262,17 +6189,10 @@ w32_initialize_display_info (Lisp_Object display_name) dpyinfo->n_fonts = 0; dpyinfo->smallest_font_height = 1; dpyinfo->smallest_char_width = 1; - - hlinfo->mouse_face_beg_row = hlinfo->mouse_face_beg_col = -1; - hlinfo->mouse_face_end_row = hlinfo->mouse_face_end_col = -1; - hlinfo->mouse_face_face_id = DEFAULT_FACE_ID; - hlinfo->mouse_face_window = Qnil; - hlinfo->mouse_face_overlay = Qnil; - hlinfo->mouse_face_hidden = 0; - dpyinfo->vertical_scroll_bar_cursor = w32_load_cursor (IDC_ARROW); /* TODO: dpyinfo->gray */ + reset_mouse_highlight (&dpyinfo->mouse_highlight); } /* Create an xrdb-style database of resources to supersede registry settings. @@ -6329,11 +6249,6 @@ w32_make_rdb (char *xrm_option) return buffer; } -void -x_flush (struct frame * f) -{ /* Nothing to do */ } - - extern frame_parm_handler w32_frame_parm_handlers[]; static struct redisplay_interface w32_redisplay_interface = @@ -6347,9 +6262,7 @@ static struct redisplay_interface w32_redisplay_interface = x_after_update_window_line, x_update_window_begin, x_update_window_end, - x_cursor_to, - x_flush, - 0, /* flush_display_optional */ + 0, /* flush_display */ x_clear_window_mouse_face, x_get_glyph_overhangs, x_fix_overlapping_area, @@ -6362,6 +6275,7 @@ static struct redisplay_interface w32_redisplay_interface = w32_clear_frame_area, w32_draw_window_cursor, w32_draw_vertical_window_border, + w32_draw_window_divider, w32_shift_glyphs_for_insert }; @@ -6384,11 +6298,11 @@ w32_create_terminal (struct w32_display_info *dpyinfo) terminal->ins_del_lines_hook = x_ins_del_lines; terminal->delete_glyphs_hook = x_delete_glyphs; terminal->ring_bell_hook = w32_ring_bell; - terminal->reset_terminal_modes_hook = w32_reset_terminal_modes; - terminal->set_terminal_modes_hook = w32_set_terminal_modes; + terminal->reset_terminal_modes_hook = NULL; + terminal->set_terminal_modes_hook = NULL; terminal->update_begin_hook = x_update_begin; terminal->update_end_hook = x_update_end; - terminal->set_terminal_window_hook = w32_set_terminal_window; + terminal->set_terminal_window_hook = NULL; terminal->read_socket_hook = w32_read_socket; terminal->frame_up_to_date_hook = w32_frame_up_to_date; terminal->mouse_position_hook = w32_mouse_position; @@ -6404,21 +6318,11 @@ w32_create_terminal (struct w32_display_info *dpyinfo) terminal->delete_terminal_hook = x_delete_terminal; terminal->rif = &w32_redisplay_interface; - terminal->scroll_region_ok = 1; /* We'll scroll partial frames. */ - terminal->char_ins_del_ok = 1; - terminal->line_ins_del_ok = 1; /* We'll just blt 'em. */ - terminal->fast_clear_end_of_line = 1; /* X does this well. */ - terminal->memory_below_frame = 0; /* We don't remember what scrolls - off the bottom. */ /* We don't yet support separate terminals on W32, so don't try to share keyboards between virtual terminals that are on the same physical terminal like X does. */ - terminal->kboard = xmalloc (sizeof (KBOARD)); - init_kboard (terminal->kboard); - kset_window_system (terminal->kboard, intern ("w32")); - terminal->kboard->next_kboard = all_kboards; - all_kboards = terminal->kboard; + terminal->kboard = allocate_kboard (Qw32); /* Don't let the initial kboard remain current longer than necessary. That would cause problems if a file loaded on startup tries to prompt in the mini-buffer. */ @@ -6466,9 +6370,7 @@ w32_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name) terminal = w32_create_terminal (dpyinfo); /* Set the name of the terminal. */ - terminal->name = xmalloc (SBYTES (display_name) + 1); - strncpy (terminal->name, SDATA (display_name), SBYTES (display_name)); - terminal->name[SBYTES (display_name)] = 0; + terminal->name = xlispstrdup (display_name); dpyinfo->xrdb = xrm_option ? w32_make_rdb (xrm_option) : NULL; @@ -6521,27 +6423,7 @@ w32_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name) void x_delete_display (struct w32_display_info *dpyinfo) { - /* Discard this display from w32_display_name_list and w32_display_list. - We can't use Fdelq because that can quit. */ - if (! NILP (w32_display_name_list) - && EQ (XCAR (w32_display_name_list), dpyinfo->name_list_element)) - w32_display_name_list = XCDR (w32_display_name_list); - else - { - Lisp_Object tail; - - tail = w32_display_name_list; - while (CONSP (tail) && CONSP (XCDR (tail))) - { - if (EQ (XCAR (XCDR (tail)), dpyinfo->name_list_element)) - { - XSETCDR (tail, XCDR (XCDR (tail))); - break; - } - tail = XCDR (tail); - } - } - + /* FIXME: the only display info apparently can't be deleted. */ /* free palette table */ { struct w32_palette_entry * plist; @@ -6600,7 +6482,7 @@ w32_initialize (void) } #ifdef CYGWIN - if ((w32_message_fd = open ("/dev/windows", O_RDWR | O_CLOEXEC)) == -1) + if ((w32_message_fd = emacs_open ("/dev/windows", O_RDWR, 0)) == -1) fatal ("opening /dev/windows: %s", strerror (errno)); #endif /* CYGWIN */ @@ -6679,12 +6561,6 @@ w32_initialize (void) void syms_of_w32term (void) { - staticpro (&w32_display_name_list); - w32_display_name_list = Qnil; - - staticpro (&last_mouse_scroll_bar); - last_mouse_scroll_bar = Qnil; - DEFSYM (Qvendor_specific_keysyms, "vendor-specific-keysyms"); DEFSYM (Qadded, "added"); @@ -6768,8 +6644,6 @@ X toolkit. Possible values are: gtk, motif, xaw, or xaw3d. With MS Windows or Nextstep, the value is t. */); Vx_toolkit_scroll_bars = Qt; - staticpro (&last_mouse_motion_frame); - last_mouse_motion_frame = Qnil; - - Fprovide (intern_c_string ("w32"), Qnil); + /* Tell Emacs about this window system. */ + Fprovide (Qw32, Qnil); }