如何在12.04和/或14.04 GTK3中启用助记符?
街上的一句话是“gtk-enable-mnemonics”自版本3.10以来已被弃用,我完全不确定如何让我的应用程序显示助记符。
只有按下alt
键才会显示它们。
请看这里:
- wxPython Button Shortcut Accelerator如何’&spam’| 堆栈溢出
我已经尝试了本文中有关settings.ini的所有建议,将bool切换为相反的:
- 如何在GTK3中禁用助记符? | 问问Ubuntu
有关:
- GTK + 3参考Manua | GNOME开发人员中心
在使用GTK3的Ubuntu 14.04上“禁用”Nautilus 3.10.1的助记符:
- 如果尚不存在,请创建以下路径和文件。
/home/YOURUSERNAME/.config/gtk-3.0/settings.ini
- 然后加:
[Settings]
gtk-enable-mnemonics = 0
- 然后注销并重新登录。
资料来源:
- 在gtk 3中是否有等效的.gtkrc-2.0? | GNOME邮件服务
- 设置:GTK + 3参考手册| GNOME开发人员中心
ps请注意,GTK文档说你应该有一个名为XDG_CONFIG_HOME
的环境变量,但我没有。 我确实有一个现有的~/.config/gtk-3.0
文件夹,它看起来默认情况下没有环境变量。
看起来GTK + -3在版本3.8之后(从版本3.10开始)丢失了“gtk-auto-mnemonics”设置。
3.14.4的以下补丁应该重新启用“gtk-auto-mnemonics”。 它可能也适用于其他GTK + -3版本,如3.16。 编译之后,你只需要这些文件(前两个是符号链接):
libgtk-3.so -> libgtk-3.so.0.1400.4 libgtk-3.so.0 -> libgtk-3.so.0.1400.4 libgtk-3.so.0.1400.4
http://ftp.gnome.org/pub/gnome/sources/gtk+/3.14/gtk+-3.14.4.tar.xz
您可以轻松地开始使用编译的东西(如果需要,用lib
替换lib64
):
LD_LIBRARY_PATH=/folder/where/you/installed/lib64 file-roller
–
不知道为什么,但看起来GTK +开发人员在删除提供这样有用function的代码方面变得非常棒…… !!!
如果任何GTK +开发人员读到这个:这些代码行是如何伤害任何人或为什么他们删除???
如果有人对原始提交感兴趣:
- https://github.com/GNOME/gtk/commit/7e3a494fac62140f466fc43f6cc061215953e9b1
- https://github.com/GNOME/gtk/commit/7e3a494fac62140f466fc43f6cc061215953e9b1.patch
看起来GTK +人员当时有一个function删除运行:
- https://github.com/GNOME/gtk/commit/425e977bb65a52c05fbc2b643acf32aec4bc477f
- https://github.com/GNOME/gtk/commit/7b66956e63f4cd85fc72bf51778596c9b1b83c28
==========
diff -ur gtk+-3.14.4.old/gtk/gtklabel.c gtk+-3.14.4.new/gtk/gtklabel.c --- gtk+-3.14.4.old/gtk/gtklabel.c 2014-10-21 16:20:55.000000000 +0200 +++ gtk+-3.14.4.new/gtk/gtklabel.c 2015-05-06 23:01:45.447209817 +0200 @@ -2561,11 +2561,12 @@ if (with_uline) { - gboolean enable_mnemonics = TRUE; - gboolean auto_mnemonics = TRUE; + gboolean enable_mnemonics; + gboolean auto_mnemonics; g_object_get (gtk_widget_get_settings (GTK_WIDGET (label)), "gtk-enable-mnemonics", &enable_mnemonics, + "gtk-auto-mnemonics", &auto_mnemonics, NULL); if (!(enable_mnemonics && priv->mnemonics_visible && @@ -2775,8 +2776,8 @@ { GtkLabelPrivate *priv = label->priv; PangoAttrList *attrs; - gboolean enable_mnemonics = TRUE; - gboolean auto_mnemonics = TRUE; + gboolean enable_mnemonics; + gboolean auto_mnemonics; if (priv->pattern_set) return; @@ -2784,8 +2785,9 @@ if (is_mnemonic) { g_object_get (gtk_widget_get_settings (GTK_WIDGET (label)), - "gtk-enable-mnemonics", &enable_mnemonics, - NULL); + "gtk-enable-mnemonics", &enable_mnemonics, + "gtk-auto-mnemonics", &auto_mnemonics, + NULL); if (enable_mnemonics && priv->mnemonics_visible && pattern && (!auto_mnemonics || diff -ur gtk+-3.14.4.old/gtk/gtkmain.c gtk+-3.14.4.new/gtk/gtkmain.c --- gtk+-3.14.4.old/gtk/gtkmain.c 2014-10-21 16:20:55.000000000 +0200 +++ gtk+-3.14.4.new/gtk/gtkmain.c 2015-05-06 22:47:35.375311109 +0200 @@ -1717,18 +1717,26 @@ ((event->key.state & (gtk_accelerator_get_default_mod_mask ()) & ~(GDK_RELEASE_MASK|GDK_MOD1_MASK)) == 0) && !GTK_IS_MENU_SHELL (grab_widget)) { - gboolean mnemonics_visible; - GtkWidget *window; + gboolean auto_mnemonics; - mnemonics_visible = (event->type == GDK_KEY_PRESS); + g_object_get (gtk_widget_get_settings (grab_widget), + "gtk-auto-mnemonics", &auto_mnemonics, NULL); - window = gtk_widget_get_toplevel (grab_widget); - if (GTK_IS_WINDOW (window)) + if (auto_mnemonics) { - if (mnemonics_visible) - _gtk_window_schedule_mnemonics_visible (GTK_WINDOW (window)); - else - gtk_window_set_mnemonics_visible (GTK_WINDOW (window), FALSE); + gboolean mnemonics_visible; + GtkWidget *window; + + mnemonics_visible = (event->type == GDK_KEY_PRESS); + + window = gtk_widget_get_toplevel (grab_widget); + if (GTK_IS_WINDOW (window)) + { + if (mnemonics_visible) + _gtk_window_schedule_mnemonics_visible (GTK_WINDOW (window)); + else + gtk_window_set_mnemonics_visible (GTK_WINDOW (window), FALSE); + } } } /* else fall through */ diff -ur gtk+-3.14.4.old/gtk/gtkmenushell.c gtk+-3.14.4.new/gtk/gtkmenushell.c --- gtk+-3.14.4.old/gtk/gtkmenushell.c 2014-08-15 16:38:05.000000000 +0200 +++ gtk+-3.14.4.new/gtk/gtkmenushell.c 2015-05-06 22:53:03.442086931 +0200 @@ -898,9 +898,17 @@ _gtk_menu_shell_update_mnemonics (GtkMenuShell *menu_shell) { GtkMenuShell *target; + gboolean auto_mnemonics; gboolean found; gboolean mnemonics_visible; + g_object_get (gtk_widget_get_settings (GTK_WIDGET (menu_shell)), + "gtk-auto-mnemonics", &auto_mnemonics, + NULL); + + if (!auto_mnemonics) + return; + target = menu_shell; found = FALSE; while (target) diff -ur gtk+-3.14.4.old/gtk/gtkwindow.c gtk+-3.14.4.new/gtk/gtkwindow.c --- gtk+-3.14.4.old/gtk/gtkwindow.c 2014-10-21 16:20:55.000000000 +0200 +++ gtk+-3.14.4.new/gtk/gtkwindow.c 2015-05-06 22:59:47.780956630 +0200 @@ -5878,6 +5878,8 @@ GtkWindow *window = GTK_WINDOW (widget); GtkWindowPrivate *priv = window->priv; GdkWindow *gdk_window; + gboolean auto_mnemonics; + GtkPolicyType visible_focus; GList *link; if (!gtk_widget_is_toplevel (widget)) @@ -5966,10 +5968,15 @@ } } - /* if mnemonics visible is not already set + /* if auto-mnemonics is enabled and mnemonics visible is not already set * (as in the case of popup menus), then hide mnemonics initially */ - if (!priv->mnemonics_visible_set) + g_object_get (gtk_widget_get_settings (widget), + "gtk-auto-mnemonics", &auto_mnemonics, + "gtk-visible-focus", &visible_focus, + NULL); + + if (auto_mnemonics && !priv->mnemonics_visible_set) gtk_window_set_mnemonics_visible (window, FALSE); /* inherit from transient parent, so that a dialog that is @@ -7834,6 +7841,7 @@ GdkEventFocus *event) { GtkWindow *window = GTK_WINDOW (widget); + gboolean auto_mnemonics; /* It appears spurious focus in events can occur when * the window is hidden. So we'll just check to see if @@ -7845,7 +7853,9 @@ _gtk_window_set_has_toplevel_focus (window, TRUE); _gtk_window_set_is_active (window, TRUE); - if (gtk_window_has_mnemonic_modifier_pressed (window)) + g_object_get (gtk_widget_get_settings (widget), + "gtk-auto-mnemonics", &auto_mnemonics, NULL); + if (auto_mnemonics && gtk_window_has_mnemonic_modifier_pressed (window)) _gtk_window_schedule_mnemonics_visible (window); } @@ -7857,12 +7867,16 @@ GdkEventFocus *event) { GtkWindow *window = GTK_WINDOW (widget); + gboolean auto_mnemonics; _gtk_window_set_has_toplevel_focus (window, FALSE); _gtk_window_set_is_active (window, FALSE); /* set the mnemonic-visible property to false */ - gtk_window_set_mnemonics_visible (window, FALSE); + g_object_get (gtk_widget_get_settings (widget), + "gtk-auto-mnemonics", &auto_mnemonics, NULL); + if (auto_mnemonics) + gtk_window_set_mnemonics_visible (window, FALSE); return FALSE; }
我想我正在改变错误的主题。 哎呀。
遵循的步骤。
https://stackoverflow.com/a/24095212/2026508
更改自: gtk-auto-mnemonics = 0
<----已禁用
更改为: gtk-auto-mnemonics = 1
<----已启用
在GTK3中更改settings.ini: /usr/share/themes/CURRENT_THEME_NAME/gtk3.0/settings.ini
在GTK2中更改gtkrc: /usr/share/themes/CURRENT_THEME_NAME/gtk2.0/gtkrc
但请确保它是正确/当前主题。