Add a draft for 'gtk' plugin. Does nothing for now.
authorAndriy Grytsenko <andrej@rep.kiev.ua>
Mon, 24 Oct 2016 22:18:02 +0000 (01:18 +0300)
committerAndriy Grytsenko <andrej@rep.kiev.ua>
Mon, 24 Oct 2016 22:23:45 +0000 (01:23 +0300)
.gitignore
configure.ac
plugins/Makefile.am
plugins/gtk.c [new file with mode: 0644]
po/POTFILES.in
po/lxhotkey.pot

index de47094..341fb40 100644 (file)
@@ -28,3 +28,4 @@ po/POTFILES
 lxhotkey
 *.pc
 *.tar.xz
+man/lxhotkey.1
index de61baa..fde3435 100644 (file)
@@ -60,6 +60,31 @@ PKG_CHECK_MODULES(PACKAGE, [$pkg_modules])
 AC_SUBST(PACKAGE_CFLAGS)
 AC_SUBST(PACKAGE_LIBS)
 
+dnl GTK+ stuff
+AC_ARG_WITH(gtk,
+    [AC_HELP_STRING([--with-gtk=VER],
+        [build 'gtk' GUI, choose GTK+ version for build])
+AC_HELP_STRING([--without-gtk],
+        [disable 'gtk' GUI build @<:@default@:>@])],
+    [ac_with_gtk="${withval}"],
+    [ac_with_gtk=no]
+)
+
+if test x"$ac_with_gtk" != xno; then
+  case "$ac_with_gtk" in
+    3|3.*)
+      pkg_modules="gtk+-3.0"
+      ;;
+    *)
+      pkg_modules="gtk+-2.0 >= 2.18.0"
+      ;;
+  esac
+  PKG_CHECK_MODULES(GTK, [$pkg_modules], [with_gtk=yes], [with_gtk=no])
+fi
+AM_CONDITIONAL(WITH_GTK, [test x$with_gtk = xyes])
+AC_SUBST(GTK_CFLAGS)
+AC_SUBST(GTK_LIBS)
+
 dnl Test for libunistring for correct UTF-8 printf
 AC_CHECK_LIB(unistring, ulc_fprintf)
 
index 6e466e7..5464a21 100644 (file)
@@ -13,6 +13,9 @@ AM_LDFLAGS = \
 ## modules list
 pkglibdir = $(libdir)/lxhotkey
 pkglib_LTLIBRARIES = ob.la
+if WITH_GTK
+pkglib_LTLIBRARIES += gtk.la
+endif
 
 ## Openbox module
 ob_la_SOURCES = openbox.c
@@ -24,3 +27,8 @@ install-exec-hook:
 PLUGINS_INSTALLED = $(pkglib_LTLIBRARIES:.la=.so)
 uninstall-hook:
        cd $(DESTDIR)$(pkglibdir) && rm -f $(PLUGINS_INSTALLED) || true
+
+# GTK module
+gtk_la_SOURCES = gtk.c
+gtk_la_CFLAGS = $(GTK_CFLAGS)
+gtk_la_LIBADD = $(GTK_LIBS)
diff --git a/plugins/gtk.c b/plugins/gtk.c
new file mode 100644 (file)
index 0000000..34bf4ed
--- /dev/null
@@ -0,0 +1,187 @@
+/*
+ * Copyright (C) 2016 Andriy Grytsenko <andrej@rep.kiev.ua>
+ *
+ * This file is a part of LXHotkey project.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "lxhotkey.h"
+
+#include <glib/gi18n-lib.h>
+#include <gtk/gtk.h>
+
+typedef struct {
+    const gchar *wm;
+    const LXHotkeyPluginInit *cb;
+    gpointer config;
+} PluginData;
+
+static const char menu_xml[] =
+"<menubar>"
+  "<menu action='FileMenu'>"
+    "<menuitem action='Save'/>"
+    "<menuitem action='Quit'/>"
+  "</menu>"
+  "<menu action='EditMenu'>"
+    "<menuitem action='New'/>"
+    "<menuitem action='Del'/>"
+    "<menuitem action='Edit'/>"
+  "</menu>"
+  "<menu action='HelpMenu'>"
+    "<menuitem action='About'/>"
+  "</menu>"
+"</menubar>"
+"<toolbar>"
+    "<toolitem action='Save'/>"
+    "<separator/>"
+    "<toolitem action='New'/>"
+    "<toolitem action='Del'/>"
+    "<toolitem action='Edit'/>"
+"</toolbar>";
+
+static void on_save(GtkAction *act, PluginData *data)
+{
+}
+
+static void on_quit(GtkAction *act, PluginData *data)
+{
+    gtk_main_quit();
+}
+
+static void on_new(GtkAction *act, PluginData *data)
+{
+}
+
+static void on_del(GtkAction *act, PluginData *data)
+{
+}
+
+static void on_edit(GtkAction *act, PluginData *data)
+{
+}
+
+static void on_about(GtkAction *act, PluginData *data)
+{
+}
+
+static GtkActionEntry actions[] =
+{
+    { "FileMenu", NULL, N_("_File"), NULL, NULL, NULL },
+        { "Save", GTK_STOCK_SAVE, NULL, NULL, NULL, G_CALLBACK(on_save) },
+        { "Quit", GTK_STOCK_QUIT, NULL, NULL, NULL, G_CALLBACK(on_quit) },
+    { "EditMenu", NULL, N_("_Edit"), NULL, NULL, NULL },
+        { "New", GTK_STOCK_NEW, NULL, NULL, NULL, G_CALLBACK(on_new) },
+        { "Del", GTK_STOCK_DELETE, NULL, "", NULL, G_CALLBACK(on_del) },
+        { "Edit", GTK_STOCK_EDIT, NULL, NULL, NULL, G_CALLBACK(on_edit) },
+    { "HelpMenu", NULL, N_("_Help"), NULL, NULL, NULL },
+        { "About", GTK_STOCK_ABOUT, NULL, NULL, NULL, G_CALLBACK(on_about) }
+};
+
+static void on_notebook_switch_page(GtkNotebook *nb, gpointer *page, guint num,
+                                    PluginData *data)
+{
+}
+
+static void module_gtk_run(const gchar *wm, const LXHotkeyPluginInit *cb,
+                           gpointer config, GError **error)
+{
+    GtkUIManager *ui;
+    GtkActionGroup *act_grp;
+    GtkAccelGroup *accel_grp;
+    GtkWidget *win, *menubar;
+    GtkToolbar *toolbar;
+    GtkBox *vbox;
+    GtkWidget *acts, *apps;
+    GtkNotebook *notebook;
+    PluginData data;
+    int i = 0;
+
+    gtk_init(&i, NULL);
+
+    data.wm = wm;
+    data.cb = cb;
+    data.config = config;
+
+    win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+    gtk_window_set_default_size(GTK_WINDOW(win), 400, 300);
+    g_signal_connect(win, "destroy", G_CALLBACK(gtk_main_quit), NULL);
+
+    vbox = (GtkBox *)gtk_vbox_new(FALSE, 0);
+
+    /* create menu bar and toolbar */
+    ui = gtk_ui_manager_new();
+    act_grp = gtk_action_group_new("Main");
+    gtk_action_group_set_translation_domain(act_grp, NULL);
+    gtk_action_group_add_actions(act_grp, actions, G_N_ELEMENTS(actions), &data);
+
+    accel_grp = gtk_ui_manager_get_accel_group(ui);
+    gtk_window_add_accel_group(GTK_WINDOW(win), accel_grp);
+
+    gtk_ui_manager_insert_action_group(ui, act_grp, 0);
+    gtk_ui_manager_add_ui_from_string(ui, menu_xml, -1, NULL);
+    g_object_unref(act_grp);
+
+    menubar = gtk_ui_manager_get_widget(ui, "/menubar");
+    toolbar = GTK_TOOLBAR(gtk_ui_manager_get_widget(ui, "/toolbar"));
+
+    /* FIXME: use some style? */
+    gtk_toolbar_set_icon_size(toolbar, GTK_ICON_SIZE_SMALL_TOOLBAR);
+    gtk_toolbar_set_style(toolbar, GTK_TOOLBAR_ICONS);
+
+    gtk_box_pack_start(vbox, menubar, FALSE, TRUE, 0);
+    gtk_box_pack_start(vbox, GTK_WIDGET(toolbar), FALSE, TRUE, 0);
+
+    /* notebook - it contains two tabs: Actions and Programs */
+    notebook = (GtkNotebook*)gtk_notebook_new();
+    gtk_notebook_set_scrollable(notebook, TRUE);
+    gtk_container_set_border_width(GTK_CONTAINER(notebook), 0);
+
+    g_signal_connect_after(notebook, "switch-page",
+                           G_CALLBACK(on_notebook_switch_page), &data);
+
+    gtk_box_pack_start(vbox, GTK_WIDGET(notebook), TRUE, TRUE, 0);
+
+    /* setup notebook */
+    acts = gtk_tree_view_new();
+    //...
+    
+    gtk_notebook_append_page(notebook, acts, gtk_label_new(_("Actions")));
+
+    apps = gtk_tree_view_new();
+    //...
+    
+    gtk_notebook_append_page(notebook, apps, gtk_label_new(_("Programs")));
+
+    /* and finally run it all */
+    gtk_container_add(GTK_CONTAINER(win), GTK_WIDGET(vbox));
+    gtk_widget_show_all(win);
+    gtk_main();
+}
+
+static void module_gtk_alert(GError *error)
+{
+}
+
+FM_DEFINE_MODULE(lxhotkey_gui, gtk)
+
+LXHotkeyGUIPluginInit fm_module_init_lxhotkey_gui = {
+    .run = module_gtk_run,
+    .alert = module_gtk_alert
+};
index 888dfe1..b2c008d 100644 (file)
@@ -1,2 +1,3 @@
 src/lxhotkey.c
 plugins/openbox.c
+plugins/gtk.c
index d00e798..82948a4 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-03-10 21:19+0200\n"
+"POT-Creation-Date: 2016-10-25 01:16+0300\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,625 +17,647 @@ msgstr ""
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ../src/lxhotkey.c:228
+#: ../src/lxhotkey.c:229
 #, c-format
 msgid "Usage: %s global [<action>]      - show keys bound to action(s)\n"
 msgstr ""
 
-#: ../src/lxhotkey.c:229
+#: ../src/lxhotkey.c:230
 #, c-format
 msgid "       %s global <action> <key>  - bind a key to the action\n"
 msgstr ""
 
-#: ../src/lxhotkey.c:230
+#: ../src/lxhotkey.c:231
 #, c-format
 msgid "       %s app [<exec>]           - show keys bound to exec line\n"
 msgstr ""
 
-#: ../src/lxhotkey.c:231
+#: ../src/lxhotkey.c:232
 #, c-format
 msgid "       %s app <exec> <key>       - bind a key to some exec line\n"
 msgstr ""
 
-#: ../src/lxhotkey.c:232
+#: ../src/lxhotkey.c:233
 #, c-format
 msgid "       %s app <exec> --          - unbind all keys from exec line\n"
 msgstr ""
 
-#: ../src/lxhotkey.c:233
+#: ../src/lxhotkey.c:234
 #, c-format
 msgid "       %s show <key>             - show the action bound to a key\n"
 msgstr ""
 
-#: ../src/lxhotkey.c:234
+#: ../src/lxhotkey.c:235
 #, c-format
 msgid "       %s --gui=<type>           - start with GUI\n"
 msgstr ""
 
-#: ../src/lxhotkey.c:329
+#: ../src/lxhotkey.c:330
 msgid "empty option name."
 msgstr ""
 
-#: ../src/lxhotkey.c:332
+#: ../src/lxhotkey.c:333
 msgid "empty action name."
 msgstr ""
 
-#: ../src/lxhotkey.c:364
+#: ../src/lxhotkey.c:365
 #, c-format
 msgid "no matching option '%s' found for action '%s'."
 msgstr ""
 
-#: ../src/lxhotkey.c:368
+#: ../src/lxhotkey.c:369
 #, c-format
 msgid "action '%s' isn't supported by WM %s."
 msgstr ""
 
-#: ../src/lxhotkey.c:385
+#: ../src/lxhotkey.c:386
 #, c-format
 msgid "value '%s' is not supported for option '%s'."
 msgstr ""
 
-#: ../src/lxhotkey.c:389
+#: ../src/lxhotkey.c:390
 #, c-format
 msgid "value '%s' is not supported for action '%s'."
 msgstr ""
 
-#: ../src/lxhotkey.c:402
+#: ../src/lxhotkey.c:403
 #, c-format
 msgid "action '%s' does not support options."
 msgstr ""
 
-#: ../src/lxhotkey.c:466
+#: ../src/lxhotkey.c:467
 #, c-format
 msgid "LXHotkey: sorry, cannot configure keys remotely.\n"
 msgstr ""
 
-#: ../src/lxhotkey.c:493
+#: ../src/lxhotkey.c:494
 #, c-format
 msgid "Window manager %s isn't supported now, sorry."
 msgstr ""
 
-#: ../src/lxhotkey.c:500
+#: ../src/lxhotkey.c:501
 msgid "Problems loading configuration: "
 msgstr ""
 
-#: ../src/lxhotkey.c:509
+#: ../src/lxhotkey.c:510
 #, c-format
 msgid "GUI type %s currently isn't supported."
 msgstr ""
 
 #. invalid request
-#: ../src/lxhotkey.c:526 ../src/lxhotkey.c:602
+#: ../src/lxhotkey.c:527 ../src/lxhotkey.c:603
 msgid "Invalid request: "
 msgstr ""
 
-#: ../src/lxhotkey.c:536 ../src/lxhotkey.c:614
+#: ../src/lxhotkey.c:537 ../src/lxhotkey.c:615
 msgid "Problems saving configuration: "
 msgstr ""
 
-#: ../src/lxhotkey.c:553
+#: ../src/lxhotkey.c:554
 msgid "ACTION(s)"
 msgstr ""
 
-#: ../src/lxhotkey.c:553 ../src/lxhotkey.c:631
+#: ../src/lxhotkey.c:554 ../src/lxhotkey.c:632
 msgid "KEY(s)"
 msgstr ""
 
-#: ../src/lxhotkey.c:631
+#: ../src/lxhotkey.c:632
 msgid "EXEC"
 msgstr ""
 
-#: ../src/lxhotkey.c:652
+#: ../src/lxhotkey.c:653
 msgid "Requested operation isn't supported."
 msgstr ""
 
-#: ../plugins/openbox.c:139
+#: ../plugins/openbox.c:203
 msgid "Failed to reconfigure Openbox."
 msgstr ""
 
 #. reuse GList
 #. reuse GList
-#: ../plugins/openbox.c:161
+#: ../plugins/openbox.c:222
 msgid "yes"
 msgstr ""
 
-#: ../plugins/openbox.c:161
+#: ../plugins/openbox.c:222
 msgid "no"
 msgstr ""
 
-#: ../plugins/openbox.c:164
+#: ../plugins/openbox.c:225
 msgid "enabled"
 msgstr ""
 
-#: ../plugins/openbox.c:165
+#: ../plugins/openbox.c:226
 msgid "wmclass"
 msgstr ""
 
-#: ../plugins/openbox.c:166
+#: ../plugins/openbox.c:227
 msgid "name"
 msgstr ""
 
-#: ../plugins/openbox.c:167
+#: ../plugins/openbox.c:228
 msgid "icon"
 msgstr ""
 
-#: ../plugins/openbox.c:172 ../plugins/openbox.c:244
+#: ../plugins/openbox.c:233 ../plugins/openbox.c:305
 msgid "command"
 msgstr ""
 
-#: ../plugins/openbox.c:173 ../plugins/openbox.c:249
+#: ../plugins/openbox.c:234 ../plugins/openbox.c:310
 msgid "prompt"
 msgstr ""
 
-#: ../plugins/openbox.c:174
+#: ../plugins/openbox.c:235
 msgid "startupnotify"
 msgstr ""
 
-#: ../plugins/openbox.c:178 ../plugins/openbox.c:281
+#: ../plugins/openbox.c:239 ../plugins/openbox.c:342
 msgid "center"
 msgstr ""
 
-#: ../plugins/openbox.c:179
+#: ../plugins/openbox.c:240
 msgid "default"
 msgstr ""
 
-#: ../plugins/openbox.c:179
+#: ../plugins/openbox.c:240
 msgid "primary"
 msgstr ""
 
-#: ../plugins/openbox.c:179
+#: ../plugins/openbox.c:240
 msgid "mouse"
 msgstr ""
 
-#: ../plugins/openbox.c:180
+#: ../plugins/openbox.c:241
 msgid "active"
 msgstr ""
 
-#: ../plugins/openbox.c:180 ../plugins/openbox.c:283
+#: ../plugins/openbox.c:241 ../plugins/openbox.c:344
 msgid "all"
 msgstr ""
 
-#: ../plugins/openbox.c:185 ../plugins/openbox.c:290
+#: ../plugins/openbox.c:246 ../plugins/openbox.c:351
 msgid "monitor"
 msgstr ""
 
-#: ../plugins/openbox.c:190
+#: ../plugins/openbox.c:251
 msgid "menu"
 msgstr ""
 
-#: ../plugins/openbox.c:191
+#: ../plugins/openbox.c:252
 msgid "position"
 msgstr ""
 
-#: ../plugins/openbox.c:195
+#: ../plugins/openbox.c:256
 msgid "list"
 msgstr ""
 
-#: ../plugins/openbox.c:195
+#: ../plugins/openbox.c:256
 msgid "icons"
 msgstr ""
 
-#: ../plugins/openbox.c:195
+#: ../plugins/openbox.c:256
 msgid "none"
 msgstr ""
 
-#: ../plugins/openbox.c:198 ../plugins/openbox.c:216
+#: ../plugins/openbox.c:259 ../plugins/openbox.c:277
 msgid "dialog"
 msgstr ""
 
-#: ../plugins/openbox.c:199 ../plugins/openbox.c:217
+#: ../plugins/openbox.c:260 ../plugins/openbox.c:278
 msgid "bar"
 msgstr ""
 
-#: ../plugins/openbox.c:200 ../plugins/openbox.c:218
+#: ../plugins/openbox.c:261 ../plugins/openbox.c:279
 msgid "raise"
 msgstr ""
 
-#: ../plugins/openbox.c:201
+#: ../plugins/openbox.c:262
 msgid "allDesktops"
 msgstr ""
 
-#: ../plugins/openbox.c:202 ../plugins/openbox.c:219
+#: ../plugins/openbox.c:263 ../plugins/openbox.c:280
 msgid "panels"
 msgstr ""
 
-#: ../plugins/openbox.c:203
+#: ../plugins/openbox.c:264
 msgid "desktop"
 msgstr ""
 
-#: ../plugins/openbox.c:204
+#: ../plugins/openbox.c:265
 msgid "linear"
 msgstr ""
 
-#: ../plugins/openbox.c:205
+#: ../plugins/openbox.c:266
 msgid "interactive"
 msgstr ""
 
-#: ../plugins/openbox.c:206 ../plugins/openbox.c:221
+#: ../plugins/openbox.c:267 ../plugins/openbox.c:282
 msgid "finalactions"
 msgstr ""
 
-#: ../plugins/openbox.c:210 ../plugins/openbox.c:226 ../plugins/openbox.c:261
-#: ../plugins/openbox.c:312
+#: ../plugins/openbox.c:271 ../plugins/openbox.c:287 ../plugins/openbox.c:322
+#: ../plugins/openbox.c:373
 msgid "north"
 msgstr ""
 
-#: ../plugins/openbox.c:210
+#: ../plugins/openbox.c:271
 msgid "northeast"
 msgstr ""
 
-#: ../plugins/openbox.c:210 ../plugins/openbox.c:227 ../plugins/openbox.c:262
-#: ../plugins/openbox.c:312
+#: ../plugins/openbox.c:271 ../plugins/openbox.c:288 ../plugins/openbox.c:323
+#: ../plugins/openbox.c:373
 msgid "east"
 msgstr ""
 
-#: ../plugins/openbox.c:211
+#: ../plugins/openbox.c:272
 msgid "southeast"
 msgstr ""
 
-#: ../plugins/openbox.c:211 ../plugins/openbox.c:226 ../plugins/openbox.c:261
-#: ../plugins/openbox.c:312
+#: ../plugins/openbox.c:272 ../plugins/openbox.c:287 ../plugins/openbox.c:322
+#: ../plugins/openbox.c:373
 msgid "south"
 msgstr ""
 
-#: ../plugins/openbox.c:211
+#: ../plugins/openbox.c:272
 msgid "southwest"
 msgstr ""
 
-#: ../plugins/openbox.c:212 ../plugins/openbox.c:227 ../plugins/openbox.c:262
-#: ../plugins/openbox.c:312
+#: ../plugins/openbox.c:273 ../plugins/openbox.c:288 ../plugins/openbox.c:323
+#: ../plugins/openbox.c:373
 msgid "west"
 msgstr ""
 
-#: ../plugins/openbox.c:212
+#: ../plugins/openbox.c:273
 msgid "northwest"
 msgstr ""
 
-#: ../plugins/openbox.c:215 ../plugins/openbox.c:256 ../plugins/openbox.c:315
+#: ../plugins/openbox.c:276 ../plugins/openbox.c:317 ../plugins/openbox.c:376
 msgid "direction"
 msgstr ""
 
-#: ../plugins/openbox.c:220
+#: ../plugins/openbox.c:281
 msgid "desktops"
 msgstr ""
 
-#: ../plugins/openbox.c:225 ../plugins/openbox.c:236 ../plugins/openbox.c:260
-#: ../plugins/openbox.c:281 ../plugins/openbox.c:282 ../plugins/openbox.c:283
+#: ../plugins/openbox.c:286 ../plugins/openbox.c:297 ../plugins/openbox.c:321
+#: ../plugins/openbox.c:342 ../plugins/openbox.c:343 ../plugins/openbox.c:344
 msgid "current"
 msgstr ""
 
-#: ../plugins/openbox.c:225 ../plugins/openbox.c:260 ../plugins/openbox.c:283
+#: ../plugins/openbox.c:286 ../plugins/openbox.c:321 ../plugins/openbox.c:344
 msgid "next"
 msgstr ""
 
-#: ../plugins/openbox.c:225 ../plugins/openbox.c:260
+#: ../plugins/openbox.c:286 ../plugins/openbox.c:321
 msgid "previous"
 msgstr ""
 
-#: ../plugins/openbox.c:226 ../plugins/openbox.c:236 ../plugins/openbox.c:261
+#: ../plugins/openbox.c:287 ../plugins/openbox.c:297 ../plugins/openbox.c:322
 msgid "last"
 msgstr ""
 
-#: ../plugins/openbox.c:226 ../plugins/openbox.c:261
+#: ../plugins/openbox.c:287 ../plugins/openbox.c:322
 msgid "up"
 msgstr ""
 
-#: ../plugins/openbox.c:227 ../plugins/openbox.c:262
+#: ../plugins/openbox.c:288 ../plugins/openbox.c:323
 msgid "down"
 msgstr ""
 
-#: ../plugins/openbox.c:227 ../plugins/openbox.c:262 ../plugins/openbox.c:272
-#: ../plugins/openbox.c:305
+#: ../plugins/openbox.c:288 ../plugins/openbox.c:323 ../plugins/openbox.c:333
+#: ../plugins/openbox.c:366
 msgid "left"
 msgstr ""
 
-#: ../plugins/openbox.c:228 ../plugins/openbox.c:263 ../plugins/openbox.c:272
-#: ../plugins/openbox.c:306
+#: ../plugins/openbox.c:289 ../plugins/openbox.c:324 ../plugins/openbox.c:333
+#: ../plugins/openbox.c:367
 msgid "right"
 msgstr ""
 
-#: ../plugins/openbox.c:231 ../plugins/openbox.c:266
+#: ../plugins/openbox.c:292 ../plugins/openbox.c:327
 msgid "to"
 msgstr ""
 
-#: ../plugins/openbox.c:232 ../plugins/openbox.c:267
+#: ../plugins/openbox.c:293 ../plugins/openbox.c:328
 msgid "wrap"
 msgstr ""
 
-#: ../plugins/openbox.c:239
+#: ../plugins/openbox.c:300
 msgid "where"
 msgstr ""
 
-#: ../plugins/openbox.c:253
+#: ../plugins/openbox.c:314
 msgid "both"
 msgstr ""
 
-#: ../plugins/openbox.c:253
+#: ../plugins/openbox.c:314
 msgid "horizontal"
 msgstr ""
 
-#: ../plugins/openbox.c:253
+#: ../plugins/openbox.c:314
 msgid "vertical"
 msgstr ""
 
-#: ../plugins/openbox.c:268
+#: ../plugins/openbox.c:329
 msgid "follow"
 msgstr ""
 
-#: ../plugins/openbox.c:272 ../plugins/openbox.c:307 ../plugins/openbox.c:319
+#: ../plugins/openbox.c:333 ../plugins/openbox.c:368 ../plugins/openbox.c:380
 msgid "top"
 msgstr ""
 
-#: ../plugins/openbox.c:272 ../plugins/openbox.c:308 ../plugins/openbox.c:319
+#: ../plugins/openbox.c:333 ../plugins/openbox.c:369 ../plugins/openbox.c:380
 msgid "bottom"
 msgstr ""
 
-#: ../plugins/openbox.c:273
+#: ../plugins/openbox.c:334
 msgid "topleft"
 msgstr ""
 
-#: ../plugins/openbox.c:273
+#: ../plugins/openbox.c:334
 msgid "topright"
 msgstr ""
 
-#: ../plugins/openbox.c:273
+#: ../plugins/openbox.c:334
 msgid "bottomleft"
 msgstr ""
 
-#: ../plugins/openbox.c:274
+#: ../plugins/openbox.c:335
 msgid "bottomright"
 msgstr ""
 
-#: ../plugins/openbox.c:277
+#: ../plugins/openbox.c:338
 msgid "edge"
 msgstr ""
 
-#: ../plugins/openbox.c:283
+#: ../plugins/openbox.c:344
 msgid "prev"
 msgstr ""
 
-#: ../plugins/openbox.c:288
+#: ../plugins/openbox.c:349
 msgid "width"
 msgstr ""
 
-#: ../plugins/openbox.c:289
+#: ../plugins/openbox.c:350
 msgid "height"
 msgstr ""
 
-#: ../plugins/openbox.c:319
+#: ../plugins/openbox.c:380
 msgid "normal"
 msgstr ""
 
-#: ../plugins/openbox.c:322
+#: ../plugins/openbox.c:383
 msgid "layer"
 msgstr ""
 
 #. global actions
-#: ../plugins/openbox.c:328
+#: ../plugins/openbox.c:389
 msgid "Execute"
 msgstr ""
 
-#: ../plugins/openbox.c:329
+#: ../plugins/openbox.c:390
 msgid "ShowMenu"
 msgstr ""
 
-#: ../plugins/openbox.c:330
+#: ../plugins/openbox.c:391
 msgid "NextWindow"
 msgstr ""
 
-#: ../plugins/openbox.c:331
+#: ../plugins/openbox.c:392
 msgid "PreviousWindow"
 msgstr ""
 
-#: ../plugins/openbox.c:332
+#: ../plugins/openbox.c:393
 msgid "DirectionalCycleWindows"
 msgstr ""
 
-#: ../plugins/openbox.c:333
+#: ../plugins/openbox.c:394
 msgid "DirectionalTargetWindow"
 msgstr ""
 
-#: ../plugins/openbox.c:334
+#: ../plugins/openbox.c:395
 msgid "GoToDesktop"
 msgstr ""
 
-#: ../plugins/openbox.c:335
+#: ../plugins/openbox.c:396
 msgid "AddDesktop"
 msgstr ""
 
-#: ../plugins/openbox.c:336
+#: ../plugins/openbox.c:397
 msgid "RemoveDesktop"
 msgstr ""
 
-#: ../plugins/openbox.c:337
+#: ../plugins/openbox.c:398
 msgid "ToggleDockAutohide"
 msgstr ""
 
-#: ../plugins/openbox.c:338
+#: ../plugins/openbox.c:399
 msgid "Reconfigure"
 msgstr ""
 
-#: ../plugins/openbox.c:339
+#: ../plugins/openbox.c:400
 msgid "Restart"
 msgstr ""
 
-#: ../plugins/openbox.c:340
+#: ../plugins/openbox.c:401
 msgid "Exit"
 msgstr ""
 
 #. windows actions
-#: ../plugins/openbox.c:342
+#: ../plugins/openbox.c:403
 msgid "Focus"
 msgstr ""
 
-#: ../plugins/openbox.c:343
+#: ../plugins/openbox.c:404
 msgid "Raise"
 msgstr ""
 
-#: ../plugins/openbox.c:344
+#: ../plugins/openbox.c:405
 msgid "Lower"
 msgstr ""
 
-#: ../plugins/openbox.c:345
+#: ../plugins/openbox.c:406
 msgid "RaiseLower"
 msgstr ""
 
-#: ../plugins/openbox.c:346
+#: ../plugins/openbox.c:407
 msgid "Unfocus"
 msgstr ""
 
-#: ../plugins/openbox.c:347
+#: ../plugins/openbox.c:408
 msgid "FocusToBottom"
 msgstr ""
 
-#: ../plugins/openbox.c:348
+#: ../plugins/openbox.c:409
 msgid "Iconify"
 msgstr ""
 
-#: ../plugins/openbox.c:349
+#: ../plugins/openbox.c:410
 msgid "Close"
 msgstr ""
 
-#: ../plugins/openbox.c:350
+#: ../plugins/openbox.c:411
 msgid "ToggleShade"
 msgstr ""
 
-#: ../plugins/openbox.c:351
+#: ../plugins/openbox.c:412
 msgid "Shade"
 msgstr ""
 
-#: ../plugins/openbox.c:352
+#: ../plugins/openbox.c:413
 msgid "Unshade"
 msgstr ""
 
-#: ../plugins/openbox.c:353
+#: ../plugins/openbox.c:414
 msgid "ToggleOmnipresent"
 msgstr ""
 
-#: ../plugins/openbox.c:354
+#: ../plugins/openbox.c:415
 msgid "ToggleMaximize"
 msgstr ""
 
-#: ../plugins/openbox.c:355
+#: ../plugins/openbox.c:416
 msgid "Maximize"
 msgstr ""
 
-#: ../plugins/openbox.c:356
+#: ../plugins/openbox.c:417
 msgid "Unmaximize"
 msgstr ""
 
-#: ../plugins/openbox.c:357
+#: ../plugins/openbox.c:418
 msgid "ToggleFullscreen"
 msgstr ""
 
-#: ../plugins/openbox.c:358
+#: ../plugins/openbox.c:419
 msgid "ToggleDecorations"
 msgstr ""
 
-#: ../plugins/openbox.c:359
+#: ../plugins/openbox.c:420
 msgid "Decorate"
 msgstr ""
 
-#: ../plugins/openbox.c:360
+#: ../plugins/openbox.c:421
 msgid "Undecorate"
 msgstr ""
 
-#: ../plugins/openbox.c:361
+#: ../plugins/openbox.c:422
 msgid "SendToDesktop"
 msgstr ""
 
-#: ../plugins/openbox.c:362
+#: ../plugins/openbox.c:423
 msgid "Move"
 msgstr ""
 
-#: ../plugins/openbox.c:363
+#: ../plugins/openbox.c:424
 msgid "Resize"
 msgstr ""
 
-#: ../plugins/openbox.c:364
+#: ../plugins/openbox.c:425
 msgid "MoveResizeTo"
 msgstr ""
 
-#: ../plugins/openbox.c:365
+#: ../plugins/openbox.c:426
 msgid "MoveRelative"
 msgstr ""
 
-#: ../plugins/openbox.c:366
+#: ../plugins/openbox.c:427
 msgid "ResizeRelative"
 msgstr ""
 
-#: ../plugins/openbox.c:367
+#: ../plugins/openbox.c:428
 msgid "MoveToEdge"
 msgstr ""
 
-#: ../plugins/openbox.c:368
+#: ../plugins/openbox.c:429
 msgid "GrowToEdge"
 msgstr ""
 
-#: ../plugins/openbox.c:369
+#: ../plugins/openbox.c:430
 msgid "ShrinkToEdge"
 msgstr ""
 
-#: ../plugins/openbox.c:370
+#: ../plugins/openbox.c:431
 msgid "GrowToFill"
 msgstr ""
 
-#: ../plugins/openbox.c:371
+#: ../plugins/openbox.c:432
 msgid "ToggleAlwaysOnTop"
 msgstr ""
 
-#: ../plugins/openbox.c:372
+#: ../plugins/openbox.c:433
 msgid "ToggleAlwaysOnBottom"
 msgstr ""
 
-#: ../plugins/openbox.c:373
+#: ../plugins/openbox.c:434
 msgid "SendToLayer"
 msgstr ""
 
-#: ../plugins/openbox.c:455
+#: ../plugins/openbox.c:516
 msgid "Duplicate <keyboard> section in the rc.xml file."
 msgstr ""
 
-#: ../plugins/openbox.c:480 ../plugins/openbox.c:486 ../plugins/openbox.c:721
+#: ../plugins/openbox.c:541 ../plugins/openbox.c:547 ../plugins/openbox.c:782
 msgid "Internal error."
 msgstr ""
 
-#: ../plugins/openbox.c:529
+#: ../plugins/openbox.c:590
 msgid "rc.xml error: no key is set for a keybind."
 msgstr ""
 
-#: ../plugins/openbox.c:600
+#: ../plugins/openbox.c:661
 msgid "Invalid rc.xml: action with a sub-action."
 msgstr ""
 
-#: ../plugins/openbox.c:710
+#: ../plugins/openbox.c:771
 msgid "rc.xml error: no name is set for action."
 msgstr ""
 
-#: ../plugins/openbox.c:740
+#: ../plugins/openbox.c:801
 #, c-format
 msgid "rc.xml error: empty tag <%s> is prohibited."
 msgstr ""
 
-#: ../plugins/openbox.c:829
+#: ../plugins/openbox.c:894
 msgid "Could not find the rc.xml file anywhere."
 msgstr ""
 
-#: ../plugins/openbox.c:875 ../plugins/openbox.c:988 ../plugins/openbox.c:1132
-#: ../plugins/openbox.c:1150
+#: ../plugins/openbox.c:940 ../plugins/openbox.c:1053
+#: ../plugins/openbox.c:1197 ../plugins/openbox.c:1215
 msgid "No WM configuration is available."
 msgstr ""
 
-#: ../plugins/openbox.c:992
+#: ../plugins/openbox.c:1057
 msgid "Keybinding should activate at least one action."
 msgstr ""
 
-#: ../plugins/openbox.c:1014 ../plugins/openbox.c:1024
-#: ../plugins/openbox.c:1176 ../plugins/openbox.c:1186
+#: ../plugins/openbox.c:1079 ../plugins/openbox.c:1089
+#: ../plugins/openbox.c:1241 ../plugins/openbox.c:1251
 #, c-format
 msgid "Hotkey '%s' is already bound to an action."
 msgstr ""
 
-#: ../plugins/openbox.c:1154
+#: ../plugins/openbox.c:1219
 msgid "The exec line cannot be empty."
 msgstr ""
+
+#: ../plugins/gtk.c:86
+msgid "_File"
+msgstr ""
+
+#: ../plugins/gtk.c:89
+msgid "_Edit"
+msgstr ""
+
+#: ../plugins/gtk.c:93
+msgid "_Help"
+msgstr ""
+
+#. ...
+#: ../plugins/gtk.c:165
+msgid "Actions"
+msgstr ""
+
+#. ...
+#: ../plugins/gtk.c:170
+msgid "Programs"
+msgstr ""