XEmacs 21.2.20 "Yoko".
[chise/xemacs-chise.git.1] / src / frame-x.c
index 2aa7d59..906a6b1 100644 (file)
@@ -103,19 +103,34 @@ x_window_to_frame (struct device *d, Window wdesc)
 struct frame *
 x_any_window_to_frame (struct device *d, Window wdesc)
 {
-  Lisp_Object tail, frame;
-  struct frame *f;
-
+  Widget w;
   assert (DEVICE_X_P (d));
 
+  w = XtWindowToWidget (DEVICE_X_DISPLAY (d), wdesc);
+
+  if (!w)
+    return 0;
+
+  /* We used to map over all frames here and then map over all widgets
+     belonging to that frame. However it turns out that this was very fragile
+     as it requires our display stuctures to be in sync _and_ that the 
+     loop is told about every new widget somebody adds. Therefore we
+     now let Xt find it for us (which does a bottom-up search which
+     could even be faster) */
+  return  x_any_widget_or_parent_to_frame (d, w);
+}
+
+static struct frame *
+x_find_frame_for_window (struct device *d, Window wdesc)
+{
+  Lisp_Object tail, frame;
+  struct frame *f;
   /* This function was previously written to accept only a window argument
      (and to loop over all devices looking for a matching window), but
      that is incorrect because window ID's are not unique across displays. */
 
   for (tail = DEVICE_FRAME_LIST (d); CONSP (tail); tail = XCDR (tail))
     {
-      int i;
-
       frame = XCAR (tail);
       f = XFRAME (frame);
       /* This frame matches if the window is any of its widgets. */
@@ -138,18 +153,18 @@ x_any_window_to_frame (struct device *d, Window wdesc)
         would incorrectly get sucked away by Emacs if this function matched
         on psheet widgets. */
 
-      for (i = 0; i < FRAME_X_NUM_TOP_WIDGETS (f); i++)
-       {
-         Widget wid = FRAME_X_TOP_WIDGETS (f)[i];
-         if (wid && XtIsManaged (wid) && wdesc == XtWindow (wid))
-           return f;
-       }
-
-#ifdef HAVE_SCROLLBARS
-      /* Match if the window is one of this frame's scrollbars. */
-      if (x_window_is_scrollbar (f, wdesc))
-       return f;
-#endif
+      /* Note: that this called only from
+         x_any_widget_or_parent_to_frame it is unnecessary to iterate
+         over the top level widgets. */
+
+      /* Note:  we use to special case scrollbars but this turns out to be a bad idea
+         because
+         1. We sometimes get events for _unmapped_ scrollbars and our
+         callers don't want us to fail.
+         2. Starting with the 21.2 widget stuff there are now loads of
+         widgets to check and it is easy to forget adding them in a loop here.
+         See x_any_window_to_frame
+         3. We pick up all widgets now anyway. */
     }
 
   return 0;
@@ -160,7 +175,7 @@ x_any_widget_or_parent_to_frame (struct device *d, Widget widget)
 {
   while (widget)
     {
-      struct frame *f = x_any_window_to_frame (d, XtWindow (widget));
+      struct frame *f = x_find_frame_for_window (d, XtWindow (widget));
       if (f)
        return f;
       widget = XtParent (widget);
@@ -421,9 +436,9 @@ static void
 init_x_prop_symbols (void)
 {
 #define def(sym, rsrc) \
-   pure_put (sym, Qx_resource_name, build_string (rsrc))
+   Fput (sym, Qx_resource_name, build_string (rsrc))
 #define defi(sym,rsrc) \
-   def (sym, rsrc); pure_put (sym, Qintegerp, Qt)
+   def (sym, rsrc); Fput (sym, Qintegerp, Qt)
 
 #if 0 /* this interferes with things. #### fix this right */
   def (Qminibuffer, XtNminibuffer);
@@ -1880,7 +1895,7 @@ x_create_widgets (struct frame *f, Lisp_Object lisp_window_id,
       char *string;
 
       CHECK_STRING (lisp_window_id);
-      string = (char *) (XSTRING_DATA (lisp_window_id));
+      string = (char *) XSTRING_DATA (lisp_window_id);
       if (string[0] == '0' && (string[1] == 'x' || string[1] == 'X'))
        sscanf (string+2, "%lxu", &window_id);
 #if 0
@@ -2190,10 +2205,10 @@ x_init_frame_3 (struct frame *f)
 }
 
 static void
-x_mark_frame (struct frame *f, void (*markobj) (Lisp_Object))
+x_mark_frame (struct frame *f)
 {
-  markobj (FRAME_X_ICON_PIXMAP (f));
-  markobj (FRAME_X_ICON_PIXMAP_MASK (f));
+  mark_object (FRAME_X_ICON_PIXMAP (f));
+  mark_object (FRAME_X_ICON_PIXMAP_MASK (f));
 }
 
 static void