Как подключить сигнал движения курсора к функции (GTK) - PullRequest
0 голосов
/ 27 марта 2019

Я пишу программу на C, использующую библиотеки GTK, которая считывает положение курсора и записывает его в другую функцию. Я написал код, который может точно читать данные положения курсора, но я не могу понять, как связать событие перемещения курсора с функцией.

Вот код, который у меня есть:

int main(int argc, char **argv){
    GdkWindow *window;
    GtkWidget *gtk_window;
    GdkDevice *mouse;
    gint x = 0;
    gint y = 0;

    gdk_init(&argc, &argv);
    gtk_init(&argc, &argv);


    gtk_window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_widget_show(gtk_window);    
    window = gtk_widget_get_window(GTK_WIDGET(gtk_window));

    gdk_window_maximize(window);
    gdk_window_set_title(window, "write-mouse");

    GdkSeat *seat = gdk_display_get_default_seat (gdk_display_get_default ());
    mouse = gdk_seat_get_pointer (seat);

    gdk_window_get_device_position (window, mouse, &x, &y, NULL);

    //read cursor position at startup to test code
    g_print("X = %d\n", x);
    g_print("Y = %d\n", y);

    //g_signal_connect (mouse, "something?", G_CALLBACK (print_mouse), NULL);

    gtk_main();
}

static void print_mouse(GdkDevice *mouse, gpointer data){
    gint x = 0;
    gint y = 0;
    //do I need to pass the window object to "print_mouse" function too?
    //can I point to it using some gtk function?
    gdk_window_get_device_position (window, mouse, &x, &y, NULL);

    g_print("X = %d\n", x);
    g_print("Y = %d\n", y);
}

Я предполагаю, что мне нужно использовать "g_signal_connect ()", чтобы связать событие движения курсора с функцией "print_mouse", но я не могу понять, что нужно в качестве аргументов заставить его работать.

Что я должен поместить в поле "details_signal" в g_signal_connect ()?

Есть ли лучший способ сделать это полностью?

1 Ответ

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

ваше что-то есть «движение-уведомление-событие», которое выдает данные как событие GdkEventMotion: https://developer.gnome.org/gtk2/stable/GtkWidget.html#GtkWidget-motion-notify-event

Я думаю, что вам также нужно убедиться в gtk_widget_add_events (widget, GDK_POINTER_MOTION_MASK); при построении виджета. По соображениям производительности вы можете настроить его на запуск кода только с определенной частотой обновления, чтобы не перегружать процессор.

...