I will try to fiddle with themes, but I think it is a superficial fix. Emacs ought to work even without a desktop environment. Hell, I'll run Window Maker with no DE at all sometimes. I think I found fix with this with Emacs. It may be only fix for Chromium or like is a theme, because there is no way I have energy to learn how to compile that. The Emacs fix... I checked Ubuntu's packaging of Emacs to see how it is different. They have a patch they pulled from Emacs upstream. Ironically, it is called "0020-Emacs-should-show-GTK-icons-again.patch". With that, I've recompiled Emacs and buttons now work correctly, without changing anything else, no new themes. In fact, I'm doing these builds on a headless system where I'm launching Emacs to test via X11 forwarding. Theme does not matter, so far as I can tell. The Emacs session forwards back just fine now, calling into question the emphasis on themes. In case you want to try Emacs-24.5 on Centos with that patch, the files are in my rpm server http://pj.freefaculty.org/Software/EL It is yum repo, if you install my security key The RPMs in question are http://pj.freefaculty.org/Software/EL/7/x86_64/emacs-24.5-8.el7.centos.x86_64.rpm http://pj.freefaculty.org/Software/EL/7/x86_64/emacs-common-24.5-8.el7.centos.x86_64.rpm All the other RPM files generated from the Emacs build are in that same folders. I know I'm not allowed to put an attachment on this list, so I'll paste in 0020-Emacs-should-show-GTK-icons-again.patch and you can maybe tell me what it does: >From d4a257411a7c23c2ed75c3e163243fd0e92dc2be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Dj=C3=A4rv?= <jan.h.d@xxxxxxxxxx> Date: Sat, 18 Oct 2014 18:19:53 +0200 Subject: Emacs should show GTK+ icons again. This upstream patch has been added: Handle deprecated Gtk+ stuff for version <= 3.10 * lisp/term/x-win.el (x-gtk-stock-map): Add icon names suggested as replacements to stock names before stock names in a list. Cdr may be a list, each name is tried in turn until one is found. * src/gtkutil.c (XG_TEXT_CANCEL, XG_TEXT_OPEN, XG_TEXT_OK): New defines to handle Gtk versions. (xg_get_file_with_chooser): Use them. (xg_have_tear_offs, tearoff_remove, tearoff_activate): Remove (create_menus): Remove teroff argument and code. Remove call to gtk_menu_set_title. (xg_update_menubar, xg_update_submenu): Remove tearoff code. Adjust args to create_menus. (xg_tool_bar_menu_proxy, xg_tool_bar_detach_callback) (xg_tool_bar_attach_callback, TOOLBAR_TOP_WIDGET): Remove. (xg_pack_tool_bar): Replace TOOLBAR_TOP_WIDGET, remove detach code. (xg_make_tool_item): Remove detach code. (xg_update_tool_bar_sizes): Replace TOOLBAR_TOP_WIDGET. (find_icon_from_name): New function. (update_frame_tool_bar): Remove GtkStockItem code, move to find_icon_from_name. Let stock be a list of icon names to try. Only use gtk_image_new_from_stock on Gtk+ < 3.10. Replace TOOLBAR_TOP_WIDGET. (free_frame_tool_bar, xg_change_toolbar_position ): Replace TOOLBAR_TOP_WIDGET. (xg_initialize): Remove tearoff code. * src/gtkutil.h (xg_have_tear_offs): Remove declaration. * src/xmenu.c (set_frame_menubar): Remove GTK block that calls xg_have_tear_offs. * src/xterm.h (handlebox_widget): Remove. Origin: upstream, commit: 3f4c6d52d345999938bc2d4a53246af4c61ef176 Bug-Debian: http://bugs.debian.org/828000 Added-by: Rob Browning <rlb@xxxxxxxxxxxxxxxx> --- lisp/ChangeLog | 6 + lisp/term/x-win.el | 63 ++++---- src/ChangeLog | 31 ++++ src/gtkutil.c | 421 +++++++++++------------------------------------------ src/gtkutil.h | 2 - src/xmenu.c | 6 - src/xterm.h | 4 - 7 files changed, 155 insertions(+), 378 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 7345c6a..102461e 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,9 @@ +2014-10-18 Jan Djärv <jan.h.d@xxxxxxxxxx> + + * term/x-win.el (x-gtk-stock-map): Add icon names suggested as + replacements to stock names before stock names in a list. + Cdr may be a list, each name is tried in turn until one is found. + 2015-04-10 Nicolas Petton <nicolas@xxxxxxxxx> * Version 24.5 released. diff --git a/lisp/term/x-win.el b/lisp/term/x-win.el index ca0ae3b..7a41d32 100644 --- a/lisp/term/x-win.el +++ b/lisp/term/x-win.el @@ -1475,47 +1475,47 @@ This returns an error if any Emacs frames are X frames, or always under W32." (mapcar (lambda (arg) (cons (purecopy (car arg)) (purecopy (cdr arg)))) '( - ("etc/images/new" . "gtk-new") - ("etc/images/open" . "gtk-open") + ("etc/images/new" . ("document-new" "gtk-new")) + ("etc/images/open" . ("document-open" "gtk-open")) ("etc/images/diropen" . "n:system-file-manager") - ("etc/images/close" . "gtk-close") - ("etc/images/save" . "gtk-save") - ("etc/images/saveas" . "gtk-save-as") - ("etc/images/undo" . "gtk-undo") - ("etc/images/cut" . "gtk-cut") - ("etc/images/copy" . "gtk-copy") - ("etc/images/paste" . "gtk-paste") - ("etc/images/search" . "gtk-find") - ("etc/images/print" . "gtk-print") - ("etc/images/preferences" . "gtk-preferences") - ("etc/images/help" . "gtk-help") - ("etc/images/left-arrow" . "gtk-go-back") - ("etc/images/right-arrow" . "gtk-go-forward") - ("etc/images/home" . "gtk-home") - ("etc/images/jump-to" . "gtk-jump-to") + ("etc/images/close" . ("window-close" "gtk-close")) + ("etc/images/save" . ("document-save" "gtk-save")) + ("etc/images/saveas" . ("document-save-as" "gtk-save-as")) + ("etc/images/undo" . ("edit-undo" "gtk-undo")) + ("etc/images/cut" . ("edit-cut" "gtk-cut")) + ("etc/images/copy" . ("edit-copy" "gtk-copy")) + ("etc/images/paste" . ("edit-paste" "gtk-paste")) + ("etc/images/search" . ("edit-find" "gtk-find")) + ("etc/images/print" . ("document-print" "gtk-print")) + ("etc/images/preferences" . ("preferences-system" "gtk-preferences")) + ("etc/images/help" . ("help-browser" "gtk-help")) + ("etc/images/left-arrow" . ("go-previous" "gtk-go-back")) + ("etc/images/right-arrow" . ("go-next" "gtk-go-forward")) + ("etc/images/home" . ("go-home" "gtk-home")) + ("etc/images/jump-to" . ("go-jump" "gtk-jump-to")) ("etc/images/index" . "gtk-index") - ("etc/images/search" . "gtk-find") - ("etc/images/exit" . "gtk-quit") + ("etc/images/exit" . ("application-exit" "gtk-quit")) ("etc/images/cancel" . "gtk-cancel") - ("etc/images/info" . "gtk-info") + ("etc/images/info" . ("dialog-information" "gtk-info")) ("etc/images/bookmark_add" . "n:bookmark_add") ;; Used in Gnus and/or MH-E: ("etc/images/attach" . "gtk-attach") ("etc/images/connect" . "gtk-connect") ("etc/images/contact" . "gtk-contact") - ("etc/images/delete" . "gtk-delete") - ("etc/images/describe" . "gtk-properties") + ("etc/images/delete" . ("edit-delete" "gtk-delete")) + ("etc/images/describe" . ("ocument-properties" "gtk-properties")) ("etc/images/disconnect" . "gtk-disconnect") ;; ("etc/images/exit" . "gtk-exit") ("etc/images/lock-broken" . "gtk-lock_broken") ("etc/images/lock-ok" . "gtk-lock_ok") ("etc/images/lock" . "gtk-lock") ("etc/images/next-page" . "gtk-next-page") - ("etc/images/refresh" . "gtk-refresh") - ("etc/images/sort-ascending" . "gtk-sort-ascending") + ("etc/images/refresh" . ("view-refresh" "gtk-refresh")) + ("etc/images/sort-ascending" . ("view-sort-ascending" "gtk-sort-ascending")) ("etc/images/sort-column-ascending" . "gtk-sort-column-ascending") ("etc/images/sort-criteria" . "gtk-sort-criteria") - ("etc/images/sort-descending" . "gtk-sort-descending") + ("etc/images/sort-descending" . ("view-sort-descending" + "gtk-sort-descending")) ("etc/images/sort-row-ascending" . "gtk-sort-row-ascending") ("images/gnus/toggle-subscription" . "gtk-task-recurring") ("images/mail/compose" . "gtk-mail-compose") @@ -1532,8 +1532,8 @@ This returns an error if any Emacs frames are X frames, or always under W32." ("images/mail/spam" . "gtk-spam") ;; Used for GDB Graphical Interface ("images/gud/break" . "gtk-no") - ("images/gud/recstart" . "gtk-media-record") - ("images/gud/recstop" . "gtk-media-stop") + ("images/gud/recstart" . ("media-record" "gtk-media-record")) + ("images/gud/recstop" . ("media-playback-stop" "gtk-media-stop")) ;; No themed versions available: ;; mail/preview (combining stock_mail and stock_zoom) ;; mail/save (combining stock_mail, stock_save and stock_convert) @@ -1542,9 +1542,12 @@ This returns an error if any Emacs frames are X frames, or always under W32." Emacs must be compiled with the Gtk+ toolkit for this to have any effect. A value that begins with n: denotes a named icon instead of a stock icon." :version "22.2" - :type '(choice (repeat (choice symbol - (cons (string :tag "Emacs icon") - (string :tag "Stock/named"))))) + :type '(choice (repeat + (choice symbol + (cons (string :tag "Emacs icon") + (choice (group (string :tag "Named") + (string :tag "Stock")) + (string :tag "Stock/named")))))) :group 'x) (defcustom icon-map-list '(x-gtk-stock-map) diff --git a/src/ChangeLog b/src/ChangeLog index f95a763..1ad3dfe 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,34 @@ +2014-10-18 Jan Djärv <jan.h.d@xxxxxxxxxx> + + * xterm.h (handlebox_widget): Remove. + + * xmenu.c (set_frame_menubar): Remove GTK block that calls + xg_have_tear_offs. + + * gtkutil.h (xg_have_tear_offs): Remove declaration. + + * gtkutil.c (XG_TEXT_CANCEL, XG_TEXT_OPEN, XG_TEXT_OK): New defines + to handle Gtk versions. + (xg_get_file_with_chooser): Use them. + (xg_have_tear_offs, tearoff_remove, tearoff_activate): Remove + (create_menus): Remove teroff argument and code. + Remove call to gtk_menu_set_title. + (xg_update_menubar, xg_update_submenu): Remove tearoff code. Adjust + args to create_menus. + (xg_tool_bar_menu_proxy, xg_tool_bar_detach_callback) + (xg_tool_bar_attach_callback, TOOLBAR_TOP_WIDGET): Remove. + (xg_pack_tool_bar): Replace TOOLBAR_TOP_WIDGET, remove detach code. + (xg_make_tool_item): Remove detach code. + (xg_update_tool_bar_sizes): Replace TOOLBAR_TOP_WIDGET. + (find_icon_from_name): New function. + (update_frame_tool_bar): Remove GtkStockItem code, move to + find_icon_from_name. Let stock be a list of icon names to try. + Only use gtk_image_new_from_stock on Gtk+ < 3.10. + Replace TOOLBAR_TOP_WIDGET. + (free_frame_tool_bar, xg_change_toolbar_position ): Replace + TOOLBAR_TOP_WIDGET. + (xg_initialize): Remove tearoff code. + 2015-04-10 Nicolas Petton <nicolas@xxxxxxxxx> * Version 24.5 released. diff --git a/src/gtkutil.c b/src/gtkutil.c index eddd2b5..68709ed 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c @@ -92,6 +92,16 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #endif #endif /* HAVE_FREETYPE */ +#if GTK_CHECK_VERSION (3, 10, 0) +#define XG_TEXT_CANCEL "Cancel" +#define XG_TEXT_OK "OK" +#define XG_TEXT_OPEN "Open" +#else +#define XG_TEXT_CANCEL GTK_STOCK_CANCEL +#define XG_TEXT_OK GTK_STOCK_OK +#define XG_TEXT_OPEN GTK_STOCK_OPEN +#endif + #ifndef HAVE_GTK3 #ifdef USE_GTK_TOOLTIP #define gdk_window_get_screen(w) gdk_drawable_get_screen (w) @@ -1826,9 +1836,9 @@ xg_get_file_with_chooser (struct frame *f, action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER; filewin = gtk_file_chooser_dialog_new (prompt, gwin, action, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + XG_TEXT_CANCEL, GTK_RESPONSE_CANCEL, (mustmatch_p || only_dir_p ? - GTK_STOCK_OPEN : GTK_STOCK_OK), + XG_TEXT_OPEN : XG_TEXT_OK), GTK_RESPONSE_OK, NULL); gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (filewin), TRUE); @@ -2408,57 +2418,6 @@ make_menu_item (const char *utf8_label, return w; } -#ifdef HAVE_GTK_TEAROFF_MENU_ITEM_NEW - -static int xg_detached_menus; - -/* Return true if there are detached menus. */ - -bool -xg_have_tear_offs (struct frame *f) -{ - /* If the frame's menubar height is zero, the menu bar is probably - being redirected outside the window to some kind of global menu; - this situation is the moral equivalent of a tear-off. */ - return FRAME_MENUBAR_HEIGHT (f) == 0 || xg_detached_menus > 0; -} - -/* Callback invoked when a detached menu window is removed. Here we - decrease the xg_detached_menus count. - WIDGET is the top level window that is removed (the parent of the menu). - CLIENT_DATA is not used. */ - -static void -tearoff_remove (GtkWidget *widget, gpointer client_data) -{ - if (xg_detached_menus > 0) --xg_detached_menus; -} - -/* Callback invoked when a menu is detached. It increases the - xg_detached_menus count. - WIDGET is the GtkTearoffMenuItem. - CLIENT_DATA is not used. */ - -static void -tearoff_activate (GtkWidget *widget, gpointer client_data) -{ - GtkWidget *menu = gtk_widget_get_parent (widget); - if (gtk_menu_get_tearoff_state (GTK_MENU (menu))) - { - ++xg_detached_menus; - g_signal_connect (G_OBJECT (gtk_widget_get_toplevel (widget)), - "destroy", - G_CALLBACK (tearoff_remove), 0); - } -} -#else /* ! HAVE_GTK_TEAROFF_MENU_ITEM_NEW */ -bool -xg_have_tear_offs (struct frame *f) -{ - return FRAME_MENUBAR_HEIGHT (f) == 0; -} -#endif /* ! HAVE_GTK_TEAROFF_MENU_ITEM_NEW */ - /* Create a menu item widget, and connect the callbacks. ITEM describes the menu item. F is the frame the created menu belongs to. @@ -2529,8 +2488,6 @@ xg_create_one_menuitem (widget_value *item, HIGHLIGHT_CB is the callback to call when entering/leaving menu items. If POP_UP_P, create a popup menu. If MENU_BAR_P, create a menu bar. - If ADD_TEAROFF_P, add a tearoff menu item. Ignored if MENU_BAR_P or - the Gtk+ version used does not have tearoffs. TOPMENU is the topmost GtkWidget that others shall be placed under. It may be NULL, in that case we create the appropriate widget (menu bar or menu item depending on POP_UP_P and MENU_BAR_P) @@ -2552,7 +2509,6 @@ create_menus (widget_value *data, GCallback highlight_cb, bool pop_up_p, bool menu_bar_p, - bool add_tearoff_p, GtkWidget *topmenu, xg_menu_cb_data *cl_data, const char *name) @@ -2603,17 +2559,6 @@ create_menus (widget_value *data, "selection-done", deactivate_cb, 0); } -#ifdef HAVE_GTK_TEAROFF_MENU_ITEM_NEW - if (! menu_bar_p && add_tearoff_p) - { - GtkWidget *tearoff = gtk_tearoff_menu_item_new (); - gtk_menu_shell_append (GTK_MENU_SHELL (wmenu), tearoff); - - g_signal_connect (G_OBJECT (tearoff), "activate", - G_CALLBACK (tearoff_activate), 0); - } -#endif - for (item = data; item; item = item->next) { GtkWidget *w; @@ -2627,7 +2572,6 @@ create_menus (widget_value *data, group = NULL; utf8_label = get_utf8_string (item->name); - gtk_menu_set_title (GTK_MENU (wmenu), utf8_label); w = gtk_menu_item_new_with_label (utf8_label); gtk_widget_set_sensitive (w, FALSE); if (utf8_label) g_free (utf8_label); @@ -2658,7 +2602,6 @@ create_menus (widget_value *data, highlight_cb, 0, 0, - add_tearoff_p, 0, cl_data, 0); @@ -2716,7 +2659,6 @@ xg_create_widget (const char *type, const char *name, struct frame *f, highlight_cb, pop_up_p, menu_bar_p, - menu_bar_p, 0, 0, name); @@ -2826,7 +2768,7 @@ xg_update_menubar (GtkWidget *menubar, { /* Item(s) added. Add all new items in one call. */ create_menus (val, f, select_cb, deactivate_cb, highlight_cb, - 0, 1, 0, menubar, cl_data, 0); + 0, 1, menubar, cl_data, 0); /* All updated. */ val = 0; @@ -2909,14 +2851,6 @@ xg_update_menubar (GtkWidget *menubar, gtk_label_set_text (wlabel, utf8_label); g_object_notify (G_OBJECT (witem), "label"); -#ifdef HAVE_GTK_TEAROFF_MENU_ITEM_NEW - /* If this item has a submenu that has been detached, change - the title in the WM decorations also. */ - if (submenu && gtk_menu_get_tearoff_state (GTK_MENU (submenu))) - /* Set the title of the detached window. */ - gtk_menu_set_title (GTK_MENU (submenu), utf8_label); -#endif - if (utf8_label) g_free (utf8_label); iter = g_list_next (iter); val = val->next; @@ -2943,7 +2877,7 @@ xg_update_menubar (GtkWidget *menubar, GtkWidget *submenu = create_menus (NULL, f, select_cb, deactivate_cb, highlight_cb, - 0, 0, 0, 0, cl_data, 0); + 0, 0, 0, cl_data, 0); gtk_widget_set_name (w, MENU_ITEM_NAME); gtk_menu_shell_insert (GTK_MENU_SHELL (menubar), w, pos); @@ -3152,17 +3086,6 @@ xg_update_submenu (GtkWidget *submenu, { GtkWidget *w = GTK_WIDGET (iter->data); -#ifdef HAVE_GTK_TEAROFF_MENU_ITEM_NEW - /* Skip tearoff items, they have no counterpart in val. */ - if (GTK_IS_TEAROFF_MENU_ITEM (w)) - { - has_tearoff_p = 1; - iter = g_list_next (iter); - if (iter) w = GTK_WIDGET (iter->data); - else break; - } -#endif - /* Remember first radio button in a group. If we get a mismatch in a radio group we must rebuild the whole group so that the connections in GTK becomes correct. */ @@ -3250,7 +3173,6 @@ xg_update_submenu (GtkWidget *submenu, highlight_cb, 0, 0, - ! has_tearoff_p, submenu, cl_data, 0); @@ -4031,187 +3953,6 @@ xg_get_tool_bar_widgets (GtkWidget *vb, GtkWidget **wimage) } -/* This callback is called when a tool item should create a proxy item, - such as for the overflow menu. Also called when the tool bar is detached. - If we don't create a proxy menu item, the detached tool bar will be - blank. */ - -static gboolean -xg_tool_bar_menu_proxy (GtkToolItem *toolitem, gpointer user_data) -{ - GtkButton *wbutton = GTK_BUTTON (XG_BIN_CHILD (XG_BIN_CHILD (toolitem))); - GtkWidget *vb = XG_BIN_CHILD (wbutton); - GtkWidget *c1; - GtkLabel *wlbl = GTK_LABEL (xg_get_tool_bar_widgets (vb, &c1)); - GtkImage *wimage = GTK_IMAGE (c1); - GtkWidget *wmenuitem = gtk_image_menu_item_new_with_label - (wlbl ? gtk_label_get_text (wlbl) : ""); - GtkWidget *wmenuimage; - - - if (gtk_button_get_use_stock (wbutton)) - wmenuimage = gtk_image_new_from_stock (gtk_button_get_label (wbutton), - GTK_ICON_SIZE_MENU); - else - { - GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (wbutton)); - GtkImageType store_type = gtk_image_get_storage_type (wimage); - - g_object_set (G_OBJECT (settings), "gtk-menu-images", TRUE, NULL); - - if (store_type == GTK_IMAGE_STOCK) - { - gchar *stock_id; - gtk_image_get_stock (wimage, &stock_id, NULL); - wmenuimage = gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_MENU); - } - else if (store_type == GTK_IMAGE_ICON_SET) - { - GtkIconSet *icon_set; - gtk_image_get_icon_set (wimage, &icon_set, NULL); - wmenuimage = gtk_image_new_from_icon_set (icon_set, - GTK_ICON_SIZE_MENU); - } - else if (store_type == GTK_IMAGE_PIXBUF) - { - gint width, height; - - if (settings && - gtk_icon_size_lookup_for_settings (settings, GTK_ICON_SIZE_MENU, - &width, &height)) - { - GdkPixbuf *src_pixbuf, *dest_pixbuf; - - src_pixbuf = gtk_image_get_pixbuf (wimage); - dest_pixbuf = gdk_pixbuf_scale_simple (src_pixbuf, width, height, - GDK_INTERP_BILINEAR); - - wmenuimage = gtk_image_new_from_pixbuf (dest_pixbuf); - } - else - { - fprintf (stderr, "internal error: GTK_IMAGE_PIXBUF failed\n"); - emacs_abort (); - } - } - else if (store_type == GTK_IMAGE_ICON_NAME) - { - const gchar *icon_name; - GtkIconSize icon_size; - - gtk_image_get_icon_name (wimage, &icon_name, &icon_size); - wmenuimage = gtk_image_new_from_icon_name (icon_name, - GTK_ICON_SIZE_MENU); - } - else - { - fprintf (stderr, "internal error: store_type is %d\n", store_type); - emacs_abort (); - } - } - if (wmenuimage) - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (wmenuitem), wmenuimage); - - g_signal_connect (G_OBJECT (wmenuitem), - "activate", - G_CALLBACK (xg_tool_bar_proxy_callback), - user_data); - - - g_object_set_data (G_OBJECT (wmenuitem), XG_TOOL_BAR_PROXY_BUTTON, - (gpointer) wbutton); - gtk_tool_item_set_proxy_menu_item (toolitem, "Emacs toolbar item", wmenuitem); - gtk_widget_set_sensitive (wmenuitem, - gtk_widget_get_sensitive (GTK_WIDGET (wbutton))); - - /* Use enter/leave notify to show help. We use the events - rather than the GtkButton specific signals "enter" and - "leave", so we can have only one callback. The event - will tell us what kind of event it is. */ - g_signal_connect (G_OBJECT (wmenuitem), - "enter-notify-event", - G_CALLBACK (xg_tool_bar_proxy_help_callback), - user_data); - g_signal_connect (G_OBJECT (wmenuitem), - "leave-notify-event", - G_CALLBACK (xg_tool_bar_proxy_help_callback), - user_data); - - return TRUE; -} - -/* This callback is called when a tool bar is detached. We must set - the height of the tool bar to zero when this happens so frame sizes - are correctly calculated. - WBOX is the handle box widget that enables detach/attach of the tool bar. - W is the tool bar widget. - CLIENT_DATA is a pointer to the frame the tool bar belongs to. */ - -static void -xg_tool_bar_detach_callback (GtkHandleBox *wbox, - GtkWidget *w, - gpointer client_data) -{ - struct frame *f = client_data; - - g_object_set (G_OBJECT (w), "show-arrow", !x_gtk_whole_detached_tool_bar, - NULL); - - if (f) - { - GtkRequisition req, req2; - - gtk_widget_get_preferred_size (GTK_WIDGET (wbox), NULL, &req); - gtk_widget_get_preferred_size (w, NULL, &req2); - req.width -= req2.width; - req.height -= req2.height; - if (FRAME_TOOLBAR_TOP_HEIGHT (f) != 0) - FRAME_TOOLBAR_TOP_HEIGHT (f) = req.height; - else if (FRAME_TOOLBAR_BOTTOM_HEIGHT (f) != 0) - FRAME_TOOLBAR_BOTTOM_HEIGHT (f) = req.height; - else if (FRAME_TOOLBAR_RIGHT_WIDTH (f) != 0) - FRAME_TOOLBAR_RIGHT_WIDTH (f) = req.width; - else if (FRAME_TOOLBAR_LEFT_WIDTH (f) != 0) - FRAME_TOOLBAR_LEFT_WIDTH (f) = req.width; - xg_height_or_width_changed (f); - } -} - -/* This callback is called when a tool bar is reattached. We must set - the height of the tool bar when this happens so frame sizes - are correctly calculated. - WBOX is the handle box widget that enables detach/attach of the tool bar. - W is the tool bar widget. - CLIENT_DATA is a pointer to the frame the tool bar belongs to. */ - -static void -xg_tool_bar_attach_callback (GtkHandleBox *wbox, - GtkWidget *w, - gpointer client_data) -{ - struct frame *f = client_data; - g_object_set (G_OBJECT (w), "show-arrow", TRUE, NULL); - - if (f) - { - GtkRequisition req, req2; - - gtk_widget_get_preferred_size (GTK_WIDGET (wbox), NULL, &req); - gtk_widget_get_preferred_size (w, NULL, &req2); - req.width += req2.width; - req.height += req2.height; - if (FRAME_TOOLBAR_TOP_HEIGHT (f) != 0) - FRAME_TOOLBAR_TOP_HEIGHT (f) = req.height; - else if (FRAME_TOOLBAR_BOTTOM_HEIGHT (f) != 0) - FRAME_TOOLBAR_BOTTOM_HEIGHT (f) = req.height; - else if (FRAME_TOOLBAR_RIGHT_WIDTH (f) != 0) - FRAME_TOOLBAR_RIGHT_WIDTH (f) = req.width; - else if (FRAME_TOOLBAR_LEFT_WIDTH (f) != 0) - FRAME_TOOLBAR_LEFT_WIDTH (f) = req.width; - xg_height_or_width_changed (f); - } -} - /* This callback is called when the mouse enters or leaves a tool bar item. It is used for displaying and hiding the help text. W is the tool bar item, a button. @@ -4291,11 +4032,7 @@ xg_tool_bar_item_expose_callback (GtkWidget *w, gtk_toolbar_set_orientation (GTK_TOOLBAR (w), o) #endif -#ifdef HAVE_GTK_HANDLE_BOX_NEW -#define TOOLBAR_TOP_WIDGET(x) ((x)->handlebox_widget) -#else #define TOOLBAR_TOP_WIDGET(x) ((x)->toolbar_widget) -#endif /* Attach a tool bar to frame F. */ @@ -4304,31 +4041,15 @@ xg_pack_tool_bar (struct frame *f, Lisp_Object pos) { struct x_output *x = f->output_data.x; bool into_hbox = EQ (pos, Qleft) || EQ (pos, Qright); - GtkWidget *top_widget = TOOLBAR_TOP_WIDGET (x); + GtkWidget *top_widget = x->toolbar_widget; toolbar_set_orientation (x->toolbar_widget, into_hbox ? GTK_ORIENTATION_VERTICAL : GTK_ORIENTATION_HORIZONTAL); -#ifdef HAVE_GTK_HANDLE_BOX_NEW - if (!x->handlebox_widget) - { - top_widget = x->handlebox_widget = gtk_handle_box_new (); - g_signal_connect (G_OBJECT (x->handlebox_widget), "child-detached", - G_CALLBACK (xg_tool_bar_detach_callback), f); - g_signal_connect (G_OBJECT (x->handlebox_widget), "child-attached", - G_CALLBACK (xg_tool_bar_attach_callback), f); - gtk_container_add (GTK_CONTAINER (x->handlebox_widget), - x->toolbar_widget); - } -#endif if (into_hbox) { -#ifdef HAVE_GTK_HANDLE_BOX_NEW - gtk_handle_box_set_handle_position (GTK_HANDLE_BOX (x->handlebox_widget), - GTK_POS_TOP); -#endif gtk_box_pack_start (GTK_BOX (x->hbox_widget), top_widget, FALSE, FALSE, 0); @@ -4341,10 +4062,6 @@ xg_pack_tool_bar (struct frame *f, Lisp_Object pos) else { bool vbox_pos = x->menubar_widget != 0; -#ifdef HAVE_GTK_HANDLE_BOX_NEW - gtk_handle_box_set_handle_position (GTK_HANDLE_BOX (x->handlebox_widget), - GTK_POS_LEFT); -#endif gtk_box_pack_start (GTK_BOX (x->vbox_widget), top_widget, FALSE, FALSE, 0); @@ -4497,10 +4214,6 @@ xg_make_tool_item (struct frame *f, intptr_t ii = i; gpointer gi = (gpointer) ii; - g_signal_connect (G_OBJECT (ti), "create-menu-proxy", - G_CALLBACK (xg_tool_bar_menu_proxy), - gi); - g_signal_connect (G_OBJECT (wb), "clicked", G_CALLBACK (xg_tool_bar_callback), gi); @@ -4614,7 +4327,7 @@ xg_update_tool_bar_sizes (struct frame *f) struct x_output *x = f->output_data.x; GtkRequisition req; int nl = 0, nr = 0, nt = 0, nb = 0; - GtkWidget *top_widget = TOOLBAR_TOP_WIDGET (x); + GtkWidget *top_widget = x->toolbar_widget; gtk_widget_get_preferred_size (GTK_WIDGET (top_widget), NULL, &req); if (x->toolbar_in_hbox) @@ -4653,6 +4366,42 @@ xg_update_tool_bar_sizes (struct frame *f) return 0; } +static char * +find_icon_from_name (char *name, + GtkIconTheme *icon_theme, + char **icon_name) +{ +#if ! GTK_CHECK_VERSION (3, 10, 0) + GtkStockItem stock_item; +#endif + + if (name[0] == 'n' && name[1] == ':') + { + *icon_name = name + 2; + name = NULL; + + if (! gtk_icon_theme_has_icon (icon_theme, *icon_name)) + *icon_name = NULL; + } + +#if ! GTK_CHECK_VERSION (3, 10, 0) + else if (gtk_stock_lookup (name, &stock_item)) + *icon_name = NULL; +#endif + else if (gtk_icon_theme_has_icon (icon_theme, name)) + { + *icon_name = name; + name = NULL; + } + else + { + name = NULL; + *icon_name = NULL; + } + + return name; +} + /* Update the tool bar for frame F. Add new buttons and remove old. */ @@ -4668,6 +4417,9 @@ update_frame_tool_bar (struct frame *f) Lisp_Object style; bool text_image, horiz; struct xg_frame_tb_info *tbinfo; + GdkScreen *screen; + GtkIconTheme *icon_theme; + if (! FRAME_GTK_WIDGET (f)) return; @@ -4702,6 +4454,8 @@ update_frame_tool_bar (struct frame *f) dir = gtk_widget_get_direction (GTK_WIDGET (wtoolbar)); style = Ftool_bar_get_system_style (); + screen = gtk_widget_get_screen (GTK_WIDGET (wtoolbar)); + icon_theme = gtk_icon_theme_get_for_screen (screen); /* Are we up to date? */ tbinfo = g_object_get_data (G_OBJECT (FRAME_GTK_OUTER_WIDGET (f)), @@ -4738,7 +4492,6 @@ update_frame_tool_bar (struct frame *f) struct image *img = NULL; Lisp_Object image; Lisp_Object stock = Qnil; - GtkStockItem stock_item; char *stock_name = NULL; char *icon_name = NULL; Lisp_Object rtl; @@ -4792,32 +4545,28 @@ update_frame_tool_bar (struct frame *f) if (!NILP (specified_file) && !NILP (Ffboundp (Qx_gtk_map_stock))) stock = call1 (Qx_gtk_map_stock, specified_file); - if (STRINGP (stock)) + if (CONSP (stock)) { - stock_name = SSDATA (stock); - if (stock_name[0] == 'n' && stock_name[1] == ':') - { - GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (wtoolbar)); - GtkIconTheme *icon_theme = gtk_icon_theme_get_for_screen (screen); - - icon_name = stock_name + 2; - stock_name = NULL; - stock = Qnil; - - if (! gtk_icon_theme_has_icon (icon_theme, icon_name)) - icon_name = NULL; - else - icon_size = gtk_toolbar_get_icon_size (wtoolbar); - } - else if (gtk_stock_lookup (SSDATA (stock), &stock_item)) - icon_size = gtk_toolbar_get_icon_size (wtoolbar); - else - { - stock = Qnil; - stock_name = NULL; - } + Lisp_Object tem; + for (tem = stock; CONSP (tem); tem = XCDR (tem)) + if (! NILP (tem) && STRINGP (XCAR (tem))) + { + stock_name = find_icon_from_name (SSDATA (XCAR (tem)), + icon_theme, + &icon_name); + if (stock_name || icon_name) break; + } + } + else if (STRINGP (stock)) + { + stock_name = find_icon_from_name (SSDATA (stock), + icon_theme, + &icon_name); } + if (stock_name || icon_name) + icon_size = gtk_toolbar_get_icon_size (wtoolbar); + if (stock_name == NULL && icon_name == NULL) { /* No stock image, or stock item not known. Try regular @@ -4878,7 +4627,12 @@ update_frame_tool_bar (struct frame *f) w = NULL; else if (stock_name) { + +#if GTK_CHECK_VERSION (3, 10, 0) + w = gtk_image_new_from_icon_name (stock_name, icon_size); +#else w = gtk_image_new_from_stock (stock_name, icon_size); +#endif g_object_set_data_full (G_OBJECT (w), XG_TOOL_BAR_STOCK_NAME, (gpointer) xstrdup (stock_name), (GDestroyNotify) xfree); @@ -4920,7 +4674,7 @@ update_frame_tool_bar (struct frame *f) { if (! x->toolbar_is_packed) xg_pack_tool_bar (f, f->tool_bar_position); - gtk_widget_show_all (TOOLBAR_TOP_WIDGET (x)); + gtk_widget_show_all (x->toolbar_widget); if (xg_update_tool_bar_sizes (f)) xg_height_or_width_changed (f); } @@ -4939,11 +4693,9 @@ free_frame_tool_bar (struct frame *f) if (x->toolbar_widget) { struct xg_frame_tb_info *tbinfo; - GtkWidget *top_widget = TOOLBAR_TOP_WIDGET (x); + GtkWidget *top_widget = x->toolbar_widget; block_input (); - /* We may have created the toolbar_widget in xg_create_tool_bar, but - not the x->handlebox_widget which is created in xg_pack_tool_bar. */ if (x->toolbar_is_packed) { if (x->toolbar_in_hbox) @@ -4957,7 +4709,7 @@ free_frame_tool_bar (struct frame *f) gtk_widget_destroy (x->toolbar_widget); x->toolbar_widget = 0; - TOOLBAR_TOP_WIDGET (x) = 0; + x->toolbar_widget = 0; x->toolbar_is_packed = false; FRAME_TOOLBAR_TOP_HEIGHT (f) = FRAME_TOOLBAR_BOTTOM_HEIGHT (f) = 0; FRAME_TOOLBAR_LEFT_WIDTH (f) = FRAME_TOOLBAR_RIGHT_WIDTH (f) = 0; @@ -4982,7 +4734,7 @@ void xg_change_toolbar_position (struct frame *f, Lisp_Object pos) { struct x_output *x = f->output_data.x; - GtkWidget *top_widget = TOOLBAR_TOP_WIDGET (x); + GtkWidget *top_widget = x->toolbar_widget; if (! x->toolbar_widget || ! top_widget) return; @@ -5026,9 +4778,6 @@ xg_initialize (void) gdpy_def = NULL; xg_ignore_gtk_scrollbar = 0; -#ifdef HAVE_GTK_TEAROFF_MENU_ITEM_NEW - xg_detached_menus = 0; -#endif xg_menu_cb_list.prev = xg_menu_cb_list.next = xg_menu_item_cb_list.prev = xg_menu_item_cb_list.next = 0; diff --git a/src/gtkutil.h b/src/gtkutil.h index 5176be6..37d2900 100644 --- a/src/gtkutil.h +++ b/src/gtkutil.h @@ -107,8 +107,6 @@ extern void xg_update_frame_menubar (struct frame *f); extern bool xg_event_is_for_menubar (struct frame *, const XEvent *); -extern bool xg_have_tear_offs (struct frame *f); - extern ptrdiff_t xg_get_scroll_id_for_window (Display *dpy, Window wid); extern void xg_create_scroll_bar (struct frame *f, diff --git a/src/xmenu.c b/src/xmenu.c index 53683c7..77fc4ef 100644 --- a/src/xmenu.c +++ b/src/xmenu.c @@ -793,12 +793,6 @@ set_frame_menubar (struct frame *f, bool first_time, bool deep_p) f->output_data.x->saved_menu_event->type = 0; } -#ifdef USE_GTK - /* If we have detached menus, we must update deep so detached menus - also gets updated. */ - deep_p = deep_p || xg_have_tear_offs (f); -#endif - if (deep_p) { /* Make a widget-value tree representing the entire menu trees. */ diff --git a/src/xterm.h b/src/xterm.h index 4683a4c..1fb3f0a 100644 --- a/src/xterm.h +++ b/src/xterm.h @@ -491,10 +491,6 @@ struct x_output GtkWidget *menubar_widget; /* The tool bar in this frame */ GtkWidget *toolbar_widget; -#ifdef HAVE_GTK_HANDLE_BOX_NEW -/* The handle box that makes the tool bar detachable. */ - GtkWidget *handlebox_widget; -#endif /* True if tool bar is packed into the hbox widget (i.e. vertical). */ bool_bf toolbar_in_hbox : 1; bool_bf toolbar_is_packed : 1; On Fri, Sep 22, 2017 at 5:31 PM, Frank Cox <theatre@xxxxxxxxxxx> wrote: > On Fri, 22 Sep 2017 17:04:14 -0500 > Paul Johnson wrote: > >> The bad problem I see now is that Emacs and Chromium-browser, which >> rely on gtk3 don't work properly anymore. In Emacs, the symptom is >> that the ribbon of buttons under the pull down menu will no longer >> show. In Chromium, the buttons and other widget things on the top >> are an ugly yellow distortion. > > Un-intuitive as it may be, you may just need to start using either the Adwaita or Clearlooks-phenix theme. > > One chap I know of that's using the CERN linux told me that solved a problem similar to yours by using the clearlooks-phenix theme. > > I use clearlooks-phenix here to solve a different set of problems (menus on Gnome-terminal and Geany), and I don't really like the way Adwaita looks. > > Here's the solution if you want to try it: > > yum install clearlooks-phenix-gtk2-theme clearlooks-phenix-gtk3-theme > > Go to the look and feel preferences setting on your desktop and select Clearlooks-phenix from the list. > > And afterward you can > > yum remove mate-themes > > if you want because it's not needed any more (assuming that you're using mate, that is). > > > -- > MELVILLE THEATRE ~ Real D 3D Digital Cinema ~ www.melvilletheatre.com > _______________________________________________ > CentOS mailing list > CentOS@xxxxxxxxxx > https://lists.centos.org/mailman/listinfo/centos -- Paul E. Johnson http://pj.freefaculty.org Director, Center for Research Methods and Data Analysis http://crmda.ku.edu To write to me directly, please address me at pauljohn at ku.edu. _______________________________________________ CentOS mailing list CentOS@xxxxxxxxxx https://lists.centos.org/mailman/listinfo/centos