changeset 21888:6ce89105f98f

(Qdrag_n_drop, drag_n_drop_syms, lispy_drag_n_drop_names): New variables. (make_lispy_event): Handle drag_n_drop events. (syms_of_keyboard): Initialize new symbols.
author Richard M. Stallman <rms@gnu.org>
date Fri, 01 May 1998 04:51:51 +0000
parents 1c9f20274f76
children 93207874c93c
files src/keyboard.c
diffstat 1 files changed, 87 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/keyboard.c	Fri May 01 04:51:20 1998 +0000
+++ b/src/keyboard.c	Fri May 01 04:51:51 1998 +0000
@@ -451,6 +451,7 @@
 #ifdef WINDOWSNT
 Lisp_Object Qmouse_wheel;
 #endif
+Lisp_Object Qdrag_n_drop;
 /* Lisp_Object Qmouse_movement; - also an event header */
 
 /* Properties of event headers.  */
@@ -3291,6 +3292,7 @@
 #ifdef WINDOWSNT
 static Lisp_Object mouse_wheel_syms;
 #endif
+static Lisp_Object drag_n_drop_syms;
 
 /* This is a list of keysym codes for special "accent" characters.
    It parallels lispy_accent_keys.  */
@@ -3722,8 +3724,16 @@
 {
   "mouse-wheel"
 };
+
 #endif /* WINDOWSNT */
 
+/* drag-n-drop events are generated when a set of selected files are
+   dragged from another application and dropped onto an Emacs window.  */
+static char *lispy_drag_n_drop_names[] =
+{
+  "drag-n-drop"
+};
+
 /* Scroll bar parts.  */
 Lisp_Object Qabove_handle, Qhandle, Qbelow_handle;
 Lisp_Object Qup, Qdown;
@@ -4216,6 +4226,78 @@
 	}
       }
 #endif /* WINDOWSNT */
+
+    case drag_n_drop:
+      {
+	int part;
+	FRAME_PTR f;
+	Lisp_Object window;
+	Lisp_Object posn;
+	Lisp_Object head, position;
+	Lisp_Object files;
+	int row, column;
+
+	/* The frame_or_window field should be a cons of the frame in
+	   which the event occurred and a list of the filenames
+	   dropped.  */
+	if (! CONSP (event->frame_or_window))
+	  abort ();
+
+	f = XFRAME (XCONS (event->frame_or_window)->car);
+	files = XCONS (event->frame_or_window)->cdr;
+
+	/* Ignore mouse events that were made on frames that
+	   have been deleted.  */
+	if (! FRAME_LIVE_P (f))
+	  return Qnil;
+	pixel_to_glyph_coords (f, XINT (event->x), XINT (event->y),
+			       &column, &row, NULL, 1);
+	window = window_from_coordinates (f, column, row, &part);
+
+	if (!WINDOWP (window))
+	  {
+	    window = XCONS (event->frame_or_window)->car;
+	    posn = Qnil;
+	  }
+	else
+	  {
+	    int pixcolumn, pixrow;
+	    column -= XINT (XWINDOW (window)->left);
+	    row -= XINT (XWINDOW (window)->top);
+	    glyph_to_pixel_coords (f, column, row, &pixcolumn, &pixrow);
+	    XSETINT (event->x, pixcolumn);
+	    XSETINT (event->y, pixrow);
+
+	    if (part == 1)
+	      posn = Qmode_line;
+	    else if (part == 2)
+	      posn = Qvertical_line;
+	    else
+	      XSETINT (posn,
+		       buffer_posn_from_coords (XWINDOW (window),
+						column, row));
+	  }
+
+	{
+	  Lisp_Object head, position;
+
+	  position
+	    = Fcons (window,
+		     Fcons (posn,
+			    Fcons (Fcons (event->x, event->y),
+				   Fcons (make_number (event->timestamp),
+					  Qnil))));
+
+	  head = modify_event_symbol (0, event->modifiers,
+				      Qdrag_n_drop, Qnil,
+				      lispy_drag_n_drop_names,
+				      &drag_n_drop_syms, 1);
+	  return Fcons (head,
+			Fcons (position,
+			       Fcons (files,
+				      Qnil)));
+	}
+      }
 #endif /* HAVE_MOUSE */
 
 #if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI)
@@ -8553,6 +8635,8 @@
   Qmouse_wheel = intern ("mouse-wheel");
   staticpro (&Qmouse_wheel);
 #endif
+  Qdrag_n_drop = intern ("drag-n-drop");
+  staticpro (&Qdrag_n_drop);
 
   Qmenu_enable = intern ("menu-enable");
   staticpro (&Qmenu_enable);
@@ -8666,6 +8750,9 @@
 #ifdef WINDOWSNT
   mouse_wheel_syms = Qnil;
   staticpro (&mouse_wheel_syms);
+  
+  drag_n_drop_syms = Qnil;
+  staticpro (&drag_n_drop_syms);
 #endif
 
   unread_switch_frame = Qnil;