103#include <gdk/gdkkeysyms.h>
104#ifdef GDK_WINDOWING_WAYLAND
105#include <gdk/gdkwayland.h>
108#include <gdk/gdkwin32.h>
117#ifdef MAC_INTEGRATION
118#include <gtkosxapplication.h>
120#ifdef GDK_WINDOWING_QUARTZ
135 "widget colour-label indices drifted from dt_colorlabels_enum");
226#ifdef GDK_WINDOWING_WAYLAND
298#ifdef MAC_INTEGRATION
299#ifdef GTK_TYPE_OSX_APPLICATION
316#ifdef GTK_TYPE_OSX_APPLICATION
331 if(
oldw != event->width ||
oldh != event->height)
354 oldh =
event->height;
356#ifndef GDK_WINDOWING_QUARTZ
367 if(oldx != event->configure.x || oldy != event->configure.y)
371 oldx =
event->configure.x;
372 oldy =
event->configure.y;
452 GdkModifierType modifiers = 0;
458 double *pressure, gboolean *have_pressure,
459 double *tilt_x,
double *tilt_y, gboolean *have_tilt,
462 if(pressure) *pressure = 0.0;
463 if(have_pressure) *have_pressure =
FALSE;
464 if(tilt_x) *tilt_x = 0.0;
465 if(tilt_y) *tilt_y = 0.0;
466 if(have_tilt) *have_tilt =
FALSE;
510 GdkModifierType modifiers = 0;
560 if(pressure) *pressure =
best_p;
609 double pressure = 0.0;
744 const double speed_px_s =
hypot(dx, dy) /
dt_s;
763 "[tablet] %s dev='%s' src_dev='%s' evt_dev='%s' src=%d tablet=%d tool=%d supports[p=%d xt=%d yt=%d] read[p=%d xt=%d yt=%d] map_src[p=%d xt=%d yt=%d] state[p_src=%d p_evt=%d xt_src=%d yt_src=%d] fallback[p=%d t=%d dev='%s'] values[p=%.4f tx=%.4f ty=%.4f t=%.4f a=%.4f] xy=(%.1f, %.1f) t_ms=%u reset=%d\n",
808 event->time,
TRUE,
"button-press");
819 event->time,
FALSE,
"button-release");
831 event->time,
FALSE,
"motion");
840#define DT_WIN32_CURSOR_SUBCLASS_CENTER ((UINT_PTR)0x41534e4e)
895 = {
"GDK_SOURCE_MOUSE",
"GDK_SOURCE_PEN",
"GDK_SOURCE_ERASER",
"GDK_SOURCE_CURSOR",
896 "GDK_SOURCE_KEYBOARD",
"GDK_SOURCE_TOUCHSCREEN",
"GDK_SOURCE_TOUCHPAD",
"GDK_SOURCE_TRACKPOINT",
897 "GDK_SOURCE_TABLET_PAD" };
904 static const gchar *
MODE_NAMES[] = {
"GDK_MODE_DISABLED",
"GDK_MODE_SCREEN",
"GDK_MODE_WINDOW" };
912 = {
"GDK_AXIS_IGNORE",
"GDK_AXIS_X",
"GDK_AXIS_Y",
"GDK_AXIS_PRESSURE",
913 "GDK_AXIS_XTILT",
"GDK_AXIS_YTILT",
"GDK_AXIS_WHEEL",
"GDK_AXIS_DISTANCE",
914 "GDK_AXIS_ROTATION",
"GDK_AXIS_SLIDER",
"GDK_AXIS_LAST" };
921#define DT_ACCEL_SEARCH_RECENT_KEY "plugins/accel_search/recent_entries"
1052 g_setenv(
"GTK_OVERLAY_SCROLLING",
"0", 0);
1055 g_setenv(
"LIBOVERLAY_SCROLLBAR",
"0", 0);
1069#ifdef MAC_INTEGRATION
1070#ifdef GTK_TYPE_OSX_APPLICATION
1108 GtkAccelFlags
flags = 0;
1163 GList *input_devices
1172 dt_print(
DT_DEBUG_INPUT,
"[input device] manager fallback devices: slave=%d floating=%d merged_total=%d\n",
1213 input_devices =
NULL;
1260 GtkAllocation allocation;
1275#ifdef MAC_INTEGRATION
1276#ifdef GTK_TYPE_OSX_APPLICATION
1282#ifdef GDK_WINDOWING_QUARTZ
1313 "the configuration file\n",
1318#ifdef GDK_WINDOWING_QUARTZ
1472#ifdef GDK_WINDOWING_WAYLAND
1524#ifdef GDK_WINDOWING_WAYLAND
1674#ifdef MAC_INTEGRATION
1675#ifdef GTK_TYPE_OSX_APPLICATION
1908 c[
i] =
init[
i].default_col;
void dt_accels_set_top_offset_handler(dt_accels_top_offset_handler_t handler)
gboolean dt_accels_dispatch(GtkWidget *w, GdkEvent *event, gpointer user_data)
Force our listener for all key strokes to bypass reserved Gtk keys.
dt_accels_t * dt_accels_init(char *config_file, GtkAccelFlags flags)
void dt_accels_set_refocus_handler(dt_accels_refocus_handler_t handler)
void dt_accels_set_recent_handlers(dt_accels_recent_get_handler_t get, dt_accels_recent_set_handler_t set)
void dt_accels_set_global(dt_accels_t *accels)
static void dt_accels_disable(dt_accels_t *accels, gboolean state)
static const char * _get_source_name(int pos)
static gboolean _widget_stored_int(const char *key, int *value)
static double _clamp01d(const double value)
static void _accels_recent_set(int index, const char *value)
static gboolean _sample_tablet_state_from_devices(const GdkEvent *event, double *pressure, gboolean *have_pressure, double *tilt_x, double *tilt_y, gboolean *have_tilt, const char **picked_device_name)
static void _ui_widget_redraw_callback(gpointer instance, GtkWidget *widget)
static gint _accels_top_offset(void)
GtkWidget * dt_gui_main_window(void)
static gboolean _button_released(GtkWidget *w, GdkEventButton *event, gpointer user_data)
static dt_control_pointer_input_t _extract_pointer_input(const GdkEvent *event, const double x, const double y, const guint32 time_ms, const gboolean reset_kinematics, const char *tag)
void dt_ui_container_foreach(dt_ui_t *ui, const dt_ui_container_t c, GtkCallback callback)
calls a callback on all children widgets from container
gboolean dt_gui_quit_callback(GtkWidget *widget, GdkEvent *event, gpointer user_data)
static gboolean _center_leave(GtkWidget *widget, GdkEventCrossing *event, gpointer user_data)
static const gdouble * _event_axes(const GdkEvent *event)
static gint _widget_natural_width(GtkWidget *widget)
static const char * _get_mode_name(int pos)
static void _center_unrealize(GtkWidget *widget, gpointer user_data)
static void _widget_store_bool(const char *key, gboolean value)
static void _widget_message(const char *message)
static gboolean _key_pressed(GtkWidget *w, GdkEventKey *event)
static gboolean _center_enter(GtkWidget *widget, GdkEventCrossing *event, gpointer user_data)
struct dt_accels_t * dt_gui_get_accels(void)
static gboolean _ui_toast_button_press_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
static gboolean _button_pressed(GtkWidget *w, GdkEventButton *event, gpointer user_data)
static dt_tablet_motion_state_t _tablet_motion_state
static gchar * _accels_recent_get(int index)
static gboolean _draw(GtkWidget *da, cairo_t *cr, gpointer user_data)
static gboolean _ui_log_button_press_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
static void _notify_profile_changed(void)
void dt_ui_container_destroy_children(dt_ui_t *ui, const dt_ui_container_t c)
destroy all child widgets from container
struct dt_ui_t * dt_gui_get_ui(void)
static gboolean _widget_stored_bool(const char *key)
static LRESULT CALLBACK _center_win32_cursor_proc(HWND hwnd, UINT message, WPARAM w_param, LPARAM l_param, UINT_PTR subclass_id, DWORD_PTR ref_data)
void dt_gui_load_theme(const char *theme)
static void _widget_cursor(GdkCursorType cursor)
int dt_gui_gtk_write_config()
void dt_gui_store_last_preset(const char *name)
void dt_configure_ppd_dpi(dt_gui_gtk_t *gui)
GtkWidget * dt_gui_center_widget(void)
static gboolean _get_axis_value_for_source(const GdkEvent *event, GdkDevice *source_device, const GdkAxisUse axis, double *value, gboolean *from_source_map)
static const char * _get_axis_name(int pos)
static void _init_widgets(dt_gui_gtk_t *gui)
static void _update_display_profile(void)
static gboolean _mouse_moved(GtkWidget *w, GdkEventMotion *event, gpointer user_data)
#define DT_ACCEL_SEARCH_RECENT_KEY
void dt_gui_add_help_link(GtkWidget *widget, char *link)
#define DT_WIN32_CURSOR_SUBCLASS_CENTER
void dt_ui_notify_user()
draw user's attention
static void _notebook_page_changed(gpointer owner)
static gboolean _focus_in_out_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
static void _ui_log_redraw_callback(gpointer instance, GtkWidget *widget)
int dt_gui_gtk_init(dt_gui_gtk_t *gui)
static void _widget_store_int(const char *key, int value)
void dt_gui_refocus_center()
static void _gui_refresh_thumbnail(int32_t imgid, gboolean refresh_filmstrip)
static void _refresh_all_container_spacing(void)
static gint _last_box_spacing
void dt_gui_set_pango_resolution(PangoLayout *layout)
static gboolean _configure(GtkWidget *da, GdkEventConfigure *event, gpointer user_data)
static gboolean _scrolled(GtkWidget *widget, GdkEventScroll *event, gpointer user_data)
static void _ui_toast_redraw_callback(gpointer instance, GtkWidget *widget)
void dt_gui_gtk_run(dt_gui_gtk_t *gui)
static GtkWidget * _widget_root_window(void)
static void _refresh_container_spacing(GtkWidget *w, gpointer user_data)
static gboolean _window_configure(GtkWidget *da, GdkEvent *event, gpointer user_data)
static void _center_realize(GtkWidget *widget, gpointer user_data)
static void _gui_startup_progress(const char *message)
void dt_ui_container_focus_widget(dt_ui_t *ui, const dt_ui_container_t c, GtkWidget *w)
gives a widget focus in the container
static gboolean _sample_axis_from_device_state(GdkWindow *window, GdkDevice *device, const GdkAxisUse axis, double *value)
void dt_gui_update_em(void)
static void error(char *msg)
void init(dt_imageio_module_format_t *self)
uint32_t container(dt_lib_module_t *self)
void dt_collection_gui_register_handlers(void)
void dt_colorspaces_set_profile_changed_handler(dt_colorspaces_profile_changed_handler_t handler)
Register the one callback fired when the display profile changes.
void dt_colorspaces_set_display_profile(const dt_colorspaces_color_profile_type_t profile_type, GtkWidget *widget)
Refresh the cached display profile from the monitor showing widget (X atom, colord,...
The colour-profile module's API: which profiles exist, and how to apply one.
struct _GtkWidget GtkWidget
GtkWidget, opaque, spelled exactly as GTK spells it.
void dt_conf_set_bool(const char *name, int val)
int dt_conf_get_bool(const char *name)
int dt_conf_key_exists(const char *key)
float dt_conf_get_float(const char *name)
gchar * dt_conf_get_string(const char *name)
void dt_conf_set_int(const char *name, int val)
int dt_conf_get_int(const char *name)
void dt_conf_set_string(const char *name, const char *val)
const char * dt_conf_get_string_const(const char *name)
void dt_gui_container_destroy_children(GtkContainer *container)
void dt_control_key_pressed(GdkEventKey *event)
void dt_control_button_pressed(double x, double y, double pressure, int which, int type, uint32_t state)
void * dt_control_expose(void *voidptr)
void dt_toast_log(const char *msg,...)
void dt_control_mouse_leave()
gboolean dt_control_configure(GtkWidget *da, GdkEventConfigure *event, gpointer user_data)
void dt_control_button_released(double x, double y, int which, uint32_t state)
void dt_control_set_pointer_input(const dt_control_pointer_input_t *input)
void dt_control_mouse_moved(double x, double y, double pressure, int which)
void dt_control_mouse_enter()
#define dt_control_change_cursor(cursor)
struct dt_control_t * dt_control_get_global(void)
int dt_load_from_string(const gchar *input, gboolean open_image_in_dr, gboolean *single_image)
struct dt_gui_gtk_t * dt_gui_get_global(void)
static int dt_pthread_mutex_unlock(dt_pthread_mutex_t *mutex) RELEASE(mutex) NO_THREAD_SAFETY_ANALYSIS
static int dt_pthread_mutex_init(dt_pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)
static int dt_pthread_mutex_lock(dt_pthread_mutex_t *mutex) ACQUIRE(mutex) NO_THREAD_SAFETY_ANALYSIS
void dt_loc_get_sharedir(char *sharedir, size_t bufsize)
void dt_loc_get_datadir(char *datadir, size_t bufsize)
void dt_loc_get_user_config_dir(char *configdir, size_t bufsize)
void dt_film_gui_register_handlers(void)
void dt_folder_survey_gui_register_handlers()
void dt_gui_presets_init()
void dt_guides_set_overlay_colors()
void dt_history_merge_gui_register_handlers(void)
const char * dt_l10n_get_current_lang(dt_l10n_t *l10n)
struct dt_l10n_t * dt_l10n_get_global(void)
int32_t dt_get_debug_flags(void)
void dt_print(dt_debug_thread_t thread, const char *msg,...) __attribute__((format(printf
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
dt_mipmap_buffer_dsc_flags flags
void dt_osx_focus_window()
void dt_osx_autoset_dpi(GtkWidget *widget)
void dt_concat_path_file(char destination[4096], const char path[4096], const char *const file)
Append a constant filename to a variable, stack-based, fixed-sized, directory, and add a / in-between...
@ DT_COLORSPACE_DISPLAY
The monitor profile – the one list entry that mutates after init.
void dt_screen_set_dpi(double dpi)
static cairo_surface_t * dt_cairo_image_surface_create(cairo_format_t format, int width, int height)
#define DT_DEBUG_CONTROL_SIGNAL_RAISE(ctlsig, signal,...)
struct dt_control_signal_t * dt_control_signal_get_global(void)
@ DT_SIGNAL_CONTROL_REDRAW_ALL
This signal is raised when dt_control_queue_redraw() is called. no param, no returned value.
@ DT_SIGNAL_CONTROL_TOAST_REDRAW
This signal is raised when dt_control_toast_redraw() is called. no param, no returned value.
@ DT_SIGNAL_CONTROL_NOTEBOOK_TAB_CHANGED
This signal is raised when a GtkNotebook created/registered via dt_ui_notebook_set_picker_owner() swi...
@ DT_SIGNAL_CONTROL_PROFILE_CHANGED
This signal is raised when the screen profile has changed no param, no returned value.
@ DT_SIGNAL_CONTROL_LOG_REDRAW
This signal is raised when dt_control_log_redraw() is called. no param, no returned value.
#define DT_DEBUG_CONTROL_SIGNAL_CONNECT(ctlsig, signal, cb, user_data)
static const dt_aligned_pixel_simd_t value
void dt_gui_splash_init(void)
void dt_gui_splash_updatef(const char *format,...)
void dt_gui_splash_set_transient_for(GtkWidget *parent)
void dt_startup_progress_set_handler(dt_startup_progress_handler_t handler)
struct dt_gui_gtk_t * gui
struct dt_view_manager_t * view_manager
dt_pthread_mutex_t log_mutex
dt_pthread_mutex_t toast_mutex
struct dt_gui_gtk_t::@33 export_popup
cairo_surface_t * surface
GtkMenu * presets_popup_menu
cairo_filter_t filter_image
struct dt_gui_gtk_t::@34 styles_popup
dt_thumbtable_t * thumbtable_lighttable
GtkWidget * containers[DT_UI_CONTAINER_SIZE]
dt_thumbtable_t * thumbtable_filmstrip
GtkWidget * panels[DT_UI_PANEL_SIZE]
typedef double((*spd)(unsigned long int wavelength, double TempK))
void dt_thumbnail_notify_set_handler(dt_thumbnail_refresh_handler_t handler)
A widget to manage and display image thumbnails in Ansel's lighttable and filmstrip views.
#define dt_thumbtable_refresh_thumbnail(table, imgid, reinit)
gchar * dt_util_str_replace(const gchar *string, const gchar *pattern, const gchar *substitute)
void dt_view_manager_configure(dt_view_manager_t *vm, int width, int height)
int dt_view_manager_scrolled(dt_view_manager_t *vm, double x, double y, int up, int state, int delta_y)
const dt_view_t * dt_view_manager_get_current_view(dt_view_manager_t *vm)
GtkWidget * dt_ui_toast_msg(dt_ui_t *ui)
GtkWidget * dt_ui_center(dt_ui_t *ui)
void dt_ui_cleanup_titlebar(dt_ui_t *ui)
void dt_ui_init_titlebar(dt_ui_t *ui)
int dt_ui_panel_get_size(dt_ui_t *ui, const dt_ui_panel_t p)
gboolean dt_ui_panel_ancestor(dt_ui_t *ui, const dt_ui_panel_t p, GtkWidget *w)
GtkWidget * dt_ui_log_msg(dt_ui_t *ui)
GtkWidget * dt_ui_main_window(dt_ui_t *ui)
void dt_ui_init_main_table(GtkWidget *parent, dt_ui_t *ui)
GtkWidget * dt_ui_center_base(dt_ui_t *ui)