Implemented "Reload" action in GTK+ GUI.
authorAndriy Grytsenko <andrej@rep.kiev.ua>
Tue, 25 Oct 2016 23:23:31 +0000 (02:23 +0300)
committerAndriy Grytsenko <andrej@rep.kiev.ua>
Tue, 25 Oct 2016 23:23:31 +0000 (02:23 +0300)
Also fixed reload problem in Openbox plugin.

plugins/gtk.c
plugins/openbox.c
src/lxhotkey.c
src/lxhotkey.h

index 9919881..39d98df 100644 (file)
@@ -32,9 +32,10 @@ static int inited = 0;
 typedef struct {
     const gchar *wm;
     const LXHotkeyPluginInit *cb;
-    gpointer config;
+    gpointer *config;
     GtkNotebook *notebook;
     GtkWidget *acts, *apps;
+    gboolean changed;
 } PluginData;
 
 static const char menu_xml[] =
@@ -62,12 +63,28 @@ static const char menu_xml[] =
     "<toolitem action='Edit'/>"
 "</toolbar>";
 
+static void set_actions_list(PluginData *data);
+static void set_apps_list(PluginData *data);
+
 static void on_reload(GtkAction *act, PluginData *data)
 {
+    GError *error = NULL;
+
+    *data->config = data->cb->load(*data->config, &error);
+    if (error)
+    {
+        g_warning("error loading config: %s",error->message);
+        g_error_free(error);
+    }
+    set_actions_list(data);
+    set_apps_list(data);
 }
 
 static void on_save(GtkAction *act, PluginData *data)
 {
+    if (!data->changed)
+        /* nothing to save */
+        return;
 }
 
 static void on_quit(GtkAction *act, PluginData *data)
@@ -121,14 +138,14 @@ static void on_notebook_switch_page(GtkNotebook *nb, gpointer *page, guint num,
 static void set_actions_list(PluginData *data)
 {
     GtkListStore *model = gtk_list_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
-    GList *apps = data->cb->get_wm_keys(data->config, "*", NULL);
+    GList *acts = data->cb->get_wm_keys(*data->config, "*", NULL);
     GList *l;
     LXHotkeyGlobal *act;
     LXHotkeyAttr *attr, *opt;
     char *val, *_val;
     GtkTreeIter iter;
 
-    for (l = apps; l; l = l->next)
+    for (l = acts; l; l = l->next)
     {
         act = l->data;
         if (act->actions == NULL)
@@ -151,7 +168,7 @@ static void set_actions_list(PluginData *data)
         g_free(_val);
         //FIXME: this is a stub, it should show something better than just first action
     }
-    g_list_free(apps);
+    g_list_free(acts);
     gtk_tree_view_set_model(GTK_TREE_VIEW(data->acts), GTK_TREE_MODEL(model));
     g_object_unref(model);
 }
@@ -159,7 +176,7 @@ static void set_actions_list(PluginData *data)
 static void set_apps_list(PluginData *data)
 {
     GtkListStore *model = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
-    GList *apps = data->cb->get_app_keys(data->config, "*", NULL);
+    GList *apps = data->cb->get_app_keys(*data->config, "*", NULL);
     GList *l;
     LXHotkeyApp *app;
     GtkTreeIter iter;
@@ -177,7 +194,7 @@ static void set_apps_list(PluginData *data)
 }
 
 static void module_gtk_run(const gchar *wm, const LXHotkeyPluginInit *cb,
-                           gpointer config, GError **error)
+                           gpointer *config, GError **error)
 {
     GtkUIManager *ui;
     GtkActionGroup *act_grp;
index b925607..60520ad 100644 (file)
@@ -502,6 +502,15 @@ static FmXmlFileTag ObXmlFile_action; /* may be multiple for a binding */
 static FmXmlFileTag ObXmlFile_command; /* for <action name="Execute"> */
 static FmXmlFileTag ObXmlFile_execute; /* obsolete alias for command */
 
+static inline void clear_stack(ObXmlFile *cfg)
+{
+    while (cfg->stack != NULL) {
+        free_options(((ObActionsList *)cfg->stack->data)->list);
+        g_free(cfg->stack->data);
+        cfg->stack = g_list_delete_link(cfg->stack, cfg->stack);
+    }
+}
+
 static gboolean tag_handler_keyboard(FmXmlFileItem *item, GList *children,
                                      char * const *attribute_names,
                                      char * const *attribute_values,
@@ -536,7 +545,7 @@ static gboolean tag_handler_keybind(FmXmlFileItem *item, GList *children,
     LXHotkeyGlobal *act;
     guint i;
 
-    if (!cfg->stack || cfg->stack->next) { /* corruption! */
+    if (!cfg->stack) { /* corruption! */
         g_set_error_literal(error, LXKEYS_OB_ERROR, LXKEYS_PARSE_ERROR,
                             _("Internal error."));
         return FALSE;
@@ -550,8 +559,9 @@ static gboolean tag_handler_keybind(FmXmlFileItem *item, GList *children,
     /* just remove top stack item, all actions are already there */
     actions = oblist->list;
     g_free(oblist);
-    g_list_free(cfg->stack);
-    cfg->stack = NULL;
+    cfg->stack = g_list_delete_link(cfg->stack, cfg->stack);
+    /* and clear junk if there were actions there - e.g. from mouse section */
+    clear_stack(cfg);
     action = actions->data;
     /* decide where to put: execs or actions */
     if (children && !children->next && /* exactly one child which is an action */
@@ -752,6 +762,12 @@ static gboolean tag_handler_action(FmXmlFileItem *item, GList *children,
     GError *err = NULL;
     guint i;
 
+    /* if section keyboard already finished then ignore this */
+    if (cfg->keyboard) {
+        /* see notes in tag_handler_keyboard() as well */
+        return TRUE;
+    }
+
     /* create a LXHotkeyAttr */
     data = lxhotkey_attr_new();
     //data->has_actions = FALSE; /* action can have only options, not sub-actions! */
@@ -814,11 +830,7 @@ static void obcfg_free(gpointer config)
     g_object_unref(cfg->xml);
     g_list_free_full(cfg->actions, (GDestroyNotify)lkxeys_action_free);
     g_list_free_full(cfg->execs, (GDestroyNotify)lkxeys_app_free);
-    while (cfg->stack != NULL) {
-        free_options(((ObActionsList *)cfg->stack->data)->list);
-        g_free(cfg->stack->data);
-        cfg->stack = g_list_delete_link(cfg->stack, cfg->stack);
-    }
+    clear_stack(cfg);
     g_list_free(cfg->added_tags);
     g_free(cfg);
 }
index 0ed7e51..3e17d63 100644 (file)
@@ -513,7 +513,7 @@ int main(int argc, char *argv[])
         {
             if (gui_plugin->t->init)
                 gui_plugin->t->init(argc, argv);
-            gui_plugin->t->run(wm_name, plugin->t, config, &error);
+            gui_plugin->t->run(wm_name, plugin->t, &config, &error);
         }
         else
             g_set_error(&error, LXKEYS_ERROR, LXKEYS_NOT_SUPPORTED,
index 62b3e8c..e1f1c17 100644 (file)
@@ -181,11 +181,12 @@ extern LXHotkeyPluginInit fm_module_init_lxhotkey;
  * @alert: callback to show an error message
  *
  * The @run callback receives name of WM, pointer to callbacks, and pointer to
- * the config data which is already succesfully loaded and ready to use.
+ * pointer to the config data which is already succesfully loaded and ready to
+ * use. Config may be reloaded by plugin if needed.
  */
 typedef struct {
     /*< public >*/
-    void (*run)(const gchar *wm, const LXHotkeyPluginInit *cb, gpointer config, GError **error);
+    void (*run)(const gchar *wm, const LXHotkeyPluginInit *cb, gpointer *config, GError **error);
     void (*alert)(GError *error);
     void (*init)(int argc, char **argv);
     /*< private >*/