Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
39 changes: 20 additions & 19 deletions src/bauhaus/bauhaus.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
You should have received a copy of the GNU General Public License
along with darktable. If not, see <http://www.gnu.org/licenses/>.
*/
#include "common/gdk_event_utils.h"

#include "bauhaus/bauhaus.h"
#include "common/calculator.h"
Expand Down Expand Up @@ -583,10 +584,10 @@ 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 = event->x_root - allocation.x;
const gint ey = event->y_root - 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 int tol = DT_PIXEL_APPLY_DPI(event->state & GDK_BUTTON1_MASK ? 400 : 50);
const int tol = DT_PIXEL_APPLY_DPI(dt_gdk_event_get_state(event) & GDK_BUTTON1_MASK ? 400 : 50);
if(ex < - tol || ex > allocation.width + tol
|| ey + pop->offcut < - tol
|| ey + pop->offcut > pop->position.height + tol)
Expand Down Expand Up @@ -629,7 +630,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(event->state & GDK_BUTTON1_MASK
if(dt_gdk_event_get_state(event) & GDK_BUTTON1_MASK
|| (bh->mouse_line_distance
&& ((bh->mouse_line_distance * mouse_off <= 0) ^
(fabsf(bh->mouse_line_distance - mouse_off) > .5f))))
Expand All @@ -644,7 +645,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 && event->state & GDK_BUTTON1_MASK)
if(_combobox_entry(d, active)->sensitive && dt_gdk_event_get_state(event) & GDK_BUTTON1_MASK)
{
if(active != d->active)
_combobox_set(w, active, w->combobox.mute_scrolling);
Expand All @@ -668,7 +669,7 @@ static gboolean _popup_button_release(GtkWidget *widget,
GdkEventButton *event,
gpointer user_data)
{
if(darktable.bauhaus->change_active && event->button != GDK_BUTTON_MIDDLE)
if(darktable.bauhaus->change_active && dt_gdk_event_get_button(event) != GDK_BUTTON_MIDDLE)
_popup_hide();

return TRUE;
Expand All @@ -678,7 +679,7 @@ static gboolean _popup_button_press(GtkWidget *widget,
GdkEventButton *event,
gpointer user_data)
{
if(event->window != gtk_widget_get_window(widget))
if(dt_gdk_event_get_window(event) != gtk_widget_get_window(widget))
{
_popup_reject();
return TRUE;
Expand All @@ -687,17 +688,17 @@ static gboolean _popup_button_press(GtkWidget *widget,
dt_bauhaus_t *bh = darktable.bauhaus;
dt_bauhaus_widget_t *w = bh->current;

if(event->button == GDK_BUTTON_PRIMARY)
if(dt_gdk_event_get_button(event) == 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(event->time, bh->opentime))
&& !dt_gui_long_click(dt_gdk_event_get_time(event), bh->opentime))
{
// counts as double click, reset:
if(!(dt_modifier_is(event->state, GDK_CONTROL_MASK) && w->field
if(!(dt_modifier_is(dt_gdk_event_get_state(event), 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));
Expand All @@ -707,7 +708,7 @@ static gboolean _popup_button_press(GtkWidget *widget,
event->state |= GDK_BUTTON1_MASK;
_window_motion_notify(widget, (GdkEventMotion*)event, user_data);
}
else if(event->button == GDK_BUTTON_MIDDLE && w->type == DT_BAUHAUS_SLIDER)
else if(dt_gdk_event_get_button(event) == GDK_BUTTON_MIDDLE && w->type == DT_BAUHAUS_SLIDER)
_slider_zoom_range(w, 0);
else
_popup_reject();
Expand Down Expand Up @@ -3096,14 +3097,14 @@ static void _widget_scroll(GtkEventControllerScroll *controller,
if(w->type == DT_BAUHAUS_SLIDER)
{
const gboolean force = darktable.control->element == DT_ACTION_ELEMENT_FORCE
&& event->scroll.window == gtk_widget_get_window(widget);
if(force && dt_modifier_is(event->scroll.state, GDK_SHIFT_MASK | GDK_CONTROL_MASK))
&& dt_gdk_event_get_window(event) == gtk_widget_get_window(widget);
if(force && dt_modifier_is(dt_gdk_event_get_state(event), GDK_SHIFT_MASK | GDK_CONTROL_MASK))
{
_slider_zoom_range(w, delta);
_slider_zoom_toast(w);
}
else
_slider_add_step(widget, - delta, event->scroll.state, force);
_slider_add_step(widget, - delta, dt_gdk_event_get_state(event), force);
}
else
_combobox_next_sensitive(w, delta, 0, FALSE);
Expand All @@ -3117,7 +3118,7 @@ static gboolean _widget_key_press(GtkWidget *widget, GdkEventKey *event)
dt_bauhaus_widget_t *w = (dt_bauhaus_widget_t *)widget;

int delta = -1;
switch(event->keyval)
switch(dt_gdk_event_get_keyval(event))
{
case GDK_KEY_Right:
case GDK_KEY_KP_Right:
Expand All @@ -3133,7 +3134,7 @@ static gboolean _widget_key_press(GtkWidget *widget, GdkEventKey *event)
_request_focus(w);

if(w->type == DT_BAUHAUS_SLIDER)
_slider_add_step(widget, delta, event->state, FALSE);
_slider_add_step(widget, delta, dt_gdk_event_get_state(event), FALSE);
else
_combobox_next_sensitive(w, delta, 0, FALSE);

Expand Down Expand Up @@ -3447,7 +3448,7 @@ static gboolean _popup_key_press(GtkWidget *widget,
const gboolean is_combo = w->type == DT_BAUHAUS_COMBOBOX;
int delta = -1;

switch(event->keyval)
switch(dt_gdk_event_get_keyval(event))
{
case GDK_KEY_BackSpace:
case GDK_KEY_Delete:
Expand Down Expand Up @@ -3513,7 +3514,7 @@ 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, event->state, FALSE);
_slider_add_step(GTK_WIDGET(w), delta, dt_gdk_event_get_state(event), FALSE);
break;
default:
if(!event->string || !g_utf8_validate(event->string, -1, NULL)) return FALSE;
Expand Down Expand Up @@ -3660,7 +3661,7 @@ static void _widget_motion(GtkEventControllerMotion *controller,
const float steps = floorf((x - bh->mouse_x) / scaled_step);
GdkEvent *const event = gtk_get_current_event(); // TODO cleanup
_slider_add_step(widget, copysignf(1, d->factor) * steps,
event->motion.state, FALSE);
dt_gdk_event_get_state(event), FALSE);
gdk_event_free(event);

bh->mouse_x += steps * scaled_step;
Expand Down
7 changes: 4 additions & 3 deletions src/chart/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
You should have received a copy of the GNU General Public License
along with darktable. If not, see <http://www.gnu.org/licenses/>.
*/
#include "common/gdk_event_utils.h"

#include "chart/dtcairo.h"
#include "chart/colorchart.h"
Expand Down Expand Up @@ -195,7 +196,7 @@ static gboolean motion_notify_callback_reference(GtkWidget *widget, GdkEventMoti

static gboolean handle_motion(GtkWidget *widget, GdkEventMotion *event, dt_lut_t *self, image_t *image)
{
if(!(event->state & GDK_BUTTON1_MASK) || !image->image) return FALSE;
if(!(dt_gdk_event_get_state(event) & GDK_BUTTON1_MASK) || !image->image) return FALSE;

// mouse -> 0..1
float x, y;
Expand Down Expand Up @@ -259,8 +260,8 @@ static void map_mouse_to_0_1(GtkWidget *widget, GdkEventMotion *event, image_t *
guint width = gtk_widget_get_allocated_width(widget);
guint height = gtk_widget_get_allocated_height(widget);

*x = (event->x - image->offset_x) / (width - 2.0 * image->offset_x);
*y = (event->y - image->offset_y) / (height - 2.0 * image->offset_y);
*x = (dt_gdk_event_get_x(event) - image->offset_x) / (width - 2.0 * image->offset_x);
*y = (dt_gdk_event_get_y(event) - image->offset_y) / (height - 2.0 * image->offset_y);
}

static void update_corner(image_t *image, int which, float *x, float *y)
Expand Down
172 changes: 172 additions & 0 deletions src/common/gdk_event_utils.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
/*
This file is part of darktable,
Copyright (C) 2025 darktable developers.

darktable is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

darktable is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with darktable. If not, see <http://www.gnu.org/licenses/>.
*/

#pragma once

#include <gtk/gtk.h>

G_BEGIN_DECLS

/* Inline wrappers around gdk_event_get_*() accessor functions.
*
* These provide direct-return access to GdkEvent fields without direct struct
* member access. They accept const void* so any typed event pointer
* (GdkEventButton*, GdkEventKey*, etc.) can be passed without a cast.
*
* This is preparation for the GTK4 migration where GdkEvent is no longer
* a publicly accessible struct.
*/

static inline GdkEventType dt_gdk_event_get_type(const void *e)
{
return gdk_event_get_event_type((const GdkEvent *)e);
}

static inline guint32 dt_gdk_event_get_time(const void *e)
{
return gdk_event_get_time((const GdkEvent *)e);
}

static inline guint dt_gdk_event_get_button(const void *e)
{
guint b = 0;
gdk_event_get_button((const GdkEvent *)e, &b);
return b;
}

static inline guint dt_gdk_event_get_click_count(const void *e)
{
guint c = 0;
gdk_event_get_click_count((const GdkEvent *)e, &c);
return c;
}

static inline GdkModifierType dt_gdk_event_get_state(const void *e)
{
GdkModifierType s = 0;
gdk_event_get_state((const GdkEvent *)e, &s);
return s;
}

static inline gdouble dt_gdk_event_get_x(const void *e)
{
gdouble x = 0, y = 0;
gdk_event_get_coords((const GdkEvent *)e, &x, &y);
(void)y;
return x;
}

static inline gdouble dt_gdk_event_get_y(const void *e)
{
gdouble x = 0, y = 0;
gdk_event_get_coords((const GdkEvent *)e, &x, &y);
(void)x;
return y;
}

static inline gdouble dt_gdk_event_get_root_x(const void *e)
{
gdouble x = 0, y = 0;
gdk_event_get_root_coords((const GdkEvent *)e, &x, &y);
(void)y;
return x;
}

static inline gdouble dt_gdk_event_get_root_y(const void *e)
{
gdouble x = 0, y = 0;
gdk_event_get_root_coords((const GdkEvent *)e, &x, &y);
(void)x;
return y;
}

static inline guint dt_gdk_event_get_keyval(const void *e)
{
guint k = 0;
gdk_event_get_keyval((const GdkEvent *)e, &k);
return k;
}

static inline guint16 dt_gdk_event_get_keycode(const void *e)
{
guint16 k = 0;
gdk_event_get_keycode((const GdkEvent *)e, &k);
return k;
}

static inline GdkScrollDirection dt_gdk_event_get_scroll_direction(const void *e)
{
GdkScrollDirection d = GDK_SCROLL_UP;
gdk_event_get_scroll_direction((const GdkEvent *)e, &d);
return d;
}

static inline gdouble dt_gdk_event_get_scroll_delta_x(const void *e)
{
gdouble dx = 0, dy = 0;
gdk_event_get_scroll_deltas((const GdkEvent *)e, &dx, &dy);
(void)dy;
return dx;
}

static inline gdouble dt_gdk_event_get_scroll_delta_y(const void *e)
{
gdouble dx = 0, dy = 0;
gdk_event_get_scroll_deltas((const GdkEvent *)e, &dx, &dy);
(void)dx;
return dy;
}

static inline GdkWindow *dt_gdk_event_get_window(const void *e)
{
return gdk_event_get_window((const GdkEvent *)e);
}

static inline GdkDevice *dt_gdk_event_get_device(const void *e)
{
return gdk_event_get_device((const GdkEvent *)e);
}

static inline GdkDevice *dt_gdk_event_get_source_device(const void *e)
{
return gdk_event_get_source_device((const GdkEvent *)e);
}

static inline GdkScreen *dt_gdk_event_get_screen(const void *e)
{
return gdk_event_get_screen((const GdkEvent *)e);
}

static inline GdkSeat *dt_gdk_event_get_seat(const void *e)
{
return gdk_event_get_seat((const GdkEvent *)e);
}

static inline gboolean dt_gdk_event_get_pointer_emulated(void *e)
{
return gdk_event_get_pointer_emulated((GdkEvent *)e);
}

static inline gboolean dt_gdk_event_get_axis(const void *e,
GdkAxisUse axis_use,
gdouble *value)
{
return gdk_event_get_axis((const GdkEvent *)e, axis_use, value);
}

G_END_DECLS
Loading
Loading