forked from pool/emacs
Accepting request 427872 from editors
Patch emacs to support gtk 3.20 (forwarded request 426184 from Zaitor) OBS-URL: https://build.opensuse.org/request/show/427872 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/emacs?expand=0&rev=125
This commit is contained in:
commit
386e04b633
843
emacs-24-fix-missing-gtk-icons.patch
Normal file
843
emacs-24-fix-missing-gtk-icons.patch
Normal file
@ -0,0 +1,843 @@
|
||||
From 8ca576def5fd21eac6f7262e21545b0e2b685b92 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jan=20Dj=C3=A4rv?= <jan.h.d@swipnet.se>
|
||||
Date: Sat, 18 Oct 2014 18:19:53 +0200
|
||||
Subject: [PATCH] Fix #48862
|
||||
|
||||
---
|
||||
lisp/term/x-win.el | 63 ++++----
|
||||
src/frame.h | 6 +
|
||||
src/gtkutil.c | 423 +++++++++++------------------------------------------
|
||||
src/gtkutil.h | 2 -
|
||||
src/xmenu.c | 6 -
|
||||
src/xterm.h | 4 -
|
||||
6 files changed, 125 insertions(+), 379 deletions(-)
|
||||
|
||||
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/frame.h b/src/frame.h
|
||||
index bc49cfa..414de62 100644
|
||||
--- a/src/frame.h
|
||||
+++ b/src/frame.h
|
||||
@@ -725,6 +725,12 @@ default_pixels_per_inch_y (void)
|
||||
/* Pixel height of frame F's tool-bar. */
|
||||
#define FRAME_TOOL_BAR_HEIGHT(f) (f)->tool_bar_height
|
||||
|
||||
+#ifdef USE_GTK
|
||||
+#define FRAME_TOOL_BAR_POSITION(f) (f)->tool_bar_position
|
||||
+#else
|
||||
+#define FRAME_TOOL_BAR_POSITION(f) ((void) f, Qtop)
|
||||
+#endif
|
||||
+
|
||||
/* Lines above the top-most window in frame F. */
|
||||
#define FRAME_TOP_MARGIN(F) \
|
||||
(FRAME_MENU_BAR_LINES (F) + FRAME_TOOL_BAR_LINES (F))
|
||||
diff --git a/src/gtkutil.c b/src/gtkutil.c
|
||||
index eddd2b5..33e3cd1 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);
|
||||
@@ -4919,8 +4673,8 @@ update_frame_tool_bar (struct frame *f)
|
||||
if (f->n_tool_bar_items != 0)
|
||||
{
|
||||
if (! x->toolbar_is_packed)
|
||||
- xg_pack_tool_bar (f, f->tool_bar_position);
|
||||
- gtk_widget_show_all (TOOLBAR_TOP_WIDGET (x));
|
||||
+ xg_pack_tool_bar (f, FRAME_TOOL_BAR_POSITION (f));
|
||||
+ 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;
|
||||
--
|
||||
2.8.0
|
||||
|
@ -1,3 +1,9 @@
|
||||
-------------------------------------------------------------------
|
||||
Fri Sep 9 13:21:33 UTC 2016 - zaitor@opensuse.org
|
||||
|
||||
- Add emacs-24-fix-missing-gtk-icons.patch: Bring emacs up to speed
|
||||
on gtk3-3.20 changes. Fixes missing icons in emacs-gtk.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Fri Aug 19 08:58:26 UTC 2016 - werner@suse.de
|
||||
|
||||
|
@ -127,6 +127,7 @@ Patch37: emacs-24-0017-ELF-unexec-Don-t-insert-a-new-section.patch
|
||||
Patch38: emacs-24-0018-src-unexelf.c-NEW_PROGRAM_H-Remove-unused-macro-Bug-.patch
|
||||
Patch39: emacs-24-0019-ELF-unexec-align-section-header.patch
|
||||
Patch40: gmalloc.patch
|
||||
Patch41: emacs-24-fix-missing-gtk-icons.patch
|
||||
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||
%{expand: %%global include_info %(test -s /usr/share/info/info.info* && echo 0 || echo 1)}
|
||||
@ -254,6 +255,7 @@ and most assembler-like syntaxes.
|
||||
%patch38 -p1
|
||||
%patch39 -p1
|
||||
%patch40 -p1
|
||||
%patch41 -p1
|
||||
|
||||
%if %{without autoconf}
|
||||
# We don't want to run autoconf
|
||||
|
Loading…
Reference in New Issue
Block a user