Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
menu.c File Reference
#include "common/act_on.h"
#include "common/selection.h"
#include "gui/application.h"
#include "widgets/accelerators.h"
#include "views/view.h"
#include "math.h"
#include "menu.h"
#include "widgets/label.h"
#include "widgets/widget_settings.h"
#include "widgets/widget_style.h"
+ Include dependency graph for menu.c:

Go to the source code of this file.

Functions

static void _activate_callback_to_action_callback (GtkMenuItem *menu_item, gpointer user_data)
 
static gboolean _menu_icon_draw (GtkWidget *widget, cairo_t *cr, gpointer user_data)
 
static void _menu_entry_destroy (GtkWidget *widget, gpointer user_data)
 
GtkWidgetctx_gtk_menu_item_new_with_icon (const char *label, GtkWidget *menu, void(*activate_callback)(GtkWidget *widget, gpointer user_data), gpointer user_data, dt_menu_icon_t icon)
 
GtkWidgetctx_gtk_menu_item_new_with_icon_and_shortcut (const char *label, const char *shortcut, GtkWidget *menu, void(*activate_callback)(GtkWidget *widget, gpointer user_data), gpointer user_data, dt_menu_icon_t icon)
 
GtkWidgetctx_gtk_menu_item_new_with_markup (const char *label, GtkWidget *menu, void(*activate_callback)(GtkWidget *widget, gpointer user_data), gpointer user_data)
 
GtkWidgetctx_gtk_menu_item_new_with_markup_and_shortcut (const char *label, const char *shortcut, GtkWidget *menu, void(*activate_callback)(GtkWidget *widget, gpointer user_data), gpointer user_data)
 
GtkWidgetctx_gtk_menu_item_new_with_markup_and_pixbuf (const char *label, GdkPixbuf *icon, GtkWidget *menu, void(*activate_callback)(GtkWidget *widget, gpointer user_data), gpointer user_data)
 
GtkWidgetctx_gtk_check_menu_item_new_with_markup (const char *label, GtkWidget *menu, void(*activate_callback)(GtkWidget *widget, gpointer user_data), gpointer user_data, const gboolean checked, const gboolean show_checkbox)
 
GtkWidgetctx_gtk_check_menu_item_new_with_markup_and_pixbuf (const char *label, GdkPixbuf *icon, GtkWidget *menu, void(*activate_callback)(GtkWidget *widget, gpointer user_data), gpointer user_data, const gboolean checked, const gboolean show_checkbox)
 
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_no_accel_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)
 
GtkWidgetget_last_widget (GList **list)
 
gboolean has_selection ()
 
gboolean has_active_images ()
 
gboolean _is_lighttable ()
 
gboolean _is_darkroom ()
 
gboolean has_active_image_in_lighttable ()
 

Function Documentation

◆ _activate_callback_to_action_callback()

static void _activate_callback_to_action_callback ( GtkMenuItem *  menu_item,
gpointer  user_data 
)
static

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 dt_gui_get_global() 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.

Definition at line 49 of file menu.c.

References dt_menu_entry_t::accel_group, dt_menu_entry_t::action_callback, and window.

Referenced by set_menu_entry(), and update_entry().

◆ _is_darkroom()

gboolean _is_darkroom ( )

◆ _is_lighttable()

◆ _menu_entry_destroy()

static void _menu_entry_destroy ( GtkWidget widget,
gpointer  user_data 
)
static

Definition at line 90 of file menu.c.

References dt_menu_entry_t::accel_path, and dt_free.

Referenced by set_menu_entry().

◆ _menu_icon_draw()

static gboolean _menu_icon_draw ( GtkWidget widget,
cairo_t *  cr,
gpointer  user_data 
)
static

◆ 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 
)

Definition at line 589 of file menu.c.

References set_menu_entry(), and dt_menu_entry_t::widget.

Referenced by add_sub_sub_menu_entry(), and append_thumbnails().

◆ 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_no_accel_sub_menu_entry()

void add_no_accel_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 
)

Definition at line 576 of file menu.c.

References add_generic_sub_menu_entry().

Referenced by append_file(), and append_views().

◆ 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)

Definition at line 628 of file menu.c.

Referenced by append_image(), and append_run().

◆ 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 
)

Definition at line 509 of file menu.c.

References add_generic_top_menu_entry(), and dt_gui_get_accels().

Referenced by dt_ui_init_global_menu().

◆ add_top_submenu_entry()

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

◆ ctx_gtk_check_menu_item_new_with_markup()

GtkWidget * ctx_gtk_check_menu_item_new_with_markup ( const char *  label,
GtkWidget menu,
void(*)(GtkWidget *widget, gpointer user_data)  activate_callback,
gpointer  user_data,
const gboolean  checked,
const gboolean  show_checkbox 
)

Definition at line 241 of file menu.c.

References DT_GUI_BOX_SPACING, FALSE, and TRUE.

Referenced by populate_masks_context_menu().

◆ ctx_gtk_check_menu_item_new_with_markup_and_pixbuf()

GtkWidget * ctx_gtk_check_menu_item_new_with_markup_and_pixbuf ( const char *  label,
GdkPixbuf *  icon,
GtkWidget menu,
void(*)(GtkWidget *widget, gpointer user_data)  activate_callback,
gpointer  user_data,
const gboolean  checked,
const gboolean  show_checkbox 
)

Definition at line 280 of file menu.c.

References DT_GUI_BOX_SPACING, FALSE, and TRUE.

Referenced by _blendop_masks_group_ctx_menu().

◆ ctx_gtk_menu_item_new_with_icon()

GtkWidget * ctx_gtk_menu_item_new_with_icon ( const char *  label,
GtkWidget menu,
void(*)(GtkWidget *widget, gpointer user_data)  activate_callback,
gpointer  user_data,
dt_menu_icon_t  icon 
)

◆ ctx_gtk_menu_item_new_with_icon_and_shortcut()

GtkWidget * ctx_gtk_menu_item_new_with_icon_and_shortcut ( const char *  label,
const char *  shortcut,
GtkWidget menu,
void(*)(GtkWidget *widget, gpointer user_data)  activate_callback,
gpointer  user_data,
dt_menu_icon_t  icon 
)

◆ ctx_gtk_menu_item_new_with_markup()

GtkWidget * ctx_gtk_menu_item_new_with_markup ( const char *  label,
GtkWidget menu,
void(*)(GtkWidget *widget, gpointer user_data)  activate_callback,
gpointer  user_data 
)

◆ ctx_gtk_menu_item_new_with_markup_and_pixbuf()

GtkWidget * ctx_gtk_menu_item_new_with_markup_and_pixbuf ( const char *  label,
GdkPixbuf *  icon,
GtkWidget menu,
void(*)(GtkWidget *widget, gpointer user_data)  activate_callback,
gpointer  user_data 
)

Definition at line 215 of file menu.c.

References DT_GUI_BOX_SPACING, FALSE, and TRUE.

Referenced by dt_masks_create_menu().

◆ ctx_gtk_menu_item_new_with_markup_and_shortcut()

GtkWidget * ctx_gtk_menu_item_new_with_markup_and_shortcut ( const char *  label,
const char *  shortcut,
GtkWidget menu,
void(*)(GtkWidget *widget, gpointer user_data)  activate_callback,
gpointer  user_data 
)

Definition at line 185 of file menu.c.

References DT_GUI_BOX_SPACING, FALSE, and TRUE.

Referenced by _brush_populate_context_menu(), and _polygon_populate_context_menu().

◆ get_custom_data()

◆ get_last_widget()

GtkWidget * get_last_widget ( GList **  list)

◆ has_active_image_in_lighttable()

gboolean has_active_image_in_lighttable ( )

Definition at line 676 of file menu.c.

References _is_lighttable(), and has_active_images().

Referenced by append_file().

◆ 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 dt_gui_get_global() 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.

Definition at line 327 of file menu.c.

References _activate_callback_to_action_callback(), _menu_entry_destroy(), dt_menu_entry_t::accel_group, dt_menu_entry_t::accel_path, dt_menu_entry_t::action_callback, dt_menu_entry_t::active_callback, dt_menu_entry_t::checked_callback, dt_accels_build_path(), dt_accels_display_mods(), dt_accels_new_action_shortcut(), dt_free, dt_gui_get_accels(), DT_MENU_ENTRY_CHECKBUTTON, DT_MENU_ENTRY_DEFAULT, FALSE, IS_NULL_PTR, 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 _styles_add_menu_entry(), _styles_get_submenu(), 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 
)

Definition at line 464 of file menu.c.

References entries, and update_entry().

Referenced by add_generic_top_menu_entry().