comparison gtk4/dw.c @ 2309:e238178186ff

GTK: Add a secondary callback for the mouse enter, but keep the logic in the same place.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Wed, 10 Feb 2021 09:55:04 +0000
parents a9018bd91d04
children 5df7b1431d1a
comparison
equal deleted inserted replaced
2308:a9018bd91d04 2309:e238178186ff
404 static gint _dw_motion_notify_event(GtkEventControllerMotion *controller, double x, double y, gpointer data); 404 static gint _dw_motion_notify_event(GtkEventControllerMotion *controller, double x, double y, gpointer data);
405 static gboolean _dw_delete_event(GtkWidget *window, gpointer data); 405 static gboolean _dw_delete_event(GtkWidget *window, gpointer data);
406 static gint _dw_key_press_event(GtkEventControllerKey *controller, guint keyval, guint keycode, GdkModifierType state, gpointer data); 406 static gint _dw_key_press_event(GtkEventControllerKey *controller, guint keyval, guint keycode, GdkModifierType state, gpointer data);
407 static gint _dw_generic_event(GtkWidget *widget, gpointer data); 407 static gint _dw_generic_event(GtkWidget *widget, gpointer data);
408 static gint _dw_configure_event(GtkWidget *widget, int width, int height, gpointer data); 408 static gint _dw_configure_event(GtkWidget *widget, int width, int height, gpointer data);
409 static gint _dw_container_enter_event(GtkEventControllerKey *controller, guint keyval, guint keycode, GdkModifierType state, gpointer data); 409 static gint _dw_container_enter_event(GtkEventController *controller, guint keyval, guint keycode, GdkModifierType state, gpointer data);
410 static gint _dw_combobox_select_event(GtkWidget *widget, gpointer data); 410 static gint _dw_combobox_select_event(GtkWidget *widget, gpointer data);
411 static gint _dw_expose_event(GtkWidget *widget, cairo_t *cr, int width, int height, gpointer data); 411 static gint _dw_expose_event(GtkWidget *widget, cairo_t *cr, int width, int height, gpointer data);
412 static gint _dw_set_focus_event(GtkWindow *window, GtkWidget *widget, gpointer data); 412 static gint _dw_set_focus_event(GtkWindow *window, GtkWidget *widget, gpointer data);
413 static gint _dw_tree_context_event(GtkGestureSingle *gesture, int n_press, double x, double y, gpointer data); 413 static gint _dw_tree_context_event(GtkGestureSingle *gesture, int n_press, double x, double y, gpointer data);
414 static gint _dw_value_changed_event(GtkWidget *widget, gpointer user_data); 414 static gint _dw_value_changed_event(GtkWidget *widget, gpointer user_data);
1067 retval = treeexpandfunc(work.window, (HTREEITEM)iter, work.data); 1067 retval = treeexpandfunc(work.window, (HTREEITEM)iter, work.data);
1068 } 1068 }
1069 return retval; 1069 return retval;
1070 } 1070 }
1071 1071
1072 static gint _dw_container_enter_event(GtkEventControllerKey *controller, guint keyval, guint keycode, GdkModifierType state, gpointer data) 1072 static gint _dw_container_enter_event(GtkEventController *controller, guint keyval, guint keycode, GdkModifierType state, gpointer data)
1073 { 1073 {
1074 SignalHandler work = _dw_get_signal_handler(data); 1074 SignalHandler work = _dw_get_signal_handler(data);
1075 int retval = FALSE; 1075 int retval = FALSE;
1076 1076
1077 if(work.window && GTK_IS_WIDGET(work.window)) 1077 if(work.window && GTK_IS_WIDGET(work.window))
1078 { 1078 {
1079 GtkWidget *widget = GTK_WIDGET(g_object_get_data(G_OBJECT(work.window), "_dw_user")); 1079 GtkWidget *user = GTK_WIDGET(g_object_get_data(G_OBJECT(work.window), "_dw_user"));
1080 GtkWidget *widget = user ? user : work.window;
1080 GdkEvent *event = gtk_event_controller_get_current_event(GTK_EVENT_CONTROLLER(controller)); 1081 GdkEvent *event = gtk_event_controller_get_current_event(GTK_EVENT_CONTROLLER(controller));
1081 GdkEventType type = gdk_event_get_event_type(event); 1082 GdkEventType type = gdk_event_get_event_type(event);
1082 gint button = (type == GDK_BUTTON_PRESS) ? gdk_button_event_get_button(event) : -1; 1083 gint button = (type == GDK_BUTTON_PRESS) ? gdk_button_event_get_button(event) : -1;
1083 1084
1084 1085 /* Handle both key and button events together */
1085 /* TODO: Make sure this works.
1086 Handle both key and button events together */
1087 if((type == GDK_BUTTON_PRESS && button == 1) || keyval == VK_RETURN) 1086 if((type == GDK_BUTTON_PRESS && button == 1) || keyval == VK_RETURN)
1088 { 1087 {
1089 int (*contextfunc)(HWND, char *, void *, void *) = work.func; 1088 int (*contextfunc)(HWND, char *, void *, void *) = work.func;
1090 char *text = NULL; 1089 char *text = NULL;
1091 void *data = NULL; 1090 void *data = NULL;
1115 } 1114 }
1116 } 1115 }
1117 } 1116 }
1118 } 1117 }
1119 return retval; 1118 return retval;
1119 }
1120
1121 /* Just forward to the other handler, with bogus key info */
1122 void _dw_container_enter_mouse(GtkEventController *controller, int n_press, double x, double y, gpointer data)
1123 {
1124 if(n_press == 2)
1125 _dw_container_enter_event(GTK_EVENT_CONTROLLER(controller), 0, 0, 0, data);
1120 } 1126 }
1121 1127
1122 /* Return the logical page id from the physical page id */ 1128 /* Return the logical page id from the physical page id */
1123 int _dw_get_logical_page(HWND handle, unsigned long pageid) 1129 int _dw_get_logical_page(HWND handle, unsigned long pageid)
1124 { 1130 {
10425 #define _DW_INTERNAL_CALLBACK_PARAMS 4 10431 #define _DW_INTERNAL_CALLBACK_PARAMS 4
10426 10432
10427 /* Signal setup functions */ 10433 /* Signal setup functions */
10428 GObject *_dw_key_setup(struct _dw_signal_list *signal, GObject *object, void *sigfunc, void *discfunc, void *data) 10434 GObject *_dw_key_setup(struct _dw_signal_list *signal, GObject *object, void *sigfunc, void *discfunc, void *data)
10429 { 10435 {
10436 /* Special case for item enter... we need a mouse callback too */
10437 if(strcmp(signal->name, DW_SIGNAL_ITEM_ENTER) == 0)
10438 {
10439 GtkGesture *gesture = gtk_gesture_click_new();
10440 gtk_widget_add_controller(GTK_WIDGET(object), GTK_EVENT_CONTROLLER(gesture));
10441 int cid, sigid = _dw_set_signal_handler(G_OBJECT(object), (HWND)object, sigfunc, data, (gpointer)_dw_container_enter_mouse, discfunc);
10442 void **newparams = calloc(sizeof(void *), 3);
10443
10444 newparams[0] = DW_INT_TO_POINTER(sigid);
10445 newparams[2] = DW_POINTER(object);
10446 cid = g_signal_connect_data(G_OBJECT(gesture), "pressed", G_CALLBACK(_dw_container_enter_mouse), newparams, _dw_signal_disconnect, 0);
10447 _dw_set_signal_handler_id(object, sigid, cid);
10448 }
10430 if(GTK_IS_WIDGET(object)) 10449 if(GTK_IS_WIDGET(object))
10431 { 10450 {
10432 GtkEventController *controller = gtk_event_controller_key_new(); 10451 GtkEventController *controller = gtk_event_controller_key_new();
10433 gtk_widget_add_controller(GTK_WIDGET(object), controller); 10452 gtk_widget_add_controller(GTK_WIDGET(object), controller);
10434 return G_OBJECT(controller); 10453 return G_OBJECT(controller);