comparison src/events.c @ 149:538048ae2ab8 r20-3b1

Import from CVS: tag r20-3b1
author cvs
date Mon, 13 Aug 2007 09:36:16 +0200
parents 9b50b4588a93
children 25f70ba0133c
comparison
equal deleted inserted replaced
148:f659db2a1f73 149:538048ae2ab8
61 Lisp_Object Qkey_press_event_p; 61 Lisp_Object Qkey_press_event_p;
62 Lisp_Object Qbutton_event_p; 62 Lisp_Object Qbutton_event_p;
63 Lisp_Object Qmouse_event_p; 63 Lisp_Object Qmouse_event_p;
64 Lisp_Object Qprocess_event_p; 64 Lisp_Object Qprocess_event_p;
65 65
66 Lisp_Object Qkey_press, Qbutton_press, Qbutton_release, Qmisc_user; 66 Lisp_Object Qkey_press, Qbutton_press, Qbutton_release, Qmisc_user, Qempty;
67 Lisp_Object Qascii_character; 67 Lisp_Object Qascii_character;
68 68
69 /* #### Ad-hoc hack. Should be part of define_lrecord_implementation */ 69 /* #### Ad-hoc hack. Should be part of define_lrecord_implementation */
70 void 70 void
71 clear_event_resource (void) 71 clear_event_resource (void)
183 XEVENT (obj)->event.motion.x, XEVENT (obj)->event.motion.y); 183 XEVENT (obj)->event.motion.x, XEVENT (obj)->event.motion.y);
184 write_c_string (buf, printcharfun); 184 write_c_string (buf, printcharfun);
185 break; 185 break;
186 } 186 }
187 case process_event: 187 case process_event:
188 {
189 write_c_string ("#<process-event ", printcharfun); 188 write_c_string ("#<process-event ", printcharfun);
190 print_internal (XEVENT (obj)->event.process.process, printcharfun, 1); 189 print_internal (XEVENT (obj)->event.process.process, printcharfun, 1);
191 break; 190 break;
192 }
193 case timeout_event: 191 case timeout_event:
194 {
195 write_c_string ("#<timeout-event ", printcharfun); 192 write_c_string ("#<timeout-event ", printcharfun);
196 print_internal (XEVENT (obj)->event.timeout.object, printcharfun, 1); 193 print_internal (XEVENT (obj)->event.timeout.object, printcharfun, 1);
197 break; 194 break;
198 }
199 case empty_event: 195 case empty_event:
200 {
201 write_c_string ("#<empty-event", printcharfun); 196 write_c_string ("#<empty-event", printcharfun);
202 break; 197 break;
203 }
204 case misc_user_event: 198 case misc_user_event:
205 case eval_event: 199 case eval_event:
206 {
207 write_c_string ("#<", printcharfun); 200 write_c_string ("#<", printcharfun);
208 if (XEVENT (obj)->event_type == misc_user_event) 201 if (XEVENT (obj)->event_type == misc_user_event)
209 write_c_string ("misc-user", printcharfun); 202 write_c_string ("misc-user", printcharfun);
210 else 203 else
211 write_c_string ("eval", printcharfun); 204 write_c_string ("eval", printcharfun);
213 print_internal (XEVENT (obj)->event.eval.function, printcharfun, 1); 206 print_internal (XEVENT (obj)->event.eval.function, printcharfun, 1);
214 write_c_string (" ", printcharfun); 207 write_c_string (" ", printcharfun);
215 print_internal (XEVENT (obj)->event.eval.object, printcharfun, 1); 208 print_internal (XEVENT (obj)->event.eval.object, printcharfun, 1);
216 write_c_string (")", printcharfun); 209 write_c_string (")", printcharfun);
217 break; 210 break;
218 }
219 case dead_event: 211 case dead_event:
220 {
221 write_c_string ("#<DEALLOCATED-EVENT", printcharfun); 212 write_c_string ("#<DEALLOCATED-EVENT", printcharfun);
222 break; 213 break;
223 }
224 default: 214 default:
225 {
226 write_c_string ("#<UNKNOWN-EVENT-TYPE", printcharfun); 215 write_c_string ("#<UNKNOWN-EVENT-TYPE", printcharfun);
227 break; 216 break;
228 } 217 }
229 }
230 write_c_string (">", printcharfun); 218 write_c_string (">", printcharfun);
231 } 219 }
232 220
233 static int 221 static int
234 event_equal (Lisp_Object o1, Lisp_Object o2, int depth) 222 event_equal (Lisp_Object o1, Lisp_Object o2, int depth)
240 if (!EQ (e1->channel, e2->channel)) return 0; 228 if (!EQ (e1->channel, e2->channel)) return 0;
241 /* if (e1->timestamp != e2->timestamp) return 0; */ 229 /* if (e1->timestamp != e2->timestamp) return 0; */
242 switch (e1->event_type) 230 switch (e1->event_type)
243 { 231 {
244 case process_event: 232 case process_event:
245 return (EQ (e1->event.process.process, 233 return EQ (e1->event.process.process, e2->event.process.process);
246 e2->event.process.process));
247 234
248 case timeout_event: 235 case timeout_event:
249 if (NILP (Fequal (e1->event.timeout.function, 236 return (!NILP (Fequal (e1->event.timeout.function,
250 e2->event.timeout.function))) 237 e2->event.timeout.function)) &&
251 return 0; 238 !NILP (Fequal (e1->event.timeout.object,
252 if (NILP (Fequal (e1->event.timeout.object, 239 e2->event.timeout.object)));
253 e2->event.timeout.object)))
254 return 0;
255 return 1;
256 240
257 case key_press_event: 241 case key_press_event:
258 return ((EQ (e1->event.key.keysym, 242 return (EQ (e1->event.key.keysym, e2->event.key.keysym) &&
259 e2->event.key.keysym) 243 (e1->event.key.modifiers == e2->event.key.modifiers));
260 && (e1->event.key.modifiers
261 == e2->event.key.modifiers)));
262 244
263 case button_press_event: 245 case button_press_event:
264 case button_release_event: 246 case button_release_event:
265 return (((e1->event.button.button 247 return (e1->event.button.button == e2->event.button.button &&
266 == e2->event.button.button) 248 e1->event.button.modifiers == e2->event.button.modifiers);
267 && (e1->event.button.modifiers
268 == e2->event.button.modifiers)));
269 249
270 case pointer_motion_event: 250 case pointer_motion_event:
271 return ((e1->event.motion.x == e2->event.motion.x 251 return (e1->event.motion.x == e2->event.motion.x &&
272 && e1->event.motion.y == e2->event.motion.y)); 252 e1->event.motion.y == e2->event.motion.y);
273 253
274 case misc_user_event: 254 case misc_user_event:
275 case eval_event: 255 case eval_event:
276 if (NILP (Fequal (e1->event.eval.function, 256 return (!NILP (Fequal (e1->event.eval.function,
277 e2->event.eval.function))) 257 e2->event.eval.function)) &&
278 return 0; 258 !NILP (Fequal (e1->event.eval.object,
279 if (NILP (Fequal (e1->event.eval.object, 259 e2->event.eval.object)));
280 e2->event.eval.object)))
281 return 0;
282 return 1;
283 260
284 case magic_eval_event: 261 case magic_eval_event:
285 if (e1->event.magic_eval.internal_function != 262 return (e1->event.magic_eval.internal_function ==
286 e2->event.magic_eval.internal_function) 263 e2->event.magic_eval.internal_function &&
287 return 0; 264 !NILP (Fequal (e1->event.magic_eval.object,
288 if (NILP (Fequal (e1->event.magic_eval.object, 265 e2->event.magic_eval.object)));
289 e2->event.magic_eval.object)))
290 return 0;
291 return 1;
292 266
293 case magic_event: 267 case magic_event:
294 { 268 {
295 Lisp_Object console; 269 Lisp_Object console;
296 270
297 console = CDFW_CONSOLE (e1->channel); 271 console = CDFW_CONSOLE (e1->channel);
298 272
299 #ifdef HAVE_X_WINDOWS 273 #ifdef HAVE_X_WINDOWS
300 /* XEvent is actually a union which means that we can't just use == */ 274 /* XEvent is actually a union which means that we can't just use == */
301 if (CONSOLE_X_P (XCONSOLE (console))) 275 if (CONSOLE_X_P (XCONSOLE (console)))
302 return (!memcmp ((XEvent *) &e1->event.magic.underlying_x_event, 276 return !memcmp ((XEvent *) &e1->event.magic.underlying_x_event,
303 (XEvent *) &e2->event.magic.underlying_x_event, 277 (XEvent *) &e2->event.magic.underlying_x_event,
304 sizeof (e1->event.magic.underlying_x_event))); 278 sizeof (e1->event.magic.underlying_x_event));
305 #endif 279 #endif
280 #ifdef HAVE_TTY
281 if (CONSOLE_TTY_P (XCONSOLE (console)))
306 return (e1->event.magic.underlying_tty_event == 282 return (e1->event.magic.underlying_tty_event ==
307 e2->event.magic.underlying_tty_event); 283 e2->event.magic.underlying_tty_event);
284 #endif
285 return 1;
308 } 286 }
309 287
310 case empty_event: /* Empty and deallocated events are equal. */ 288 case empty_event: /* Empty and deallocated events are equal. */
311 case dead_event: 289 case dead_event:
312 return 1; 290 return 1;
958 case pointer_motion_event: strcpy (buf, "motion"); return; 936 case pointer_motion_event: strcpy (buf, "motion"); return;
959 case misc_user_event: strcpy (buf, "misc-user"); return; 937 case misc_user_event: strcpy (buf, "misc-user"); return;
960 case eval_event: strcpy (buf, "eval"); return; 938 case eval_event: strcpy (buf, "eval"); return;
961 case process_event: strcpy (buf, "process");return; 939 case process_event: strcpy (buf, "process");return;
962 case timeout_event: strcpy (buf, "timeout");return; 940 case timeout_event: strcpy (buf, "timeout");return;
963 case empty_event: strcpy (buf, "EMPTY-EVENT"); return; 941 case empty_event: strcpy (buf, "empty"); return;
964 case dead_event: strcpy (buf, "DEAD-EVENT"); return; 942 case dead_event: strcpy (buf, "DEAD-EVENT"); return;
965 default: 943 default:
966 abort (); 944 abort ();
967 } 945 }
968 #define modprint1(x) { strcpy (buf, (x)); buf += sizeof (x)-1; } 946 #define modprint1(x) { strcpy (buf, (x)); buf += sizeof (x)-1; }
1021 DEFUN ("eventp", Feventp, 1, 1, 0, /* 999 DEFUN ("eventp", Feventp, 1, 1, 0, /*
1022 True if OBJECT is an event object. 1000 True if OBJECT is an event object.
1023 */ 1001 */
1024 (object)) 1002 (object))
1025 { 1003 {
1026 return ((EVENTP (object)) ? Qt : Qnil); 1004 return EVENTP (object) ? Qt : Qnil;
1027 } 1005 }
1028 1006
1029 DEFUN ("event-live-p", Fevent_live_p, 1, 1, 0, /* 1007 DEFUN ("event-live-p", Fevent_live_p, 1, 1, 0, /*
1030 True if OBJECT is an event object that has not been deallocated. 1008 True if OBJECT is an event object that has not been deallocated.
1031 */ 1009 */
1032 (object)) 1010 (object))
1033 { 1011 {
1034 return ((EVENTP (object) && XEVENT (object)->event_type != dead_event) 1012 return EVENTP (object) && XEVENT (object)->event_type != dead_event ?
1035 ? Qt : Qnil); 1013 Qt : Qnil;
1036 } 1014 }
1037 1015
1038 #if 0 /* debugging functions */ 1016 #if 0 /* debugging functions */
1039 1017
1040 xxDEFUN ("event-next", Fevent_next, Sevent_next, 1, 1, 0 /* 1018 xxDEFUN ("event-next", Fevent_next, 1, 1, 0, /*
1041 Return the event object's `next' event, or nil if it has none. 1019 Return the event object's `next' event, or nil if it has none.
1042 The `next-event' field is changed by calling `set-next-event'. 1020 The `next-event' field is changed by calling `set-next-event'.
1043 */ ) 1021 */
1044 (event) 1022 (event))
1045 Lisp_Object event;
1046 { 1023 {
1047 struct Lisp_Event *e; 1024 struct Lisp_Event *e;
1048 CHECK_LIVE_EVENT (event); 1025 CHECK_LIVE_EVENT (event);
1049 1026
1050 return XEVENT_NEXT (event); 1027 return XEVENT_NEXT (event);
1051 } 1028 }
1052 1029
1053 xxDEFUN ("set-event-next", Fset_event_next, Sset_event_next, 2, 2, 0 /* 1030 xxDEFUN ("set-event-next", Fset_event_next, 2, 2, 0, /*
1054 Set the `next event' of EVENT to NEXT-EVENT. 1031 Set the `next event' of EVENT to NEXT-EVENT.
1055 NEXT-EVENT must be an event object or nil. 1032 NEXT-EVENT must be an event object or nil.
1056 */ ) 1033 */
1057 (event, next_event) 1034 (event, next_event))
1058 Lisp_Object event, next_event;
1059 { 1035 {
1060 Lisp_Object ev; 1036 Lisp_Object ev;
1061 1037
1062 CHECK_LIVE_EVENT (event); 1038 CHECK_LIVE_EVENT (event);
1063 if (NILP (next_event)) 1039 if (NILP (next_event))
1076 list3 (build_string ("Cyclic event-next"), 1052 list3 (build_string ("Cyclic event-next"),
1077 event, 1053 event,
1078 next_event)); 1054 next_event));
1079 } 1055 }
1080 XSET_EVENT_NEXT (event, next_event); 1056 XSET_EVENT_NEXT (event, next_event);
1081 return (next_event); 1057 return next_event;
1082 } 1058 }
1083 1059
1084 #endif /* 0 */ 1060 #endif /* 0 */
1085 1061
1086 DEFUN ("event-type", Fevent_type, 1, 1, 0, /* 1062 DEFUN ("event-type", Fevent_type, 1, 1, 0, /*
1103 (event)) 1079 (event))
1104 { 1080 {
1105 CHECK_LIVE_EVENT (event); 1081 CHECK_LIVE_EVENT (event);
1106 switch (XEVENT (event)->event_type) 1082 switch (XEVENT (event)->event_type)
1107 { 1083 {
1108 case key_press_event: 1084 case key_press_event: return Qkey_press;
1109 return Qkey_press; 1085 case button_press_event: return Qbutton_press;
1110 1086 case button_release_event: return Qbutton_release;
1111 case button_press_event: 1087 case misc_user_event: return Qmisc_user;
1112 return Qbutton_press; 1088 case pointer_motion_event: return Qmotion;
1113 1089 case process_event: return Qprocess;
1114 case button_release_event: 1090 case timeout_event: return Qtimeout;
1115 return Qbutton_release; 1091 case eval_event: return Qeval;
1116
1117 case misc_user_event:
1118 return Qmisc_user;
1119
1120 case pointer_motion_event:
1121 return Qmotion;
1122
1123 case process_event:
1124 return Qprocess;
1125
1126 case timeout_event:
1127 return Qtimeout;
1128
1129 case eval_event:
1130 return Qeval;
1131
1132 case magic_event: 1092 case magic_event:
1133 case magic_eval_event: 1093 case magic_eval_event:
1134 return Qmagic; 1094 return Qmagic;
1135 1095
1136 case empty_event: 1096 case empty_event:
1141 return Qnil; 1101 return Qnil;
1142 } 1102 }
1143 } 1103 }
1144 1104
1145 DEFUN ("event-timestamp", Fevent_timestamp, 1, 1, 0, /* 1105 DEFUN ("event-timestamp", Fevent_timestamp, 1, 1, 0, /*
1146 Return the timestamp of the given event object. 1106 Return the timestamp of the event object EVENT.
1147 */ 1107 */
1148 (event)) 1108 (event))
1149 { 1109 {
1150 CHECK_LIVE_EVENT (event); 1110 CHECK_LIVE_EVENT (event);
1151 /* This junk is so that timestamps don't get to be negative, but contain 1111 /* This junk is so that timestamps don't get to be negative, but contain
1166 if (XEVENT(e)->event_type != (t1) && XEVENT(e)->event_type != (t2)) \ 1126 if (XEVENT(e)->event_type != (t1) && XEVENT(e)->event_type != (t2)) \
1167 e = wrong_type_argument ((sym),(e)); \ 1127 e = wrong_type_argument ((sym),(e)); \
1168 } 1128 }
1169 1129
1170 DEFUN ("event-key", Fevent_key, 1, 1, 0, /* 1130 DEFUN ("event-key", Fevent_key, 1, 1, 0, /*
1171 Return the Keysym of the given key-press event. 1131 Return the Keysym of the key-press event EVENT.
1172 This will be the ASCII code of a printing character, or a symbol. 1132 This will be a character if the event is associated with one, else a symbol.
1173 */ 1133 */
1174 (event)) 1134 (event))
1175 { 1135 {
1176 CHECK_EVENT_TYPE (event, key_press_event, Qkey_press_event_p); 1136 CHECK_EVENT_TYPE (event, key_press_event, Qkey_press_event_p);
1177 return (XEVENT (event)->event.key.keysym); 1137 return XEVENT (event)->event.key.keysym;
1178 } 1138 }
1179 1139
1180 DEFUN ("event-button", Fevent_button, 1, 1, 0, /* 1140 DEFUN ("event-button", Fevent_button, 1, 1, 0, /*
1181 Return the button-number of the given mouse-button-press event. 1141 Return the button-number of the given button-press or button-release event.
1182 */ 1142 */
1183 (event)) 1143 (event))
1184 { 1144 {
1185 CHECK_EVENT_TYPE2 (event, button_press_event, button_release_event, 1145 CHECK_EVENT_TYPE2 (event, button_press_event, button_release_event,
1186 Qbutton_event_p); 1146 Qbutton_event_p);
1272 1232
1273 return 1; 1233 return 1;
1274 } 1234 }
1275 1235
1276 DEFUN ("event-window-x-pixel", Fevent_window_x_pixel, 1, 1, 0, /* 1236 DEFUN ("event-window-x-pixel", Fevent_window_x_pixel, 1, 1, 0, /*
1277 Return the X position in pixels of the given mouse event. 1237 Return the X position in pixels of mouse event EVENT.
1278 The value returned is relative to the window the event occurred in. 1238 The value returned is relative to the window the event occurred in.
1279 This will signal an error if the event is not a mouse-motion, button-press, 1239 This will signal an error if the event is not a mouse event.
1280 or button-release event. See also `event-x-pixel'. 1240 See also `mouse-event-p' and `event-x-pixel'.
1281 */ 1241 */
1282 (event)) 1242 (event))
1283 { 1243 {
1284 int x, y; 1244 int x, y;
1285 1245
1290 else 1250 else
1291 return make_int (x); 1251 return make_int (x);
1292 } 1252 }
1293 1253
1294 DEFUN ("event-window-y-pixel", Fevent_window_y_pixel, 1, 1, 0, /* 1254 DEFUN ("event-window-y-pixel", Fevent_window_y_pixel, 1, 1, 0, /*
1295 Return the Y position in pixels of the given mouse event. 1255 Return the Y position in pixels of mouse event EVENT.
1296 The value returned is relative to the window the event occurred in. 1256 The value returned is relative to the window the event occurred in.
1297 This will signal an error if the event is not a mouse-motion, button-press, 1257 This will signal an error if the event is not a mouse event.
1298 or button-release event. See also `event-y-pixel'. 1258 See also `mouse-event-p' and `event-y-pixel'.
1299 */ 1259 */
1300 (event)) 1260 (event))
1301 { 1261 {
1302 int x, y; 1262 int x, y;
1303 1263
1308 else 1268 else
1309 return make_int (y); 1269 return make_int (y);
1310 } 1270 }
1311 1271
1312 DEFUN ("event-x-pixel", Fevent_x_pixel, 1, 1, 0, /* 1272 DEFUN ("event-x-pixel", Fevent_x_pixel, 1, 1, 0, /*
1313 Return the X position in pixels of the given mouse event. 1273 Return the X position in pixels of mouse event EVENT.
1314 The value returned is relative to the frame the event occurred in. 1274 The value returned is relative to the frame the event occurred in.
1315 This will signal an error if the event is not a mouse-motion, button-press, 1275 This will signal an error if the event is not a mouse event.
1316 or button-release event. See also `event-window-x-pixel'. 1276 See also `mouse-event-p' and `event-window-x-pixel'.
1317 */ 1277 */
1318 (event)) 1278 (event))
1319 { 1279 {
1320 int x, y; 1280 int x, y;
1321 1281
1326 else 1286 else
1327 return make_int (x); 1287 return make_int (x);
1328 } 1288 }
1329 1289
1330 DEFUN ("event-y-pixel", Fevent_y_pixel, 1, 1, 0, /* 1290 DEFUN ("event-y-pixel", Fevent_y_pixel, 1, 1, 0, /*
1331 Return the Y position in pixels of the given mouse event. 1291 Return the Y position in pixels of mouse event EVENT.
1332 The value returned is relative to the frame the event occurred in. 1292 The value returned is relative to the frame the event occurred in.
1333 This will signal an error if the event is not a mouse-motion, button-press, 1293 This will signal an error if the event is not a mouse event.
1334 or button-release event. See also `event-window-y-pixel'. 1294 See also `mouse-event-p' `event-window-y-pixel'.
1335 */ 1295 */
1336 (event)) 1296 (event))
1337 { 1297 {
1338 int x, y; 1298 int x, y;
1339 1299
1452 1412
1453 return result; 1413 return result;
1454 } 1414 }
1455 1415
1456 DEFUN ("event-over-text-area-p", Fevent_over_text_area_p, 1, 1, 0, /* 1416 DEFUN ("event-over-text-area-p", Fevent_over_text_area_p, 1, 1, 0, /*
1457 Return whether the given mouse event occurred over the text area of a window. 1417 Return t if the mouse event EVENT occurred over the text area of a window.
1458 The modeline is not considered to be part of the text area. 1418 The modeline is not considered to be part of the text area.
1459 */ 1419 */
1460 (event)) 1420 (event))
1461 { 1421 {
1462 int result = event_pixel_translation (event, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); 1422 int result = event_pixel_translation (event, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
1463 1423
1464 if (result == OVER_TEXT || result == OVER_NOTHING) 1424 return result == OVER_TEXT || result == OVER_NOTHING ? Qt : Qnil;
1465 return Qt;
1466 else
1467 return Qnil;
1468 } 1425 }
1469 1426
1470 DEFUN ("event-over-modeline-p", Fevent_over_modeline_p, 1, 1, 0, /* 1427 DEFUN ("event-over-modeline-p", Fevent_over_modeline_p, 1, 1, 0, /*
1471 Return whether the given mouse event occurred over the modeline of a window. 1428 Return t if the mouse event EVENT occurred over the modeline of a window.
1472 */ 1429 */
1473 (event)) 1430 (event))
1474 { 1431 {
1475 int result = event_pixel_translation (event, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); 1432 int result = event_pixel_translation (event, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
1476 1433
1477 if (result == OVER_MODELINE) 1434 return result == OVER_MODELINE ? Qt : Qnil;
1478 return Qt;
1479 else
1480 return Qnil;
1481 } 1435 }
1482 1436
1483 DEFUN ("event-over-border-p", Fevent_over_border_p, 1, 1, 0, /* 1437 DEFUN ("event-over-border-p", Fevent_over_border_p, 1, 1, 0, /*
1484 Return whether the given mouse event occurred over an internal border. 1438 Return t if the mouse event EVENT occurred over an internal border.
1485 */ 1439 */
1486 (event)) 1440 (event))
1487 { 1441 {
1488 int result = event_pixel_translation (event, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); 1442 int result = event_pixel_translation (event, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
1489 1443
1490 if (result == OVER_BORDER) 1444 return result == OVER_BORDER ? Qt : Qnil;
1491 return Qt;
1492 else
1493 return Qnil;
1494 } 1445 }
1495 1446
1496 DEFUN ("event-over-toolbar-p", Fevent_over_toolbar_p, 1, 1, 0, /* 1447 DEFUN ("event-over-toolbar-p", Fevent_over_toolbar_p, 1, 1, 0, /*
1497 Return whether the given mouse event occurred over a toolbar. 1448 Return t if the mouse event EVENT occurred over a toolbar.
1498 */ 1449 */
1499 (event)) 1450 (event))
1500 { 1451 {
1501 int result = event_pixel_translation (event, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); 1452 int result = event_pixel_translation (event, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
1502 1453
1503 if (result == OVER_TOOLBAR) 1454 return result == OVER_TOOLBAR ? Qt : Qnil;
1504 return Qt;
1505 else
1506 return Qnil;
1507 } 1455 }
1508 1456
1509 struct console * 1457 struct console *
1510 event_console_or_selected (Lisp_Object event) 1458 event_console_or_selected (Lisp_Object event)
1511 { 1459 {
1517 1465
1518 return XCONSOLE (console); 1466 return XCONSOLE (console);
1519 } 1467 }
1520 1468
1521 DEFUN ("event-channel", Fevent_channel, 1, 1, 0, /* 1469 DEFUN ("event-channel", Fevent_channel, 1, 1, 0, /*
1522 Return the channel that the given event occurred on. 1470 Return the channel that the event EVENT occurred on.
1523 This will be a frame, device, console, or nil for some types 1471 This will be a frame, device, console, or nil for some types
1524 of events (e.g. eval events). 1472 of events (e.g. eval events).
1525 */ 1473 */
1526 (event)) 1474 (event))
1527 { 1475 {
1528 CHECK_LIVE_EVENT (event); 1476 CHECK_LIVE_EVENT (event);
1529 return EVENT_CHANNEL (XEVENT (event)); 1477 return EVENT_CHANNEL (XEVENT (event));
1530 } 1478 }
1531 1479
1532 DEFUN ("event-window", Fevent_window, 1, 1, 0, /* 1480 DEFUN ("event-window", Fevent_window, 1, 1, 0, /*
1533 Return the window of the given mouse event. 1481 Return the window over which mouse event EVENT occurred.
1534 This may be nil if the event occurred in the border or over a toolbar. 1482 This may be nil if the event occurred in the border or over a toolbar.
1535 The modeline is considered to be in the window it represents. 1483 The modeline is considered to be within the window it describes.
1536 */ 1484 */
1537 (event)) 1485 (event))
1538 { 1486 {
1539 struct window *w; 1487 struct window *w;
1540 Lisp_Object window;
1541 1488
1542 event_pixel_translation (event, 0, 0, 0, 0, &w, 0, 0, 0, 0, 0); 1489 event_pixel_translation (event, 0, 0, 0, 0, &w, 0, 0, 0, 0, 0);
1543 1490
1544 if (!w) 1491 if (!w)
1545 return Qnil; 1492 return Qnil;
1546 else 1493 else
1547 { 1494 {
1495 Lisp_Object window;
1496
1548 XSETWINDOW (window, w); 1497 XSETWINDOW (window, w);
1549 return window; 1498 return window;
1550 } 1499 }
1551 } 1500 }
1552 1501
1553 DEFUN ("event-point", Fevent_point, 1, 1, 0, /* 1502 DEFUN ("event-point", Fevent_point, 1, 1, 0, /*
1554 Return the character position of the given mouse event. 1503 Return the character position of the mouse event EVENT.
1555 If the event did not occur over a window, or did not occur over text, 1504 If the event did not occur over a window, or did not occur over text,
1556 then this returns nil. Otherwise, it returns an index into the buffer 1505 then this returns nil. Otherwise, it returns a position in the buffer
1557 visible in the event's window. 1506 visible in the event's window.
1558 */ 1507 */
1559 (event)) 1508 (event))
1560 { 1509 {
1561 Bufpos bufp; 1510 Bufpos bufp;
1562 struct window *w; 1511 struct window *w;
1563 1512
1564 event_pixel_translation (event, 0, 0, 0, 0, &w, &bufp, 0, 0, 0, 0); 1513 event_pixel_translation (event, 0, 0, 0, 0, &w, &bufp, 0, 0, 0, 0);
1565 1514
1566 if (!w) 1515 return w && bufp ? make_int (bufp) : Qnil;
1567 return Qnil;
1568 else if (!bufp)
1569 return Qnil;
1570 else
1571 return make_int (bufp);
1572 } 1516 }
1573 1517
1574 DEFUN ("event-closest-point", Fevent_closest_point, 1, 1, 0, /* 1518 DEFUN ("event-closest-point", Fevent_closest_point, 1, 1, 0, /*
1575 Return the character position of the given mouse event. 1519 Return the character position closest to the mouse event EVENT.
1576 If the event did not occur over a window or over text, return the 1520 If the event did not occur over a window or over text, return the
1577 closest point to the location of the event. If the Y pixel position 1521 closest point to the location of the event. If the Y pixel position
1578 overlaps a window and the X pixel position is to the left of that 1522 overlaps a window and the X pixel position is to the left of that
1579 window, the closest point is the beginning of the line containing the 1523 window, the closest point is the beginning of the line containing the
1580 Y position. If the Y pixel position overlaps a window and the X pixel 1524 Y position. If the Y pixel position overlaps a window and the X pixel
1581 position is to the right of that window, the closest point is the end 1525 position is to the right of that window, the closest point is the end
1582 of the line containing the Y position. If the Y pixel position is 1526 of the line containing the Y position. If the Y pixel position is
1583 above a window, return 0. If it is below a window, return the value 1527 above a window, return 0. If it is below the last character in a window,
1584 of (window-end). 1528 return the value of (window-end).
1585 */ 1529 */
1586 (event)) 1530 (event))
1587 { 1531 {
1588 Bufpos bufp; 1532 Bufpos bufp;
1589 1533
1590 event_pixel_translation (event, 0, 0, 0, 0, 0, 0, &bufp, 0, 0, 0); 1534 event_pixel_translation (event, 0, 0, 0, 0, 0, 0, &bufp, 0, 0, 0);
1591 1535
1592 if (!bufp) 1536 return bufp ? make_int (bufp) : Qnil;
1593 return Qnil;
1594 else
1595 return make_int (bufp);
1596 } 1537 }
1597 1538
1598 DEFUN ("event-x", Fevent_x, 1, 1, 0, /* 1539 DEFUN ("event-x", Fevent_x, 1, 1, 0, /*
1599 Return the X position of the given mouse event in characters. 1540 Return the X position of the mouse event EVENT in characters.
1600 This is relative to the window the event occurred over. 1541 This is relative to the window the event occurred over.
1601 */ 1542 */
1602 (event)) 1543 (event))
1603 { 1544 {
1604 int char_x; 1545 int char_x;
1607 1548
1608 return make_int (char_x); 1549 return make_int (char_x);
1609 } 1550 }
1610 1551
1611 DEFUN ("event-y", Fevent_y, 1, 1, 0, /* 1552 DEFUN ("event-y", Fevent_y, 1, 1, 0, /*
1612 Return the Y position of the given mouse event in characters. 1553 Return the Y position of the mouse event EVENT in characters.
1613 This is relative to the window the event occurred over. 1554 This is relative to the window the event occurred over.
1614 */ 1555 */
1615 (event)) 1556 (event))
1616 { 1557 {
1617 int char_y; 1558 int char_y;
1634 { 1575 {
1635 Charcount mbufp; 1576 Charcount mbufp;
1636 1577
1637 event_pixel_translation (event, 0, 0, 0, 0, 0, 0, 0, &mbufp, 0, 0); 1578 event_pixel_translation (event, 0, 0, 0, 0, 0, 0, 0, &mbufp, 0, 0);
1638 1579
1639 if (mbufp < 0) 1580 return mbufp < 0 ? Qnil : make_int (mbufp);
1640 return Qnil;
1641 else
1642 return make_int (mbufp);
1643 } 1581 }
1644 1582
1645 DEFUN ("event-glyph", Fevent_glyph, 1, 1, 0, /* 1583 DEFUN ("event-glyph", Fevent_glyph, 1, 1, 0, /*
1646 Return the glyph that the given mouse event occurred over, or nil. 1584 Return the glyph that the mouse event EVENT occurred over, or nil.
1647 */ 1585 */
1648 (event)) 1586 (event))
1649 { 1587 {
1650 Lisp_Object glyph; 1588 Lisp_Object glyph;
1651 struct window *w; 1589 struct window *w;
1652 1590
1653 event_pixel_translation (event, 0, 0, 0, 0, &w, 0, 0, 0, &glyph, 0); 1591 event_pixel_translation (event, 0, 0, 0, 0, &w, 0, 0, 0, &glyph, 0);
1654 1592
1655 if (!w) 1593 return w && GLYPHP (glyph) ? glyph : Qnil;
1656 return Qnil;
1657 else if (GLYPHP (glyph))
1658 return glyph;
1659 else
1660 return Qnil;
1661 } 1594 }
1662 1595
1663 DEFUN ("event-glyph-extent", Fevent_glyph_extent, 1, 1, 0, /* 1596 DEFUN ("event-glyph-extent", Fevent_glyph_extent, 1, 1, 0, /*
1664 Return the extent of the glyph that the given mouse event occurred over. 1597 Return the extent of the glyph that the mouse event EVENT occurred over.
1665 If the event did not occur over a glyph, nil is returned. 1598 If the event did not occur over a glyph, nil is returned.
1666 */ 1599 */
1667 (event)) 1600 (event))
1668 { 1601 {
1669 Lisp_Object extent; 1602 Lisp_Object extent;
1670 struct window *w; 1603 struct window *w;
1671 1604
1672 event_pixel_translation (event, 0, 0, 0, 0, &w, 0, 0, 0, 0, &extent); 1605 event_pixel_translation (event, 0, 0, 0, 0, &w, 0, 0, 0, 0, &extent);
1673 1606
1674 if (!w) 1607 return w && EXTENTP (extent) ? extent : Qnil;
1675 return Qnil;
1676 else if (EXTENTP (extent))
1677 return extent;
1678 else
1679 return Qnil;
1680 } 1608 }
1681 1609
1682 DEFUN ("event-glyph-x-pixel", Fevent_glyph_x_pixel, 1, 1, 0, /* 1610 DEFUN ("event-glyph-x-pixel", Fevent_glyph_x_pixel, 1, 1, 0, /*
1683 Return the X pixel position of EVENT relative to the glyph it occurred over. 1611 Return the X pixel position of EVENT relative to the glyph it occurred over.
1684 EVENT should be a mouse event. If the event did not occur over a glyph, 1612 EVENT should be a mouse event. If the event did not occur over a glyph,
1690 struct window *w; 1618 struct window *w;
1691 int obj_x; 1619 int obj_x;
1692 1620
1693 event_pixel_translation (event, 0, 0, &obj_x, 0, &w, 0, 0, 0, 0, &extent); 1621 event_pixel_translation (event, 0, 0, &obj_x, 0, &w, 0, 0, 0, 0, &extent);
1694 1622
1695 if (w && EXTENTP (extent)) 1623 return w && EXTENTP (extent) ? make_int (obj_x) : Qnil;
1696 return make_int (obj_x);
1697 else
1698 return Qnil;
1699 } 1624 }
1700 1625
1701 DEFUN ("event-glyph-y-pixel", Fevent_glyph_y_pixel, 1, 1, 0, /* 1626 DEFUN ("event-glyph-y-pixel", Fevent_glyph_y_pixel, 1, 1, 0, /*
1702 Return the Y pixel position of EVENT relative to the glyph it occurred over. 1627 Return the Y pixel position of EVENT relative to the glyph it occurred over.
1703 EVENT should be a mouse event. If the event did not occur over a glyph, 1628 EVENT should be a mouse event. If the event did not occur over a glyph,
1709 struct window *w; 1634 struct window *w;
1710 int obj_y; 1635 int obj_y;
1711 1636
1712 event_pixel_translation (event, 0, 0, 0, &obj_y, &w, 0, 0, 0, 0, &extent); 1637 event_pixel_translation (event, 0, 0, 0, &obj_y, &w, 0, 0, 0, 0, &extent);
1713 1638
1714 if (w && EXTENTP (extent)) 1639 return w && EXTENTP (extent) ? make_int (obj_y) : Qnil;
1715 return make_int (obj_y);
1716 else
1717 return Qnil;
1718 } 1640 }
1719 1641
1720 DEFUN ("event-toolbar-button", Fevent_toolbar_button, 1, 1, 0, /* 1642 DEFUN ("event-toolbar-button", Fevent_toolbar_button, 1, 1, 0, /*
1721 Return the toolbar button that the given mouse event occurred over. 1643 Return the toolbar button that the mouse event EVENT occurred over.
1722 If the event did not occur over a toolbar, nil is returned. 1644 If the event did not occur over a toolbar button, nil is returned.
1723 */ 1645 */
1724 (event)) 1646 (event))
1725 { 1647 {
1726 #ifdef HAVE_TOOLBARS 1648 #ifdef HAVE_TOOLBARS
1727 Lisp_Object button; 1649 Lisp_Object button;
1728 int result; 1650
1729 1651 int result = event_pixel_translation (event, 0, 0, 0, 0, 0, 0, 0, 0, &button, 0);
1730 result = event_pixel_translation (event, 0, 0, 0, 0, 0, 0, 0, 0, &button, 0); 1652
1731 1653 return result == OVER_TOOLBAR && TOOLBAR_BUTTONP (button) ? button : Qnil;
1732 if (result == OVER_TOOLBAR) 1654 #else
1733 {
1734 if (TOOLBAR_BUTTONP (button))
1735 return button;
1736 else
1737 return Qnil; 1655 return Qnil;
1738 }
1739 else
1740 #endif 1656 #endif
1741 return Qnil;
1742 } 1657 }
1743 1658
1744 DEFUN ("event-process", Fevent_process, 1, 1, 0, /* 1659 DEFUN ("event-process", Fevent_process, 1, 1, 0, /*
1745 Return the process of the given process-output event. 1660 Return the process of the given process-output event.
1746 */ 1661 */
1747 (event)) 1662 (event))
1748 { 1663 {
1749 CHECK_EVENT_TYPE (event, process_event, Qprocess_event_p); 1664 CHECK_EVENT_TYPE (event, process_event, Qprocess_event_p);
1750 return (XEVENT (event)->event.process.process); 1665 return XEVENT (event)->event.process.process;
1751 } 1666 }
1752 1667
1753 DEFUN ("event-function", Fevent_function, 1, 1, 0, /* 1668 DEFUN ("event-function", Fevent_function, 1, 1, 0, /*
1754 Return the callback function of EVENT. 1669 Return the callback function of EVENT.
1755 EVENT should be a timeout, misc-user, or eval event. 1670 EVENT should be a timeout, misc-user, or eval event.
1844 props = Fcons (Qfunction, Fcons (Fevent_function (event), props)); 1759 props = Fcons (Qfunction, Fcons (Fevent_function (event), props));
1845 break; 1760 break;
1846 1761
1847 case magic_eval_event: 1762 case magic_eval_event:
1848 case magic_event: 1763 case magic_event:
1764 break;
1765
1849 case empty_event: 1766 case empty_event:
1767 RETURN_UNGCPRO (Qnil);
1850 break; 1768 break;
1851 1769
1852 default: 1770 default:
1853 abort (); 1771 abort ();
1854 break; /* not reached; warning suppression */ 1772 break; /* not reached; warning suppression */
1916 defsymbol (&Qprocess_event_p, "process-event-p"); 1834 defsymbol (&Qprocess_event_p, "process-event-p");
1917 defsymbol (&Qkey_press, "key-press"); 1835 defsymbol (&Qkey_press, "key-press");
1918 defsymbol (&Qbutton_press, "button-press"); 1836 defsymbol (&Qbutton_press, "button-press");
1919 defsymbol (&Qbutton_release, "button-release"); 1837 defsymbol (&Qbutton_release, "button-release");
1920 defsymbol (&Qmisc_user, "misc-user"); 1838 defsymbol (&Qmisc_user, "misc-user");
1839 defsymbol (&Qempty, "empty");
1921 defsymbol (&Qascii_character, "ascii-character"); 1840 defsymbol (&Qascii_character, "ascii-character");
1922 } 1841 }
1923 1842
1924 void 1843 void
1925 vars_of_events (void) 1844 vars_of_events (void)