comparison src/menubar-x.c @ 48:56c54cf7c5b6 r19-16b90

Import from CVS: tag r19-16b90
author cvs
date Mon, 13 Aug 2007 08:56:04 +0200
parents 1a767b41a199
children 131b0175ea99
comparison
equal deleted inserted replaced
47:11c6df210d7f 48:56c54cf7c5b6
306 unbind_to (count, Qnil); 306 unbind_to (count, Qnil);
307 return wv; 307 return wv;
308 } 308 }
309 309
310 310
311 #ifdef LWLIB_MENUBARS_LUCID
312 int in_menu_callback;
313
314 Lisp_Object
315 restore_in_menu_callback(Lisp_Object val)
316 {
317 in_menu_callback = XINT(val);
318 return Qnil;
319 }
320 #endif /* LWLIB_MENUBARS_LUCID */
321
322
311 /* The order in which callbacks are run is funny to say the least. 323 /* The order in which callbacks are run is funny to say the least.
312 It's sometimes tricky to avoid running a callback twice, and to 324 It's sometimes tricky to avoid running a callback twice, and to
313 avoid returning prematurely. So, this function returns true 325 avoid returning prematurely. So, this function returns true
314 if the menu's callbacks are no longer gc protected. So long 326 if the menu's callbacks are no longer gc protected. So long
315 as we unprotect them before allowing other callbacks to run, 327 as we unprotect them before allowing other callbacks to run,
336 struct device *d = get_device_from_display (XtDisplay (widget)); 348 struct device *d = get_device_from_display (XtDisplay (widget));
337 struct frame *f = x_any_window_to_frame (d, XtWindow (widget)); 349 struct frame *f = x_any_window_to_frame (d, XtWindow (widget));
338 Lisp_Object rest = Qnil; 350 Lisp_Object rest = Qnil;
339 Lisp_Object frame; 351 Lisp_Object frame;
340 int any_changes = 0; 352 int any_changes = 0;
353 int count;
341 354
342 if (!f) 355 if (!f)
343 f = x_any_window_to_frame (d, XtWindow (XtParent (widget))); 356 f = x_any_window_to_frame (d, XtWindow (XtParent (widget)));
344 if (!f) 357 if (!f)
345 return; 358 return;
355 Lisp_Object submenu_desc; 368 Lisp_Object submenu_desc;
356 widget_value *wv; 369 widget_value *wv;
357 370
358 assert (hack_wv->type == INCREMENTAL_TYPE); 371 assert (hack_wv->type == INCREMENTAL_TYPE);
359 VOID_TO_LISP (submenu_desc, hack_wv->call_data); 372 VOID_TO_LISP (submenu_desc, hack_wv->call_data);
373
374 /*
375 * #### Fix the menu code so this isn't necessary.
376 *
377 * Protect against reentering the menu code otherwise we will
378 * crash later when the code gets confused at the state
379 * changes.
380 */
381 count = specpdl_depth ();
382 record_unwind_protect (restore_in_menu_callback,
383 make_int (in_menu_callback));
384 in_menu_callback = 1;
360 wv = menu_item_descriptor_to_widget_value (submenu_desc, SUBMENU_TYPE, 385 wv = menu_item_descriptor_to_widget_value (submenu_desc, SUBMENU_TYPE,
361 1, 0); 386 1, 0);
387 unbind_to (count, Qnil);
388
362 if (!wv) 389 if (!wv)
363 { 390 {
364 wv = xmalloc_widget_value (); 391 wv = xmalloc_widget_value ();
365 wv->type = CASCADE_TYPE; 392 wv->type = CASCADE_TYPE;
366 wv->next = NULL; 393 wv->next = NULL;