X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/e6cba65065d7002d181c3d440bfc5e04ba953783..be02381c5db4236f51f474726003d5a97bbc61f7:/src/xmenu.c diff --git a/src/xmenu.c b/src/xmenu.c index a04eb2502b..eab7bb03f2 100644 --- a/src/xmenu.c +++ b/src/xmenu.c @@ -1,6 +1,7 @@ /* X Communication module for terminals which understand the X protocol. - Copyright (C) 1986, 1988, 1993, 1994, 1996, 1999, 2000, 2001, 2002, 2003, - 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. + +Copyright (C) 1986, 1988, 1993-1994, 1996, 1999-2011 + Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -89,6 +90,9 @@ along with GNU Emacs. If not, see . */ #include #endif /* HAVE_XAW3D */ #endif /* USE_LUCID */ +#ifdef USE_MOTIF +#include "../lwlib/lwlib.h" +#endif #else /* not USE_X_TOOLKIT */ #ifndef USE_GTK #include "../oldXMenu/XMenu.h" @@ -109,28 +113,9 @@ along with GNU Emacs. If not, see . */ Lisp_Object Qdebug_on_next_call; -extern Lisp_Object Qmenu_bar; - -extern Lisp_Object QCtoggle, QCradio; - -extern Lisp_Object Qoverriding_local_map, Qoverriding_terminal_local_map; - -extern Lisp_Object Qmenu_bar_update_hook; - -#ifdef USE_X_TOOLKIT -extern void set_frame_menubar (FRAME_PTR, int, int); -extern XtAppContext Xt_app_con; - -static Lisp_Object xdialog_show (FRAME_PTR, int, Lisp_Object, Lisp_Object, - char **); -static void popup_get_selection (XEvent *, struct x_display_info *, - LWLIB_ID, int); -#endif /* USE_X_TOOLKIT */ - -#ifdef USE_GTK -extern void set_frame_menubar (FRAME_PTR, int, int); +#if defined (USE_X_TOOLKIT) || defined (USE_GTK) static Lisp_Object xdialog_show (FRAME_PTR, int, Lisp_Object, Lisp_Object, - char **); + const char **); #endif static int update_frame_menubar (struct frame *); @@ -139,17 +124,11 @@ static int update_frame_menubar (struct frame *); Xt on behalf of one of the widget sets. */ static int popup_activated_flag; -static int next_menubar_widget_id; - -/* For NS and NTGUI, these prototypes are defined in keyboard.h. */ -#if defined (USE_X_TOOLKIT) || defined (USE_GTK) -extern widget_value *xmalloc_widget_value (void); -extern widget_value *digest_single_submenu (int, int, int); -#endif - #ifdef USE_X_TOOLKIT +static int next_menubar_widget_id; + /* Return the frame whose ->output_data.x->id equals ID, or 0 if none. */ static struct frame * @@ -337,7 +316,7 @@ for instance using the window manager, then this produces a quit and #else { Lisp_Object title; - char *error_name; + const char *error_name; Lisp_Object selection; int specpdl_count = SPECPDL_INDEX (); @@ -744,7 +723,7 @@ show_help_event (FRAME_PTR f, xt_or_gtk_widget widget, Lisp_Object help) unhighlighting. */ #ifdef USE_GTK -void +static void menu_highlight_callback (GtkWidget *widget, gpointer call_data) { xg_menu_item_cb_data *cb_data; @@ -763,7 +742,7 @@ menu_highlight_callback (GtkWidget *widget, gpointer call_data) show_help_event (cb_data->cl_data->f, widget, help); } #else -void +static void menu_highlight_callback (Widget widget, LWLIB_ID id, void *call_data) { struct frame *f; @@ -904,35 +883,30 @@ static void apply_systemfont_to_dialog (Widget w) { const char *fn = xsettings_get_system_normal_font (); - if (fn) + if (fn) { XrmDatabase db = XtDatabase (XtDisplay (w)); if (db) - XrmPutStringResource (&db, "*dialog.faceName", fn); + XrmPutStringResource (&db, "*dialog.font", fn); } } static void -apply_systemfont_to_menu (Widget w) +apply_systemfont_to_menu (struct frame *f, Widget w) { const char *fn = xsettings_get_system_normal_font (); - int defflt; - - if (!fn) return; - if (XtIsShell (w)) /* popup menu */ + if (fn) { - Widget *childs = NULL; - - XtVaGetValues (w, XtNchildren, &childs, NULL); - if (*childs) w = *childs; + XrmDatabase db = XtDatabase (XtDisplay (w)); + if (db) + { + XrmPutStringResource (&db, "*menubar*font", fn); + XrmPutStringResource (&db, "*popup*font", fn); + } } - - /* Only use system font if the default is used for the menu. */ - XtVaGetValues (w, XtNdefaultFace, &defflt, NULL); - if (defflt) - XtVaSetValues (w, XtNfaceName, fn, NULL); } + #endif /* Set the contents of the menubar widgets of frame F. @@ -1128,7 +1102,7 @@ set_frame_menubar (FRAME_PTR f, int first_time, int deep_p) string = XVECTOR (items)->contents[i + 1]; if (NILP (string)) break; - wv->name = (char *) SDATA (string); + wv->name = SSDATA (string); update_submenu_strings (wv->contents); wv = wv->next; } @@ -1157,7 +1131,7 @@ set_frame_menubar (FRAME_PTR f, int first_time, int deep_p) break; wv = xmalloc_widget_value (); - wv->name = (char *) SDATA (string); + wv->name = SSDATA (string); wv->value = 0; wv->enabled = 1; wv->button_type = BUTTON_TYPE_NONE; @@ -1201,8 +1175,6 @@ set_frame_menubar (FRAME_PTR f, int first_time, int deep_p) } else { - GtkWidget *wvbox = f->output_data.x->vbox_widget; - menubar_widget = xg_create_widget ("menubar", "menubar", f, first_wv, G_CALLBACK (menubar_selection_callback), @@ -1231,7 +1203,11 @@ set_frame_menubar (FRAME_PTR f, int first_time, int deep_p) char menuOverride[] = "Ctrlg: MenuGadgetEscape()"; XtTranslations override = XtParseTranslationTable (menuOverride); - menubar_widget = lw_create_widget ("menubar", "menubar", id, first_wv, +#ifdef USE_LUCID + apply_systemfont_to_menu (f, f->output_data.x->column_widget); +#endif + menubar_widget = lw_create_widget ("menubar", "menubar", id, + first_wv, f->output_data.x->column_widget, 0, popup_activate_callback, @@ -1242,9 +1218,6 @@ set_frame_menubar (FRAME_PTR f, int first_time, int deep_p) /* Make menu pop down on C-g. */ XtOverrideTranslations (menubar_widget, override); -#ifdef USE_LUCID - apply_systemfont_to_menu (menubar_widget); -#endif } { @@ -1415,7 +1388,7 @@ menu_position_func (GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer /* Check if there is room for the menu. If not, adjust x/y so that the menu is fully visible. */ - gtk_widget_size_request (GTK_WIDGET (menu), &req); + gtk_widget_get_preferred_size (GTK_WIDGET (menu), NULL, &req); if (data->x + req.width > disp_width) *x -= data->x + req.width - disp_width; if (data->y + req.height > disp_height) @@ -1563,6 +1536,10 @@ create_and_show_popup_menu (FRAME_PTR f, widget_value *first_wv, if (! FRAME_X_P (f)) abort (); +#ifdef USE_LUCID + apply_systemfont_to_menu (f, f->output_data.x->widget); +#endif + menu_id = widget_id_tick++; menu = lw_create_widget ("popup", first_wv->name, menu_id, first_wv, f->output_data.x->widget, 1, 0, @@ -1570,10 +1547,6 @@ create_and_show_popup_menu (FRAME_PTR f, widget_value *first_wv, popup_deactivate_callback, menu_highlight_callback); -#ifdef USE_LUCID - apply_systemfont_to_menu (menu); -#endif - dummy.type = ButtonPress; dummy.serial = 0; dummy.send_event = 0; @@ -1625,7 +1598,7 @@ create_and_show_popup_menu (FRAME_PTR f, widget_value *first_wv, Lisp_Object xmenu_show (FRAME_PTR f, int x, int y, int for_click, int keymaps, - Lisp_Object title, char **error, EMACS_UINT timestamp) + Lisp_Object title, const char **error_name, EMACS_UINT timestamp) { int i; widget_value *wv, *save_wv = 0, *first_wv = 0, *prev_wv = 0; @@ -1640,11 +1613,11 @@ xmenu_show (FRAME_PTR f, int x, int y, int for_click, int keymaps, if (! FRAME_X_P (f)) abort (); - *error = NULL; + *error_name = NULL; if (menu_items_used <= MENU_ITEMS_PANE_LENGTH) { - *error = "Empty menu"; + *error_name = "Empty menu"; return Qnil; } @@ -1689,7 +1662,7 @@ xmenu_show (FRAME_PTR f, int x, int y, int for_click, int keymaps, { /* Create a new pane. */ Lisp_Object pane_name, prefix; - char *pane_string; + const char *pane_string; pane_name = AREF (menu_items, i + MENU_ITEMS_PANE_NAME); prefix = AREF (menu_items, i + MENU_ITEMS_PANE_PREFIX); @@ -1702,7 +1675,7 @@ xmenu_show (FRAME_PTR f, int x, int y, int for_click, int keymaps, } #endif pane_string = (NILP (pane_name) - ? "" : (char *) SDATA (pane_name)); + ? "" : SSDATA (pane_name)); /* If there is just one top-level pane, put all its items directly under the top-level menu. */ if (menu_items_n_panes == 1) @@ -1767,9 +1740,9 @@ xmenu_show (FRAME_PTR f, int x, int y, int for_click, int keymaps, prev_wv->next = wv; else save_wv->contents = wv; - wv->name = (char *) SDATA (item_name); + wv->name = SSDATA (item_name); if (!NILP (descrip)) - wv->key = (char *) SDATA (descrip); + wv->key = SSDATA (descrip); wv->value = 0; /* If this item has a null value, make the call_data null so that it won't display a box @@ -1820,7 +1793,7 @@ xmenu_show (FRAME_PTR f, int x, int y, int for_click, int keymaps, title = ENCODE_MENU_STRING (title); #endif - wv_title->name = (char *) SDATA (title); + wv_title->name = SSDATA (title); wv_title->enabled = TRUE; wv_title->button_type = BUTTON_TYPE_NONE; wv_title->help = Qnil; @@ -2001,12 +1974,16 @@ create_and_show_dialog (FRAME_PTR f, widget_value *first_wv) #endif /* not USE_GTK */ -static char * button_names [] = { +static const char * button_names [] = { "button1", "button2", "button3", "button4", "button5", "button6", "button7", "button8", "button9", "button10" }; static Lisp_Object -xdialog_show (FRAME_PTR f, int keymaps, Lisp_Object title, Lisp_Object header, char **error_name) +xdialog_show (FRAME_PTR f, + int keymaps, + Lisp_Object title, + Lisp_Object header, + const char **error_name) { int i, nb_buttons=0; char dialog_name[6]; @@ -2033,11 +2010,11 @@ xdialog_show (FRAME_PTR f, int keymaps, Lisp_Object title, Lisp_Object header, c representing the text label and buttons. */ { Lisp_Object pane_name, prefix; - char *pane_string; + const char *pane_string; pane_name = XVECTOR (menu_items)->contents[MENU_ITEMS_PANE_NAME]; prefix = XVECTOR (menu_items)->contents[MENU_ITEMS_PANE_PREFIX]; pane_string = (NILP (pane_name) - ? "" : (char *) SDATA (pane_name)); + ? "" : SSDATA (pane_name)); prev_wv = xmalloc_widget_value (); prev_wv->value = pane_string; if (keymaps && !NILP (prefix)) @@ -2084,8 +2061,8 @@ xdialog_show (FRAME_PTR f, int keymaps, Lisp_Object title, Lisp_Object header, c prev_wv->next = wv; wv->name = (char *) button_names[nb_buttons]; if (!NILP (descrip)) - wv->key = (char *) SDATA (descrip); - wv->value = (char *) SDATA (item_name); + wv->key = SSDATA (descrip); + wv->value = SSDATA (item_name); wv->call_data = (void *) &XVECTOR (menu_items)->contents[i]; wv->enabled = !NILP (enable); wv->help = Qnil; @@ -2264,7 +2241,7 @@ pop_down_menu (Lisp_Object arg) Lisp_Object xmenu_show (FRAME_PTR f, int x, int y, int for_click, int keymaps, - Lisp_Object title, char **error, EMACS_UINT timestamp) + Lisp_Object title, const char **error, EMACS_UINT timestamp) { Window root; XMenu *menu; @@ -2328,14 +2305,14 @@ xmenu_show (FRAME_PTR f, int x, int y, int for_click, int keymaps, { /* Create a new pane. */ Lisp_Object pane_name, prefix; - char *pane_string; + const char *pane_string; maxlines = max (maxlines, lines); lines = 0; pane_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_NAME]; prefix = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_PREFIX]; pane_string = (NILP (pane_name) - ? "" : (char *) SDATA (pane_name)); + ? "" : SSDATA (pane_name)); if (keymaps && !NILP (prefix)) pane_string++; @@ -2553,13 +2530,16 @@ xmenu_show (FRAME_PTR f, int x, int y, int for_click, int keymaps, #endif /* HAVE_MENUS */ -/* Detect if a dialog or menu has been posted. */ +#ifndef MSDOS +/* Detect if a dialog or menu has been posted. MSDOS has its own + implementation on msdos.c. */ int popup_activated (void) { return popup_activated_flag; } +#endif /* not MSDOS */ /* The following is used by delayed window autoselection. */ @@ -2597,6 +2577,3 @@ syms_of_xmenu (void) defsubr (&Sx_popup_dialog); #endif } - -/* arch-tag: 92ea573c-398e-496e-ac73-2436f7d63242 - (do not change this comment) */