1 /* 2 * This file is part of gtkD. 3 * 4 * gtkD is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU Lesser General Public License 6 * as published by the Free Software Foundation; either version 3 7 * of the License, or (at your option) any later version, with 8 * some exceptions, please read the COPYING file. 9 * 10 * gtkD is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public License 16 * along with gtkD; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA 18 */ 19 20 // generated automatically - do not change 21 // find conversion definition on APILookup.txt 22 // implement new conversion functionalities on the wrap.utils pakage 23 24 25 module gtk.AccelMap; 26 27 private import glib.ScannerG; 28 private import glib.Str; 29 private import gobject.ObjectG; 30 private import gobject.Signals; 31 private import gtk.c.functions; 32 public import gtk.c.types; 33 public import gtkc.gtktypes; 34 private import std.algorithm; 35 36 37 /** 38 * Accelerator maps are used to define runtime configurable accelerators. 39 * Functions for manipulating them are are usually used by higher level 40 * convenience mechanisms like #GtkUIManager and are thus considered 41 * “low-level”. You’ll want to use them if you’re manually creating menus that 42 * should have user-configurable accelerators. 43 * 44 * An accelerator is uniquely defined by: 45 * - accelerator path 46 * - accelerator key 47 * - accelerator modifiers 48 * 49 * The accelerator path must consist of 50 * “<WINDOWTYPE>/Category1/Category2/.../Action”, where WINDOWTYPE 51 * should be a unique application-specific identifier that corresponds 52 * to the kind of window the accelerator is being used in, e.g. 53 * “Gimp-Image”, “Abiword-Document” or “Gnumeric-Settings”. 54 * The “Category1/.../Action” portion is most appropriately chosen by 55 * the action the accelerator triggers, i.e. for accelerators on menu 56 * items, choose the item’s menu path, e.g. “File/Save As”, 57 * “Image/View/Zoom” or “Edit/Select All”. So a full valid accelerator 58 * path may look like: “<Gimp-Toolbox>/File/Dialogs/Tool Options...”. 59 * 60 * All accelerators are stored inside one global #GtkAccelMap that can 61 * be obtained using gtk_accel_map_get(). See 62 * [Monitoring changes][monitoring-changes] for additional 63 * details. 64 * 65 * # Manipulating accelerators 66 * 67 * New accelerators can be added using gtk_accel_map_add_entry(). 68 * To search for specific accelerator, use gtk_accel_map_lookup_entry(). 69 * Modifications of existing accelerators should be done using 70 * gtk_accel_map_change_entry(). 71 * 72 * In order to avoid having some accelerators changed, they can be 73 * locked using gtk_accel_map_lock_path(). Unlocking is done using 74 * gtk_accel_map_unlock_path(). 75 * 76 * # Saving and loading accelerator maps 77 * 78 * Accelerator maps can be saved to and loaded from some external 79 * resource. For simple saving and loading from file, 80 * gtk_accel_map_save() and gtk_accel_map_load() are provided. 81 * Saving and loading can also be done by providing file descriptor 82 * to gtk_accel_map_save_fd() and gtk_accel_map_load_fd(). 83 * 84 * # Monitoring changes 85 * 86 * #GtkAccelMap object is only useful for monitoring changes of 87 * accelerators. By connecting to #GtkAccelMap::changed signal, one 88 * can monitor changes of all accelerators. It is also possible to 89 * monitor only single accelerator path by using it as a detail of 90 * the #GtkAccelMap::changed signal. 91 */ 92 public class AccelMap : ObjectG 93 { 94 /** the main Gtk struct */ 95 protected GtkAccelMap* gtkAccelMap; 96 97 /** Get the main Gtk struct */ 98 public GtkAccelMap* getAccelMapStruct(bool transferOwnership = false) 99 { 100 if (transferOwnership) 101 ownedRef = false; 102 return gtkAccelMap; 103 } 104 105 /** the main Gtk struct as a void* */ 106 protected override void* getStruct() 107 { 108 return cast(void*)gtkAccelMap; 109 } 110 111 protected override void setStruct(GObject* obj) 112 { 113 gtkAccelMap = cast(GtkAccelMap*)obj; 114 super.setStruct(obj); 115 } 116 117 /** 118 * Sets our main struct and passes it to the parent class. 119 */ 120 public this (GtkAccelMap* gtkAccelMap, bool ownedRef = false) 121 { 122 this.gtkAccelMap = gtkAccelMap; 123 super(cast(GObject*)gtkAccelMap, ownedRef); 124 } 125 126 127 /** */ 128 public static GType getType() 129 { 130 return gtk_accel_map_get_type(); 131 } 132 133 /** 134 * Registers a new accelerator with the global accelerator map. 135 * This function should only be called once per @accel_path 136 * with the canonical @accel_key and @accel_mods for this path. 137 * To change the accelerator during runtime programatically, use 138 * gtk_accel_map_change_entry(). 139 * 140 * Set @accel_key and @accel_mods to 0 to request a removal of 141 * the accelerator. 142 * 143 * Note that @accel_path string will be stored in a #GQuark. Therefore, if you 144 * pass a static string, you can save some memory by interning it first with 145 * g_intern_static_string(). 146 * 147 * Params: 148 * accelPath = valid accelerator path 149 * accelKey = the accelerator key 150 * accelMods = the accelerator modifiers 151 */ 152 public static void addEntry(string accelPath, uint accelKey, GdkModifierType accelMods) 153 { 154 gtk_accel_map_add_entry(Str.toStringz(accelPath), accelKey, accelMods); 155 } 156 157 /** 158 * Adds a filter to the global list of accel path filters. 159 * 160 * Accel map entries whose accel path matches one of the filters 161 * are skipped by gtk_accel_map_foreach(). 162 * 163 * This function is intended for GTK+ modules that create their own 164 * menus, but don’t want them to be saved into the applications accelerator 165 * map dump. 166 * 167 * Params: 168 * filterPattern = a pattern (see #GPatternSpec) 169 */ 170 public static void addFilter(string filterPattern) 171 { 172 gtk_accel_map_add_filter(Str.toStringz(filterPattern)); 173 } 174 175 /** 176 * Changes the @accel_key and @accel_mods currently associated with @accel_path. 177 * Due to conflicts with other accelerators, a change may not always be possible, 178 * @replace indicates whether other accelerators may be deleted to resolve such 179 * conflicts. A change will only occur if all conflicts could be resolved (which 180 * might not be the case if conflicting accelerators are locked). Successful 181 * changes are indicated by a %TRUE return value. 182 * 183 * Note that @accel_path string will be stored in a #GQuark. Therefore, if you 184 * pass a static string, you can save some memory by interning it first with 185 * g_intern_static_string(). 186 * 187 * Params: 188 * accelPath = a valid accelerator path 189 * accelKey = the new accelerator key 190 * accelMods = the new accelerator modifiers 191 * replace = %TRUE if other accelerators may be deleted upon conflicts 192 * 193 * Returns: %TRUE if the accelerator could be changed, %FALSE otherwise 194 */ 195 public static bool changeEntry(string accelPath, uint accelKey, GdkModifierType accelMods, bool replace) 196 { 197 return gtk_accel_map_change_entry(Str.toStringz(accelPath), accelKey, accelMods, replace) != 0; 198 } 199 200 /** 201 * Loops over the entries in the accelerator map whose accel path 202 * doesn’t match any of the filters added with gtk_accel_map_add_filter(), 203 * and execute @foreach_func on each. The signature of @foreach_func is 204 * that of #GtkAccelMapForeach, the @changed parameter indicates whether 205 * this accelerator was changed during runtime (thus, would need 206 * saving during an accelerator map dump). 207 * 208 * Params: 209 * data = data to be passed into @foreach_func 210 * foreachFunc = function to be executed for each accel 211 * map entry which is not filtered out 212 */ 213 public static void foreac(void* data, GtkAccelMapForeach foreachFunc) 214 { 215 gtk_accel_map_foreach(data, foreachFunc); 216 } 217 218 /** 219 * Loops over all entries in the accelerator map, and execute 220 * @foreach_func on each. The signature of @foreach_func is that of 221 * #GtkAccelMapForeach, the @changed parameter indicates whether 222 * this accelerator was changed during runtime (thus, would need 223 * saving during an accelerator map dump). 224 * 225 * Params: 226 * data = data to be passed into @foreach_func 227 * foreachFunc = function to be executed for each accel 228 * map entry 229 */ 230 public static void foreachUnfiltered(void* data, GtkAccelMapForeach foreachFunc) 231 { 232 gtk_accel_map_foreach_unfiltered(data, foreachFunc); 233 } 234 235 /** 236 * Gets the singleton global #GtkAccelMap object. This object 237 * is useful only for notification of changes to the accelerator 238 * map via the ::changed signal; it isn’t a parameter to the 239 * other accelerator map functions. 240 * 241 * Returns: the global #GtkAccelMap object 242 * 243 * Since: 2.4 244 */ 245 public static AccelMap get() 246 { 247 auto p = gtk_accel_map_get(); 248 249 if(p is null) 250 { 251 return null; 252 } 253 254 return ObjectG.getDObject!(AccelMap)(cast(GtkAccelMap*) p); 255 } 256 257 /** 258 * Parses a file previously saved with gtk_accel_map_save() for 259 * accelerator specifications, and propagates them accordingly. 260 * 261 * Params: 262 * fileName = a file containing accelerator specifications, 263 * in the GLib file name encoding 264 */ 265 public static void load(string fileName) 266 { 267 gtk_accel_map_load(Str.toStringz(fileName)); 268 } 269 270 /** 271 * Filedescriptor variant of gtk_accel_map_load(). 272 * 273 * Note that the file descriptor will not be closed by this function. 274 * 275 * Params: 276 * fd = a valid readable file descriptor 277 */ 278 public static void loadFd(int fd) 279 { 280 gtk_accel_map_load_fd(fd); 281 } 282 283 /** 284 * #GScanner variant of gtk_accel_map_load(). 285 * 286 * Params: 287 * scanner = a #GScanner which has already been provided with an input file 288 */ 289 public static void loadScanner(ScannerG scanner) 290 { 291 gtk_accel_map_load_scanner((scanner is null) ? null : scanner.getScannerGStruct()); 292 } 293 294 /** 295 * Locks the given accelerator path. If the accelerator map doesn’t yet contain 296 * an entry for @accel_path, a new one is created. 297 * 298 * Locking an accelerator path prevents its accelerator from being changed 299 * during runtime. A locked accelerator path can be unlocked by 300 * gtk_accel_map_unlock_path(). Refer to gtk_accel_map_change_entry() 301 * for information about runtime accelerator changes. 302 * 303 * If called more than once, @accel_path remains locked until 304 * gtk_accel_map_unlock_path() has been called an equivalent number 305 * of times. 306 * 307 * Note that locking of individual accelerator paths is independent from 308 * locking the #GtkAccelGroup containing them. For runtime accelerator 309 * changes to be possible, both the accelerator path and its #GtkAccelGroup 310 * have to be unlocked. 311 * 312 * Params: 313 * accelPath = a valid accelerator path 314 * 315 * Since: 2.4 316 */ 317 public static void lockPath(string accelPath) 318 { 319 gtk_accel_map_lock_path(Str.toStringz(accelPath)); 320 } 321 322 /** 323 * Looks up the accelerator entry for @accel_path and fills in @key. 324 * 325 * Params: 326 * accelPath = a valid accelerator path 327 * key = the accelerator key to be filled in (optional) 328 * 329 * Returns: %TRUE if @accel_path is known, %FALSE otherwise 330 */ 331 public static bool lookupEntry(string accelPath, out GtkAccelKey key) 332 { 333 return gtk_accel_map_lookup_entry(Str.toStringz(accelPath), &key) != 0; 334 } 335 336 /** 337 * Saves current accelerator specifications (accelerator path, key 338 * and modifiers) to @file_name. 339 * The file is written in a format suitable to be read back in by 340 * gtk_accel_map_load(). 341 * 342 * Params: 343 * fileName = the name of the file to contain 344 * accelerator specifications, in the GLib file name encoding 345 */ 346 public static void save(string fileName) 347 { 348 gtk_accel_map_save(Str.toStringz(fileName)); 349 } 350 351 /** 352 * Filedescriptor variant of gtk_accel_map_save(). 353 * 354 * Note that the file descriptor will not be closed by this function. 355 * 356 * Params: 357 * fd = a valid writable file descriptor 358 */ 359 public static void saveFd(int fd) 360 { 361 gtk_accel_map_save_fd(fd); 362 } 363 364 /** 365 * Undoes the last call to gtk_accel_map_lock_path() on this @accel_path. 366 * Refer to gtk_accel_map_lock_path() for information about accelerator path locking. 367 * 368 * Params: 369 * accelPath = a valid accelerator path 370 * 371 * Since: 2.4 372 */ 373 public static void unlockPath(string accelPath) 374 { 375 gtk_accel_map_unlock_path(Str.toStringz(accelPath)); 376 } 377 378 protected class OnChangedDelegateWrapper 379 { 380 void delegate(string, uint, GdkModifierType, AccelMap) dlg; 381 gulong handlerId; 382 383 this(void delegate(string, uint, GdkModifierType, AccelMap) dlg) 384 { 385 this.dlg = dlg; 386 onChangedListeners ~= this; 387 } 388 389 void remove(OnChangedDelegateWrapper source) 390 { 391 foreach(index, wrapper; onChangedListeners) 392 { 393 if (wrapper.handlerId == source.handlerId) 394 { 395 onChangedListeners[index] = null; 396 onChangedListeners = std.algorithm.remove(onChangedListeners, index); 397 break; 398 } 399 } 400 } 401 } 402 OnChangedDelegateWrapper[] onChangedListeners; 403 404 /** 405 * Notifies of a change in the global accelerator map. 406 * The path is also used as the detail for the signal, 407 * so it is possible to connect to 408 * changed::`accel_path`. 409 * 410 * Params: 411 * accelPath = the path of the accelerator that changed 412 * accelKey = the key value for the new accelerator 413 * accelMods = the modifier mask for the new accelerator 414 * 415 * Since: 2.4 416 */ 417 gulong addOnChanged(void delegate(string, uint, GdkModifierType, AccelMap) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0) 418 { 419 auto wrapper = new OnChangedDelegateWrapper(dlg); 420 wrapper.handlerId = Signals.connectData( 421 this, 422 "changed", 423 cast(GCallback)&callBackChanged, 424 cast(void*)wrapper, 425 cast(GClosureNotify)&callBackChangedDestroy, 426 connectFlags); 427 return wrapper.handlerId; 428 } 429 430 extern(C) static void callBackChanged(GtkAccelMap* accelmapStruct, char* accelPath, uint accelKey, GdkModifierType accelMods, OnChangedDelegateWrapper wrapper) 431 { 432 wrapper.dlg(Str.toString(accelPath), accelKey, accelMods, wrapper.outer); 433 } 434 435 extern(C) static void callBackChangedDestroy(OnChangedDelegateWrapper wrapper, GClosure* closure) 436 { 437 wrapper.remove(wrapper); 438 } 439 }