Gnomeのボタンに「Alt」ショートカットを有効にしますか?

Gnomeのボタンに「Alt」ショートカットを有効にしますか?

私の言葉は:ボタンテキストの文字に下線が引かれるたびにAltその文字にプラスを押してボタンをクリックすることです。私は成功せずにアプレットを見ましKeyboardTweak 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.cGCCおよびGTK3開発パッケージ(sudo apt-get install gcc libgtk-3-devDebian / 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ハッキングなので、時には奇妙な動作が発生することがあります。私はこれについておおよそのテストだけをしました。既知のエラー:

  • thenGTK_IM_MODULEに設定すると、何でも(空のCファイルでも!)使用すると、キーを押すとG​​Editがクラッシュします(Debian jessieで観察されます)。理由はわかりません。ximLD_PRELOADAlt

関連情報