Revision: 4123 http://geany.svn.sourceforge.net/geany/?rev=4123&view=rev Author: ntrel Date: 2009-08-25 16:55:56 +0000 (Tue, 25 Aug 2009)
Log Message: ----------- Remove GeanyKeyGroup struct from the API - plugins should not set these fields. Make keybindings_set_item() duplicate the name and label fields (needed by GeanyLua) and return a keybinding pointer. Add keybindings_get_item() to the API (in case it's useful). Move some keybinding code out of plugin source files.
Modified Paths: -------------- trunk/ChangeLog trunk/plugins/geanyfunctions.h trunk/src/build.c trunk/src/keybindings.c trunk/src/keybindings.h trunk/src/plugindata.h trunk/src/plugins.c trunk/src/pluginutils.c trunk/src/pluginutils.h
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2009-08-25 16:03:24 UTC (rev 4122) +++ trunk/ChangeLog 2009-08-25 16:55:56 UTC (rev 4123) @@ -2,6 +2,15 @@
* data/filetypes.markdown: Add filetypes.markdown for configuration (thanks to Jon Strait). + * src/build.c, src/keybindings.c, src/keybindings.h, src/plugindata.h, + src/pluginutils.c, src/plugins.c, src/pluginutils.h, + plugins/geanyfunctions.h: + Remove GeanyKeyGroup struct from the API - plugins should not set + these fields. + Make keybindings_set_item() duplicate the name and label fields + (needed by GeanyLua) and return a keybinding pointer. + Add keybindings_get_item() to the API (in case it's useful). + Move some keybinding code out of plugin source files.
2009-08-24 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
Modified: trunk/plugins/geanyfunctions.h =================================================================== --- trunk/plugins/geanyfunctions.h 2009-08-25 16:03:24 UTC (rev 4122) +++ trunk/plugins/geanyfunctions.h 2009-08-25 16:55:56 UTC (rev 4123) @@ -254,6 +254,8 @@ geany_functions->p_keybindings->send_command #define keybindings_set_item \ geany_functions->p_keybindings->set_item +#define keybindings_get_item \ + geany_functions->p_keybindings->get_item #define tm_get_real_path \ geany_functions->p_tm->get_real_path #define tm_source_file_new \
Modified: trunk/src/build.c =================================================================== --- trunk/src/build.c 2009-08-25 16:03:24 UTC (rev 4122) +++ trunk/src/build.c 2009-08-25 16:55:56 UTC (rev 4123) @@ -139,7 +139,7 @@ static void add_menu_accel(GeanyKeyGroup *group, guint kb_id, GtkAccelGroup *accel_group, GtkWidget *menuitem) { - GeanyKeyBinding *kb = &group->keys[kb_id]; + GeanyKeyBinding *kb = keybindings_get_item(group, kb_id);
if (kb->key != 0) gtk_widget_add_accelerator(menuitem, "activate", accel_group,
Modified: trunk/src/keybindings.c =================================================================== --- trunk/src/keybindings.c 2009-08-25 16:03:24 UTC (rev 4122) +++ trunk/src/keybindings.c 2009-08-25 16:55:56 UTC (rev 4123) @@ -25,9 +25,12 @@ * Configurable keyboard shortcuts. */
+ +#include "geany.h" + #include <gdk/gdkkeysyms.h> +#include <string.h>
-#include "geany.h" #include "keybindings.h" #include "support.h" #include "utils.h" @@ -109,6 +112,19 @@ static void add_popup_menu_accels(void);
+/** Lookup a keybinding item. + * @param group Group. + * @param key_id Keybinding index for the group. + * @return The keybinding. + * @since 0.19. */ +GeanyKeyBinding *keybindings_get_item(GeanyKeyGroup *group, gsize key_id) +{ + g_assert(key_id < group->count); + + return &group->keys[key_id]; +} + + /* This is used to set default keybindings on startup. * Menu accels are set in apply_kb_accel(). */ /** Simple convenience function to fill a GeanyKeyBinding struct item. @@ -117,25 +133,32 @@ * @param callback Function to call when activated, or @c NULL. * @param key (Lower case) default key, e.g. @c GDK_j, but usually 0 for unset. * @param mod Default modifier, e.g. @c GDK_CONTROL_MASK, but usually 0 for unset. - * @param name Key name for the configuration file, such as @c "menu_new". + * @param kf_name Key name for the configuration file, such as @c "menu_new". * @param label Label used in the preferences dialog keybindings tab. - * @param menu_item Optional widget to set an accelerator for, or @c NULL. */ -void keybindings_set_item(GeanyKeyGroup *group, gsize key_id, + * @param menu_item Optional widget to set an accelerator for, or @c NULL. + * @return The keybinding - normally this is ignored. */ +GeanyKeyBinding *keybindings_set_item(GeanyKeyGroup *group, gsize key_id, GeanyKeyCallback callback, guint key, GdkModifierType mod, - gchar *name, gchar *label, GtkWidget *menu_item) + gchar *kf_name, gchar *label, GtkWidget *menu_item) { - GeanyKeyBinding *kb; + GeanyKeyBinding *kb = keybindings_get_item(group, key_id);
- g_assert(key_id < group->count); - - kb = &group->keys[key_id]; - - kb->name = name; - kb->label = label; + if (group->plugin) + { + /* some plugins e.g. GeanyLua need these fields duplicated */ + setptr(kb->name, g_strdup(kf_name)); + setptr(kb->label, g_strdup(label)); + } + else + { + kb->name = kf_name; + kb->label = label; + } kb->key = key; kb->mods = mod; kb->callback = callback; kb->menu_item = menu_item; + return kb; }
@@ -2271,3 +2294,46 @@ kb->key, kb->mods, GTK_ACCEL_VISIBLE); }
+ +/* used for plugins */ +GeanyKeyGroup *keybindings_set_group(GeanyKeyGroup *group, const gchar *section_name, + const gchar *label, gsize count, GeanyKeyGroupCallback callback) +{ + g_return_val_if_fail(section_name, NULL); + g_return_val_if_fail(count, NULL); + g_return_val_if_fail(!callback, NULL); + + /* prevent conflict with core bindings */ + g_return_val_if_fail(!g_str_equal(section_name, keybindings_keyfile_group_name), NULL); + + if (!group) + group = g_new0(GeanyKeyGroup, 1); + + if (!group->keys || count > group->count) + { + /* allow resizing existing array of keys */ + group->keys = g_renew(GeanyKeyBinding, group->keys, count); + memset(group->keys + group->count, 0, (count - group->count) * sizeof(GeanyKeyBinding)); + } + group->plugin = TRUE; + add_kb_group(group, section_name, label, count, group->keys); + return group; +} + + +/* used for plugins */ +void keybindings_free_group(GeanyKeyGroup *group) +{ + GeanyKeyBinding *kb; + + g_assert(group->plugin); + + foreach_c_array(kb, group->keys, group->count) + { + g_free(kb->name); + g_free(kb->label); + } + g_free(group->keys); + g_ptr_array_remove_fast(keybinding_groups, group); + g_free(group); +}
Modified: trunk/src/keybindings.h =================================================================== --- trunk/src/keybindings.h 2009-08-25 16:03:24 UTC (rev 4122) +++ trunk/src/keybindings.h 2009-08-25 16:55:56 UTC (rev 4123) @@ -34,9 +34,8 @@ /** Function pointer type used for keybinding callbacks. */ typedef void (*GeanyKeyCallback) (guint key_id);
-/** Represents a single keybinding action. */ -/* Note: name and label are not const strings so plugins can set them to malloc'd strings - * and free them in cleanup(). */ +/** Represents a single keybinding action. + * Use keybindings_set_item() to set. */ typedef struct GeanyKeyBinding { guint key; /**< Key value in lower-case, such as @c GDK_a or 0 */ @@ -45,19 +44,23 @@ gchar *label; /**< Label used in the preferences dialog keybindings tab */ GeanyKeyCallback callback; /**< Function called when the key combination is pressed, or @c NULL */ GtkWidget *menu_item; /**< Optional widget to set an accelerator for, or @c NULL */ -} GeanyKeyBinding; +} +GeanyKeyBinding;
+/** A collection of keybindings grouped together. */ +typedef struct GeanyKeyGroup GeanyKeyGroup;
-/** A collection of keybindings grouped together. Plugins should not set these fields. */ -typedef struct GeanyKeyGroup +/* Plugins should not set these fields. */ +struct GeanyKeyGroup { - const gchar *name; /**< Group name used in the configuration file, such as @c "html_chars" */ + const gchar *name; /* Group name used in the configuration file, such as @c "html_chars" */ const gchar *label; /* Group label used in the preferences dialog keybindings tab */ - gsize count; /**< The number of keybindings the group holds */ + gsize count; /* number of keybindings the group holds */ GeanyKeyBinding *keys; /* array of GeanyKeyBinding structs */ -} -GeanyKeyGroup; + gboolean plugin; /* used by plugin */ +};
+ extern GPtrArray *keybinding_groups; /* array of GeanyKeyGroup pointers */
extern const gchar keybindings_keyfile_group_name[]; @@ -318,10 +321,20 @@
void keybindings_free(void);
-void keybindings_set_item(GeanyKeyGroup *group, gsize key_id, +/** Function pointer type used for keybinding group callbacks. */ +typedef gboolean (*GeanyKeyGroupCallback) (guint key_id); + +GeanyKeyGroup *keybindings_set_group(GeanyKeyGroup *group, const gchar *section_name, + const gchar *label, gsize count, GeanyKeyGroupCallback callback) G_GNUC_WARN_UNUSED_RESULT; + +void keybindings_free_group(GeanyKeyGroup *group); + +GeanyKeyBinding *keybindings_set_item(GeanyKeyGroup *group, gsize key_id, GeanyKeyCallback callback, guint key, GdkModifierType mod, gchar *name, gchar *label, GtkWidget *menu_item);
+GeanyKeyBinding *keybindings_get_item(GeanyKeyGroup *group, gsize key_id); + void keybindings_update_combo(GeanyKeyBinding *kb, guint key, GdkModifierType mods);
void keybindings_send_command(guint group_id, guint key_id);
Modified: trunk/src/plugindata.h =================================================================== --- trunk/src/plugindata.h 2009-08-25 16:03:24 UTC (rev 4122) +++ trunk/src/plugindata.h 2009-08-25 16:55:56 UTC (rev 4123) @@ -50,7 +50,7 @@ enum { /** The Application Programming Interface (API) version, incremented * whenever any plugin data types are modified or appended to. */ - GEANY_API_VERSION = 152, + GEANY_API_VERSION = 153,
/** The Application Binary Interface (ABI) version, incremented whenever * existing fields in the plugin data types have to be changed or reordered. */ @@ -471,9 +471,11 @@ typedef struct KeybindingFuncs { void (*send_command) (guint group_id, guint key_id); - void (*set_item) (struct GeanyKeyGroup *group, gsize key_id, + struct GeanyKeyBinding* (*set_item) (struct GeanyKeyGroup *group, gsize key_id, _GeanyKeyCallback callback, guint key, GdkModifierType mod, gchar *name, gchar *label, GtkWidget *menu_item); + struct GeanyKeyBinding* (*get_item)(struct GeanyKeyGroup *group, gsize key_id); + } KeybindingFuncs;
Modified: trunk/src/plugins.c =================================================================== --- trunk/src/plugins.c 2009-08-25 16:03:24 UTC (rev 4122) +++ trunk/src/plugins.c 2009-08-25 16:55:56 UTC (rev 4123) @@ -243,7 +243,8 @@
static KeybindingFuncs keybindings_funcs = { &keybindings_send_command, - &keybindings_set_item + &keybindings_set_item, + &keybindings_get_item };
static TagManagerFuncs tagmanager_funcs = { @@ -684,11 +685,8 @@ remove_callbacks(plugin);
if (plugin->key_group) - { - g_free(plugin->key_group->keys); - g_ptr_array_remove_fast(keybinding_groups, plugin->key_group); - setptr(plugin->key_group, NULL); - } + keybindings_free_group(plugin->key_group); + widget = plugin->toolbar_separator.widget; if (widget) gtk_widget_destroy(widget);
Modified: trunk/src/pluginutils.c =================================================================== --- trunk/src/pluginutils.c 2009-08-25 16:03:24 UTC (rev 4122) +++ trunk/src/pluginutils.c 2009-08-25 16:55:56 UTC (rev 4123) @@ -28,8 +28,6 @@
#include "geany.h"
-#include <string.h> - #include "pluginutils.h" #include "pluginprivate.h"
@@ -140,40 +138,11 @@ GeanyKeyGroup *plugin_set_key_group(GeanyPlugin *plugin, const gchar *section_name, gsize count, GeanyKeyGroupCallback callback) { - GeanyKeyGroup *group; GeanyPluginPrivate *priv = plugin->priv;
- g_return_val_if_fail(section_name, NULL); - g_return_val_if_fail(count, NULL); - g_return_val_if_fail(!callback, NULL); - - if (!priv->key_group) - priv->key_group = g_new0(GeanyKeyGroup, 1); - group = priv->key_group; - - group->name = section_name; - - if (!group->keys || count > group->count) - { - group->keys = g_renew(GeanyKeyBinding, group->keys, count); - memset(group->keys + group->count, 0, (count - group->count) * sizeof(GeanyKeyBinding)); - } - group->count = count; - - if (!NZV(group->name)) - { - geany_debug("Plugin "%s" has not set the name field for its keybinding group" - " - ignoring all keybindings!", - priv->info.name); - return NULL; - } - /* prevent conflict with core bindings */ - g_return_val_if_fail(! g_str_equal(group->name, keybindings_keyfile_group_name), NULL); - - group->label = priv->info.name; - - g_ptr_array_add(keybinding_groups, group); - return group; + priv->key_group = keybindings_set_group(priv->key_group, section_name, + priv->info.name, count, callback); + return priv->key_group; }
Modified: trunk/src/pluginutils.h =================================================================== --- trunk/src/pluginutils.h 2009-08-25 16:03:24 UTC (rev 4122) +++ trunk/src/pluginutils.h 2009-08-25 16:55:56 UTC (rev 4123) @@ -26,8 +26,10 @@ #ifndef PLUGINUTILS_H #define PLUGINUTILS_H
-#include "plugindata.h" /* GeanyPlugin */ +#include "plugindata.h" /* GeanyPlugin */ +#include "keybindings.h" /* GeanyKeyGroupCallback */
+ void plugin_add_toolbar_item(GeanyPlugin *plugin, GtkToolItem *item);
void plugin_module_make_resident(GeanyPlugin *plugin); @@ -36,10 +38,6 @@ GObject *object, gchar *signal_name, gboolean after, GCallback callback, gpointer user_data);
- -/** Function pointer type used for keybinding group callbacks. */ -typedef gboolean (*GeanyKeyGroupCallback) (guint key_id); - struct GeanyKeyGroup *plugin_set_key_group(GeanyPlugin *plugin, const gchar *section_name, gsize count, GeanyKeyGroupCallback callback);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.