私の言葉は:ボタンテキストの文字に下線が引かれるたびにAlt
その文字にプラスを押してボタンをクリックすることです。私は成功せずにアプレットを見ましKeyboard
たTweak Tool
。
押すとAlt
文字に下線が引かれますが、あらかじめ下線を引くことを好みます。
答え1
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では、このオプションは削除されました(今回提出してください、対応するログメッセージは、単に機能が削除されたことを示します。ソースコードを見ると開く方法はありません。最小300ミリ秒間押した後にのみAltニーモニックを表示するクレイジー動作(タイムアウトはコンパイル時定数でハードコーディングされます)が唯一可能な動作です。
私はこの動作を無視する予定です。事前ロードニーモニックが表示されるように強制するライブラリラッパーです。ほとんどの電話機が内部にあるので簡単ではありません。最後に、ラベル表示ウィジェットにニーモニックを表示するかどうかを示すクエリが常に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
ハッキングなので、時には奇妙な動作が発生することがあります。私はこれについておおよそのテストだけをしました。既知のエラー:
- then
GTK_IM_MODULE
に設定すると、何でも(空のCファイルでも!)使用すると、キーを押すとGEditがクラッシュします(Debian jessieで観察されます)。理由はわかりません。xim
LD_PRELOAD
Alt