Gnome의 버튼에 "Alt" 단축키를 활성화하시겠습니까?

Gnome의 버튼에 "Alt" 단축키를 활성화하시겠습니까?

내 말은: 버튼 텍스트의 문자에 밑줄이 그어질 때마다 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.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해킹이므로 때때로 이상한 동작이 발생할 수 있습니다. 나는 이것에 대해 대략적인 테스트만을 수행했습니다. 알려진 오류:

  • then GTK_IM_MODULE으로 설정 하면 무엇이든(심지어 빈 C 파일이라도!) 사용하면 키를 누를 때 GEdit가 중단됩니다 (Debian jessie에서 관찰됨). 이유는 모르겠습니다.ximLD_PRELOADAlt

관련 정보