XEmacs 21.2.24 "Hecate".
[chise/xemacs-chise.git.1] / src / events.c
index 5727037..7bb19c4 100644 (file)
@@ -87,7 +87,7 @@ deinitialize_event (Lisp_Object ev)
     ((int *) event) [i] = 0xdeadbeef;
   event->event_type = dead_event;
   event->channel = Qnil;
-  set_lheader_implementation (&(event->lheader), lrecord_event);
+  set_lheader_implementation (&(event->lheader), &lrecord_event);
   XSET_EVENT_NEXT (ev, Qnil);
 }
 
@@ -96,36 +96,36 @@ void
 zero_event (struct Lisp_Event *e)
 {
   xzero (*e);
-  set_lheader_implementation (&(e->lheader), lrecord_event);
+  set_lheader_implementation (&(e->lheader), &lrecord_event);
   e->event_type = empty_event;
   e->next = Qnil;
   e->channel = Qnil;
 }
 
 static Lisp_Object
-mark_event (Lisp_Object obj, void (*markobj) (Lisp_Object))
+mark_event (Lisp_Object obj)
 {
   struct Lisp_Event *event = XEVENT (obj);
 
   switch (event->event_type)
     {
     case key_press_event:
-      ((markobj) (event->event.key.keysym));
+      mark_object (event->event.key.keysym);
       break;
     case process_event:
-      ((markobj) (event->event.process.process));
+      mark_object (event->event.process.process);
       break;
     case timeout_event:
-      ((markobj) (event->event.timeout.function));
-      ((markobj) (event->event.timeout.object));
+      mark_object (event->event.timeout.function);
+      mark_object (event->event.timeout.object);
       break;
     case eval_event:
     case misc_user_event:
-      ((markobj) (event->event.eval.function));
-      ((markobj) (event->event.eval.object));
+      mark_object (event->event.eval.function);
+      mark_object (event->event.eval.object);
       break;
     case magic_eval_event:
-      ((markobj) (event->event.magic_eval.object));
+      mark_object (event->event.magic_eval.object);
       break;
     case button_press_event:
     case button_release_event:
@@ -137,7 +137,7 @@ mark_event (Lisp_Object obj, void (*markobj) (Lisp_Object))
     default:
       abort ();
     }
-  ((markobj) (event->channel));
+  mark_object (event->channel);
   return event->next;
 }
 
@@ -154,7 +154,7 @@ static void
 print_event (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
 {
   if (print_readably)
-    error ("printing unreadable object #<event>");
+    error ("Printing unreadable object #<event>");
 
   switch (XEVENT (obj)->event_type)
     {
@@ -179,7 +179,7 @@ print_event (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
        assert (INTP (Vx));
        Vy = Fevent_y_pixel (obj);
        assert (INTP (Vy));
-       sprintf (buf, "#<motion-event %ld, %ld", (long)(XINT (Vx)), (long)(XINT (Vy)));
+       sprintf (buf, "#<motion-event %ld, %ld", (long) XINT (Vx), (long) XINT (Vy));
        write_c_string (buf, printcharfun);
        break;
       }
@@ -219,16 +219,18 @@ print_event (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
 }
 
 static int
-event_equal (Lisp_Object o1, Lisp_Object o2, int depth)
+event_equal (Lisp_Object obj1, Lisp_Object obj2, int depth)
 {
-  struct Lisp_Event *e1 = XEVENT (o1);
-  struct Lisp_Event *e2 = XEVENT (o2);
+  struct Lisp_Event *e1 = XEVENT (obj1);
+  struct Lisp_Event *e2 = XEVENT (obj2);
 
   if (e1->event_type != e2->event_type) return 0;
   if (!EQ (e1->channel, e2->channel)) return 0;
 /*  if (e1->timestamp != e2->timestamp) return 0; */
   switch (e1->event_type)
     {
+    default: abort ();
+
     case process_event:
       return EQ (e1->event.process.process, e2->event.process.process);
 
@@ -284,14 +286,14 @@ event_equal (Lisp_Object o1, Lisp_Object o2, int depth)
 #endif
 #ifdef HAVE_TTY
        if (CONSOLE_TTY_P (con))
-       return (e1->event.magic.underlying_tty_event ==
-               e2->event.magic.underlying_tty_event);
+         return (e1->event.magic.underlying_tty_event ==
+                 e2->event.magic.underlying_tty_event);
 #endif
 #ifdef HAVE_MS_WINDOWS
        if (CONSOLE_MSWINDOWS_P (con))
-       return (!memcmp(&e1->event.magic.underlying_mswindows_event,
-               &e2->event.magic.underlying_mswindows_event,
-               sizeof(union magic_data)));
+         return (!memcmp(&e1->event.magic.underlying_mswindows_event,
+                         &e2->event.magic.underlying_mswindows_event,
+                         sizeof(union magic_data)));
 #endif
        return 1; /* not reached */
       }
@@ -299,10 +301,6 @@ event_equal (Lisp_Object o1, Lisp_Object o2, int depth)
     case empty_event:      /* Empty and deallocated events are equal. */
     case dead_event:
       return 1;
-
-    default:
-      abort ();
-      return 0;                 /* not reached; warning suppression */
     }
 }
 
@@ -377,7 +375,7 @@ event_hash (Lisp_Object obj, int depth)
 
 DEFINE_BASIC_LRECORD_IMPLEMENTATION ("event", event,
                                     mark_event, print_event, 0, event_equal,
-                                    event_hash, struct Lisp_Event);
+                                    event_hash, 0, struct Lisp_Event);
 
 \f
 DEFUN ("make-event", Fmake_event, 0, 2, 0, /*
@@ -512,45 +510,45 @@ WARNING: the event object returned may be a reused one; see the function
        }
       else if (EQ (keyword, Qkey))
        {
-         if (e->event_type != key_press_event)
-           WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword);
-         if (!SYMBOLP (value) && !CHARP (value))
-           signal_simple_error ("Invalid event key", value);
-         e->event.key.keysym = value;
+         switch (e->event_type)
+           {
+           case key_press_event:
+             if (!SYMBOLP (value) && !CHARP (value))
+               signal_simple_error ("Invalid event key", value);
+             e->event.key.keysym = value;
+             break;
+           default:
+             WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword);
+             break;
+           }
        }
       else if (EQ (keyword, Qbutton))
        {
-         if (e->event_type != button_press_event
-             && e->event_type != button_release_event
-             && e->event_type != misc_user_event)
+         CHECK_NATNUM (value);
+         check_int_range (XINT (value), 0, 7);
+
+         switch (e->event_type)
            {
+           case button_press_event:
+           case button_release_event:
+             e->event.button.button = XINT (value);
+             break;
+           case misc_user_event:
+             e->event.misc.button = XINT (value);
+             break;
+           default:
              WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword);
+             break;
            }
-         CHECK_NATNUM (value);
-         check_int_range (XINT (value), 0, 7);
-         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))
        {
-         Lisp_Object modtail;
          int modifiers = 0;
+         Lisp_Object sym;
 
-         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 != misc_user_event)
+         EXTERNAL_LIST_LOOP_2 (sym, value)
            {
-             WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword);
-           }
-
-         EXTERNAL_LIST_LOOP (modtail, value)
-           {
-             Lisp_Object sym = XCAR (modtail);
-             if (EQ (sym, Qcontrol))      modifiers |= MOD_CONTROL;
+             if      (EQ (sym, Qcontrol)) modifiers |= MOD_CONTROL;
              else if (EQ (sym, Qmeta))    modifiers |= MOD_META;
              else if (EQ (sym, Qsuper))   modifiers |= MOD_SUPER;
              else if (EQ (sym, Qhyper))   modifiers |= MOD_HYPER;
@@ -560,42 +558,61 @@ WARNING: the event object returned may be a reused one; see the function
              else
                signal_simple_error ("Invalid key modifier", sym);
            }
-         if (e->event_type == key_press_event)
-           e->event.key.modifiers = modifiers;
-         else if (e->event_type == button_press_event
-                  || e->event_type == button_release_event)
-           e->event.button.modifiers = modifiers;
-         else if (e->event_type == pointer_motion_event)
-           e->event.motion.modifiers = modifiers;
-         else /* misc_user_event */
-           e->event.misc.modifiers = modifiers;
+
+         switch (e->event_type)
+           {
+           case key_press_event:
+             e->event.key.modifiers = modifiers;
+             break;
+           case button_press_event:
+           case button_release_event:
+             e->event.button.modifiers = modifiers;
+             break;
+           case pointer_motion_event:
+             e->event.motion.modifiers = modifiers;
+             break;
+           case misc_user_event:
+             e->event.misc.modifiers = modifiers;
+             break;
+           default:
+             WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword);
+             break;
+           }
        }
       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 != misc_user_event)
+         switch (e->event_type)
            {
+           case pointer_motion_event:
+           case button_press_event:
+           case button_release_event:
+           case misc_user_event:
+             /* Allow negative values, so we can specify toolbar
+                positions.  */
+             CHECK_INT (value);
+             coord_x = XINT (value);
+             break;
+           default:
              WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword);
+             break;
            }
-         /* Allow negative values, so we can specify toolbar
-             positions.  */
-         CHECK_INT (value);
-         coord_x = XINT (value);
        }
       else if (EQ (keyword, Qy))
        {
-         if (e->event_type != pointer_motion_event
-             && e->event_type != button_press_event
-             && e->event_type != button_release_event
-             && e->event_type != misc_user_event)
+         switch (e->event_type)
            {
+           case pointer_motion_event:
+           case button_press_event:
+           case button_release_event:
+           case misc_user_event:
+             /* Allow negative values; see above. */
+             CHECK_INT (value);
+             coord_y = XINT (value);
+             break;
+           default:
              WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword);
+             break;
            }
-         /* Allow negative values; see above. */
-         CHECK_INT (value);
-         coord_y = XINT (value);
        }
       else if (EQ (keyword, Qtimestamp))
        {
@@ -604,15 +621,27 @@ WARNING: the event object returned may be a reused one; see the function
        }
       else if (EQ (keyword, Qfunction))
        {
-         if (e->event_type != misc_user_event)
-           WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword);
-         e->event.eval.function = value;
+         switch (e->event_type)
+           {
+           case misc_user_event:
+             e->event.eval.function = value;
+             break;
+           default:
+             WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword);
+             break;
+           }
        }
       else if (EQ (keyword, Qobject))
        {
-         if (e->event_type != misc_user_event)
-           WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword);
-         e->event.eval.object = value;
+         switch (e->event_type)
+           {
+           case misc_user_event:
+             e->event.eval.object = value;
+             break;
+           default:
+             WRONG_EVENT_TYPE_FOR_PROPERTY (type, keyword);
+             break;
+           }
        }
       else
        signal_simple_error_2 ("Invalid property", keyword, value);
@@ -629,31 +658,28 @@ WARNING: the event object returned may be a reused one; see the function
 
   /* Fevent_properties, Fevent_x_pixel, etc. work with pixels relative
      to the frame, so we must adjust accordingly.  */
-  if (e->event_type == pointer_motion_event
-      || e->event_type == button_press_event
-      || e->event_type == button_release_event
-      || e->event_type == misc_user_event)
+  if (FRAMEP (EVENT_CHANNEL (e)))
     {
-      struct frame *f = XFRAME (EVENT_CHANNEL (e));
+      coord_x += FRAME_REAL_LEFT_TOOLBAR_WIDTH (XFRAME (EVENT_CHANNEL (e)));
+      coord_y += FRAME_REAL_TOP_TOOLBAR_HEIGHT (XFRAME (EVENT_CHANNEL (e)));
 
-      coord_x += FRAME_REAL_LEFT_TOOLBAR_WIDTH (f);
-      coord_y += FRAME_REAL_TOP_TOOLBAR_HEIGHT (f);
-
-      if (e->event_type == pointer_motion_event)
+      switch (e->event_type)
        {
+       case pointer_motion_event:
          e->event.motion.x = coord_x;
          e->event.motion.y = coord_y;
-       }
-      else if (e->event_type == button_press_event
-              || e->event_type == button_release_event)
-       {
+         break;
+       case button_press_event:
+       case button_release_event:
          e->event.button.x = coord_x;
          e->event.button.y = coord_y;
-       }
-      else if (e->event_type == misc_user_event)
-       {
+         break;
+       case misc_user_event:
          e->event.misc.x = coord_x;
          e->event.misc.y = coord_y;
+         break;
+       default:
+         abort();
        }
     }
 
@@ -661,20 +687,20 @@ WARNING: the event object returned may be a reused one; see the function
   switch (e->event_type)
     {
     case key_press_event:
-      if (UNBOUNDP (e->event.key.keysym)
-         || !(SYMBOLP (e->event.key.keysym) || CHARP (e->event.key.keysym)))
-       error ("Undefined key for keypress event");
+      if (UNBOUNDP (e->event.key.keysym))
+       error ("A key must be specified to make a keypress event");
       break;
     case button_press_event:
+      if (!e->event.button.button)
+       error ("A button must be specified to make a button-press event");
+      break;
     case button_release_event:
       if (!e->event.button.button)
-       error ("Undefined button for %s event",
-              e->event_type == button_press_event
-              ? "buton-press" : "button-release");
+       error ("A button must be specified to make a button-release event");
       break;
     case misc_user_event:
       if (NILP (e->event.misc.function))
-       error ("Undefined function for misc-user event");
+       error ("A function must be specified to make a misc-user event");
       break;
     default:
       break;
@@ -737,7 +763,7 @@ DEFUN ("copy-event", Fcopy_event, 1, 2, 0, /*
 Make a copy of the given event object.
 If a second argument is given, the first event is copied into the second
 and the second is returned.  If the second argument is not supplied (or
-is nil) then a new event will be made as with `allocate-event.'  See also
+is nil) then a new event will be made as with `make-event'.  See also
 the function `deallocate-event'.
 */
        (event1, event2))
@@ -745,19 +771,26 @@ the function `deallocate-event'.
   CHECK_LIVE_EVENT (event1);
   if (NILP (event2))
     event2 = Fmake_event (Qnil, Qnil);
-  else CHECK_LIVE_EVENT (event2);
-  if (EQ (event1, event2))
-    return signal_simple_continuable_error_2
-      ("copy-event called with `eq' events", event1, event2);
+  else
+    {
+      CHECK_LIVE_EVENT (event2);
+      if (EQ (event1, event2))
+       return signal_simple_continuable_error_2
+         ("copy-event called with `eq' events", event1, event2);
+    }
 
   assert (XEVENT_TYPE (event1) <= last_event_type);
   assert (XEVENT_TYPE (event2) <= last_event_type);
 
   {
-    Lisp_Object save_next = XEVENT_NEXT (event2);
+    Lisp_Event *ev2 = XEVENT (event2);
+    Lisp_Event *ev1 = XEVENT (event1);
+
+    ev2->event_type = ev1->event_type;
+    ev2->channel    = ev1->channel;
+    ev2->timestamp  = ev1->timestamp;
+    ev2->event      = ev1->event;
 
-    *XEVENT (event2) = *XEVENT (event1);
-    XSET_EVENT_NEXT (event2, save_next);
     return event2;
   }
 }
@@ -989,7 +1022,7 @@ character_to_event (Emchar c, struct Lisp_Event *event, struct console *con,
        }
       if (c >= 'A' && c <= 'Z') c -= 'A'-'a';
     }
-#if defined(HAVE_TTY) 
+#if defined(HAVE_TTY)
   else if (do_backspace_mapping &&
           CHARP (con->tty_erase_char) && c == XCHAR (con->tty_erase_char))
     k = QKbackspace;
@@ -1253,8 +1286,8 @@ format_event_object (char *buf, struct Lisp_Event *event, int brief)
     default:
       abort ();
     }
-#define modprint1(x)  { strcpy (buf, (x)); buf += sizeof (x)-1; }
-#define modprint(x,y) { if (brief) modprint1 (y) else modprint1 (x) }
+#define modprint1(x)  do { strcpy (buf, (x)); buf += sizeof (x)-1; } while (0)
+#define modprint(x,y) do { if (brief) modprint1 (y); else modprint1 (x); } while (0)
   if (mod & MOD_CONTROL) modprint ("control-", "C-");
   if (mod & MOD_META)    modprint ("meta-",    "M-");
   if (mod & MOD_SUPER)   modprint ("super-",   "S-");
@@ -1429,22 +1462,28 @@ Return the timestamp of the event object EVENT.
 #define CHECK_EVENT_TYPE(e,t1,sym) do {                \
   CHECK_LIVE_EVENT (e);                                \
   if (XEVENT(e)->event_type != (t1))           \
-    e = wrong_type_argument ((sym),(e));       \
+    e = wrong_type_argument (sym,e);           \
 } while (0)
 
-#define CHECK_EVENT_TYPE2(e,t1,t2,sym) do {    \
-  CHECK_LIVE_EVENT (e);                                \
-  if (XEVENT(e)->event_type != (t1) &&         \
-      XEVENT(e)->event_type != (t2))           \
-    e = wrong_type_argument ((sym),(e));       \
+#define CHECK_EVENT_TYPE2(e,t1,t2,sym) do {            \
+  CHECK_LIVE_EVENT (e);                                        \
+  {                                                    \
+    emacs_event_type CET_type = XEVENT (e)->event_type;        \
+    if (CET_type != (t1) &&                            \
+       CET_type != (t2))                               \
+      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));       \
+#define CHECK_EVENT_TYPE3(e,t1,t2,t3,sym) do {         \
+  CHECK_LIVE_EVENT (e);                                        \
+  {                                                    \
+    emacs_event_type CET_type = XEVENT (e)->event_type;        \
+    if (CET_type != (t1) &&                            \
+       CET_type != (t2) &&                             \
+       CET_type != (t3))                               \
+      e = wrong_type_argument (sym,e);                 \
+  }                                                    \
 } while (0)
 
 DEFUN ("event-key", Fevent_key, 1, 1, 0, /*
@@ -2077,6 +2116,8 @@ This is in the form of a property list (alternating keyword/value pairs).
 
   switch (e->event_type)
     {
+    default: abort ();
+
     case process_event:
       props = cons3 (Qprocess, e->event.process.process, props);
       break;
@@ -2127,10 +2168,6 @@ This is in the form of a property list (alternating keyword/value pairs).
     case empty_event:
       RETURN_UNGCPRO (Qnil);
       break;
-
-    default:
-      abort ();
-      break;                 /* not reached; warning suppression */
     }
 
   props = cons3 (Qchannel, Fevent_channel (event), props);
@@ -2199,11 +2236,28 @@ syms_of_events (void)
   defsymbol (&Qbutton_release, "button-release");
   defsymbol (&Qmisc_user, "misc-user");
   defsymbol (&Qascii_character, "ascii-character");
+
+  defsymbol (&QKbackspace, "backspace");
+  defsymbol (&QKtab, "tab");
+  defsymbol (&QKlinefeed, "linefeed");
+  defsymbol (&QKreturn, "return");
+  defsymbol (&QKescape, "escape");
+  defsymbol (&QKspace, "space");
+  defsymbol (&QKdelete, "delete");
+}
+
+
+void
+reinit_vars_of_events (void)
+{
+  Vevent_resource = Qnil;
 }
 
 void
 vars_of_events (void)
 {
+  reinit_vars_of_events ();
+
   DEFVAR_LISP ("character-set-property", &Vcharacter_set_property /*
 A symbol used to look up the 8-bit character of a keysym.
 To convert a keysym symbol to an 8-bit code, as when that key is
@@ -2213,22 +2267,4 @@ system-specific code will set up appropriate properties and set this
 variable.
 */ );
   Vcharacter_set_property = Qnil;
-
-  Vevent_resource = Qnil;
-
-  QKbackspace = KEYSYM ("backspace");
-  QKtab       = KEYSYM ("tab");
-  QKlinefeed  = KEYSYM ("linefeed");
-  QKreturn    = KEYSYM ("return");
-  QKescape    = KEYSYM ("escape");
-  QKspace     = KEYSYM ("space");
-  QKdelete    = KEYSYM ("delete");
-
-  staticpro (&QKbackspace);
-  staticpro (&QKtab);
-  staticpro (&QKlinefeed);
-  staticpro (&QKreturn);
-  staticpro (&QKescape);
-  staticpro (&QKspace);
-  staticpro (&QKdelete);
 }