Ansel 0.0
A darktable fork - bloat + design vision
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
menu.h File Reference
#include <gtk/gtk.h>
#include <glib.h>
+ Include dependency graph for menu.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  dt_menu_entry_t
 

Macros

#define MAKE_ACCEL_WRAPPER(cb)
 
#define GET_ACCEL_WRAPPER(cb)   cb##__accel
 

Typedefs

typedef enum dt_menus_t dt_menus_t
 
typedef enum dt_menu_entry_style_t dt_menu_entry_style_t
 
typedef struct dt_menu_entry_t dt_menu_entry_t
 

Enumerations

enum  dt_menus_t {
  DT_MENU_FILE = 0 ,
  DT_MENU_EDIT ,
  DT_MENU_SELECTION ,
  DT_MENU_IMAGE ,
  DT_MENU_STYLES ,
  DT_MENU_RUN ,
  DT_MENU_DISPLAY ,
  DT_MENU_ATELIERS ,
  DT_MENU_HELP ,
  DT_MENU_LAST
}
 
enum  dt_menu_entry_style_t {
  DT_MENU_ENTRY_DEFAULT = 0 ,
  DT_MENU_ENTRY_CHECKBUTTON = 1 ,
  DT_MENU_ENTRY_RADIOBUTTON = 2 ,
  DT_MENU_ENTRY_LAST
}
 

Functions

dt_menu_entry_tset_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)
 
void update_entry (dt_menu_entry_t *entry)
 
void update_menu_entries (GtkWidget *widget, gpointer user_data)
 
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)
 
void add_top_menu_entry (GtkWidget *menu_bar, GtkWidget **menus, GList **lists, const dt_menus_t index, gchar *label)
 
void add_generic_top_submenu_entry (GtkWidget **menus, GList **lists, const gchar *label, const dt_menus_t index, GtkAccelGroup *accel_group)
 
void add_top_submenu_entry (GtkWidget **menus, GList **lists, const gchar *label, const dt_menus_t index)
 
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)
 
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)
 
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)
 
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)
 
void add_menu_separator (GtkWidget *menu)
 
void add_sub_menu_separator (GtkWidget *parent)
 
voidget_custom_data (GtkWidget *widget)
 
GtkWidget * get_last_widget (GList **list)
 
gboolean has_selection ()
 
gboolean has_active_images ()
 
gboolean _is_lighttable ()
 
void append_display (GtkWidget **menus, GList **lists, const dt_menus_t index)
 
void append_edit (GtkWidget **menus, GList **lists, const dt_menus_t index)
 
void append_file (GtkWidget **menus, GList **lists, const dt_menus_t index)
 
void append_help (GtkWidget **menus, GList **lists, const dt_menus_t index)
 
void append_image (GtkWidget **menus, GList **lists, const dt_menus_t index)
 
void append_run (GtkWidget **menus, GList **lists, const dt_menus_t index)
 
void append_select (GtkWidget **menus, GList **lists, const dt_menus_t index)
 
void append_views (GtkWidget **menus, GList **lists, const dt_menus_t index)
 

Macro Definition Documentation

◆ GET_ACCEL_WRAPPER

#define GET_ACCEL_WRAPPER (   cb)    cb##__accel

◆ MAKE_ACCEL_WRAPPER

#define MAKE_ACCEL_WRAPPER (   cb)
Value:
static gboolean \
cb##__accel (GtkAccelGroup *group, \
GObject *acceleratable, \
guint keyval, \
GdkModifierType mods, \
gpointer user_data) \
{ \
cb(); \
return TRUE; \
}
#define TRUE
Definition ashift_lsd.c:151

Typedef Documentation

◆ dt_menu_entry_style_t

◆ dt_menu_entry_t

◆ dt_menus_t

typedef enum dt_menus_t dt_menus_t

Enumeration Type Documentation

◆ dt_menu_entry_style_t

Enumerator
DT_MENU_ENTRY_DEFAULT 
DT_MENU_ENTRY_CHECKBUTTON 
DT_MENU_ENTRY_RADIOBUTTON 
DT_MENU_ENTRY_LAST 

◆ dt_menus_t

enum dt_menus_t
Enumerator
DT_MENU_FILE 
DT_MENU_EDIT 
DT_MENU_SELECTION 
DT_MENU_IMAGE 
DT_MENU_STYLES 
DT_MENU_RUN 
DT_MENU_DISPLAY 
DT_MENU_ATELIERS 
DT_MENU_HELP 
DT_MENU_LAST 

Function Documentation

◆ _is_lighttable()

◆ add_generic_sub_menu_entry()

void add_generic_sub_menu_entry ( GtkWidget **  menus,
GList **  lists,
const gchar *  label,
const dt_menus_t  index,
void data,
gboolean(*)(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)  action_callback,
gboolean(*)(GtkWidget *widget)  checked_callback,
gboolean(*)(GtkWidget *widget)  active_callback,
gboolean(*)(GtkWidget *widget)  sensitive_callback,
guint  key_val,
GdkModifierType  mods,
GtkAccelGroup *  accel_group 
)

◆ add_generic_sub_sub_menu_entry()

void add_generic_sub_sub_menu_entry ( GtkWidget **  menus,
GtkWidget *  parent,
GList **  lists,
const gchar *  label,
const dt_menus_t  index,
void data,
gboolean(*)(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)  action_callback,
gboolean(*)(GtkWidget *widget)  checked_callback,
gboolean(*)(GtkWidget *widget)  active_callback,
gboolean(*)(GtkWidget *widget)  sensitive_callback,
guint  key_val,
GdkModifierType  mods,
GtkAccelGroup *  accel_group 
)

◆ add_generic_top_menu_entry()

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 
)

◆ add_generic_top_submenu_entry()

void add_generic_top_submenu_entry ( GtkWidget **  menus,
GList **  lists,
const gchar *  label,
const dt_menus_t  index,
GtkAccelGroup *  accel_group 
)

◆ add_menu_separator()

void add_menu_separator ( GtkWidget *  menu)

◆ add_sub_menu_entry()

void add_sub_menu_entry ( GtkWidget **  menus,
GList **  lists,
const gchar *  label,
const dt_menus_t  index,
void data,
gboolean(*)(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)  action_callback,
gboolean(*)(GtkWidget *widget)  checked_callback,
gboolean(*)(GtkWidget *widget)  active_callback,
gboolean(*)(GtkWidget *widget)  sensitive_callback,
guint  key_val,
GdkModifierType  mods 
)

◆ add_sub_menu_separator()

void add_sub_menu_separator ( GtkWidget *  parent)

Referenced by append_image().

◆ add_sub_sub_menu_entry()

void add_sub_sub_menu_entry ( GtkWidget **  menus,
GtkWidget *  parent,
GList **  lists,
const gchar *  label,
const dt_menus_t  index,
void data,
gboolean(*)(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)  action_callback,
gboolean(*)(GtkWidget *widget)  checked_callback,
gboolean(*)(GtkWidget *widget)  active_callback,
gboolean(*)(GtkWidget *widget)  sensitive_callback,
guint  key_val,
GdkModifierType  mods 
)

◆ add_top_menu_entry()

void add_top_menu_entry ( GtkWidget *  menu_bar,
GtkWidget **  menus,
GList **  lists,
const dt_menus_t  index,
gchar *  label 
)

◆ add_top_submenu_entry()

void add_top_submenu_entry ( GtkWidget **  menus,
GList **  lists,
const gchar *  label,
const dt_menus_t  index 
)

◆ append_display()

◆ append_edit()

◆ append_file()

◆ append_help()

◆ append_image()

◆ append_run()

◆ append_select()

◆ append_views()

◆ get_custom_data()

◆ get_last_widget()

GtkWidget * get_last_widget ( GList **  list)

◆ has_active_images()

◆ has_selection()

gboolean has_selection ( )

◆ set_menu_entry()

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(*)(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)  action_callback,
gboolean(*)(GtkWidget *widget)  checked_callback,
gboolean(*)(GtkWidget *widget)  active_callback,
gboolean(*)(GtkWidget *widget)  sensitive_callback,
guint  key_val,
GdkModifierType  mods,
GtkAccelGroup *  accel_group 
)

How to use:

  1. write callback functions returning a gboolean that will check the context to decide if the menu item should be insensitive, checked, active. These should only use the content of globally accessible structures like darktable.gui since they take no arguments.
  2. re-use the action callback functions already used for global keyboard shortcuts (actions/accels). Again, all inputs and internal functions should be globally accessible, for example using proxies.
  3. wire everything with the set_menu_entry function below. GUI states of the children menu items will be updated automatically everytime a top-level menu is opened.

References _activate_callback_to_action_callback(), dt_menu_entry_t::accel_group, dt_gui_gtk_t::accels, dt_menu_entry_t::action_callback, dt_menu_entry_t::active_callback, dt_menu_entry_t::checked_callback, darktable, dt_accels_build_path(), dt_accels_new_action_shortcut(), DT_MENU_ENTRY_CHECKBUTTON, DT_MENU_ENTRY_DEFAULT, FALSE, darktable_t::gui, dt_menu_entry_t::menu, dt_menu_entry_t::sensitive_callback, strip_markup(), dt_menu_entry_t::style, and dt_menu_entry_t::widget.

Referenced by add_generic_sub_menu_entry(), add_generic_sub_sub_menu_entry(), and add_generic_top_submenu_entry().

◆ update_entry()

◆ update_menu_entries()

void update_menu_entries ( GtkWidget *  widget,
gpointer  user_data 
)

References update_entry().

Referenced by add_generic_top_menu_entry().