С уважением Gtk, возможно ли отключить ускорители при записи в записи? - PullRequest
0 голосов
/ 26 февраля 2019

Я изменяю существующую программу, написанную на C, в которую я добавил GtkEntry.Когда я пытаюсь написать, например, "qwerty" в entry, он заполняется только "qwrty", потому что символ "e" используется в качестве ярлыка (accelerator) для вызова другого function, и этофункция также активируется при нажатии "e".

Есть ли способ избежать accelerator callbacks, пока мы пишем в entry?

1 Ответ

0 голосов
/ 03 марта 2019

Да, вы можете disconnect свою группу акселераторов в обратном вызове focus-in-event, равном GtkEntry, и снова подключить ее, когда вы вернетесь назад к записи.Вот пример:

#include <stdio.h>
#include <gtk/gtk.h>

GtkAccelGroup *accel_group;
GClosure *closure;

void accelerator_pressed(void)
{
    printf("Accelerator pressed!\n");
}

gboolean focus_in_callback(void)
{
    gtk_accel_group_disconnect(accel_group, closure);
    g_closure_unref(closure);
    return GDK_EVENT_PROPAGATE;
}
gboolean focus_out_callback(void)
{
    closure = g_cclosure_new(accelerator_pressed, 0, 0);
    gtk_accel_group_connect(accel_group, GDK_KEY_e, (GdkModifierType)0, GTK_ACCEL_VISIBLE, closure);
    return GDK_EVENT_PROPAGATE;
}

int main()
{
    gtk_init(NULL, NULL);

    GtkWidget *window, *box, *entry, *button;

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
    entry = gtk_entry_new();
    button = gtk_button_new_with_label("click me");

    gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(entry), TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(button), TRUE, TRUE, 0);

    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    g_signal_connect(GTK_WIDGET(entry), "focus-in-event", G_CALLBACK(focus_in_callback), NULL);
    g_signal_connect(GTK_WIDGET(entry), "focus-out-event", G_CALLBACK(focus_out_callback), accel_group);

    accel_group = gtk_accel_group_new();
    gtk_window_add_accel_group(GTK_WINDOW(window), accel_group);

    gtk_container_add(GTK_CONTAINER(window), box);
    gtk_widget_show_all(window);

    gtk_main();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...