diff options
author | Richard M. Stallman <rms@gnu.org> | 1995-04-07 03:39:07 +0000 |
---|---|---|
committer | Richard M. Stallman <rms@gnu.org> | 1995-04-07 03:39:07 +0000 |
commit | 4a783e92dc748d4dc888664550a2f67ca76edcf6 (patch) | |
tree | ed04d493bb14365f622b91e7b683461485597442 /src/xmenu.c | |
parent | 0cd09a8d5d104bcb103cb7a7f93b53998bf073c8 (diff) | |
download | emacs-4a783e92dc748d4dc888664550a2f67ca76edcf6.tar.gz |
(frame_vector): New static variable.
(syms_of_xmenu): staticpro it.
(frame_vector_add_frame): New function.
(set_frame_menubar): Use frame_vector; use index as the widget id.
(free_frame_menubar): Likewise. Remove the frame from frame_vector.
(menubar_selection_callback): Use frame_vector to turn id into frame.
Diffstat (limited to 'src/xmenu.c')
-rw-r--r-- | src/xmenu.c | 55 |
1 files changed, 51 insertions, 4 deletions
diff --git a/src/xmenu.c b/src/xmenu.c index 02b66b1b85b..f6e593044ce 100644 --- a/src/xmenu.c +++ b/src/xmenu.c @@ -151,6 +151,47 @@ static int menu_items_submenu_depth; Xt on behalf of one of the widget sets. */ static int popup_activated_flag; +/* This holds a Lisp vector + which contains frames that have menu bars. + Each frame that has a menu bar is found at some index in this vector + and the menu bar widget refers to the frame through that index. */ +static Lisp_Object frame_vector; + +/* Return the index of FRAME in frame_vector. + If FRAME isn't in frame_vector yet, put it in, + lengthening the vector if necessary. */ + +static int +frame_vector_add_frame (f) + FRAME_PTR *f; +{ + int length = XVECTOR (frame_vector)->size; + int i, empty = -1; + Lisp_Object new, frame; + + XSETFRAME (frame, f); + + for (i = 0; i < length; i++) + { + if (EQ (frame, XVECTOR (frame_vector)->contents[i])) + return i; + if (NILP (XVECTOR (frame_vector)->contents[i])) + empty = i; + } + + if (empty >= 0) + { + XVECTOR (frame_vector)->contents[empty] = frame; + return empty; + } + + new = Fmake_vector (make_number (length * 2), Qnil); + bcopy (XVECTOR (frame_vector)->contents, + XVECTOR (new)->contents, sizeof (Lisp_Object) * length); + + XVECTOR (frame_vector)->contents[length] = frame; + return length; +} /* Initialize the menu_items structure if we haven't already done so. Also mark it as currently empty. */ @@ -1060,7 +1101,7 @@ menubar_selection_callback (widget, id, client_data) XtPointer client_data; { Lisp_Object prefix; - FRAME_PTR f = (FRAME_PTR) id; + FRAME_PTR f = XFRAME (XVECTOR (frame_vector)->contents[id]); Lisp_Object vector; Lisp_Object *subprefix_stack; int submenu_depth = 0; @@ -1378,10 +1419,12 @@ set_frame_menubar (f, first_time) int first_time; { Widget menubar_widget = f->display.x->menubar_widget; - int id = (int) f; - Lisp_Object tail, items; + Lisp_Object tail, items, frame; widget_value *wv, *first_wv, *prev_wv = 0; int i; + int id; + + id = frame_vector_add_frame (f); BLOCK_INPUT; @@ -1493,12 +1536,13 @@ free_frame_menubar (f) int id; menubar_widget = f->display.x->menubar_widget; - id = (int) f; if (menubar_widget) { + id = frame_vector_add_frame (f); BLOCK_INPUT; lw_destroy_all_widgets (id); + XVECTOR (frame_vector)->contents[id] = Qnil; UNBLOCK_INPUT; } } @@ -2352,6 +2396,9 @@ syms_of_xmenu () widget_id_tick = (1<<16); #endif + staticpro (&frame_vector); + frame_vector = Fmake_vector (make_number (10), Qnil); + defsubr (&Sx_popup_menu); defsubr (&Sx_popup_dialog); } |