Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
93 commits
Select commit Hold shift + click to select a range
549c2e0
gtk4-prep: IOP module event controllers
Arecsu Jul 27, 2026
dd66e30
gtk4-prep: basecurve event controllers
Arecsu Jul 27, 2026
5172855
gtk4-prep: colorcorrection event controllers
Arecsu Jul 27, 2026
6d7af51
gtk4-prep: rgbcurve event controllers
Arecsu Jul 27, 2026
bebeeda
gtk4-prep: tonecurve and lut3d event controllers
Arecsu Jul 27, 2026
0fef027
gtk4-prep: colorzones and ashift event controllers
Arecsu Jul 27, 2026
fe0bbc1
gtk4-prep: imageop event controllers
Arecsu Jul 27, 2026
556f7b6
gtk4-prep: colorbalance and temperature event controllers
Arecsu Jul 27, 2026
cc95e08
gtk4-prep: resetlabel event controllers
Arecsu Jul 27, 2026
44d0c7a
gtk4-prep: color_picker_proxy event controllers
Arecsu Jul 27, 2026
9c223f9
gtk4-prep: filter widgets event controllers
Arecsu Jul 27, 2026
d1dea23
gtk4-prep: lib module event controllers
Arecsu Jul 27, 2026
8deb1a2
gtk4-prep: toolbar event controllers
Arecsu Jul 27, 2026
5d0da43
gtk4-prep: fix scroll mask regression in colorequal and toneequal
Arecsu Jul 27, 2026
21e749d
gtk4-prep: fix code style issues in event-controller conversions
Arecsu Jul 27, 2026
d8a349e
gtk4-prep: update copyright years for modified files
Arecsu Jul 27, 2026
6cd9db3
gtk4-prep: convert thumbnail event signals to event controllers
Arecsu Jul 27, 2026
fa56b3e
gtk4-prep: convert lib module event signals to event controllers
Arecsu Jul 27, 2026
92a2e32
gtk4-prep: convert colorpicker event signals to event controllers
Arecsu Jul 27, 2026
4d6b944
gtk4-prep: convert darkroom view event signals to event controllers
Arecsu Jul 27, 2026
1f5257e
gtk4-prep: convert preferences event signals to event controllers
Arecsu Jul 27, 2026
fc10b53
gtk4-prep: convert lua preferences event signals to event controllers
Arecsu Jul 27, 2026
2eeb263
gtk4-prep: convert range select event signals to event controllers
Arecsu Jul 27, 2026
0d81c41
gtk4-prep: convert masks event signals to event controllers
Arecsu Jul 27, 2026
2c41075
gtk4-prep: convert bauhaus event signals to event controllers
Arecsu Jul 27, 2026
6a9f197
gtk4-prep: convert timeline event signals to event controllers
Arecsu Jul 27, 2026
62532fe
gtk4-prep: convert culling event signals to event controllers
Arecsu Jul 27, 2026
736d978
gtk4-prep: convert thumbtable event signals to event controllers
Arecsu Jul 27, 2026
f18af4a
gtk4-prep: convert accelerators event signals to event controllers
Arecsu Jul 27, 2026
5ce17a5
gtk4-prep: convert ratings event signals to event controllers
Arecsu Jul 27, 2026
a79d234
gtk4-prep: convert navigation event signals to event controllers
Arecsu Jul 27, 2026
6fdd06a
gtk4-prep: convert log history event signals to event controllers
Arecsu Jul 27, 2026
c0d8c80
gtk4-prep: convert viewswitcher event signals to event controllers
Arecsu Jul 27, 2026
49821d7
gtk4-prep: convert colorlabels event signals to event controllers
Arecsu Jul 27, 2026
3b06de0
gtk4-prep: convert colors filter enter-notify event to event controller
Arecsu Jul 27, 2026
348b12d
gtk4-prep: convert location result button-press event to event contro…
Arecsu Jul 27, 2026
741e9c6
gtk4-prep: convert blend gui event signals to event controllers
Arecsu Jul 27, 2026
6dd2dc1
gtk4-prep: convert export spinbutton button-press events to event con…
Arecsu Jul 27, 2026
cd691f4
gtk4-prep: convert neural restore event signals to event controllers
Arecsu Jul 27, 2026
70e2a44
gtk4-prep: convert preferences_ai event signals to event controllers
Arecsu Jul 27, 2026
b81fe8b
gtk4-prep: convert lighttable profile button button-press event to ev…
Arecsu Jul 27, 2026
b3e6e7b
gtk4-prep: convert import metadata button-press events to event contr…
Arecsu Jul 27, 2026
ef86d5a
gtk4-prep: convert filtering event signals to event controllers
Arecsu Jul 27, 2026
c003f69
gtk4-prep: convert lighttable layout button-release events to event c…
Arecsu Jul 27, 2026
163f84d
gtk4-prep: convert import event signals to event controllers
Arecsu Jul 27, 2026
25aef77
gtk4-prep: convert metadata event signals to event controllers
Arecsu Jul 27, 2026
46bbd14
gtk4-prep: convert collect event signals to event controllers
Arecsu Jul 27, 2026
7bdabc7
gtk4-prep: replace scroll-event signals with event controllers in cul…
Arecsu Jul 27, 2026
7218917
gtk4-prep: replace motion-notify and key-press signals with event con…
Arecsu Jul 27, 2026
6357622
gtk4-prep: replace event signals with event controllers in tagging mo…
Arecsu Jul 27, 2026
cf0e666
gtk4-prep: replace scroll-event with event controller in colorequal
Arecsu Jul 27, 2026
5a0439f
gtk4-prep: replace scroll-event and togglebutton callback in tonequal
Arecsu Jul 27, 2026
925bf15
gtk4-prep: migrate dt_iop_togglebutton_new from button-press-event to…
Arecsu Jul 27, 2026
93332c0
gtk4-prep: migrate togglebutton callbacks to gesture controller in bl…
Arecsu Jul 27, 2026
0cf74a3
gtk4-prep: replace event signals with event controllers in remaining …
Arecsu Jul 27, 2026
e2043f5
gtk4-prep: fix toggle button recursion by claiming gesture sequence
Arecsu Jul 27, 2026
6eae28f
gtk4-prep: guard double-click to lighttable in darkroom and liquify
Arecsu Jul 27, 2026
b62ce86
gtk4-prep: add GtkGestureMultiPress double-click bridge for GTK3
Arecsu Jul 27, 2026
698bc57
gtk4-prep: convert culling and thumbtable event signals to event cont…
Arecsu Jul 27, 2026
fb6a985
gtk4-prep: convert blend GUI event signals to event controllers
Arecsu Jul 27, 2026
4723f79
gtk4-prep: fix event memory leak in bauhaus popup button press
Arecsu Jul 27, 2026
bc1c4c0
gtk4-prep: convert toneequal event signals to event controllers
Arecsu Jul 27, 2026
89949cd
gtk4-prep: convert lib body enter callback to event controller
Arecsu Jul 27, 2026
8e164e6
gtk4-prep: fix build errors in map, location, and lut3d after event c…
Arecsu Jul 27, 2026
267b9fb
gtk4-prep: revert map view to signal-based event handling (OsmGpsMap …
Arecsu Jul 27, 2026
213285c
Revert "gtk4-prep: revert map view to signal-based event handling (Os…
Arecsu Jul 27, 2026
ad9f4bc
gtk4-prep: use CAPTURE phase for map view gesture controllers (OsmGps…
Arecsu Jul 27, 2026
099c963
gtk4-prep: fix event controller bugs in bauhaus popup
Arecsu Jul 27, 2026
e3a76db
gtk4-prep: fix get_button vs get_current_button in range widget
Arecsu Jul 27, 2026
e6b8965
gtk4-prep: fix memory leak in colorequal scroll callback
Arecsu Jul 27, 2026
e518e7c
gtk4-prep: restore GDK_BUTTON_PRIMARY guards in blend GUI
Arecsu Jul 27, 2026
a55cf3e
gtk4-prep: restore smooth-scroll accumulation in preset scroller
Arecsu Jul 27, 2026
1574bd8
gtk4-prep: fix get_button vs get_current_button in lib modules
Arecsu Jul 27, 2026
93dbfc2
gtk4-prep: add dt_gui_get_widget() macro and apply across all files
Arecsu Jul 27, 2026
a8292b2
gtk4-prep: clean up histogram scroll callback TODO
Arecsu Jul 27, 2026
454603e
gtk4-prep: update histogram scroll callback GTK4 note
Arecsu Jul 27, 2026
a4964be
gtk4-prep: add dt_gui_get_scroll_unit_delta(s)_fallback helpers
Arecsu Jul 27, 2026
7087e10
gtk4-prep: restore explicit event masks on NO_WINDOW drawing areas
Arecsu Jul 27, 2026
d8af80a
gtk4-prep: use signal handlers for bauhaus popup (GTK_WINDOW_POPUP qu…
Arecsu Jul 27, 2026
d98407a
gtk4-prep: use clicked signal for filter preferences button
Arecsu Jul 27, 2026
0ad9cf8
gtk4-prep: restore button-inside-header guard in IOP module headers
Arecsu Jul 27, 2026
c1d3dc5
gtk4-prep: fix lib module header and button event handling
Arecsu Jul 27, 2026
5ede854
gtk4-prep: update copyright year for timeline.c
Arecsu Jul 27, 2026
bf3b8b4
gtk4-prep: fix stale static gboolean in preferences_ai click callback
Arecsu Jul 27, 2026
228f927
gtk4-prep: fix ASSERT_FUNC_TYPE macro for NULL callbacks
Arecsu Jul 27, 2026
49e0141
gtk4-prep: simplify filtering rule removal logic
Arecsu Jul 27, 2026
3065cae
gtk4-prep: convert missed retouch togglebutton callbacks to gestures
Arecsu Jul 31, 2026
3368e0c
gtk4-prep: fix gesture button detection and long-press timing on pres…
Arecsu Jul 31, 2026
a7433e5
gtk4-prep: prevent stacking multiple shortcuts dialogs
Arecsu Jul 31, 2026
bae1b19
gtk4-prep: convert gesture coordinates to bin-window space in treeviews
Arecsu Jul 31, 2026
cf54806
gtk4-prep: make key event controllers work on GTK3
Arecsu Jul 31, 2026
b5955c5
gtk4-prep: allow deleting shortcuts with the backspace key
Arecsu Jul 31, 2026
d7d545d
gtk4-prep: fix click handling on the shortcuts actions treeview
Arecsu Jul 31, 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 @@ -3762,16 +3814,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 @@ -3837,22 +3891,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 @@ -3867,7 +3936,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