Mercurial > dwindows
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); |