static void multi_device_event_cb (GtkWidget *widget, GtkDeviceGroup *group, GtkMultiDeviceEvent *event, gpointer user_data) { gdouble center_x, center_y, angle; if (event->n_events != 2) return; gdk_events_get_center ((GdkEvent *) event->events[0], (GdkEvent *) event->events[1], ¢er_x, ¢er_y); gdk_events_get_angle ((GdkEvent *) event->events[0], (GdkEvent *) event->events[1], &angle); ... } static gboolean button_cb (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { GdkDevice *device; MyWidgetPrivate *private_data; device = gdk_event_get_device ((GdkEvent *) event); private_data = MY_WIDGET (widget)->private; if (event->type == GDK_BUTTON_PRESS) gtk_device_group_add_device (private_data->group, device); else if (event->type == GDK_BUTTON_RELEASE) gtk_device_group_remove_device (private_data->group, device); return TRUE; } static void my_widget_init (GtkWidget *widget) { MyWidgetPrivate *private_data; private_data = MY_WIDGET (widget)->private; private_data->group = gtk_widget_create_device_group (widget); g_signal_connect (widget, "multidevice-event", G_CALLBACK (multidevice_cb), NULL); g_signal_connect (widget, "button-press-event", G_CALLBACK (button_cb), NULL); g_signal_connect (widget, "button-release-event", G_CALLBACK (button_cb), NULL); ... }