X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/0791d107eddb1ff08b321b204427fd3599e0b2cb..ad8a47b89fc3c5a3302255f318b1ed805838cf72:/src/w32term.c diff --git a/src/w32term.c b/src/w32term.c index 331a86ef7d..ba336b5c65 100644 --- a/src/w32term.c +++ b/src/w32term.c @@ -99,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. @@ -171,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 struct frame *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; @@ -212,7 +180,7 @@ 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); @@ -653,6 +621,32 @@ w32_draw_vertical_window_border (struct window *w, int x, int y0, int y1) } +/* 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 @@ -680,7 +674,12 @@ x_update_window_end (struct window *w, bool cursor_on_p, 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 (); } @@ -688,7 +687,13 @@ x_update_window_end (struct window *w, bool cursor_on_p, /* If a row with mouse-face was overwritten, arrange for XTframe_up_to_date to redisplay the mouse highlight. */ if (mouse_face_overwritten_p) - reset_mouse_highlight (MOUSE_HL_INFO (XFRAME (w->frame))); + { + 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; + } /* Unhide the caret. This won't actually show the cursor, unless it was visible before the corresponding call to HideCaret in @@ -803,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) { @@ -1628,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) { @@ -2704,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) { @@ -3304,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 (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; } @@ -3363,16 +3363,6 @@ static void x_scroll_bar_report_motion (struct frame **, 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) { @@ -3404,10 +3394,11 @@ w32_mouse_position (struct frame **fp, int insist, Lisp_Object *bar_window, unsigned long *time) { 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 { @@ -3419,26 +3410,18 @@ w32_mouse_position (struct frame **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_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_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) @@ -3465,16 +3448,17 @@ w32_mouse_position (struct frame **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; } } } @@ -3785,7 +3769,7 @@ w32_set_vertical_scroll_bar (struct window *w, /* Get window dimensions. */ 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. */ @@ -4033,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)) { @@ -4118,7 +4100,8 @@ x_scroll_bar_report_motion (struct frame **fp, Lisp_Object *bar_window, 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); struct frame *f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window))); int pos; @@ -4137,13 +4120,13 @@ x_scroll_bar_report_motion (struct frame **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; @@ -4158,9 +4141,9 @@ x_scroll_bar_report_motion (struct frame **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 (); } @@ -4241,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 (); @@ -4479,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) { @@ -4559,11 +4538,8 @@ w32_read_socket (struct terminal *terminal, 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) { @@ -4602,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 @@ -4619,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) { @@ -4640,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; @@ -4699,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 @@ -4736,6 +4709,47 @@ w32_read_socket (struct terminal *terminal, break; case SIZE_MAXIMIZED: + { + bool iconified = FRAME_ICONIFIED_P (f); + + 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) + { + int x, y; + + /* 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, &x, &y); + f->left_pos = x; + f->top_pos = y; + + 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), 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); @@ -4767,6 +4781,12 @@ w32_read_socket (struct terminal *terminal, 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; } } @@ -4774,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); @@ -4793,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; } } @@ -5459,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. */ @@ -5597,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); @@ -5661,20 +5682,28 @@ w32fullscreen_hook (struct frame *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); @@ -5725,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; @@ -6059,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); @@ -6117,7 +6135,7 @@ 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 (); } @@ -6156,11 +6174,7 @@ w32_initialize_display_info (Lisp_Object display_name) 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", @@ -6261,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 }; @@ -6303,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, Qw32); - 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. */ @@ -6418,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; @@ -6576,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"); @@ -6665,9 +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; - /* Tell Emacs about this window system. */ Fprovide (Qw32, Qnil); }