1 /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*- 2 3 menu.h for the Openbox window manager 4 Copyright (c) 2003-2007 Dana Jansens 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 2 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 See the COPYING file for a copy of the GNU General Public License. 17 */ 18 19 #ifndef __menu_h 20 #define __menu_h 21 22 #include "window.h" 23 #include "geom.h" 24 #include "obrender/render.h" 25 26 #include <glib.h> 27 28 struct _ObClient; 29 struct _ObMenuFrame; 30 struct _ObMenuEntryFrame; 31 32 typedef struct _ObMenu ObMenu; 33 typedef struct _ObMenuEntry ObMenuEntry; 34 typedef struct _ObNormalMenuEntry ObNormalMenuEntry; 35 typedef struct _ObSubmenuMenuEntry ObSubmenuMenuEntry; 36 typedef struct _ObSeparatorMenuEntry ObSeparatorMenuEntry; 37 38 typedef void (*ObMenuShowFunc)(struct _ObMenuFrame *frame, gpointer data); 39 typedef void (*ObMenuHideFunc)(struct _ObMenuFrame *frame, gpointer data); 40 typedef gboolean (*ObMenuUpdateFunc)(struct _ObMenuFrame *frame, 41 gpointer data); 42 typedef void (*ObMenuExecuteFunc)(struct _ObMenuEntry *entry, 43 struct _ObMenuFrame *frame, 44 struct _ObClient *client, 45 guint state, gpointer data); 46 typedef void (*ObMenuCleanupFunc)(struct _ObMenu *menu, gpointer data); 47 typedef void (*ObMenuDestroyFunc)(struct _ObMenu *menu, gpointer data); 48 /*! @param x is the mouse x coordinate. on return it should be the x coordinate 49 for the menu 50 @param y is the mouse y coordinate. on return it should be the y coordinate 51 for the menu 52 */ 53 typedef void (*ObMenuPlaceFunc)(struct _ObMenuFrame *frame, gint *x, gint *y, 54 gboolean mouse, gpointer data); 55 56 struct _ObMenu 57 { 58 /* Name of the menu. Used in the showmenu action. */ 59 gchar *name; 60 /* Displayed title */ 61 gchar *title; 62 gchar *collate_key; 63 /*! The shortcut key that would be used to activate this menu if it was 64 displayed as a submenu */ 65 gunichar shortcut; 66 /*! The shortcut's position in the string */ 67 guint shortcut_position; 68 /*! If the shortcut was specified by & and should always be drawn */ 69 gboolean shortcut_always_show; 70 71 /*! If the shortcut key should be shown in menu entries even when it 72 is the first character in the string */ 73 gboolean show_all_shortcuts; 74 75 /* Command to execute to rebuild the menu */ 76 gchar *execute; 77 78 /* ObMenuEntry list */ 79 GList *entries; 80 81 /* plugin data */ 82 gpointer data; 83 84 ObMenuShowFunc show_func; 85 ObMenuHideFunc hide_func; 86 ObMenuUpdateFunc update_func; 87 ObMenuExecuteFunc execute_func; 88 ObMenuCleanupFunc cleanup_func; 89 ObMenuDestroyFunc destroy_func; 90 ObMenuPlaceFunc place_func; 91 92 /* Pipe-menu parent, we get destroyed when it is destroyed */ 93 ObMenu *pipe_creator; 94 95 /* The menu used as the destination for the "More..." entry for this menu*/ 96 ObMenu *more_menu; 97 }; 98 99 typedef enum 100 { 101 OB_MENU_ENTRY_TYPE_NORMAL, 102 OB_MENU_ENTRY_TYPE_SUBMENU, 103 OB_MENU_ENTRY_TYPE_SEPARATOR 104 } ObMenuEntryType; 105 106 struct _ObNormalMenuEntry { 107 /* Icon stuff. If you set this, make sure you RrImageRef() it too. */ 108 RrImage *icon; 109 gint icon_alpha; 110 111 gchar *label; 112 gchar *collate_key; 113 /*! The shortcut key that would be used to activate this menu entry */ 114 gunichar shortcut; 115 /*! The shortcut's position in the string */ 116 guint shortcut_position; 117 /*! If the shortcut was specified by & and should always be drawn */ 118 gboolean shortcut_always_show; 119 120 /* state */ 121 gboolean enabled; 122 123 /* List of ObActions */ 124 GSList *actions; 125 126 /* Mask icon */ 127 RrPixmapMask *mask; 128 RrColor *mask_normal_color; 129 RrColor *mask_selected_color; 130 RrColor *mask_disabled_color; 131 RrColor *mask_disabled_selected_color; 132 133 gpointer data; 134 }; 135 136 struct _ObSubmenuMenuEntry { 137 /* Icon stuff. If you set this, make sure you RrImageRef() it too. */ 138 RrImage *icon; 139 gint icon_alpha; 140 141 gchar *name; 142 ObMenu *submenu; 143 144 guint show_from; 145 }; 146 147 struct _ObSeparatorMenuEntry { 148 gchar *label; 149 }; 150 151 struct _ObMenuEntry 152 { 153 guint ref; 154 155 ObMenuEntryType type; 156 ObMenu *menu; 157 158 gint id; 159 160 union u { 161 ObNormalMenuEntry normal; 162 ObSubmenuMenuEntry submenu; 163 ObSeparatorMenuEntry separator; 164 } data; 165 }; 166 167 void menu_startup(gboolean reconfig); 168 void menu_shutdown(gboolean reconfig); 169 170 void menu_entry_ref(ObMenuEntry *self); 171 void menu_entry_unref(ObMenuEntry *self); 172 173 ObMenu* menu_new(const gchar *name, const gchar *title, 174 gboolean allow_shortcut_selection, gpointer data); 175 void menu_free(ObMenu *menu); 176 177 /*! Repopulate a pipe-menu by running its command */ 178 void menu_pipe_execute(ObMenu *self); 179 /*! Clear a pipe-menu's entries */ 180 void menu_clear_pipe_caches(void); 181 182 void menu_show_all_shortcuts(ObMenu *self, gboolean show); 183 184 void menu_show(gchar *name, const GravityPoint *pos, gint monitor, 185 gboolean mouse, gboolean user_positioned, 186 struct _ObClient *client); 187 gboolean menu_hide_delay_reached(void); 188 void menu_hide_delay_reset(void); 189 190 /*! The show function is called right after a menu is shown */ 191 void menu_set_show_func(ObMenu *menu, ObMenuShowFunc func); 192 /*! The hide function is called right before a menu is hidden */ 193 void menu_set_hide_func(ObMenu *menu, ObMenuHideFunc func); 194 /*! The update function is called when the menu should refresh its 195 contents, generally right before it is shown */ 196 void menu_set_update_func(ObMenu *menu, ObMenuUpdateFunc func); 197 /*! The execute function is called when a user chooses to execute an 198 entry in the menu */ 199 void menu_set_execute_func(ObMenu *menu, ObMenuExecuteFunc func); 200 /*! The cleanup function is called after a menu is hidden, allowing it 201 to be cleaned up between uses */ 202 void menu_set_cleanup_func(ObMenu *menu, ObMenuCleanupFunc func); 203 /*! The destroy function is called when the menu is being destroyed 204 permanently */ 205 void menu_set_destroy_func(ObMenu *menu, ObMenuDestroyFunc func); 206 /*! The place function is called when the menu is being shown and allows 207 the menu to choose its initial position */ 208 void menu_set_place_func(ObMenu *menu, ObMenuPlaceFunc func); 209 210 /* functions for building menus */ 211 /*! @param allow_shortcut this should be false when the label is coming from 212 outside data like window or desktop titles */ 213 ObMenuEntry* menu_add_normal(ObMenu *menu, gint id, const gchar *label, 214 GSList *actions, gboolean allow_shortcut); 215 ObMenuEntry* menu_add_submenu(ObMenu *menu, gint id, const gchar *submenu); 216 ObMenuEntry* menu_add_separator(ObMenu *menu, gint id, const gchar *label); 217 218 /*! This sorts groups of menu entries between consecutive separators */ 219 void menu_sort_entries(ObMenu *self); 220 221 void menu_clear_entries(ObMenu *self); 222 void menu_entry_remove(ObMenuEntry *self); 223 224 void menu_entry_set_label(ObMenuEntry *self, const gchar *label, 225 gboolean allow_shortcut); 226 227 ObMenuEntry* menu_find_entry_id(ObMenu *self, gint id); 228 229 /* fills in the submenus, for use when a menu is being shown */ 230 void menu_find_submenus(ObMenu *self); 231 232 ObMenuEntry* menu_get_more(ObMenu *menu, guint show_from); 233 234 #endif 235