X-Git-Url: http://git.chise.org/gitweb/?p=chise%2Fxemacs-chise.git.1;a=blobdiff_plain;f=src%2Fscrollbar-msw.c;h=8af6692329a2e6b92a578c3934a22bdf1129001b;hp=b6ac215f50631b54d00f1874c2b1046f37e9b96a;hb=8b2e8ef2dee7da2f0d4cea712b0fc55902c3cff7;hpb=426fe636212336bb32a5e6f187c4d623709fa57d diff --git a/src/scrollbar-msw.c b/src/scrollbar-msw.c index b6ac215..8af6692 100644 --- a/src/scrollbar-msw.c +++ b/src/scrollbar-msw.c @@ -83,9 +83,11 @@ mswindows_create_scrollbar_instance (struct frame *f, int vertical, static void mswindows_free_scrollbar_instance (struct scrollbar_instance *sb) { - DestroyWindow (SCROLLBAR_MSW_HANDLE (sb)); if (sb->scrollbar_data) - xfree (sb->scrollbar_data); + { + DestroyWindow (SCROLLBAR_MSW_HANDLE (sb)); + xfree (sb->scrollbar_data); + } } static void @@ -210,7 +212,7 @@ mswindows_handle_scrollbar_event (HWND hwnd, int code, int pos) /* "0 as the second parameter" refers to the call to real_window above. This comment was taken from Ben's 21.5 code that differs somewhat from this, I don't think the 21.4 code ever had a 0 - there. #### we're still hitting an abort here with 0 as the + there. #### we're still hitting an ABORT here with 0 as the second parameter, although only occasionally. It seems that sometimes we receive events for scrollbars that don't exist anymore. I assume it must happen like this: The user does @@ -333,43 +335,45 @@ mswindows_handle_mousewheel_event (Lisp_Object frame, int keys, int delta, { int hasVertBar, hasHorzBar; /* Indicates presence of scroll bars */ unsigned wheelScrollLines = 0; /* Number of lines per wheel notch */ - Lisp_Object win; + Lisp_Object win, corpore, sano; struct window_mirror *mirror; + int mene, _mene, tekel, upharsin; + Bufpos mens, sana; + Charcount in; + struct window *needle_in_haystack = 0; POINT donde_esta; donde_esta.x = where.x; donde_esta.y = where.y; - ScreenToClient (FRAME_MSWINDOWS_HANDLE (XFRAME (frame)), &donde_esta); - /* Find the window to scroll */ - { - int mene, _mene, tekel, upharsin; - Bufpos mens, sana; - Charcount in; - Lisp_Object corpore, sano; - struct window *needle_in_haystack; - - // stderr_out ("donde_esta: %d %d\n", donde_esta.x, donde_esta.y); - pixel_to_glyph_translation (XFRAME (frame), donde_esta.x, donde_esta.y, - &mene, &_mene, &tekel, &upharsin, - &needle_in_haystack, - &mens, &sana, &in, &corpore, &sano); - - if (needle_in_haystack) - { - XSETWINDOW (win, needle_in_haystack); - // stderr_out ("found needle\n"); - // debug_print (win); - } - else - { - win = FRAME_SELECTED_WINDOW (XFRAME (frame)); - needle_in_haystack = XWINDOW (win); - } - mirror = find_window_mirror (needle_in_haystack); - } + /* The mouse event could actually occur outside of the emacs + frame. */ + if (ScreenToClient (FRAME_MSWINDOWS_HANDLE (XFRAME (frame)), + &donde_esta) != 0) + { + /* stderr_out ("donde_esta: %d %d\n", donde_esta.x, donde_esta.y); */ + pixel_to_glyph_translation (XFRAME (frame), donde_esta.x, donde_esta.y, + &mene, &_mene, &tekel, &upharsin, + &needle_in_haystack, + &mens, &sana, &in, &corpore, &sano); + + if (needle_in_haystack) + { + XSETWINDOW (win, needle_in_haystack); + /* stderr_out ("found needle\n"); + debug_print (win); */ + } + } + + if (!needle_in_haystack) + { + win = FRAME_SELECTED_WINDOW (XFRAME (frame)); + needle_in_haystack = XWINDOW (win); + } + + mirror = find_window_mirror (needle_in_haystack); /* Check that there is something to scroll */ hasVertBar = can_scroll (mirror->scrollbar_vertical_instance);