简体   繁体   中英

GtkButton to emit GDK_KEY_PRESS

I'm attempting to attach to a toolbar button a signal associated with a keystroke supported by GtkTextView (CTRL+a, CTRL+x, etc) using the following widget structure, signal connect, and callback:

typedef struct
{
    GtkWidget *window;
    GtkWidget *text_view;
}EditorWidgets;

//...

    g_signal_connect(cut, "clicked", G_CALLBACK(cut_button_press), editor_widgets);

//...

static void cut_button_press(GtkWidget *button, EditorWidgets *editor_widgets)
{
    UNUSED(button);

    GdkEvent *event = gdk_event_new(GDK_KEY_PRESS);

    event->key.window = gtk_widget_get_window(editor_widgets->window);
    event->key.send_event = FALSE;
    event->key.time = 0;
    event->key.state = GDK_CONTROL_MASK;
    event->key.keyval = GDK_KEY_x;
    event->key.string = g_strdup("x");
    event->key.length = strlen(event->key.string);

    gtk_main_do_event(event);

    gdk_event_free(event);
}

When run, GDK complains with the following:

(ex1:7856): Gdk-WARNING **: Event with type 8 not holding a GdkDevice. It is most likely synthesized outside Gdk/GTK+

Which lets me know I've created the signal improperly (I assume). However, there's very little out there about having buttons emit GDK signals, so I'm at a loss for what's missing here.

As a secondary question, I remember reading somewhere that there was a GDK #define for TIME_NOW or something, but I couldn't find it again. Any hints there?

1.use "key-press-event" instead of clicked, clicked was associated with mouse pointer and keyboard enter key, something like (in python):

   def on_key_press (self, widget, event):
       if event.keyval == 120:
          print ('test')

2.GDK_CURRENT_TIME, define at Gdk.Event class

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM