diff src/frame-x.c @ 412:697ef44129c6 r21-2-14

Import from CVS: tag r21-2-14
author cvs
date Mon, 13 Aug 2007 11:20:41 +0200
parents 2f8bb876ab1d
children da8ed4261e83
line wrap: on
line diff
--- a/src/frame-x.c	Mon Aug 13 11:19:22 2007 +0200
+++ b/src/frame-x.c	Mon Aug 13 11:20:41 2007 +0200
@@ -50,7 +50,6 @@
 #include "faces.h"
 #include "frame.h"
 #include "window.h"
-#include "gutter.h"
 
 #ifdef HAVE_DRAGNDROP
 #include "dragdrop.h"
@@ -104,34 +103,19 @@
 struct frame *
 x_any_window_to_frame (struct device *d, Window wdesc)
 {
-  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;
+
+  assert (DEVICE_X_P (d));
+
   /* 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. */
@@ -154,18 +138,18 @@
 	 would incorrectly get sucked away by Emacs if this function matched
 	 on psheet widgets. */
 
-      /* 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. */
+      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
     }
 
   return 0;
@@ -176,7 +160,7 @@
 {
   while (widget)
     {
-      struct frame *f = x_find_frame_for_window (d, XtWindow (widget));
+      struct frame *f = x_any_window_to_frame (d, XtWindow (widget));
       if (f)
 	return f;
       widget = XtParent (widget);
@@ -344,7 +328,7 @@
   XSetClassHint (dpy, XtWindow (shell), &classhint);
 }
 
-#ifndef HAVE_WMCOMMAND
+#ifndef HAVE_SESSION
 static void
 x_wm_maybe_store_wm_command (struct frame *f)
 {
@@ -395,7 +379,7 @@
 
     }
 }
-#endif /* !HAVE_WMCOMMAND */
+#endif /* !HAVE_SESSION */
 
 static int
 x_frame_iconified_p (struct frame *f)
@@ -437,9 +421,9 @@
 init_x_prop_symbols (void)
 {
 #define def(sym, rsrc) \
-   Fput (sym, Qx_resource_name, build_string (rsrc))
+   pure_put (sym, Qx_resource_name, build_string (rsrc))
 #define defi(sym,rsrc) \
-   def (sym, rsrc); Fput (sym, Qintegerp, Qt)
+   def (sym, rsrc); pure_put (sym, Qintegerp, Qt)
 
 #if 0 /* this interferes with things. #### fix this right */
   def (Qminibuffer, XtNminibuffer);
@@ -660,17 +644,15 @@
   for (ptr = value; *ptr; ptr++)
     if (!BYTE_ASCII_P (*ptr))
       {
-        const char * tmp;
+        CONST char * tmp;
         encoding = DEVICE_XATOM_COMPOUND_TEXT (XDEVICE (FRAME_DEVICE (f)));
-	TO_EXTERNAL_FORMAT (C_STRING, value,
-			    C_STRING_ALLOCA, tmp,
-			    Qctext);
+        GET_C_CHARPTR_EXT_CTEXT_DATA_ALLOCA ((CONST char *) value, tmp);
         new_XtValue = (String) tmp;
         break;
       }
 #endif /* MULE */
 
-  /* #### Caching is device-independent - belongs in update_frame_title. */
+  /* ### Caching is device-independent - belongs in update_frame_title. */
   Xt_GET_VALUE (FRAME_X_SHELL_WIDGET (f), Xt_resource_name, &old_XtValue);
   if (!old_XtValue || strcmp (new_XtValue, old_XtValue))
     {
@@ -761,22 +743,18 @@
 
       if (STRINGP (prop))
 	{
-	  const char *extprop;
+	  CONST char *extprop;
 
 	  if (XSTRING_LENGTH (prop) == 0)
 	    continue;
 
-	  TO_EXTERNAL_FORMAT (LISP_STRING, prop,
-			      C_STRING_ALLOCA, extprop,
-			      Qctext);
+	  GET_C_STRING_CTEXT_DATA_ALLOCA (prop, extprop);
 	  if (STRINGP (val))
 	    {
-	      const Extbyte *extval;
+	      CONST Extbyte *extval;
 	      Extcount extvallen;
 
-	      TO_EXTERNAL_FORMAT (LISP_STRING, val,
-				  ALLOCA, (extval, extvallen),
-				  Qctext);
+	      GET_STRING_CTEXT_DATA_ALLOCA (val, extval, extvallen);
 	      XtVaSetValues (w, XtVaTypedArg, extprop,
 			     XtRString, extval, extvallen + 1,
 			     (XtArgVal) NULL);
@@ -1110,7 +1088,7 @@
       unsigned int modifier = 0, state = 0;
       char *Ctext;
       int numItems = 0, textlen = 0, pos = 0;
-      Lisp_Event *lisp_event = XEVENT (event);
+      struct Lisp_Event *lisp_event = XEVENT(event);
       Lisp_Object item = Qnil;
       struct gcpro gcpro1;
 
@@ -1147,12 +1125,12 @@
 	  x_event.xbutton.y_root = lisp_event->event.button.y;
 	}
       modifier = lisp_event->event.button.modifiers;
-      if (modifier & XEMACS_MOD_SHIFT)   state |= ShiftMask;
-      if (modifier & XEMACS_MOD_CONTROL) state |= ControlMask;
-      if (modifier & XEMACS_MOD_META)    state |= xd->MetaMask;
-      if (modifier & XEMACS_MOD_SUPER)   state |= xd->SuperMask;
-      if (modifier & XEMACS_MOD_HYPER)   state |= xd->HyperMask;
-      if (modifier & XEMACS_MOD_ALT)     state |= xd->AltMask;
+      if (modifier & MOD_SHIFT)   state |= ShiftMask;
+      if (modifier & MOD_CONTROL) state |= ControlMask;
+      if (modifier & MOD_META)    state |= xd->MetaMask;
+      if (modifier & MOD_SUPER)   state |= xd->SuperMask;
+      if (modifier & MOD_HYPER)   state |= xd->HyperMask;
+      if (modifier & MOD_ALT)     state |= xd->AltMask;
       state |= Button1Mask << (lisp_event->event.button.button-1);
 
       x_event.xbutton.state = state;
@@ -1192,7 +1170,7 @@
 		  Ctext=NULL;
 		  break;
 		}
-	      strcpy (Ctext+pos, (const char *)XSTRING_DATA (XCAR (item)));
+	      strcpy (Ctext+pos, (CONST char *)XSTRING_DATA (XCAR (item)));
 	      pos += XSTRING_LENGTH (XCAR (item)) + 1;
 	      item = XCDR (item);
 	    }
@@ -1262,7 +1240,7 @@
 	{
 	  filePath = transferInfo->dropData->data.files[ii];
 	  hurl = dnd_url_hexify_string ((char *)filePath, "file:");
-          /* #### Mule-izing required */
+          /* ### Mule-izing required */
 	  l_data = Fcons (make_string ((Bufbyte* )hurl,
 				       strlen (hurl)),
 			  l_data);
@@ -1337,7 +1315,7 @@
       char *dnd_data = NULL;
       unsigned long dnd_len = 0;
       int dnd_typ = DndText, dnd_dealloc = 0;
-      Lisp_Event *lisp_event = XEVENT (event);
+      struct Lisp_Event *lisp_event = XEVENT(event);
 
       /* only drag if this is really a press */
       if (EVENT_TYPE(lisp_event) != button_press_event)
@@ -1368,7 +1346,7 @@
 		}
 	      len = XSTRING_LENGTH (XCAR (run)) + 1;
 	      dnd_data = (char *) xrealloc (dnd_data, dnd_len + len);
-	      strcpy (dnd_data + dnd_len - 1, (const char *)XSTRING_DATA (XCAR (run)));
+	      strcpy (dnd_data + dnd_len - 1, (CONST char *)XSTRING_DATA (XCAR (run)));
 	      dnd_len += len;
 	      run = XCDR (run);
 	    }
@@ -1413,12 +1391,12 @@
 	}
 
       modifier = lisp_event->event.button.modifiers;
-      if (modifier & XEMACS_MOD_SHIFT)   state |= ShiftMask;
-      if (modifier & XEMACS_MOD_CONTROL) state |= ControlMask;
-      if (modifier & XEMACS_MOD_META)    state |= xd->MetaMask;
-      if (modifier & XEMACS_MOD_SUPER)   state |= xd->SuperMask;
-      if (modifier & XEMACS_MOD_HYPER)   state |= xd->HyperMask;
-      if (modifier & XEMACS_MOD_ALT)     state |= xd->AltMask;
+      if (modifier & MOD_SHIFT)   state |= ShiftMask;
+      if (modifier & MOD_CONTROL) state |= ControlMask;
+      if (modifier & MOD_META)    state |= xd->MetaMask;
+      if (modifier & MOD_SUPER)   state |= xd->SuperMask;
+      if (modifier & MOD_HYPER)   state |= xd->HyperMask;
+      if (modifier & MOD_ALT)     state |= xd->AltMask;
       state |= Button1Mask << (lisp_event->event.button.button-1);
 
       x_event.xbutton.state = state;
@@ -1551,16 +1529,13 @@
   {
     struct window *win = XWINDOW (f->root_window);
 
-    WINDOW_LEFT (win) = FRAME_LEFT_BORDER_END (f)
-      + FRAME_LEFT_GUTTER_BOUNDS (f);
-    WINDOW_TOP (win) = FRAME_TOP_BORDER_END (f)
-      + FRAME_TOP_GUTTER_BOUNDS (f);
+    WINDOW_LEFT (win) = FRAME_LEFT_BORDER_END (f);
+    WINDOW_TOP (win) = FRAME_TOP_BORDER_END (f);
 
     if (!NILP (f->minibuffer_window))
       {
 	win = XWINDOW (f->minibuffer_window);
-	WINDOW_LEFT (win) = FRAME_LEFT_BORDER_END (f)
-	  + FRAME_LEFT_GUTTER_BOUNDS (f);
+	WINDOW_LEFT (win) = FRAME_LEFT_BORDER_END (f);
       }
   }
 
@@ -1865,7 +1840,7 @@
 #ifdef EXTERNAL_WIDGET
   Window window_id = 0;
 #endif
-  const char *name;
+  CONST char *name;
   Arg al [25];
   int ac = 0;
   Widget text, container, shell;
@@ -1876,9 +1851,7 @@
 #endif
 
   if (STRINGP (f->name))
-    TO_EXTERNAL_FORMAT (LISP_STRING, f->name,
-			C_STRING_ALLOCA, name,
-			Qctext);
+    GET_C_STRING_CTEXT_DATA_ALLOCA (f->name, name);
   else
     name = "emacs";
 
@@ -1907,7 +1880,7 @@
       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
@@ -2086,9 +2059,9 @@
 	/* tell the window manager about us. */
 	x_wm_store_class_hints (shell_widget, XtName (frame_widget));
 
-#ifndef HAVE_WMCOMMAND
+#ifndef HAVE_SESSION
 	x_wm_maybe_store_wm_command (f);
-#endif /* HAVE_WMCOMMAND */
+#endif /* HAVE_SESSION */
 
 	x_wm_hack_wm_protocols (shell_widget);
       }
@@ -2217,10 +2190,10 @@
 }
 
 static void
-x_mark_frame (struct frame *f)
+x_mark_frame (struct frame *f, void (*markobj) (Lisp_Object))
 {
-  mark_object (FRAME_X_ICON_PIXMAP (f));
-  mark_object (FRAME_X_ICON_PIXMAP_MASK (f));
+  markobj (FRAME_X_ICON_PIXMAP (f));
+  markobj (FRAME_X_ICON_PIXMAP_MASK (f));
 }
 
 static void
@@ -2652,10 +2625,10 @@
 {
   Display *dpy;
 
-#ifndef HAVE_WMCOMMAND
+#ifndef HAVE_SESSION
   if (FRAME_X_TOP_LEVEL_FRAME_P (f))
     x_wm_maybe_move_wm_command (f);
-#endif /* HAVE_WMCOMMAND */
+#endif /* HAVE_SESSION */
 
 #ifdef HAVE_CDE
   DtDndDropUnregister (FRAME_X_TEXT_WIDGET (f));
@@ -2676,7 +2649,7 @@
 #else
   XtDestroyWidget (FRAME_X_SHELL_WIDGET (f));
   /* make sure the windows are really gone! */
-  /* #### Is this REALLY necessary? */
+  /* ### Is this REALLY necessary? */
   XFlush (dpy);
 #endif /* EXTERNAL_WIDGET */