I don’t know why you are only getting two motion events. The square brackets trip me up also. Tested cursor motion over a GtkWindow and a GtkEventBox. A little different but they both work good.
Eric
//gcc -Wall motion1.c -o motion1 `pkg-config --cflags --libs gtk+-3.0`
//Tested on Ubuntu18.04 and GTK3.22
#include<gtk/gtk.h>
//For blocking motion signal.
static guint window_motion_id=0;
static guint event_box_motion_id=0;
//The motion x and y coordinates.
static gdouble event_box_x=0.0;
static gdouble event_box_y=0.0;
static gdouble window_x=0.0;
static gdouble window_y=0.0;
static gboolean draw_window(GtkWidget *window, cairo_t *cr, gpointer user_data);
static gboolean draw_event_box(GtkWidget *event_box, cairo_t *cr, gpointer user_data);
static gboolean draw_da(GtkWidget *da, cairo_t *cr, gpointer user_data);
static gboolean button_press_window(GtkWidget *window, GdkEventButton *event, GtkWidget *da);
static gboolean button_release_window(GtkWidget *window, GdkEventButton *event, GtkWidget *da);
static gboolean motion_notify_window(GtkWidget *window, GdkEventMotion *event, GtkWidget *da);
static gboolean button_press_event_box(GtkWidget *da1, GdkEventButton *event, GtkWidget *da);
static gboolean button_release_event_box(GtkWidget *da1, GdkEventButton *event, GtkWidget *da);
static gboolean motion_notify_event_box(GtkWidget *da1, GdkEventMotion *event, GtkWidget *da);
int main(int argc, char **argv)
{
gtk_init(&argc, &argv);
GtkWidget *window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Motion");
gtk_window_set_default_size(GTK_WINDOW(window), 600, 200);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_set_app_paintable(window, TRUE);
g_signal_connect(window, "draw", G_CALLBACK(draw_window), NULL);
GtkWidget *event_box=gtk_event_box_new();
gtk_widget_set_size_request(event_box, 200, 200);
gtk_widget_set_app_paintable(event_box, TRUE);
g_signal_connect(event_box, "draw", G_CALLBACK(draw_event_box), NULL);
GtkWidget *da=gtk_drawing_area_new();
gtk_widget_set_size_request(da, 200, 200);
g_signal_connect(da, "draw", G_CALLBACK(draw_da), NULL);
window_motion_id=g_signal_connect(window, "motion-notify-event", G_CALLBACK(motion_notify_window), da);
//g_signal_handler_block(window, window_motion_id);
g_signal_connect(window, "button-press-event", G_CALLBACK(button_press_window), da);
g_signal_connect(window, "button-release-event", G_CALLBACK(button_release_window), da);
event_box_motion_id=g_signal_connect(event_box, "motion-notify-event", G_CALLBACK(motion_notify_event_box), da);
//g_signal_handler_block(event_box, event_box_motion_id);
g_signal_connect(event_box, "button-press-event", G_CALLBACK(button_press_event_box), da);
g_signal_connect(event_box, "button-release-event", G_CALLBACK(button_release_event_box), da);
GtkWidget *box=gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_pack_start(GTK_BOX(box), event_box, FALSE, FALSE, 0);
gtk_box_pack_end(GTK_BOX(box), da, FALSE, FALSE, 0);
gtk_container_add(GTK_CONTAINER(window), box);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
static gboolean draw_window(GtkWidget *window, cairo_t *cr, gpointer user_data)
{
cairo_set_source_rgba(cr, 1.0, 1.0, 0.0, 1.0);
cairo_paint(cr);
cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 1.0);
cairo_set_font_size(cr, 16);
cairo_move_to(cr, 330.0, 20.0);
cairo_show_text(cr, "window");
return FALSE;
}
static gboolean draw_event_box(GtkWidget *event_box, cairo_t *cr, gpointer user_data)
{
cairo_set_source_rgba(cr, 0.0, 0.0, 1.0, 1.0);
cairo_paint(cr);
cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 1.0);
cairo_set_font_size(cr, 16);
cairo_move_to(cr, 110.0, 20.0);
cairo_show_text(cr, "event box");
return FALSE;
}
static gboolean draw_da(GtkWidget *da, cairo_t *cr, gpointer user_data)
{
cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 1.0);
cairo_paint(cr);
cairo_set_source_rgba(cr, 1.0, 1.0, 0.0, 1.0);
cairo_arc(cr, window_x-200.0, window_y, 20.0, 0.0, 2.0*G_PI);
cairo_fill(cr);
cairo_set_source_rgba(cr, 0.0, 0.0, 1.0, 1.0);
cairo_arc(cr, event_box_x-400.0, event_box_y, 20.0, 0.0, 2.0*G_PI);
cairo_fill(cr);
cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 1.0);
cairo_set_font_size(cr, 16);
cairo_move_to(cr, 150.0, 20.0);
cairo_show_text(cr, "da");
return FALSE;
}
static gboolean button_press_window(GtkWidget *window, GdkEventButton *event, GtkWidget *da)
{
g_print("button press window\n");
//g_signal_handler_unblock(window, window_motion_id);
window_x=-200.0+event->x;
window_y=event->y;
gtk_widget_queue_draw(da);
return TRUE;
}
static gboolean button_release_window(GtkWidget *window, GdkEventButton *event, GtkWidget *da)
{
g_print("button release window\n");
//g_signal_handler_block(window, window_motion_id);
window_x=-200.0+event->x;
window_y=event->y;
gtk_widget_queue_draw(da);
return TRUE;
}
static gboolean motion_notify_window(GtkWidget *window, GdkEventMotion *event, GtkWidget *da)
{
window_x=-200.0+event->x;
window_y=event->y;
gtk_widget_queue_draw(da);
return TRUE;
}
static gboolean button_press_event_box(GtkWidget *event_box, GdkEventButton *event, GtkWidget *da)
{
g_print(" button press event box\n");
//g_signal_handler_unblock(event_box, event_box_motion_id);
event_box_x=event->x;
event_box_y=event->y;
gtk_widget_queue_draw(da);
return TRUE;
}
static gboolean button_release_event_box(GtkWidget *event_box, GdkEventButton *event, GtkWidget *da)
{
g_print(" button release event_box\n");
//g_signal_handler_block(event_box, event_box_motion_id);
event_box_x=event->x;
event_box_y=event->y;
gtk_widget_queue_draw(da);
return TRUE;
}
static gboolean motion_notify_event_box(GtkWidget *event_box, GdkEventMotion *event, GtkWidget *da)
{
event_box_x=event->x;
event_box_y=event->y;
gtk_widget_queue_draw(da);
return TRUE;
}