Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
e3458e7
gtk4-prep: IOP module event controllers
Arecsu Jul 27, 2026
144517d
gtk4-prep: basecurve event controllers
Arecsu Jul 27, 2026
d22b1c3
gtk4-prep: colorcorrection event controllers
Arecsu Jul 27, 2026
36b71d8
gtk4-prep: rgbcurve event controllers
Arecsu Jul 27, 2026
3117349
gtk4-prep: tonecurve and lut3d event controllers
Arecsu Jul 27, 2026
31c45b3
gtk4-prep: colorzones and ashift event controllers
Arecsu Jul 27, 2026
71143ea
gtk4-prep: imageop event controllers
Arecsu Jul 27, 2026
6b8d969
gtk4-prep: colorbalance and temperature event controllers
Arecsu Jul 27, 2026
8b7ab3e
gtk4-prep: resetlabel event controllers
Arecsu Jul 27, 2026
f82bdf2
gtk4-prep: color_picker_proxy event controllers
Arecsu Jul 27, 2026
14cacb2
gtk4-prep: filter widgets event controllers
Arecsu Jul 27, 2026
050bfe2
gtk4-prep: lib module event controllers
Arecsu Jul 27, 2026
c171fc9
gtk4-prep: toolbar event controllers
Arecsu Jul 27, 2026
3a3fa7b
gtk4-prep: fix scroll mask regression in colorequal and toneequal
Arecsu Jul 27, 2026
b645f22
gtk4-prep: fix code style issues in event-controller conversions
Arecsu Jul 27, 2026
8cbcc52
gtk4-prep: update copyright years for modified files
Arecsu Jul 27, 2026
9bfc904
gtk4-prep: convert thumbnail event signals to event controllers
Arecsu Jul 27, 2026
8618ccd
gtk4-prep: convert lib module event signals to event controllers
Arecsu Jul 27, 2026
b2d6f36
gtk4-prep: convert colorpicker event signals to event controllers
Arecsu Jul 27, 2026
283517f
gtk4-prep: convert darkroom view event signals to event controllers
Arecsu Jul 27, 2026
fa3621d
gtk4-prep: convert preferences event signals to event controllers
Arecsu Jul 27, 2026
4488706
gtk4-prep: convert lua preferences event signals to event controllers
Arecsu Jul 27, 2026
5087242
gtk4-prep: convert range select event signals to event controllers
Arecsu Jul 27, 2026
bf8b9d9
gtk4-prep: convert masks event signals to event controllers
Arecsu Jul 27, 2026
66524fb
gtk4-prep: convert bauhaus event signals to event controllers
Arecsu Jul 27, 2026
ad9c8ec
gtk4-prep: convert timeline event signals to event controllers
Arecsu Jul 27, 2026
5c44913
gtk4-prep: convert culling event signals to event controllers
Arecsu Jul 27, 2026
b99fa58
gtk4-prep: convert thumbtable event signals to event controllers
Arecsu Jul 27, 2026
9202e18
gtk4-prep: convert accelerators event signals to event controllers
Arecsu Jul 27, 2026
1ff2acb
gtk4-prep: convert ratings event signals to event controllers
Arecsu Jul 27, 2026
6b23561
gtk4-prep: convert navigation event signals to event controllers
Arecsu Jul 27, 2026
de141dd
gtk4-prep: convert log history event signals to event controllers
Arecsu Jul 27, 2026
4a47bc3
gtk4-prep: convert viewswitcher event signals to event controllers
Arecsu Jul 27, 2026
e89fd14
gtk4-prep: convert colorlabels event signals to event controllers
Arecsu Jul 27, 2026
24ef633
gtk4-prep: convert colors filter enter-notify event to event controller
Arecsu Jul 27, 2026
40066f2
gtk4-prep: convert location result button-press event to event contro…
Arecsu Jul 27, 2026
7c2fc89
gtk4-prep: convert blend gui event signals to event controllers
Arecsu Jul 27, 2026
b556767
gtk4-prep: convert export spinbutton button-press events to event con…
Arecsu Jul 27, 2026
6cc0355
gtk4-prep: convert neural restore event signals to event controllers
Arecsu Jul 27, 2026
e720434
gtk4-prep: convert preferences_ai event signals to event controllers
Arecsu Jul 27, 2026
f1288f3
gtk4-prep: convert lighttable profile button button-press event to ev…
Arecsu Jul 27, 2026
f3c4784
gtk4-prep: convert import metadata button-press events to event contr…
Arecsu Jul 27, 2026
9595e57
gtk4-prep: convert filtering event signals to event controllers
Arecsu Jul 27, 2026
4664694
gtk4-prep: convert lighttable layout button-release events to event c…
Arecsu Jul 27, 2026
f294dbe
gtk4-prep: convert import event signals to event controllers
Arecsu Jul 27, 2026
0091aec
gtk4-prep: convert metadata event signals to event controllers
Arecsu Jul 27, 2026
a982b2c
gtk4-prep: convert collect event signals to event controllers
Arecsu Jul 27, 2026
739cdbe
gtk4-prep: replace scroll-event signals with event controllers in cul…
Arecsu Jul 27, 2026
5e13858
gtk4-prep: replace motion-notify and key-press signals with event con…
Arecsu Jul 27, 2026
d44fc69
gtk4-prep: replace event signals with event controllers in tagging mo…
Arecsu Jul 27, 2026
17953ee
gtk4-prep: replace scroll-event with event controller in colorequal
Arecsu Jul 27, 2026
efb2f3a
gtk4-prep: replace scroll-event and togglebutton callback in tonequal
Arecsu Jul 27, 2026
890fc18
gtk4-prep: migrate dt_iop_togglebutton_new from button-press-event to…
Arecsu Jul 27, 2026
51d7410
gtk4-prep: migrate togglebutton callbacks to gesture controller in bl…
Arecsu Jul 27, 2026
635842a
gtk4-prep: replace event signals with event controllers in remaining …
Arecsu Jul 27, 2026
8e2154a
gtk4-prep: fix toggle button recursion by claiming gesture sequence
Arecsu Jul 27, 2026
febc420
gtk4-prep: guard double-click to lighttable in darkroom and liquify
Arecsu Jul 27, 2026
94c1f5e
gtk4-prep: add GtkGestureMultiPress double-click bridge for GTK3
Arecsu Jul 27, 2026
96985db
gtk4-prep: convert culling and thumbtable event signals to event cont…
Arecsu Jul 27, 2026
18a3144
gtk4-prep: convert blend GUI event signals to event controllers
Arecsu Jul 27, 2026
7281bc0
gtk4-prep: fix event memory leak in bauhaus popup button press
Arecsu Jul 27, 2026
2bb4950
gtk4-prep: convert toneequal event signals to event controllers
Arecsu Jul 27, 2026
be163ee
gtk4-prep: convert lib body enter callback to event controller
Arecsu Jul 27, 2026
3fa26a1
gtk4-prep: fix build errors in map, location, and lut3d after event c…
Arecsu Jul 27, 2026
4890448
gtk4-prep: revert map view to signal-based event handling (OsmGpsMap …
Arecsu Jul 27, 2026
d5fcd1b
Revert "gtk4-prep: revert map view to signal-based event handling (Os…
Arecsu Jul 27, 2026
0e5ab0d
gtk4-prep: use CAPTURE phase for map view gesture controllers (OsmGps…
Arecsu Jul 27, 2026
8387193
gtk4-prep: fix event controller bugs in bauhaus popup
Arecsu Jul 27, 2026
df1108b
gtk4-prep: fix get_button vs get_current_button in range widget
Arecsu Jul 27, 2026
40ced19
gtk4-prep: fix memory leak in colorequal scroll callback
Arecsu Jul 27, 2026
51c71a8
gtk4-prep: restore GDK_BUTTON_PRIMARY guards in blend GUI
Arecsu Jul 27, 2026
ea143e3
gtk4-prep: restore smooth-scroll accumulation in preset scroller
Arecsu Jul 27, 2026
237246e
gtk4-prep: fix get_button vs get_current_button in lib modules
Arecsu Jul 27, 2026
cef1230
gtk4-prep: add dt_gui_get_widget() macro and apply across all files
Arecsu Jul 27, 2026
60f7fc2
gtk4-prep: clean up histogram scroll callback TODO
Arecsu Jul 27, 2026
318ae35
gtk4-prep: update histogram scroll callback GTK4 note
Arecsu Jul 27, 2026
e7803b9
gtk4-prep: add dt_gui_get_scroll_unit_delta(s)_fallback helpers
Arecsu Jul 27, 2026
9f41862
gtk4-prep: restore explicit event masks on NO_WINDOW drawing areas
Arecsu Jul 27, 2026
f098290
gtk4-prep: use signal handlers for bauhaus popup (GTK_WINDOW_POPUP qu…
Arecsu Jul 27, 2026
07291ad
gtk4-prep: use clicked signal for filter preferences button
Arecsu Jul 27, 2026
cb674d5
gtk4-prep: restore button-inside-header guard in IOP module headers
Arecsu Jul 27, 2026
fadb56d
gtk4-prep: fix lib module header and button event handling
Arecsu Jul 27, 2026
20d27e3
gtk4-prep: update copyright year for timeline.c
Arecsu Jul 27, 2026
f3d66a2
gtk4-prep: fix stale static gboolean in preferences_ai click callback
Arecsu Jul 27, 2026
19b892a
gtk4-prep: fix ASSERT_FUNC_TYPE macro for NULL callbacks
Arecsu Jul 27, 2026
1fa2ac3
gtk4-prep: simplify filtering rule removal logic
Arecsu Jul 27, 2026
190d0f5
gtk4-prep: convert missed retouch togglebutton callbacks to gestures
Arecsu Jul 31, 2026
b82f564
gtk4-prep: fix gesture button detection and long-press timing on pres…
Arecsu Jul 31, 2026
a63860c
gtk4-prep: prevent stacking multiple shortcuts dialogs
Arecsu Jul 31, 2026
f255f4e
gtk4-prep: convert gesture coordinates to bin-window space in treeviews
Arecsu Jul 31, 2026
cd42cdb
gtk4-prep: make key event controllers work on GTK3
Arecsu Jul 31, 2026
a8ae37a
gtk4-prep: allow deleting shortcuts with the backspace key
Arecsu Jul 31, 2026
52e5648
gtk4-prep: fix click handling on the shortcuts actions treeview
Arecsu Jul 31, 2026
9ab4fb9
gtk4-prep: pass NULL pipe to dt_iop_commit_blend_params after upstrea…
Arecsu Aug 4, 2026
88e6de8
gtk4-prep: mirror main view pan/pinch behavior in darkroom second window
Arecsu Aug 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
193 changes: 131 additions & 62 deletions src/bauhaus/bauhaus.c
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,15 @@ static double INNER_PADDING = 4.0;
static void _popup_reject(void);
static void _popup_hide(void);
static gboolean _popup_draw(GtkWidget *widget, cairo_t *cr, gpointer user_data);
static gboolean _popup_key_press(GtkWidget *widget, GdkEventKey *event, gpointer user_data);
static void _window_motion_handle(GtkWidget *widget,
gdouble root_x,
gdouble root_y,
GdkModifierType state);
static gboolean _popup_key_press(GtkEventControllerKey *controller,
guint keyval,
guint keycode,
GdkModifierType state,
gpointer user_data);
static void _combobox_set(dt_bauhaus_widget_t *w,
const int pos,
const gboolean mute);
Expand Down Expand Up @@ -517,28 +525,27 @@ static void _slider_zoom_toast(dt_bauhaus_widget_t *w)
g_free(max_text);
}

static gboolean _popup_scroll(GtkWidget *widget,
GdkEventScroll *event,
static void _popup_scroll_cb(GtkEventControllerScroll *controller,
gdouble dx,
gdouble dy,
gpointer user_data)
{
dt_bauhaus_widget_t *w = darktable.bauhaus->current;
if(w->type == DT_BAUHAUS_COMBOBOX)
{
// match keyboard: right & down -> next
int delta_x = 0, delta_y = 0;
if(dt_gui_get_scroll_unit_deltas(event, &delta_x, &delta_y))
{
int delta = abs(delta_x) > abs(delta_y) ? delta_x : delta_y;
dt_gui_get_scroll_unit_deltas_fallback(dx, dy, &delta_x, &delta_y);
const int delta = abs(delta_x) > abs(delta_y) ? delta_x : delta_y;
if(delta != 0)
_combobox_next_sensitive(w, delta, 0, w->combobox.mute_scrolling);
}
}
else
{
int delta = 0;
if(dt_gui_get_scroll_unit_delta(event, &delta))
_slider_zoom_range(w, delta);
dt_gui_get_scroll_unit_delta_fallback(dy, &delta);
_slider_zoom_range(w, delta);
}
return TRUE;
}

static void _window_moved_to_rect(GdkWindow *window,
Expand Down Expand Up @@ -596,9 +603,10 @@ static void _window_position(const int offset)
0, - pop->offset + pop->offcut);
}

static gboolean _window_motion_notify(GtkWidget *widget,
GdkEventMotion *event,
gpointer user_data)
static void _window_motion_handle(GtkWidget *widget,
gdouble root_x,
gdouble root_y,
GdkModifierType state)
{
dt_bauhaus_t *bh = darktable.bauhaus;
dt_bauhaus_popup_t *pop = &bh->popup;
Expand All @@ -612,16 +620,16 @@ static gboolean _window_motion_notify(GtkWidget *widget,
// recalculate event coords so we get useful values outside window
GdkWindow *window = gtk_widget_get_window(pop->area);
gdk_window_get_origin(window, &allocation.x, &allocation.y);
const gint ex = dt_gdk_event_get_root_x(event) - allocation.x;
const gint ey = dt_gdk_event_get_root_y(event) - allocation.y;
const gint ex = root_x - allocation.x;
const gint ey = root_y - allocation.y;

const int tol = DT_PIXEL_APPLY_DPI(dt_gdk_event_get_state(event) & GDK_BUTTON1_MASK ? 400 : 50);
const int tol = DT_PIXEL_APPLY_DPI(state & GDK_BUTTON1_MASK ? 400 : 50);
if(ex < - tol || ex > allocation.width + tol
|| ey + pop->offcut < - tol
|| ey + pop->offcut > pop->position.height + tol)
{
_popup_reject();
return TRUE;
return;
}

if(bh->keys_cnt == 0) _stop_cursor();
Expand Down Expand Up @@ -658,7 +666,7 @@ static gboolean _window_motion_notify(GtkWidget *widget,
: _slider_get_line_offset
(pop->oldpos, 5.0 * powf(10.0f, -d->digits) / (d->max - d->min) / fabsf(d->factor),
bh->mouse_x / (width - _widget_get_quad_width(w)), bh->mouse_y / width, ht / width);
if(dt_gdk_event_get_state(event) & GDK_BUTTON1_MASK
if(state & GDK_BUTTON1_MASK
|| (bh->mouse_line_distance
&& ((bh->mouse_line_distance * mouse_off <= 0) ^
(fabsf(bh->mouse_line_distance - mouse_off) > .5f))))
Expand All @@ -673,7 +681,7 @@ static gboolean _window_motion_notify(GtkWidget *widget,
const int active = (bh->mouse_y - w->top_gap) / bh->line_height;
if(active >= 0 && active < d->entries->len)
{
if(_combobox_entry(d, active)->sensitive && dt_gdk_event_get_state(event) & GDK_BUTTON1_MASK)
if(_combobox_entry(d, active)->sensitive && state & GDK_BUTTON1_MASK)
{
if(active != d->active)
_combobox_set(w, active, w->combobox.mute_scrolling);
Expand All @@ -682,72 +690,114 @@ static gboolean _window_motion_notify(GtkWidget *widget,
}

gtk_widget_queue_draw(pop->area);
return TRUE;
}

static gboolean _popup_leave_notify(GtkWidget *widget,
GdkEventCrossing *event,
gpointer user_data)
// GTK4 TODO: This popup uses GTK_WINDOW_POPUP which has compatibility issues
// with GtkEventControllerKey and GtkEventControllerMotion on GTK3 — motion
// and key events don't reach the controllers on this window type. The signal
// handlers below are the fallback. For GTK4, the popup should be migrated to
// GtkPopover or a GtkWindow with proper event controllers.

static gboolean _window_motion_handler(GtkWidget *widget, GdkEventMotion *event,
gpointer user_data)
{
gtk_widget_set_state_flags(widget, GTK_STATE_FLAG_NORMAL, TRUE);
_window_motion_handle(widget,
dt_gdk_event_get_root_x(event),
dt_gdk_event_get_root_y(event),
dt_gdk_event_get_state(event));
return TRUE;
}

static gboolean _popup_button_release(GtkWidget *widget,
GdkEventButton *event,
static gboolean _popup_leave_handler(GtkWidget *widget, GdkEventCrossing *event,
gpointer user_data)
{
if(darktable.bauhaus->change_active && dt_gdk_event_get_button(event) != GDK_BUTTON_MIDDLE)
_popup_hide();

gtk_widget_set_state_flags(widget, GTK_STATE_FLAG_NORMAL, TRUE);
return TRUE;
}

static gboolean _popup_button_press(GtkWidget *widget,
GdkEventButton *event,
static gboolean _popup_key_handler(GtkWidget *widget, GdkEventKey *event,
gpointer user_data)
{
if(dt_gdk_event_get_window(event) != gtk_widget_get_window(widget))
{
_popup_reject();
return TRUE;
}
return _popup_key_press(NULL, dt_gdk_event_get_keyval(event), 0, dt_gdk_event_get_state(event), NULL);
}

static void _popup_button_release_cb(GtkGestureSingle *gesture,
gint n_press,
gdouble x,
gdouble y,
gpointer user_data)
{
if(darktable.bauhaus->change_active && gtk_gesture_single_get_current_button(gesture) != GDK_BUTTON_MIDDLE)
_popup_hide();
}

static void _popup_button_press_cb(GtkGestureSingle *gesture,
gint n_press,
gdouble x,
gdouble y,
gpointer user_data)
{
dt_bauhaus_t *bh = darktable.bauhaus;
dt_bauhaus_widget_t *w = bh->current;
const guint button = gtk_gesture_single_get_current_button(gesture);

if(dt_gdk_event_get_button(event) == GDK_BUTTON_PRIMARY)
// reject clicks that come from outside the popup area window
GdkEvent *cur_event = gtk_get_current_event();
if(cur_event)
{
if(dt_gdk_event_get_window(cur_event) != gtk_widget_get_window(dt_gui_get_widget(gesture)))
{
gdk_event_free(cur_event);
_popup_reject();
return;
}
gdk_event_free(cur_event);
}

if(button == GDK_BUTTON_PRIMARY)
{
// only accept left mouse click
gtk_widget_set_state_flags(GTK_WIDGET(w),
GTK_STATE_FLAG_FOCUSED, FALSE);

if(w->type == DT_BAUHAUS_COMBOBOX
&& !dt_gui_long_click(dt_gdk_event_get_time(event), bh->opentime))
&& !dt_gui_long_click(gdk_event_get_time(gtk_gesture_get_last_event(GTK_GESTURE(gesture), NULL)), bh->opentime))
{
// counts as double click, reset:
if(!(dt_modifier_is(dt_gdk_event_get_state(event), GDK_CONTROL_MASK) && w->field
GdkModifierType state;
gtk_get_current_event_state(&state);
if(!(dt_modifier_is(state, GDK_CONTROL_MASK) && w->field
&& dt_gui_presets_autoapply_for_module((dt_iop_module_t *)w->module,
GTK_WIDGET(w))))
dt_bauhaus_widget_reset(GTK_WIDGET(w));
}

bh->change_active = TRUE;
event->state |= GDK_BUTTON1_MASK;
_window_motion_notify(widget, (GdkEventMotion*)event, user_data);
GtkWidget *w_current = dt_gui_get_widget(gesture);
GdkEvent *current_event = gtk_get_current_event();
if(current_event)
{
GdkModifierType motion_state = dt_gdk_event_get_state(current_event);
motion_state |= GDK_BUTTON1_MASK;
_window_motion_handle(w_current,
dt_gdk_event_get_root_x(current_event),
dt_gdk_event_get_root_y(current_event),
motion_state);
gdk_event_free(current_event);
}
}
else if(dt_gdk_event_get_button(event) == GDK_BUTTON_MIDDLE && w->type == DT_BAUHAUS_SLIDER)
else if(button == GDK_BUTTON_MIDDLE && w->type == DT_BAUHAUS_SLIDER)
_slider_zoom_range(w, 0);
else
_popup_reject();

return TRUE;
}

static void _window_show(GtkWidget *w, gpointer user_data)
{
// make sure combo popup handles button release
gtk_grab_add(GTK_WIDGET(user_data));
// grab keyboard focus so the popup receives key events
gtk_widget_grab_focus(GTK_WIDGET(user_data));
}

static void _widget_leave(GtkEventControllerMotion *controller,
Expand Down Expand Up @@ -976,6 +1026,7 @@ void dt_bauhaus_init()
gtk_window_set_modal(GTK_WINDOW(pop->window), TRUE);
gtk_window_set_type_hint(GTK_WINDOW(pop->window),
GDK_WINDOW_TYPE_HINT_POPUP_MENU);
gtk_widget_add_events(pop->window, GDK_POINTER_MOTION_MASK);

pop->area = gtk_drawing_area_new();
g_object_set(pop->area, "expand", TRUE, NULL);
Expand All @@ -994,13 +1045,14 @@ void dt_bauhaus_init()
g_signal_connect(gtk_widget_get_window(pop->window),
"moved-to-rect", G_CALLBACK(_window_moved_to_rect), NULL);
g_signal_connect(window, "show", G_CALLBACK(_window_show), area);
g_signal_connect(window, "motion-notify-event", G_CALLBACK(_window_motion_notify), NULL);
g_signal_connect(area, "draw", G_CALLBACK(_popup_draw), NULL);
g_signal_connect(area, "leave-notify-event", G_CALLBACK(_popup_leave_notify), NULL);
g_signal_connect(area, "button-press-event", G_CALLBACK(_popup_button_press), NULL);
g_signal_connect(area, "button-release-event", G_CALLBACK (_popup_button_release), NULL);
g_signal_connect(area, "key-press-event", G_CALLBACK(_popup_key_press), NULL);
g_signal_connect(area, "scroll-event", G_CALLBACK(_popup_scroll), NULL);
g_signal_connect(window, "motion-notify-event", G_CALLBACK(_window_motion_handler), NULL);
g_signal_connect(area, "leave-notify-event", G_CALLBACK(_popup_leave_handler), NULL);
g_signal_connect(area, "key-press-event", G_CALLBACK(_popup_key_handler), NULL);
dt_gui_connect_click_all(area, _popup_button_press_cb, _popup_button_release_cb, NULL);
dt_gui_connect_scroll(area, GTK_EVENT_CONTROLLER_SCROLL_BOTH_AXES
| GTK_EVENT_CONTROLLER_SCROLL_DISCRETE,
_popup_scroll_cb, NULL);

dt_action_define(&darktable.control->actions_focus, NULL, N_("sliders"),
NULL, &_action_def_focus_slider);
Expand Down Expand Up @@ -3765,16 +3817,18 @@ static void _slider_set_normalized(dt_bauhaus_widget_t *w, float pos)
}
}

static gboolean _popup_key_press(GtkWidget *widget,
GdkEventKey *event,
gpointer user_data)
static gboolean _popup_key_press(GtkEventControllerKey *controller,
guint keyval,
guint keycode,
GdkModifierType state,
gpointer user_data)
{
dt_bauhaus_t *bh = darktable.bauhaus;
dt_bauhaus_widget_t *w = bh->current;
const gboolean is_combo = w->type == DT_BAUHAUS_COMBOBOX;
int delta = -1;

switch(dt_gdk_event_get_keyval(event))
switch(keyval)
{
case GDK_KEY_BackSpace:
case GDK_KEY_Delete:
Expand Down Expand Up @@ -3840,22 +3894,37 @@ static gboolean _popup_key_press(GtkWidget *widget,
if(is_combo)
_combobox_next_sensitive(w, delta, 0, w->combobox.mute_scrolling);
else
_slider_add_step(GTK_WIDGET(w), delta, dt_gdk_event_get_state(event), FALSE);
_slider_add_step(GTK_WIDGET(w), delta, state, FALSE);
break;
default:
if(!event->string || !g_utf8_validate(event->string, -1, NULL)) return FALSE;
const gunichar c = g_utf8_get_char(event->string);
if(!g_unichar_isprint(c)) return FALSE;
const long int char_width = g_utf8_next_char(event->string) - event->string;
{
GdkEvent *event = gtk_get_current_event();
if(!event) return FALSE;
const gchar *str = ((GdkEventKey *)event)->string;
if(!str || !g_utf8_validate(str, -1, NULL))
{
gdk_event_free(event);
return FALSE;
}
const gunichar c = g_utf8_get_char(str);
if(!g_unichar_isprint(c))
{
gdk_event_free(event);
return FALSE;
}
const long int char_width = g_utf8_next_char(str) - str;
if(bh->keys_cnt + 1 + char_width < DT_BAUHAUS_MAX_TEXT
&& (is_combo || strchr("0123456789.,%%+-*Xx/:^~ ()", event->string[0])))
&& (is_combo || strchr("0123456789.,%%+-*Xx/:^~ ()", str[0])))
{
// only accept valid keys for slider; combo is checked in _popup_draw
strncpy(bh->keys + bh->keys_cnt, event->string, char_width);
strncpy(bh->keys + bh->keys_cnt, str, char_width);
bh->keys_cnt += char_width;

if(!is_combo) _start_cursor(-1);
}
gdk_event_free(event);
break;
}
}
gtk_widget_queue_draw(bh->popup.area);
return TRUE;
Expand All @@ -3870,7 +3939,7 @@ static void _widget_button_press(GtkGestureSingle *gesture,
dt_bauhaus_widget_t *w = DT_BAUHAUS_WIDGET(widget);
dt_bauhaus_t *bh = darktable.bauhaus;
gboolean passthrough_from_histogram =
gtk_event_controller_get_widget(GTK_EVENT_CONTROLLER(gesture)) != widget;
dt_gui_get_widget(gesture) != widget;

if(!passthrough_from_histogram)
{
Expand Down
Loading
Loading