Skip to content

Commit 45213f0

Browse files
committed
convert bauhaus and iop graphs to gtkgestures
prep for gtk4
1 parent ec7c76b commit 45213f0

21 files changed

+790
-892
lines changed

src/develop/imageop.c

Lines changed: 30 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2536,48 +2536,45 @@ void dt_iop_gui_update_expanded(dt_iop_module_t *module)
25362536
dtgtk_expander_set_expanded(DTGTK_EXPANDER(module->expander), expanded);
25372537
}
25382538

2539-
static gboolean _iop_plugin_body_button_press(GtkWidget *w,
2540-
GdkEventButton *e,
2541-
gpointer user_data)
2542-
{
2543-
dt_iop_module_t *module = (dt_iop_module_t *)user_data;
2544-
if(e->button == GDK_BUTTON_PRIMARY)
2545-
{
2539+
static void _iop_plugin_body_button_press(GtkGestureSingle *gesture,
2540+
int n_press,
2541+
double x,
2542+
double y,
2543+
dt_iop_module_t *module)
2544+
{
2545+
guint button = gtk_gesture_single_get_current_button(gesture);
2546+
if(button == GDK_BUTTON_PRIMARY)
25462547
dt_iop_request_focus(module);
2547-
return TRUE;
2548-
}
2549-
else if(e->button == GDK_BUTTON_SECONDARY)
2550-
{
2548+
else if(button == GDK_BUTTON_SECONDARY)
25512549
_presets_popup_callback(NULL, NULL, module);
25522550

2553-
return TRUE;
2554-
}
2555-
return FALSE;
2551+
dt_gui_claim(gesture);
25562552
}
25572553

2558-
static gboolean _iop_plugin_header_button_release(GtkWidget *w,
2559-
GdkEventButton *e,
2560-
gpointer user_data)
2554+
static void _iop_plugin_header_button_press(GtkGestureSingle *gesture,
2555+
int n_press,
2556+
double x,
2557+
double y,
2558+
dt_iop_module_t *module)
25612559
{
2562-
if(e->type == GDK_2BUTTON_PRESS || e->type == GDK_3BUTTON_PRESS) return TRUE;
2563-
if(GTK_IS_BUTTON(gtk_get_event_widget((GdkEvent*)e))) return FALSE;
2560+
if(n_press > 1) return;
25642561

2565-
dt_iop_module_t *module = (dt_iop_module_t *)user_data;
2566-
2567-
if(e->button == GDK_BUTTON_PRIMARY)
2562+
guint button = gtk_gesture_single_get_current_button(gesture);
2563+
if(button == GDK_BUTTON_PRIMARY)
25682564
{
2569-
if(dt_modifier_is(e->state, GDK_SHIFT_MASK | GDK_CONTROL_MASK))
2565+
if(dt_modifier_eq(gesture, GDK_SHIFT_MASK | GDK_CONTROL_MASK))
25702566
; // do nothing (for easier dragging)
2571-
else if(dt_modifier_is(e->state, GDK_CONTROL_MASK))
2567+
else if(dt_modifier_eq(gesture, GDK_CONTROL_MASK))
25722568
{
25732569
dt_iop_gui_rename_module(module);
2574-
return TRUE;
2570+
dt_gui_claim(gesture);
2571+
return;
25752572
}
25762573
else
25772574
{
25782575
const gboolean collapse_others =
25792576
!dt_conf_get_bool("darkroom/ui/single_module")
2580-
!= (!dt_modifier_is(e->state, GDK_SHIFT_MASK));
2577+
!= (!dt_modifier_eq(gesture, GDK_SHIFT_MASK));
25812578

25822579
dt_iop_gui_set_expanded(module, !module->expanded, collapse_others);
25832580

@@ -2587,16 +2584,17 @@ static gboolean _iop_plugin_header_button_release(GtkWidget *w,
25872584
//used to take focus away from module search text input box when module selected
25882585
gtk_widget_grab_focus(dt_ui_center(darktable.gui->ui));
25892586

2590-
return TRUE;
2587+
dt_gui_claim(gesture);
2588+
return;
25912589
}
25922590
}
2593-
else if(e->button == GDK_BUTTON_SECONDARY)
2591+
else if(button == GDK_BUTTON_SECONDARY)
25942592
{
25952593
_presets_popup_callback(NULL, NULL, module);
25962594

2597-
return TRUE;
2595+
dt_gui_claim(gesture);
2596+
return;
25982597
}
2599-
return FALSE;
26002598
}
26012599

26022600
static void _header_size_callback(GtkWidget *widget,
@@ -3129,17 +3127,15 @@ void dt_iop_gui_set_expander(dt_iop_module_t *module)
31293127
module->header = header;
31303128

31313129
/* setup the header box */
3132-
g_signal_connect(G_OBJECT(header_evb), "button-release-event",
3133-
G_CALLBACK(_iop_plugin_header_button_release), module);
3130+
dt_gui_connect_click_all(header_evb, _iop_plugin_header_button_press, NULL, module);
31343131
gtk_widget_add_events(header_evb, GDK_POINTER_MOTION_MASK);
31353132
g_signal_connect(G_OBJECT(header_evb), "enter-notify-event",
31363133
G_CALLBACK(_header_motion_notify_show_callback), module);
31373134
g_signal_connect(G_OBJECT(header_evb), "leave-notify-event",
31383135
G_CALLBACK(_header_motion_notify_hide_callback), module);
31393136

31403137
/* connect mouse button callbacks for focus and presets */
3141-
g_signal_connect(G_OBJECT(body_evb), "button-press-event",
3142-
G_CALLBACK(_iop_plugin_body_button_press), module);
3138+
dt_gui_connect_click_all(body_evb, _iop_plugin_body_button_press, NULL, module);
31433139
gtk_widget_add_events(body_evb, GDK_POINTER_MOTION_MASK);
31443140
g_signal_connect(G_OBJECT(body_evb), "enter-notify-event",
31453141
G_CALLBACK(_header_motion_notify_show_callback), module);

src/develop/imageop_gui.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,8 @@ GtkWidget *dt_iop_togglebutton_new(dt_iop_module_t *self, const char *section, c
281281

282282
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), FALSE);
283283
if(GTK_IS_BOX(box)) gtk_box_pack_end(GTK_BOX(box), w, FALSE, FALSE, 0);
284+
// GTK4 gtk_box_insert_child_after after finding first non-button from end
285+
// gtk_widget_get_last_child / gtk_widget_get_prev_sibling
284286

285287
dt_action_define_iop(self, section, label, w, &dt_action_def_toggle);
286288

src/dtgtk/drawingarea.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ static void dtgtk_drawing_area_class_init(GtkDarktableDrawingAreaClass *class)
5252

5353
widget_class->get_request_mode = dtgtk_drawing_area_get_request_mode;
5454
widget_class->get_preferred_height_for_width = dtgtk_drawing_area_get_preferred_height_for_width;
55+
// GTK4 add signal "draw" like GTK3 so we can pass "snapshot" to it (with cairo surface)
56+
// add dtgtk_drawing_area_new() to further ease porting
5557
}
5658

5759
static void dtgtk_drawing_area_init(GtkDarktableDrawingArea *da)

src/dtgtk/thumbnail.c

Lines changed: 25 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -953,18 +953,17 @@ static void _thumbs_show_overlays(dt_thumbnail_t *thumb)
953953
}
954954
}
955955

956-
static gboolean _event_main_motion(GtkWidget *widget,
957-
GdkEventMotion *event,
958-
gpointer user_data)
956+
static void _event_main_motion(GtkEventControllerMotion *controller,
957+
double x,
958+
double y,
959+
dt_thumbnail_t *thumb)
959960
{
960-
if(!user_data) return TRUE;
961-
dt_thumbnail_t *thumb = (dt_thumbnail_t *)user_data;
961+
if(!thumb) return;
962962
// first, we hide the block overlays after a delay if the mouse hasn't move
963963
_thumbs_show_overlays(thumb);
964964

965965
if(!thumb->mouse_over && !thumb->disable_mouseover)
966966
dt_control_set_mouse_over_id(thumb->imgid);
967-
return FALSE;
968967
}
969968

970969
static gboolean _event_rating_press(GtkWidget *widget,
@@ -1244,20 +1243,24 @@ static gboolean _event_box_enter_leave(GtkWidget *widget,
12441243
return FALSE;
12451244
}
12461245

1247-
static gboolean _event_image_enter_leave(GtkWidget *widget,
1248-
GdkEventCrossing *event,
1249-
gpointer user_data)
1246+
static void _event_image_leave(GtkEventControllerMotion *controller,
1247+
dt_thumbnail_t *thumb)
12501248
{
1251-
dt_thumbnail_t *thumb = (dt_thumbnail_t *)user_data;
1252-
12531249
// we ensure that the image has mouse over
1254-
if(!thumb->mouse_over && event->type == GDK_ENTER_NOTIFY
1250+
if(!thumb->mouse_over && controller == NULL
12551251
&& !thumb->disable_mouseover)
12561252
dt_control_set_mouse_over_id(thumb->imgid);
12571253

12581254
_set_flag(thumb->w_image_box, GTK_STATE_FLAG_PRELIGHT,
1259-
(event->type == GDK_ENTER_NOTIFY));
1260-
return FALSE;
1255+
(controller == NULL));
1256+
}
1257+
1258+
static void _event_image_enter(GtkEventControllerMotion *controller,
1259+
double x,
1260+
double y,
1261+
dt_thumbnail_t *thumb)
1262+
{
1263+
_event_image_leave(NULL, thumb);
12611264
}
12621265

12631266
static gboolean _event_btn_enter_leave(GtkWidget *widget,
@@ -1331,13 +1334,12 @@ static gboolean _event_star_leave(GtkWidget *widget,
13311334
return TRUE;
13321335
}
13331336

1334-
static gboolean _event_main_leave(GtkWidget *widget,
1335-
GdkEventCrossing *event,
1336-
gpointer user_data)
1337+
static void _event_main_leave(GtkEventControllerMotion *controller,
1338+
dt_thumbnail_t *user_data)
13371339
{
1340+
GdkEventCrossing *event = (GdkEventCrossing *)gtk_get_current_event();
13381341
// if we leave for ancestor, that means we leave for blank thumbtable area
13391342
if(event->detail == GDK_NOTIFY_ANCESTOR) dt_control_set_mouse_over_id(NO_IMGID);
1340-
return FALSE;
13411343
}
13421344

13431345
// we only want to specify that the mouse is hovereing the thumbnail
@@ -1348,7 +1350,7 @@ static gboolean _event_main_drag_motion(GtkWidget *widget,
13481350
const guint time,
13491351
gpointer user_data)
13501352
{
1351-
_event_main_motion(widget, NULL, user_data);
1353+
_event_main_motion(NULL, .0f, .0f, user_data);
13521354
return TRUE;
13531355
}
13541356

@@ -1403,16 +1405,9 @@ GtkWidget *dt_thumbnail_create_widget(dt_thumbnail_t *thumb,
14031405

14041406
// the background
14051407
thumb->w_back = gtk_event_box_new();
1406-
gtk_widget_set_events(thumb->w_back,
1407-
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK
1408-
| GDK_STRUCTURE_MASK
1409-
| GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK
1410-
| GDK_POINTER_MOTION_MASK);
1408+
gtk_widget_set_events(thumb->w_back, GDK_STRUCTURE_MASK); // TODO: Needed?
14111409
gtk_widget_set_name(thumb->w_back, "thumb-back");
1412-
g_signal_connect(G_OBJECT(thumb->w_back), "motion-notify-event",
1413-
G_CALLBACK(_event_main_motion), thumb);
1414-
g_signal_connect(G_OBJECT(thumb->w_back), "leave-notify-event",
1415-
G_CALLBACK(_event_main_leave), thumb);
1410+
dt_gui_connect_motion(thumb->w_back, _event_main_motion, NULL, _event_main_leave, thumb);
14161411
gtk_widget_show(thumb->w_back);
14171412
gtk_container_add(GTK_CONTAINER(thumb->w_main), thumb->w_back);
14181413

@@ -1442,12 +1437,7 @@ GtkWidget *dt_thumbnail_create_widget(dt_thumbnail_t *thumb,
14421437
| GDK_STRUCTURE_MASK
14431438
| GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK
14441439
| GDK_POINTER_MOTION_MASK);
1445-
g_signal_connect(G_OBJECT(evt_image), "motion-notify-event",
1446-
G_CALLBACK(_event_main_motion), thumb);
1447-
g_signal_connect(G_OBJECT(evt_image), "enter-notify-event",
1448-
G_CALLBACK(_event_image_enter_leave), thumb);
1449-
g_signal_connect(G_OBJECT(evt_image), "leave-notify-event",
1450-
G_CALLBACK(_event_image_enter_leave), thumb);
1440+
dt_gui_connect_motion(evt_image, _event_main_motion, _event_image_enter, _event_image_leave, thumb);
14511441
gtk_widget_show(evt_image);
14521442
gtk_overlay_add_overlay(GTK_OVERLAY(thumb->w_image_box), evt_image);
14531443
thumb->w_image = gtk_drawing_area_new();
@@ -1461,12 +1451,7 @@ GtkWidget *dt_thumbnail_create_widget(dt_thumbnail_t *thumb,
14611451
| GDK_POINTER_MOTION_MASK);
14621452
g_signal_connect(G_OBJECT(thumb->w_image), "draw",
14631453
G_CALLBACK(_event_image_draw), thumb);
1464-
g_signal_connect(G_OBJECT(thumb->w_image), "motion-notify-event",
1465-
G_CALLBACK(_event_main_motion), thumb);
1466-
g_signal_connect(G_OBJECT(thumb->w_image), "enter-notify-event",
1467-
G_CALLBACK(_event_image_enter_leave), thumb);
1468-
g_signal_connect(G_OBJECT(thumb->w_image), "leave-notify-event",
1469-
G_CALLBACK(_event_image_enter_leave), thumb);
1454+
dt_gui_connect_motion(thumb->w_image, _event_main_motion, _event_image_enter, _event_image_leave, thumb);
14701455
g_signal_connect(G_OBJECT(thumb->w_image), "style-updated",
14711456
G_CALLBACK(_event_image_style_updated), thumb);
14721457
gtk_widget_show(thumb->w_image);

0 commit comments

Comments
 (0)