X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fevents.c;h=f4648f5a4c1561ac7f075d9d969c069424967f65;hb=5577db7627bf804df58229595b58f071292ad032;hp=57270376d7b6437150e955c67847f72d72533fd3;hpb=6883ee56ec887c2c48abe5b06b5e66aa74031910;p=chise%2Fxemacs-chise.git.1 diff --git a/src/events.c b/src/events.c index 5727037..f4648f5 100644 --- a/src/events.c +++ b/src/events.c @@ -81,51 +81,51 @@ static void deinitialize_event (Lisp_Object ev) { int i; - struct Lisp_Event *event = XEVENT (ev); + Lisp_Event *event = XEVENT (ev); - for (i = 0; i < (int) (sizeof (struct Lisp_Event) / sizeof (int)); i++) + for (i = 0; i < (int) (sizeof (Lisp_Event) / sizeof (int)); i++) ((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); } /* Set everything to zero or nil so that it's predictable. */ void -zero_event (struct Lisp_Event *e) +zero_event (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); + 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 #"); + error ("Printing unreadable object #"); 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, "#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,32 +286,29 @@ 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 + abort (); return 1; /* not reached */ } case empty_event: /* Empty and deallocated events are equal. */ case dead_event: return 1; - - default: - abort (); - return 0; /* not reached; warning suppression */ } } static unsigned long event_hash (Lisp_Object obj, int depth) { - struct Lisp_Event *e = XEVENT (obj); + Lisp_Event *e = XEVENT (obj); unsigned long hash; hash = HASH2 (e->event_type, LISP_HASH (e->channel)); @@ -362,6 +361,8 @@ event_hash (Lisp_Object obj, int depth) if (CONSOLE_MSWINDOWS_P (con)) return HASH2 (hash, e->event.magic.underlying_mswindows_event); #endif + abort (); + return 0; } case empty_event: @@ -377,7 +378,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, Lisp_Event); DEFUN ("make-event", Fmake_event, 0, 2, 0, /* @@ -430,7 +431,7 @@ WARNING: the event object returned may be a reused one; see the function { Lisp_Object tail, keyword, value; Lisp_Object event = Qnil; - struct Lisp_Event *e; + Lisp_Event *e; EMACS_INT coord_x = 0, coord_y = 0; struct gcpro gcpro1; @@ -512,45 +513,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 +561,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 +624,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 +661,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 (f); - coord_y += FRAME_REAL_TOP_TOOLBAR_HEIGHT (f); + coord_x += FRAME_REAL_LEFT_TOOLBAR_WIDTH (XFRAME (EVENT_CHANNEL (e))); + coord_y += FRAME_REAL_TOP_TOOLBAR_HEIGHT (XFRAME (EVENT_CHANNEL (e))); - 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 +690,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 +766,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 +774,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; } } @@ -937,7 +973,7 @@ command_event_p (Lisp_Object event) void -character_to_event (Emchar c, struct Lisp_Event *event, struct console *con, +character_to_event (Emchar c, Lisp_Event *event, struct console *con, int use_console_meta_flag, int do_backspace_mapping) { Lisp_Object k = Qnil; @@ -989,7 +1025,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; @@ -1006,17 +1042,18 @@ character_to_event (Emchar c, struct Lisp_Event *event, struct console *con, event->event.key.modifiers = m; } - /* This variable controls what character name -> character code mapping we are using. Window-system-specific code sets this to some symbol, and we use that symbol as the plist key to convert keysyms into 8-bit codes. In this way one can have several character sets predefined and switch them by changing this. + + #### This is utterly bogus and should be removed. */ Lisp_Object Vcharacter_set_property; Emchar -event_to_character (struct Lisp_Event *event, +event_to_character (Lisp_Event *event, int allow_extra_modifiers, int allow_meta, int allow_non_ascii) @@ -1026,7 +1063,7 @@ event_to_character (struct Lisp_Event *event, if (event->event_type != key_press_event) { - if (event->event_type == dead_event) abort (); + assert (event->event_type != dead_event); return -1; } if (!allow_extra_modifiers && @@ -1193,7 +1230,7 @@ key_sequence_to_event_chain (Lisp_Object seq) } void -format_event_object (char *buf, struct Lisp_Event *event, int brief) +format_event_object (char *buf, Lisp_Event *event, int brief) { int mouse_p = 0; int mod = 0; @@ -1253,8 +1290,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-"); @@ -1296,7 +1333,7 @@ format_event_object (char *buf, struct Lisp_Event *event, int brief) } else { - struct Lisp_String *name = XSYMBOL (key)->name; + Lisp_String *name = XSYMBOL (key)->name; memcpy (buf, string_data (name), string_length (name) + 1); str += string_length (name); } @@ -1332,7 +1369,7 @@ The `next-event' field is changed by calling `set-next-event'. */ (event)) { - struct Lisp_Event *e; + Lisp_Event *e; CHECK_LIVE_EVENT (event); return XEVENT_NEXT (event); @@ -1429,22 +1466,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, /* @@ -2066,7 +2109,7 @@ This is in the form of a property list (alternating keyword/value pairs). (event)) { Lisp_Object props = Qnil; - struct Lisp_Event *e; + Lisp_Event *e; struct gcpro gcpro1; CHECK_LIVE_EVENT (event); @@ -2077,6 +2120,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 +2172,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 +2240,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 +2271,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); }