Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
menu.h
Go to the documentation of this file.
1#include <gtk/gtk.h>
2#include <glib.h>
3
4#ifdef GDK_WINDOWING_QUARTZ
5#include "osx/osx.h"
6#endif
7
8#pragma once
9
23
31
32
33typedef struct dt_menu_entry_t
34{
35 GtkWidget *widget; // Bounding box for the whole menu item
36 gboolean has_checkbox; // Show or hide the checkbox, aka "is the current action setting a boolean ?"
37 gboolean (*action_callback)(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data); // Callback to run when the menu item is clicked, aka the action
38 gboolean (*sensitive_callback)(GtkWidget *widget); // Callback checking some conditions to decide whether the menu item should be made insensitive in current context
39 gboolean (*checked_callback)(GtkWidget *widget); // Callback checking some conditions to determine if the boolean pref set by the item is currently TRUE or FALSE
40 gboolean (*active_callback)(GtkWidget *widget); // Callback checking some conditions to determine if the menu item is the current view
41 dt_menus_t menu; // Index of first-level menu
43 GtkAccelGroup *accel_group;
45
46
59dt_menu_entry_t *set_menu_entry(GtkWidget **menus, GList **items_list, const gchar *label, dt_menus_t menu_index,
60 GtkMenu *parent, void *data,
61 gboolean (*action_callback)(GtkAccelGroup *group, GObject *acceleratable,
62 guint keyval, GdkModifierType mods, gpointer user_data),
63 gboolean (*checked_callback)(GtkWidget *widget),
64 gboolean (*active_callback)(GtkWidget *widget),
65 gboolean (*sensitive_callback)(GtkWidget *widget), guint key_val,
66 GdkModifierType mods, GtkAccelGroup *accel_group);
67
68void update_entry(dt_menu_entry_t *entry);
69void update_menu_entries(GtkWidget *widget, gpointer user_data);
70
71// Use for first-level entries in any menubar
72void add_generic_top_menu_entry(GtkWidget *menu_bar, GtkWidget **menus, GList **lists, const dt_menus_t index,
73 gchar *label, GtkAccelGroup *accel_group, const char *accel_path_prefix);
74
75
76// Use for first-level entries in the global menubar
77void add_top_menu_entry(GtkWidget *menu_bar, GtkWidget **menus, GList **lists, const dt_menus_t index,
78 gchar *label);
79
80// Special submenus entries that only open a sub-submenu
81void add_generic_top_submenu_entry(GtkWidget **menus, GList **lists, const gchar *label, const dt_menus_t index,
82 GtkAccelGroup *accel_group);
83
84// Global menu only
85void add_top_submenu_entry(GtkWidget **menus, GList **lists, const gchar *label, const dt_menus_t index);
86void add_generic_top_submenu_entry(GtkWidget **menus, GList **lists, const gchar *label, const dt_menus_t index,
87 GtkAccelGroup *accel_group);
88
89void add_generic_sub_menu_entry(GtkWidget **menus, GList **lists, const gchar *label, const dt_menus_t index,
90 void *data,
91 gboolean (*action_callback)(GtkAccelGroup *group, GObject *acceleratable,
92 guint keyval, GdkModifierType mods, gpointer user_data),
93 gboolean (*checked_callback)(GtkWidget *widget),
94 gboolean (*active_callback)(GtkWidget *widget),
95 gboolean (*sensitive_callback)(GtkWidget *widget), guint key_val,
96 GdkModifierType mods, GtkAccelGroup *accel_group);
97
98void add_sub_menu_entry(GtkWidget **menus, GList **lists, const gchar *label, const dt_menus_t index, void *data,
99 gboolean (*action_callback)(GtkAccelGroup *group, GObject *acceleratable, guint keyval,
100 GdkModifierType mods, gpointer user_data),
101 gboolean (*checked_callback)(GtkWidget *widget),
102 gboolean (*active_callback)(GtkWidget *widget),
103 gboolean (*sensitive_callback)(GtkWidget *widget), guint key_val, GdkModifierType mods);
104
105void add_generic_sub_sub_menu_entry(GtkWidget **menus, GtkWidget *parent, GList **lists, const gchar *label,
106 const dt_menus_t index, void *data,
107 gboolean (*action_callback)(GtkAccelGroup *group, GObject *acceleratable,
108 guint keyval, GdkModifierType mods,
109 gpointer user_data),
110 gboolean (*checked_callback)(GtkWidget *widget),
111 gboolean (*active_callback)(GtkWidget *widget),
112 gboolean (*sensitive_callback)(GtkWidget *widget), guint key_val,
113 GdkModifierType mods, GtkAccelGroup *accel_group);
114
115void add_sub_sub_menu_entry(GtkWidget **menus, GtkWidget *parent, GList **lists, const gchar *label,
116 const dt_menus_t index, void *data,
117 gboolean (*action_callback)(GtkAccelGroup *group, GObject *acceleratable, guint keyval,
118 GdkModifierType mods, gpointer user_data),
119 gboolean (*checked_callback)(GtkWidget *widget),
120 gboolean (*active_callback)(GtkWidget *widget),
121 gboolean (*sensitive_callback)(GtkWidget *widget), guint key_val,
122 GdkModifierType mods);
123
124// We don't go further than 3 levels of menus. This is not a Dassault Systems software.
125
126void add_menu_separator(GtkWidget *menu);
127
128void add_sub_menu_separator(GtkWidget *parent);
129
130void *get_custom_data(GtkWidget *widget);
131
132GtkWidget *get_last_widget(GList **list);
133
134gboolean has_selection();
135gboolean has_active_images();
136gboolean _is_lighttable();
137
138
139void append_display(GtkWidget **menus, GList **lists, const dt_menus_t index);
140void append_edit(GtkWidget **menus, GList **lists, const dt_menus_t index);
141void append_file(GtkWidget **menus, GList **lists, const dt_menus_t index);
142void append_help(GtkWidget **menus, GList **lists, const dt_menus_t index);
143void append_image(GtkWidget **menus, GList **lists, const dt_menus_t index);
144void append_run(GtkWidget **menus, GList **lists, const dt_menus_t index);
145void append_select(GtkWidget **menus, GList **lists, const dt_menus_t index);
146void append_views(GtkWidget **menus, GList **lists, const dt_menus_t index);
147
148// Helper to wrap (*void)(void) functions into GtkAccel compatible callbacks
149#define MAKE_ACCEL_WRAPPER(cb) \
150static gboolean \
151cb##__accel (GtkAccelGroup *group, \
152 GObject *acceleratable, \
153 guint keyval, \
154 GdkModifierType mods, \
155 gpointer user_data) \
156{ \
157 cb(); \
158 return TRUE; \
159}
160
161#define GET_ACCEL_WRAPPER(cb) cb##__accel
gboolean has_selection()
Definition menu.c:313
void append_views(GtkWidget **menus, GList **lists, const dt_menus_t index)
Definition views.c:43
void append_select(GtkWidget **menus, GList **lists, const dt_menus_t index)
Definition select.c:51
void append_display(GtkWidget **menus, GList **lists, const dt_menus_t index)
Definition display.c:413
void add_sub_sub_menu_entry(GtkWidget **menus, GtkWidget *parent, GList **lists, const gchar *label, const dt_menus_t index, void *data, gboolean(*action_callback)(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data), gboolean(*checked_callback)(GtkWidget *widget), gboolean(*active_callback)(GtkWidget *widget), gboolean(*sensitive_callback)(GtkWidget *widget), guint key_val, GdkModifierType mods)
Definition menu.c:269
dt_menu_entry_style_t
Definition menu.h:25
@ DT_MENU_ENTRY_LAST
Definition menu.h:29
@ DT_MENU_ENTRY_CHECKBUTTON
Definition menu.h:27
@ DT_MENU_ENTRY_DEFAULT
Definition menu.h:26
@ DT_MENU_ENTRY_RADIOBUTTON
Definition menu.h:28
void append_help(GtkWidget **menus, GList **lists, const dt_menus_t index)
Definition help.c:214
void add_top_menu_entry(GtkWidget *menu_bar, GtkWidget **menus, GList **lists, const dt_menus_t index, gchar *label)
Definition menu.c:183
void append_image(GtkWidget **menus, GList **lists, const dt_menus_t index)
Definition gui/actions/image.c:182
gboolean _is_lighttable()
Definition menu.c:324
void append_run(GtkWidget **menus, GList **lists, const dt_menus_t index)
Definition run.c:106
void add_generic_sub_menu_entry(GtkWidget **menus, GList **lists, const gchar *label, const dt_menus_t index, void *data, gboolean(*action_callback)(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data), gboolean(*checked_callback)(GtkWidget *widget), gboolean(*active_callback)(GtkWidget *widget), gboolean(*sensitive_callback)(GtkWidget *widget), guint key_val, GdkModifierType mods, GtkAccelGroup *accel_group)
Definition menu.c:218
void add_generic_sub_sub_menu_entry(GtkWidget **menus, GtkWidget *parent, GList **lists, const gchar *label, const dt_menus_t index, void *data, gboolean(*action_callback)(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data), gboolean(*checked_callback)(GtkWidget *widget), gboolean(*active_callback)(GtkWidget *widget), gboolean(*sensitive_callback)(GtkWidget *widget), guint key_val, GdkModifierType mods, GtkAccelGroup *accel_group)
Definition menu.c:251
void update_menu_entries(GtkWidget *widget, gpointer user_data)
Definition menu.c:138
dt_menu_entry_t * set_menu_entry(GtkWidget **menus, GList **items_list, const gchar *label, dt_menus_t menu_index, GtkMenu *parent, void *data, gboolean(*action_callback)(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data), gboolean(*checked_callback)(GtkWidget *widget), gboolean(*active_callback)(GtkWidget *widget), gboolean(*sensitive_callback)(GtkWidget *widget), guint key_val, GdkModifierType mods, GtkAccelGroup *accel_group)
Definition menu.c:40
void append_edit(GtkWidget **menus, GList **lists, const dt_menus_t index)
Definition edit.c:378
GtkWidget * get_last_widget(GList **list)
Definition menu.c:301
void add_sub_menu_entry(GtkWidget **menus, GList **lists, const gchar *label, const dt_menus_t index, void *data, gboolean(*action_callback)(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data), gboolean(*checked_callback)(GtkWidget *widget), gboolean(*active_callback)(GtkWidget *widget), gboolean(*sensitive_callback)(GtkWidget *widget), guint key_val, GdkModifierType mods)
Definition menu.c:239
void add_sub_menu_separator(GtkWidget *parent)
Definition menu.c:289
void * get_custom_data(GtkWidget *widget)
Definition menu.c:295
void add_generic_top_menu_entry(GtkWidget *menu_bar, GtkWidget **menus, GList **lists, const dt_menus_t index, gchar *label, GtkAccelGroup *accel_group, const char *accel_path_prefix)
Definition menu.c:157
void add_top_submenu_entry(GtkWidget **menus, GList **lists, const gchar *label, const dt_menus_t index)
Definition menu.c:212
void add_menu_separator(GtkWidget *menu)
Definition menu.c:283
void append_file(GtkWidget **menus, GList **lists, const dt_menus_t index)
Definition file.c:190
void add_generic_top_submenu_entry(GtkWidget **menus, GList **lists, const gchar *label, const dt_menus_t index, GtkAccelGroup *accel_group)
Definition menu.c:190
dt_menus_t
Definition menu.h:11
@ DT_MENU_IMAGE
Definition menu.h:15
@ DT_MENU_FILE
Definition menu.h:12
@ DT_MENU_STYLES
Definition menu.h:16
@ DT_MENU_EDIT
Definition menu.h:13
@ DT_MENU_DISPLAY
Definition menu.h:18
@ DT_MENU_SELECTION
Definition menu.h:14
@ DT_MENU_LAST
Definition menu.h:21
@ DT_MENU_ATELIERS
Definition menu.h:19
@ DT_MENU_HELP
Definition menu.h:20
@ DT_MENU_RUN
Definition menu.h:17
void update_entry(dt_menu_entry_t *entry)
Definition menu.c:114
gboolean has_active_images()
Definition menu.c:319
Definition menu.h:34
GtkAccelGroup * accel_group
Definition menu.h:43
gboolean has_checkbox
Definition menu.h:36
dt_menu_entry_style_t style
Definition menu.h:42
gboolean(* sensitive_callback)(GtkWidget *widget)
Definition menu.h:38
dt_menus_t menu
Definition menu.h:41
gboolean(* checked_callback)(GtkWidget *widget)
Definition menu.h:39
gboolean(* action_callback)(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
Definition menu.h:37
gboolean(* active_callback)(GtkWidget *widget)
Definition menu.h:40
GtkWidget * widget
Definition menu.h:35