diff src/events.c @ 282:c42ec1d1cded r21-0b39

Import from CVS: tag r21-0b39
author cvs
date Mon, 13 Aug 2007 10:33:18 +0200
parents 7df0dd720c89
children 558f606b08ae
line wrap: on
line diff
--- a/src/events.c	Mon Aug 13 10:32:23 2007 +0200
+++ b/src/events.c	Mon Aug 13 10:33:18 2007 +0200
@@ -66,11 +66,6 @@
 Lisp_Object Qkey_press, Qbutton_press, Qbutton_release, Qmisc_user;
 Lisp_Object Qascii_character;
 
-#if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
-Lisp_Object Qdnd_drop_event_p;
-Lisp_Object Qdnd_drop;
-#endif
-
 EXFUN (Fevent_x_pixel, 1);
 EXFUN (Fevent_y_pixel, 1);
 
@@ -138,9 +133,6 @@
     case magic_event:
     case empty_event:
     case dead_event:
-#if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
-    case dnd_drop_event:
-#endif
       break;
     default:
       abort ();
@@ -203,13 +195,14 @@
 	write_c_string ("#<empty-event", printcharfun);
 	break;
     case misc_user_event:
+	write_c_string ("#<misc-user-event (", printcharfun);
+	print_internal (XEVENT (obj)->event.misc.function, printcharfun, 1);
+	write_c_string (" ", printcharfun);
+	print_internal (XEVENT (obj)->event.misc.object, printcharfun, 1);
+	write_c_string (")", printcharfun);
+	break;
     case eval_event:
-	write_c_string ("#<", printcharfun);
-	if (XEVENT (obj)->event_type == misc_user_event)
-	  write_c_string ("misc-user", printcharfun);
-	else
-	  write_c_string ("eval", printcharfun);
-	write_c_string ("-event (", printcharfun);
+	write_c_string ("#<eval-event (", printcharfun);
 	print_internal (XEVENT (obj)->event.eval.function, printcharfun, 1);
 	write_c_string (" ", printcharfun);
 	print_internal (XEVENT (obj)->event.eval.object, printcharfun, 1);
@@ -218,11 +211,6 @@
     case dead_event:
 	write_c_string ("#<DEALLOCATED-EVENT", printcharfun);
 	break;
-#if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
-    case dnd_drop_event:
-      print_event_1 ("#<dnd-drop-event ", obj, printcharfun);
-      break;
-#endif
     default:
 	write_c_string ("#<UNKNOWN-EVENT-TYPE", printcharfun);
 	break;
@@ -264,6 +252,15 @@
 	      e1->event.motion.y == e2->event.motion.y);
 
     case misc_user_event:
+      return (internal_equal (e1->event.eval.function,
+			      e2->event.eval.function, 0) &&
+	      internal_equal (e1->event.eval.object,
+			      e2->event.eval.object, 0) &&
+	      /* is this really needed for equality
+	         or is x and y also important? */
+	      e1->event.misc.button    == e2->event.misc.button &&
+	      e1->event.misc.modifiers == e2->event.misc.modifiers);
+
     case eval_event:
       return (internal_equal (e1->event.eval.function,
 			      e2->event.eval.function, 0) &&
@@ -276,13 +273,6 @@
 	      internal_equal (e1->event.magic_eval.object,
 			      e2->event.magic_eval.object, 0));
 
-#if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
-    case dnd_drop_event:
-      return (e1->event.dnd_drop.button    == e2->event.dnd_drop.button &&
-	      e1->event.dnd_drop.modifiers == e2->event.dnd_drop.modifiers &&
-	      EQ (e1->event.dnd_drop.data, e2->event.dnd_drop.data));
-#endif
-
     case magic_event:
       {
 	struct console *con = XCONSOLE (CDFW_CONSOLE (e1->channel));
@@ -344,6 +334,10 @@
       return HASH3 (hash, e->event.motion.x, e->event.motion.y);
 
     case misc_user_event:
+      return HASH5 (hash, internal_hash (e->event.misc.function, depth + 1),
+		    internal_hash (e->event.misc.object, depth + 1),
+		    e->event.misc.button, e->event.misc.modifiers);
+
     case eval_event:
       return HASH3 (hash, internal_hash (e->event.eval.function, depth + 1),
 		    internal_hash (e->event.eval.object, depth + 1));
@@ -353,12 +347,6 @@
 		    (unsigned long) e->event.magic_eval.internal_function,
 		    internal_hash (e->event.magic_eval.object, depth + 1));
 
-#if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
-    case dnd_drop_event:
-      return HASH4 (hash, e->event.dnd_drop.button, e->event.dnd_drop.modifiers,
-		    LISP_HASH(e->event.dnd_drop.data));
-#endif
-
     case magic_event:
       {
 	struct console *con = XCONSOLE (CDFW_CONSOLE (EVENT_CHANNEL (e)));
@@ -396,7 +384,7 @@
 Return a new event of type TYPE, with properties described by PLIST.
 
 TYPE is a symbol, either `empty', `key-press', `button-press',
- `button-release', `motion' or `dnd-drop'.  If TYPE is nil, it
+ `button-release', or `motion'.  If TYPE is nil, it
  defaults to `empty'.
 
 PLIST is a property list, the properties being compatible to those
@@ -404,27 +392,24 @@
  allowed:
 
  channel	-- The event channel, a frame or a console.  For
-		   button-press, button-release, motion and dnd-drop
-		   events, this must be a frame.  For key-press
+		   button-press, button-release, motion events,
+		   this must be a frame.  For key-press
 		   events, it must be a console.  If channel is
 		   unspecified, it will be set to the selected frame
 		   or selected console, as appropriate.
  key		-- The event key, a symbol or character.  Allowed only for
 		   keypress events.
  button		-- The event button, integer 1, 2 or 3.  Allowed for
-		   button-press, button-release and dnd-drag events.
+		   button-press, button-release and misc-user events.
  modifiers	-- The event modifiers, a list of modifier symbols.  Allowed
 		   for key-press, button-press, button-release, motion and
-		   dnd-drop events.
+		   misc-user events.
  x		-- The event X coordinate, an integer.  This is relative
 		   to the left of CHANNEL's root window.  Allowed for
-		   motion, button-press, button-release and dnd-drop events.
+		   motion, button-press, button-release and misc-user events.
  y		-- The event Y coordinate, an integer.  This is relative
 		   to the top of CHANNEL's root window.  Allowed for
-		   motion, button-press, button-release and dnd-drop events.
- dnd-data	-- The event DND data, a list of (INTEGER DATA).  Allowed
-		   for dnd-drop events, if support for DND has been
-		   compiled into XEmacs.
+		   motion, button-press, button-release and misc-user events.
  timestamp	-- The event timestamp, a non-negative integer.  Allowed for
 		   all types of events.  If unspecified, it will be set to 0
 		   by default.
@@ -443,12 +428,11 @@
 {
   Lisp_Object tail, keyword, value;
   Lisp_Object event = Qnil;
-  Lisp_Object dnd_data = Qnil;
   struct Lisp_Event *e;
   EMACS_INT coord_x = 0, coord_y = 0;
-  struct gcpro gcpro1, gcpro2;
+  struct gcpro gcpro1;
 
-  GCPRO2 (event, dnd_data);
+  GCPRO1 (event);
 
   if (NILP (type))
     type = Qempty;
@@ -493,13 +477,6 @@
       e->event_type = misc_user_event;
       e->event.eval.function = e->event.eval.object = Qnil;
     }
-#if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
-  else if (EQ (type, Qdnd_drop))
-    {
-      e->event_type = dnd_drop_event;
-      e->event.dnd_drop.data = Qnil;
-    }
-#endif
   else
     {
       /* Not allowed: Qprocess, Qtimeout, Qmagic, Qeval, Qmagic_eval.  */
@@ -542,13 +519,17 @@
       else if (EQ (keyword, Qbutton))
 	{
 	  if (e->event_type != button_press_event
-	      && e->event_type != button_release_event)
+	      && e->event_type != button_release_event
+	      && e->event_type != misc_user_event)
 	    {
 	      WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword);
 	    }
 	  CHECK_NATNUM (value);
 	  check_int_range (XINT (value), 0, 7);
-	  e->event.button.button = XINT (value);
+	  if (e->event_type == misc_user_event)
+	    e->event.misc.button = XINT (value);
+	  else
+	    e->event.button.button = XINT (value);
 	}
       else if (EQ (keyword, Qmodifiers))
 	{
@@ -558,7 +539,8 @@
 	  if (e->event_type != key_press_event
 	      && e->event_type != button_press_event
 	      && e->event_type != button_release_event
-	      && e->event_type != pointer_motion_event)
+	      && e->event_type != pointer_motion_event
+	      && e->event_type != misc_user_event)
 	    {
 	      WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword);
 	    }
@@ -581,14 +563,17 @@
 	  else if (e->event_type == button_press_event
 		   || e->event_type == button_release_event)
 	    e->event.button.modifiers = modifiers;
-	  else /* pointer_motion_event */
+	  else if (e->event_type == pointer_motion_event)
 	    e->event.motion.modifiers = modifiers;
+	  else /* misc_user_event */
+	    e->event.misc.modifiers = modifiers;
 	}
       else if (EQ (keyword, Qx))
 	{
 	  if (e->event_type != pointer_motion_event
 	      && e->event_type != button_press_event
-	      && e->event_type != button_release_event)
+	      && e->event_type != button_release_event
+	      && e->event_type != misc_user_event)
 	    {
 	      WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword);
 	    }
@@ -601,7 +586,8 @@
 	{
 	  if (e->event_type != pointer_motion_event
 	      && e->event_type != button_press_event
-	      && e->event_type != button_release_event)
+	      && e->event_type != button_release_event
+	      && e->event_type != misc_user_event)
 	    {
 	      WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword);
 	    }
@@ -626,34 +612,6 @@
 	    WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword);
 	  e->event.eval.object = value;
 	}
-#if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
-      else if (EQ (keyword, Qdnd_data))
-	{
-	  if (e->event_type != dnd_drop_event)
-	    WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword);
-
-	  /* Value is either nil, or a list of (TYPE DATA).  TYPE is
-             an integer.  DATA is a list. */
-	  if (!NILP (value))
-	    {
-	      Lisp_Object dnd_tail;
-	      CHECK_CONS (value);
-	      /* To be changed to CHECK_SYMBOL. */
-	      CHECK_NATNUM (XCAR (value));
-	      CHECK_CONS (XCDR (value));
-	      if (XINT (Flength (value)) != 2)
-		signal_simple_error ("Data should be a two-element list", value);
-	      /* Check validity of DATA.  */
-	      EXTERNAL_LIST_LOOP (dnd_tail, XCAR (XCDR (value)))
-		{
-		  /* Every element must be a string. */
-		  CHECK_STRING (XCAR (dnd_tail));
-		}
-	      /* And now, copy it all to avoid corruption later.  */
-	      e->event.dnd_drop.data = Fcopy_tree (value, Qnil);
-	    }
-	}
-#endif /* HAVE_OFFIX_DND || HAVE_MS_WINDOWS */
       else
 	signal_simple_error_2 ("Invalid property", keyword, value);
     }
@@ -672,10 +630,7 @@
   if (e->event_type == pointer_motion_event
       || e->event_type == button_press_event
       || e->event_type == button_release_event
-#if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
-      || e->event_type == dnd_drop_event
-#endif
-      )
+      || e->event_type == misc_user_event)
     {
       struct frame *f = XFRAME (EVENT_CHANNEL (e));
 
@@ -688,15 +643,16 @@
 	  e->event.motion.y = coord_y;
 	}
       else if (e->event_type == button_press_event
-	       || e->event_type == button_release_event
-#if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
-	       || e->event_type == dnd_drop_event
-#endif
-	       )
+	       || e->event_type == button_release_event)
 	{
 	  e->event.button.x = coord_x;
 	  e->event.button.y = coord_y;
 	}
+      else if (e->event_type == misc_user_event)
+	{
+	  e->event.misc.x = coord_x;
+	  e->event.misc.y = coord_y;
+	}
     }
 
   /* Finally, do some more validation.  */
@@ -709,20 +665,14 @@
       break;
     case button_press_event:
     case button_release_event:
-#if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
-    case dnd_drop_event:
-#endif
       if (!e->event.button.button)
 	error ("Undefined button for %s event",
 	       e->event_type == button_press_event
-	       ? "buton-press" :
-#if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
-	       e->event_type == button_release_event
-	       ? "button-release" : "dnd-drop"
-#else
-	       "button-release"
-#endif
-	       );
+	       ? "buton-press" : "button-release");
+      break;
+    case misc_user_event:
+      if (!e->event.misc.button)
+	error ("Undefined button for misc-user event");
       break;
     default:
       break;
@@ -977,9 +927,6 @@
     case button_press_event:
     case button_release_event:
     case misc_user_event:
-#if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
-    case dnd_drop_event:
-#endif
       return 1;
     default:
       return 0;
@@ -1249,9 +1196,6 @@
   int mouse_p = 0;
   int mod = 0;
   Lisp_Object key;
-#if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
-  int dnd_p = 0;
-#endif
 
   switch (event->event_type)
     {
@@ -1296,15 +1240,6 @@
 	else strcpy (buf, "???");
 	return;
       }
-#if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
-    case dnd_drop_event:
-      {
-	dnd_p++;
-        mod = event->event.dnd_drop.modifiers;
-        key = make_char (event->event.dnd_drop.button + '0');
-        break;
-      }
-#endif
     case magic_eval_event:	strcpy (buf, "magic-eval"); return;
     case pointer_motion_event:	strcpy (buf, "motion");	    return;
     case misc_user_event:	strcpy (buf, "misc-user");  return;
@@ -1330,14 +1265,6 @@
       --mouse_p;
     }
 
-#if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
-  switch (dnd_p)
-    {
-    case 1:
-      modprint1 ("drop");
-    }
-#endif
-
 #undef modprint
 #undef modprint1
 
@@ -1473,9 +1400,6 @@
     case process_event:		return Qprocess;
     case timeout_event:		return Qtimeout;
     case eval_event:		return Qeval;
-#if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
-    case dnd_drop_event:	return Qdnd_drop;
-#endif
     case magic_event:
     case magic_eval_event:
       return Qmagic;
@@ -1515,6 +1439,14 @@
     e = wrong_type_argument ((sym),(e));	\
 } while (0)
 
+#define CHECK_EVENT_TYPE3(e,t1,t2,t3,sym) do {	\
+  CHECK_LIVE_EVENT (e);				\
+  if (XEVENT(e)->event_type != (t1) &&		\
+      XEVENT(e)->event_type != (t2) &&		\
+      XEVENT(e)->event_type != (t3))		\
+    e = wrong_type_argument ((sym),(e));	\
+} while (0)
+
 DEFUN ("event-key", Fevent_key, 1, 1, 0, /*
 Return the Keysym of the key-press event EVENT.
 This will be a character if the event is associated with one, else a symbol.
@@ -1530,30 +1462,18 @@
 */
        (event))
 {
-#if !defined(HAVE_OFFIX_DND) && !defined(HAVE_MS_WINDOWS)
 
-  CHECK_EVENT_TYPE2 (event, button_press_event, button_release_event,
-		     Qbutton_event_p);
+  CHECK_EVENT_TYPE3 (event, button_press_event, button_release_event,
+		     misc_user_event, Qbutton_event_p);
 #ifdef HAVE_WINDOW_SYSTEM
-  return make_int (XEVENT (event)->event.button.button);
+  if ( XEVENT (event)->event_type == misc_user_event)
+    return make_int (XEVENT (event)->event.misc.button);
+  else
+    return make_int (XEVENT (event)->event.button.button);
 #else /* !HAVE_WINDOW_SYSTEM */
   return Qzero;
 #endif /* !HAVE_WINDOW_SYSTEM */
 
-#else /* HAVE_OFFIX_DND || HAVE_MS_WINDOWS */
-
-  CHECK_LIVE_EVENT (event);
-  if (XEVENT(event)->event_type == (button_press_event) ||
-      XEVENT(event)->event_type == (button_release_event))
-    /* we always have X if we have OffiX !! */
-    return make_int (XEVENT (event)->event.button.button);
-  else if (XEVENT(event)->event_type == (dnd_drop_event))
-    /* we always have X if we have OffiX !! */
-    return make_int (XEVENT (event)->event.button.button);
-  else
-    return wrong_type_argument ((Qbutton_event_p),(event));
-
-#endif
 }
 
 DEFUN ("event-modifier-bits", Fevent_modifier_bits, 1, 1, 0, /*
@@ -1574,10 +1494,8 @@
       return make_int (XEVENT (event)->event.button.modifiers);
     case pointer_motion_event:
       return make_int (XEVENT (event)->event.motion.modifiers);
-#if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
-    case dnd_drop_event:
-      return make_int (XEVENT (event)->event.dnd_drop.modifiers);
-#endif
+    case misc_user_event:
+      return make_int (XEVENT (event)->event.misc.modifiers);
     default:
       event = wrong_type_argument (intern ("key-or-mouse-event-p"), event);
       goto again;
@@ -1619,13 +1537,11 @@
       *x = XEVENT (event)->event.button.x;
       *y = XEVENT (event)->event.button.y;
     }
-#if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
-  else if (XEVENT (event)->event_type == dnd_drop_event)
+  else if (XEVENT (event)->event_type == misc_user_event)
     {
-      *x = XEVENT (event)->event.dnd_drop.x;
-      *y = XEVENT (event)->event.dnd_drop.y;
+      *x = XEVENT (event)->event.misc.x;
+      *y = XEVENT (event)->event.misc.y;
     }
-#endif
   else
     return 0;
 
@@ -1776,12 +1692,10 @@
       pix_x = XEVENT (event)->event.button.x;
       pix_y = XEVENT (event)->event.button.y;
       break;
-#if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
-    case dnd_drop_event :
-      pix_x = XEVENT (event)->event.dnd_drop.x;
-      pix_y = XEVENT (event)->event.dnd_drop.y;
+    case misc_user_event :
+      pix_x = XEVENT (event)->event.misc.x;
+      pix_y = XEVENT (event)->event.misc.y;
       break;
-#endif
     default:
       dead_wrong_type_argument (Qmouse_event_p, event);
     }
@@ -2103,6 +2017,7 @@
     case timeout_event:
       return XEVENT (event)->event.timeout.function;
     case misc_user_event:
+      return XEVENT (event)->event.misc.function;
     case eval_event:
       return XEVENT (event)->event.eval.function;
     default:
@@ -2124,6 +2039,7 @@
     case timeout_event:
       return XEVENT (event)->event.timeout.object;
     case misc_user_event:
+      return XEVENT (event)->event.misc.object;
     case eval_event:
       return XEVENT (event)->event.eval.object;
     default:
@@ -2132,28 +2048,6 @@
     }
 }
 
-DEFUN ("event-drag-and-drop-data", Fevent_drag_and_drop_data, 1, 1, 0, /*
-Return the Dnd data list of EVENT.
-EVENT should be a dnd_drop event.
-*/
-       (event))
-{
-#if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
- again:
-  CHECK_LIVE_EVENT (event);
-  switch (XEVENT (event)->event_type)
-    {
-    case dnd_drop_event:
-      return XEVENT (event)->event.dnd_drop.data;
-    default:
-      event = wrong_type_argument (Qdnd_drop_event_p, event);
-      goto again;
-    }
-#else /* !(HAVE_OFFIX_DND || HAVE_MS_WINDOWS) */
-  return Qnil;
-#endif /* HAVE_OFFIX_DND || HAVE_MS_WINDOWS */
-}
-
 DEFUN ("event-properties", Fevent_properties, 1, 1, 0, /*
 Return a list of all of the properties of EVENT.
 This is in the form of a property list (alternating keyword/value pairs).
@@ -2202,21 +2096,19 @@
       break;
 
     case misc_user_event:
+      props = cons3 (Qobject,	 Fevent_object	(event), props);
+      props = cons3 (Qfunction,  Fevent_function (event), props);
+      props = cons3 (Qy,	 Fevent_y_pixel	  (event), props);
+      props = cons3 (Qx,	 Fevent_x_pixel	  (event), props);
+      props = cons3 (Qmodifiers, Fevent_modifiers (event), props);
+      props = cons3 (Qbutton,	 Fevent_button	  (event), props);
+      break;
+
     case eval_event:
       props = cons3 (Qobject,	Fevent_object	(event), props);
       props = cons3 (Qfunction, Fevent_function (event), props);
       break;
 
-#if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
-    case dnd_drop_event:
-      props = cons3 (Qy,	 Fevent_y_pixel	  (event),	    props);
-      props = cons3 (Qx,	 Fevent_x_pixel	  (event),	    props);
-      props = cons3 (Qmodifiers, Fevent_modifiers (event),	    props);
-      props = cons3 (Qbutton,	 Fevent_button	  (event),	    props);
-      props = cons3 (Qdnd_data,	 Fevent_drag_and_drop_data (event), props);
-      break;
-#endif
-
     case magic_eval_event:
     case magic_event:
       break;
@@ -2283,7 +2175,6 @@
   DEFSUBR (Fevent_process);
   DEFSUBR (Fevent_function);
   DEFSUBR (Fevent_object);
-  DEFSUBR (Fevent_drag_and_drop_data);
 
   defsymbol (&Qeventp, "eventp");
   defsymbol (&Qevent_live_p, "event-live-p");
@@ -2296,10 +2187,6 @@
   defsymbol (&Qbutton_release, "button-release");
   defsymbol (&Qmisc_user, "misc-user");
   defsymbol (&Qascii_character, "ascii-character");
-#if defined(HAVE_OFFIX_DND) || defined(HAVE_MS_WINDOWS)
-  defsymbol (&Qdnd_drop_event_p, "dnd-drop-event-p");
-  defsymbol (&Qdnd_drop, "dnd-drop");
-#endif
 }
 
 void