X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/94fbc901707d7c1fd7ec0471d288e585caf59b34..b27d230fc41cb345855438f18c72dcb74ad488fe:/src/xmenu.c diff --git a/src/xmenu.c b/src/xmenu.c index 958cd22039..95ae539355 100644 --- a/src/xmenu.c +++ b/src/xmenu.c @@ -111,7 +111,7 @@ along with GNU Emacs. If not, see . */ static Lisp_Object Qdebug_on_next_call; #if defined (USE_X_TOOLKIT) || defined (USE_GTK) -static Lisp_Object xdialog_show (FRAME_PTR, bool, Lisp_Object, Lisp_Object, +static Lisp_Object xdialog_show (struct frame *, bool, Lisp_Object, Lisp_Object, const char **); #endif @@ -130,7 +130,7 @@ static struct frame * menubar_id_to_frame (LWLIB_ID id) { Lisp_Object tail, frame; - FRAME_PTR f; + struct frame *f; FOR_EACH_FRAME (tail, frame) { @@ -154,13 +154,12 @@ menubar_id_to_frame (LWLIB_ID id) the scroll bar or the edit window. Fx_popup_menu needs to be sure it is the edit window. */ void -mouse_position_for_popup (FRAME_PTR f, int *x, int *y) +mouse_position_for_popup (struct frame *f, int *x, int *y) { Window root, dummy_window; int dummy; - if (! FRAME_X_P (f)) - emacs_abort (); + eassert (FRAME_X_P (f)); block_input (); @@ -220,11 +219,9 @@ for instance using the window manager, then this produces a quit and `x-popup-dialog' does not return. */) (Lisp_Object position, Lisp_Object contents, Lisp_Object header) { - FRAME_PTR f = NULL; + struct frame *f = NULL; Lisp_Object window; - check_x (); - /* Decode the first argument: find the window or frame to use. */ if (EQ (position, Qt) || (CONSP (position) && (EQ (XCAR (position), Qmenu_bar) @@ -232,7 +229,7 @@ for instance using the window manager, then this produces a quit and { #if 0 /* Using the frame the mouse is on may not be right. */ /* Use the mouse's current position. */ - FRAME_PTR new_f = SELECTED_FRAME (); + struct frame *new_f = SELECTED_FRAME (); Lisp_Object bar_window; enum scroll_bar_part part; Time time; @@ -277,8 +274,7 @@ for instance using the window manager, then this produces a quit and but I don't want to make one now. */ CHECK_WINDOW (window); - if (! FRAME_X_P (f) && ! FRAME_MSDOS_P (f)) - error ("Can not put X dialog on this terminal"); + check_window_system (f); /* Force a redisplay before showing the dialog. If a frame is created just before showing the dialog, its contents may not have been fully @@ -297,12 +293,12 @@ for instance using the window manager, then this produces a quit and { Lisp_Object x, y, frame, newpos; XSETFRAME (frame, f); - XSETINT (x, x_pixel_width (f) / 2); - XSETINT (y, x_pixel_height (f) / 2); - newpos = Fcons (Fcons (x, Fcons (y, Qnil)), Fcons (frame, Qnil)); + XSETINT (x, FRAME_PIXEL_WIDTH (f) / 2); + XSETINT (y, FRAME_PIXEL_HEIGHT (f) / 2); + newpos = list2 (list2 (x, y), frame); return Fx_popup_menu (newpos, - Fcons (Fcar (contents), Fcons (contents, Qnil))); + list2 (Fcar (contents), contents)); } #else { @@ -314,15 +310,15 @@ for instance using the window manager, then this produces a quit and /* Decode the dialog items from what was specified. */ title = Fcar (contents); CHECK_STRING (title); - record_unwind_protect (unuse_menu_items, Qnil); + record_unwind_protect_void (unuse_menu_items); if (NILP (Fcar (Fcdr (contents)))) /* No buttons specified, add an "Ok" button so users can pop down the dialog. Also, the lesstif/motif version crashes if there are no buttons. */ - contents = Fcons (title, Fcons (Fcons (build_string ("Ok"), Qt), Qnil)); + contents = list2 (title, Fcons (build_string ("Ok"), Qt)); - list_of_panes (Fcons (contents, Qnil)); + list_of_panes (list1 (contents)); /* Display them in a dialog box. */ block_input (); @@ -377,7 +373,7 @@ x_menu_wait_for_event (void *data) #elif defined USE_GTK ! gtk_events_pending () #else - ! XPending ((Display*) data) + ! XPending (data) #endif ) { @@ -400,7 +396,7 @@ x_menu_wait_for_event (void *data) else ntp = &next_time; -#ifdef HAVE_GTK3 +#if defined USE_GTK && defined HAVE_GTK3 /* Gtk3 have arrows on menus when they don't fit. When the pointer is over an arrow, a timeout scrolls it a bit. Use xg_select so that timeout gets triggered. */ @@ -485,7 +481,7 @@ If FRAME is nil or not given, use the selected frame. */) (Lisp_Object frame) { XEvent ev; - FRAME_PTR f = check_x_frame (frame); + struct frame *f = decode_window_system_frame (frame); Widget menubar; block_input (); @@ -496,7 +492,7 @@ If FRAME is nil or not given, use the selected frame. */) if (menubar) { Window child; - int error_p = 0; + bool error_p = 0; x_catch_errors (FRAME_X_DISPLAY (f)); memset (&ev, 0, sizeof ev); @@ -563,13 +559,10 @@ If FRAME is nil or not given, use the selected frame. */) (Lisp_Object frame) { GtkWidget *menubar; - FRAME_PTR f; - - /* gcc 2.95 doesn't accept the FRAME_PTR declaration after - block_input (). */ + struct frame *f; block_input (); - f = check_x_frame (frame); + f = decode_window_system_frame (frame); if (FRAME_EXTERNAL_MENU_BAR (f)) set_frame_menubar (f, 0, 1); @@ -624,10 +617,9 @@ popup_widget_loop (int do_timers, GtkWidget *widget) execute Lisp code. */ void -x_activate_menubar (FRAME_PTR f) +x_activate_menubar (struct frame *f) { - if (! FRAME_X_P (f)) - emacs_abort (); + eassert (FRAME_X_P (f)); if (!f->output_data.x->saved_menu_event->type) return; @@ -687,7 +679,7 @@ popup_deactivate_callback ( for that widget. F is the frame if known, or NULL if not known. */ static void -show_help_event (FRAME_PTR f, xt_or_gtk_widget widget, Lisp_Object help) +show_help_event (struct frame *f, xt_or_gtk_widget widget, Lisp_Object help) { Lisp_Object frame; @@ -730,8 +722,7 @@ menu_highlight_callback (GtkWidget *widget, gpointer call_data) xg_menu_item_cb_data *cb_data; Lisp_Object help; - cb_data = (xg_menu_item_cb_data*) g_object_get_data (G_OBJECT (widget), - XG_ITEM_DATA); + cb_data = g_object_get_data (G_OBJECT (widget), XG_ITEM_DATA); if (! cb_data) return; help = call_data ? cb_data->help : Qnil; @@ -749,15 +740,11 @@ menu_highlight_callback (GtkWidget *widget, gpointer call_data) static void menu_highlight_callback (Widget widget, LWLIB_ID id, void *call_data) { - struct frame *f; - Lisp_Object help; - - widget_value *wv = (widget_value *) call_data; - - help = wv ? wv->help : Qnil; + widget_value *wv = call_data; + Lisp_Object help = wv ? wv->help : Qnil; /* Determine the frame for the help event. */ - f = menubar_id_to_frame (id); + struct frame *f = menubar_id_to_frame (id); show_help_event (f, widget, help); } @@ -777,7 +764,7 @@ static int xg_crazy_callback_abort; static void menubar_selection_callback (GtkWidget *widget, gpointer client_data) { - xg_menu_item_cb_data *cb_data = (xg_menu_item_cb_data*) client_data; + xg_menu_item_cb_data *cb_data = client_data; if (xg_crazy_callback_abort) return; @@ -820,7 +807,7 @@ menubar_selection_callback (GtkWidget *widget, gpointer client_data) static void menubar_selection_callback (Widget widget, LWLIB_ID id, XtPointer client_data) { - FRAME_PTR f; + struct frame *f; f = menubar_id_to_frame (id); if (!f) @@ -834,7 +821,7 @@ menubar_selection_callback (Widget widget, LWLIB_ID id, XtPointer client_data) changed. */ static void -update_frame_menubar (FRAME_PTR f) +update_frame_menubar (struct frame *f) { #ifdef USE_GTK xg_update_frame_menubar (f); @@ -842,8 +829,7 @@ update_frame_menubar (FRAME_PTR f) struct x_output *x; int columns, rows; - if (! FRAME_X_P (f)) - emacs_abort (); + eassert (FRAME_X_P (f)); x = f->output_data.x; @@ -917,7 +903,7 @@ apply_systemfont_to_menu (struct frame *f, Widget w) it is set the first time this is called, from initialize_frame_menubar. */ void -set_frame_menubar (FRAME_PTR f, bool first_time, bool deep_p) +set_frame_menubar (struct frame *f, bool first_time, bool deep_p) { xt_or_gtk_widget menubar_widget; #ifdef USE_X_TOOLKIT @@ -930,8 +916,7 @@ set_frame_menubar (FRAME_PTR f, bool first_time, bool deep_p) bool *submenu_top_level_items; int *submenu_n_panes; - if (! FRAME_X_P (f)) - emacs_abort (); + eassert (FRAME_X_P (f)); menubar_widget = f->output_data.x->menubar_widget; @@ -976,7 +961,7 @@ set_frame_menubar (FRAME_PTR f, bool first_time, bool deep_p) if (! menubar_widget) previous_menu_items_used = 0; - buffer = XWINDOW (FRAME_SELECTED_WINDOW (f))->buffer; + buffer = XWINDOW (FRAME_SELECTED_WINDOW (f))->contents; specbind (Qinhibit_quit, Qt); /* Don't let the debugger step into this code because it is not reentrant. */ @@ -1055,7 +1040,7 @@ set_frame_menubar (FRAME_PTR f, bool first_time, bool deep_p) wv->help = Qnil; first_wv = wv; - for (i = 0; 0 <= submenu_start[i]; i++) + for (i = 0; submenu_start[i] >= 0; i++) { menu_items_n_panes = submenu_n_panes[i]; wv = digest_single_submenu (submenu_start[i], submenu_end[i], @@ -1270,7 +1255,7 @@ set_frame_menubar (FRAME_PTR f, bool first_time, bool deep_p) is visible. */ void -initialize_frame_menubar (FRAME_PTR f) +initialize_frame_menubar (struct frame *f) { /* This function is called before the first chance to redisplay the frame. It has to be, so the frame will have the right size. */ @@ -1285,12 +1270,11 @@ initialize_frame_menubar (FRAME_PTR f) #ifndef USE_GTK void -free_frame_menubar (FRAME_PTR f) +free_frame_menubar (struct frame *f) { Widget menubar_widget; - if (! FRAME_X_P (f)) - emacs_abort (); + eassert (FRAME_X_P (f)); menubar_widget = f->output_data.x->menubar_widget; @@ -1363,7 +1347,7 @@ static Lisp_Object *volatile menu_item_selection; create_and_show_popup_menu below. */ struct next_popup_x_y { - FRAME_PTR f; + struct frame *f; int x; int y; }; @@ -1381,7 +1365,7 @@ struct next_popup_x_y static void menu_position_func (GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer user_data) { - struct next_popup_x_y* data = (struct next_popup_x_y*)user_data; + struct next_popup_x_y *data = user_data; GtkRequisition req; struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (data->f); int disp_width = x_display_pixel_width (dpyinfo); @@ -1402,27 +1386,26 @@ menu_position_func (GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer static void popup_selection_callback (GtkWidget *widget, gpointer client_data) { - xg_menu_item_cb_data *cb_data = (xg_menu_item_cb_data*) client_data; + xg_menu_item_cb_data *cb_data = client_data; if (xg_crazy_callback_abort) return; - if (cb_data) menu_item_selection = (Lisp_Object *) cb_data->call_data; + if (cb_data) menu_item_selection = cb_data->call_data; } -static Lisp_Object -pop_down_menu (Lisp_Object arg) +static void +pop_down_menu (void *arg) { popup_activated_flag = 0; block_input (); - gtk_widget_destroy (GTK_WIDGET (XSAVE_POINTER (arg, 0))); + gtk_widget_destroy (GTK_WIDGET (arg)); unblock_input (); - return Qnil; } /* Pop up the menu for frame F defined by FIRST_WV at X/Y and loop until the menu pops down. menu_item_selection will be set to the selection. */ static void -create_and_show_popup_menu (FRAME_PTR f, widget_value *first_wv, int x, int y, +create_and_show_popup_menu (struct frame *f, widget_value *first_wv, int x, int y, bool for_click, Time timestamp) { int i; @@ -1438,8 +1421,7 @@ create_and_show_popup_menu (FRAME_PTR f, widget_value *first_wv, int x, int y, use_pos_func = 1; #endif - if (! FRAME_X_P (f)) - emacs_abort (); + eassert (FRAME_X_P (f)); xg_crazy_callback_abort = 1; menu = xg_create_widget ("popup", first_wv->name, f, first_wv, @@ -1477,7 +1459,7 @@ create_and_show_popup_menu (FRAME_PTR f, widget_value *first_wv, int x, int y, gtk_menu_popup (GTK_MENU (menu), 0, 0, pos_func, &popup_x_y, i, timestamp ? timestamp : gtk_get_current_event_time ()); - record_unwind_protect (pop_down_menu, make_save_pointer (menu)); + record_unwind_protect_ptr (pop_down_menu, menu); if (gtk_widget_get_mapped (menu)) { @@ -1510,13 +1492,13 @@ LWLIB_ID widget_id_tick; static void popup_selection_callback (Widget widget, LWLIB_ID id, XtPointer client_data) { - menu_item_selection = (Lisp_Object *) client_data; + menu_item_selection = client_data; } /* ARG is the LWLIB ID of the dialog box, represented as a Lisp object as (HIGHPART . LOWPART). */ -static Lisp_Object +static void pop_down_menu (Lisp_Object arg) { LWLIB_ID id = (XINT (XCAR (arg)) << 4 * sizeof (LWLIB_ID) @@ -1526,15 +1508,13 @@ pop_down_menu (Lisp_Object arg) lw_destroy_all_widgets (id); unblock_input (); popup_activated_flag = 0; - - return Qnil; } /* Pop up the menu for frame F defined by FIRST_WV at X/Y and loop until the menu pops down. menu_item_selection will be set to the selection. */ static void -create_and_show_popup_menu (FRAME_PTR f, widget_value *first_wv, +create_and_show_popup_menu (struct frame *f, widget_value *first_wv, int x, int y, bool for_click, Time timestamp) { int i; @@ -1545,8 +1525,7 @@ create_and_show_popup_menu (FRAME_PTR f, widget_value *first_wv, LWLIB_ID menu_id; Widget menu; - if (! FRAME_X_P (f)) - emacs_abort (); + eassert (FRAME_X_P (f)); #ifdef USE_LUCID apply_systemfont_to_menu (f, f->output_data.x->widget); @@ -1599,7 +1578,7 @@ create_and_show_popup_menu (FRAME_PTR f, widget_value *first_wv, make_number (menu_id & ~(-1 << (fact))))); /* Process events that apply to the menu. */ - popup_get_selection ((XEvent *) 0, FRAME_X_DISPLAY_INFO (f), menu_id, 1); + popup_get_selection (0, FRAME_X_DISPLAY_INFO (f), menu_id, 1); unbind_to (specpdl_count, Qnil); } @@ -1607,15 +1586,14 @@ create_and_show_popup_menu (FRAME_PTR f, widget_value *first_wv, #endif /* not USE_GTK */ -static Lisp_Object -cleanup_widget_value_tree (Lisp_Object arg) +static void +cleanup_widget_value_tree (void *arg) { - free_menubar_widget_value_tree (XSAVE_POINTER (arg, 0)); - return Qnil; + free_menubar_widget_value_tree (arg); } Lisp_Object -xmenu_show (FRAME_PTR f, int x, int y, bool for_click, bool keymaps, +xmenu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, Lisp_Object title, const char **error_name, Time timestamp) { int i; @@ -1630,8 +1608,7 @@ xmenu_show (FRAME_PTR f, int x, int y, bool for_click, bool keymaps, ptrdiff_t specpdl_count = SPECPDL_INDEX (); - if (! FRAME_X_P (f)) - emacs_abort (); + eassert (FRAME_X_P (f)); *error_name = NULL; @@ -1825,8 +1802,7 @@ xmenu_show (FRAME_PTR f, int x, int y, bool for_click, bool keymaps, /* Make sure to free the widget_value objects we used to specify the contents even with longjmp. */ - record_unwind_protect (cleanup_widget_value_tree, - make_save_pointer (first_wv)); + record_unwind_protect_ptr (cleanup_widget_value_tree, first_wv); /* Actually create and show the menu until popped down. */ create_and_show_popup_menu (f, first_wv, x, y, for_click, timestamp); @@ -1874,7 +1850,7 @@ xmenu_show (FRAME_PTR f, int x, int y, bool for_click, bool keymaps, { int j; - entry = Fcons (entry, Qnil); + entry = list1 (entry); if (!NILP (prefix)) entry = Fcons (prefix, entry); for (j = submenu_depth - 1; j >= 0; j--) @@ -1901,7 +1877,7 @@ dialog_selection_callback (GtkWidget *widget, gpointer client_data) /* Treat the pointer as an integer. There's no problem as long as pointers have enough bits to hold small integers. */ if ((intptr_t) client_data != -1) - menu_item_selection = (Lisp_Object *) client_data; + menu_item_selection = client_data; popup_activated_flag = 0; } @@ -1910,12 +1886,11 @@ dialog_selection_callback (GtkWidget *widget, gpointer client_data) dialog pops down. menu_item_selection will be set to the selection. */ static void -create_and_show_dialog (FRAME_PTR f, widget_value *first_wv) +create_and_show_dialog (struct frame *f, widget_value *first_wv) { GtkWidget *menu; - if (! FRAME_X_P (f)) - emacs_abort (); + eassert (FRAME_X_P (f)); menu = xg_create_widget ("dialog", first_wv->name, f, first_wv, G_CALLBACK (dialog_selection_callback), @@ -1925,7 +1900,7 @@ create_and_show_dialog (FRAME_PTR f, widget_value *first_wv) if (menu) { ptrdiff_t specpdl_count = SPECPDL_INDEX (); - record_unwind_protect (pop_down_menu, make_save_pointer (menu)); + record_unwind_protect_ptr (pop_down_menu, menu); /* Display the menu. */ gtk_widget_show_all (menu); @@ -1944,7 +1919,7 @@ dialog_selection_callback (Widget widget, LWLIB_ID id, XtPointer client_data) /* Treat the pointer as an integer. There's no problem as long as pointers have enough bits to hold small integers. */ if ((intptr_t) client_data != -1) - menu_item_selection = (Lisp_Object *) client_data; + menu_item_selection = client_data; block_input (); lw_destroy_all_widgets (id); @@ -1957,12 +1932,11 @@ dialog_selection_callback (Widget widget, LWLIB_ID id, XtPointer client_data) dialog pops down. menu_item_selection will be set to the selection. */ static void -create_and_show_dialog (FRAME_PTR f, widget_value *first_wv) +create_and_show_dialog (struct frame *f, widget_value *first_wv) { LWLIB_ID dialog_id; - if (!FRAME_X_P (f)) - emacs_abort (); + eassert (FRAME_X_P (f)); dialog_id = widget_id_tick++; #ifdef USE_LUCID @@ -1988,8 +1962,7 @@ create_and_show_dialog (FRAME_PTR f, widget_value *first_wv) Fcons (make_number (dialog_id >> (fact)), make_number (dialog_id & ~(-1 << (fact))))); - popup_get_selection ((XEvent *) 0, FRAME_X_DISPLAY_INFO (f), - dialog_id, 1); + popup_get_selection (0, FRAME_X_DISPLAY_INFO (f), dialog_id, 1); unbind_to (count, Qnil); } @@ -2002,7 +1975,7 @@ static const char * button_names [] = { "button6", "button7", "button8", "button9", "button10" }; static Lisp_Object -xdialog_show (FRAME_PTR f, +xdialog_show (struct frame *f, bool keymaps, Lisp_Object title, Lisp_Object header, @@ -2020,8 +1993,7 @@ xdialog_show (FRAME_PTR f, ptrdiff_t specpdl_count = SPECPDL_INDEX (); - if (! FRAME_X_P (f)) - emacs_abort (); + eassert (FRAME_X_P (f)); *error_name = NULL; @@ -2135,8 +2107,7 @@ xdialog_show (FRAME_PTR f, /* Make sure to free the widget_value objects we used to specify the contents even with longjmp. */ - record_unwind_protect (cleanup_widget_value_tree, - make_save_pointer (first_wv)); + record_unwind_protect_ptr (cleanup_widget_value_tree, first_wv); /* Actually create and show the dialog. */ create_and_show_dialog (f, first_wv); @@ -2175,7 +2146,7 @@ xdialog_show (FRAME_PTR f, { if (keymaps != 0) { - entry = Fcons (entry, Qnil); + entry = list1 (entry); if (!NILP (prefix)) entry = Fcons (prefix, entry); } @@ -2226,17 +2197,15 @@ menu_help_callback (char const *help_string, int pane, int item) pane_name = first_item[MENU_ITEMS_ITEM_NAME]; /* (menu-item MENU-NAME PANE-NUMBER) */ - menu_object = Fcons (Qmenu_item, - Fcons (pane_name, - Fcons (make_number (pane), Qnil))); + menu_object = list3 (Qmenu_item, pane_name, make_number (pane)); show_help_echo (help_string ? build_string (help_string) : Qnil, Qnil, menu_object, make_number (item)); } -static Lisp_Object +static void pop_down_menu (Lisp_Object arg) { - FRAME_PTR f = XSAVE_POINTER (arg, 0); + struct frame *f = XSAVE_POINTER (arg, 0); XMenu *menu = XSAVE_POINTER (arg, 1); block_input (); @@ -2260,13 +2229,11 @@ pop_down_menu (Lisp_Object arg) #endif /* HAVE_X_WINDOWS */ unblock_input (); - - return Qnil; } Lisp_Object -xmenu_show (FRAME_PTR f, int x, int y, bool for_click, bool keymaps, +xmenu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, Lisp_Object title, const char **error_name, Time timestamp) { Window root; @@ -2282,8 +2249,7 @@ xmenu_show (FRAME_PTR f, int x, int y, bool for_click, bool keymaps, unsigned int dummy_uint; ptrdiff_t specpdl_count = SPECPDL_INDEX (); - if (! FRAME_X_P (f) && ! FRAME_MSDOS_P (f)) - emacs_abort (); + eassert (FRAME_X_P (f) || FRAME_MSDOS_P (f)); *error_name = 0; if (menu_items_n_panes == 0) @@ -2478,8 +2444,7 @@ xmenu_show (FRAME_PTR f, int x, int y, bool for_click, bool keymaps, XMenuActivateSetWaitFunction (x_menu_wait_for_event, FRAME_X_DISPLAY (f)); #endif - record_unwind_protect (pop_down_menu, - make_save_value ("pp", f, menu)); + record_unwind_protect (pop_down_menu, make_save_ptr_ptr (f, menu)); /* Help display under X won't work because XMenuActivate contains a loop that doesn't give Emacs a chance to process it. */ @@ -2518,7 +2483,7 @@ xmenu_show (FRAME_PTR f, int x, int y, bool for_click, bool keymaps, = AREF (menu_items, i + MENU_ITEMS_ITEM_VALUE); if (keymaps) { - entry = Fcons (entry, Qnil); + entry = list1 (entry); if (!NILP (pane_prefix)) entry = Fcons (pane_prefix, entry); }