XEmacs 21.4.20 "Double Solitaire".
[chise/xemacs-chise.git.1] / src / scrollbar-msw.c
index b6ac215..8af6692 100644 (file)
@@ -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);