Включение горячих клавиш «Alt» для кнопок в Gnome?

Я имею в виду: всякий раз, когда буква в тексте кнопки подчеркнута, нажатие клавиши Alt плюс эта буква нажимает кнопку. Я успешно прошел через апплеты Keyboard и Tweak Tool .

Нажатие клавиши Alt подчеркивает буквы, но я предпочел бы, чтобы они подчеркнули заранее.

One Solution collect form web for “Включение горячих клавиш «Alt» для кнопок в Gnome?”

Для GTK 2 добавьте следующую строку в ~/.gtkrc-2.0 :

 gtk-auto-mnemonic = 0 

Для GTK 3 до GTK 3,9:

 do_dconf /org/gnome/desktop/interface/automatic-mnemonics false 

В GTK 3.10 опция была удалена (в этой фиксации , в сообщении журнала которой указано, что эта функция была удалена). Глядя на источник, нет возможности включить его. Сумасшедшее поведение показа мнемоники только после нажатия Alt было не менее 300 мс (тайм-аут жестко запрограммирован как константа времени компиляции) является единственно возможным.

Я решил переопределить это поведение, предварительно загрузив библиотечную оболочку, которая заставит мнемонику быть видимой. Это было непросто, потому что большинство звонков являются внутренними. Я, наконец, нашел способ сделать запрос, который сообщает дисплею меток, хочет ли виджет отображать мнемонику, всегда возвращает true. В основном это работает, я все время вижу мнемонику в диалоговых окнах GEdit и Evince, но не полностью: некоторые ускорители меню отсутствуют, я не знаю почему.

Код:

 #define _GNU_SOURCE #include <dlfcn.h> #include <stdio.h> #include <glib.h> #include <gtk/gtk.h> #define PROP_MNEMONICS_VISIBLE 31 #ifdef DEBUG #define DBG(args...) printf(args) #else #define DBG(args...) #endif static void (*original_gtk_window_get_property)(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); static void wrap_gtk_window_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { original_gtk_window_get_property(object, prop_id, value, pspec); if (prop_id == PROP_MNEMONICS_VISIBLE) { DBG("%s(%p, %u, &%u, %p)\n", __FUNCTION__, object, prop_id, *(unsigned*)value, pspec); g_value_set_boolean(value, TRUE); } } inline void override_gtk_window_get_property(GType object_type, GObject *obj) { static int first_window_creation = 1; if (object_type == GTK_TYPE_WINDOW && first_window_creation) { first_window_creation = 0; GtkWidgetClass *gtk_widget_class = GTK_WIDGET_GET_CLASS(obj); GObjectClass *gobject_class = G_OBJECT_CLASS(gtk_widget_class); original_gtk_window_get_property = gobject_class->get_property; gobject_class->get_property = wrap_gtk_window_get_property; } } GObject* g_object_new_valist(GType object_type, const gchar *first_property_name, va_list var_args) { static GObject* (*original_g_object_new_valist)(GType object_type, const gchar *first_property_name, va_list var_args) = NULL; if (original_g_object_new_valist == NULL) { original_g_object_new_valist = dlsym(RTLD_NEXT, "g_object_new_valist"); } GObject* obj = original_g_object_new_valist(object_type, first_property_name, var_args); override_gtk_window_get_property(object_type, obj); return obj; } gpointer g_object_new(GType object_type, const gchar *first_property_name, ...) { va_list var_args; va_start(var_args, first_property_name); gpointer obj = g_object_new_valist(object_type, first_property_name, var_args); va_end(var_args); return obj; } gpointer g_object_newv(GType object_type, guint n_parameters, GParameter *parameters) { static gpointer (*original_g_object_newv)(GType object_type, guint n_parameters, GParameter *parameters); if (original_g_object_newv == NULL) { original_g_object_newv = dlsym(RTLD_NEXT, "g_object_newv"); } GObject* obj = original_g_object_newv(object_type, n_parameters, parameters); override_gtk_window_get_property(object_type, obj); return obj; } 

Как его использовать: напишите это в файл gtk_window_get_mnemonics_visible.c . Установите GCC и пакет разработки GTK3 (например, sudo apt-get install gcc libgtk-3-dev на Debian / Ubuntu). Скомпилировать с

 gcc -Wall -fPIC -shared `pkg-config --cflags gtk+-3.0` `pkg-config --libs gtk+-3.0` -o gtk_window_get_mnemonics_visible.so gtk_window_get_mnemonics_visible.c 

Запустите приложения Gnome следующим образом:

 LD_PRELOAD=/path/to/gtk_window_get_mnemonics_visible.so gedit 

или поместите это в свой .profile :

 export LD_PRELOAD=/path/to/gtk_window_get_mnemonics_visible.so 

Обратите внимание, что LD_PRELOAD – это взлом, иногда это может вызвать странное поведение. Я только дал это беглый тест. Известная ошибка:

  • Если для GTK_IM_MODULE установлено значение xim , то использование LD_PRELOAD для чего угодно (даже пустой C-файл!) Заставляет GEdit зависать, когда я нажимаю Alt (наблюдается на Debian jessie). Понятия не имею почему.
  • Как остановить запущенное приложение от запуска нового экземпляра, если он уже запущен?
  • Gnome3 / Archlinux перемещает окна с помощью клавиш?
  • Как создать пользовательский регион в gnome3?
  • различные значки для общего исходного кода и других файлов
  • Включить недавно использованную в Gtk3 выбор файла
  • Debian 8 - прерывистый звук
  • Как удалить прописку окна в приложениях GTK3 в Awesome-WM?
  • Как настроить тему значка GNOME 3 (fallback) для Tango?
  • Индивидуальные шорты с клавиатурой с gnome-shell
  • Сменить рабочее пространство между двумя мониторами на gnome
  • Как изменить раскладку клавиатуры в gnome 3 из командной строки
  • Linux и Unix - лучшая ОС в мире.