adding trunk
authorDana Jansens <danakj@orodu.net>
Thu, 12 Jul 2007 06:57:08 +0000 (02:57 -0400)
committerDana Jansens <danakj@orodu.net>
Thu, 12 Jul 2007 06:57:08 +0000 (02:57 -0400)
Signed-off-by: Dana Jansens <danakj@orodu.net>
110 files changed:
.svnignore [deleted file]
Makefile.am
data/rc.xsd
data/xsession/.svnignore [deleted file]
debian/.svnignore [deleted file]
doc/.svnignore [deleted file]
m4/.svnignore [deleted file]
openbox/action.h [deleted file]
openbox/actions.c [new file with mode: 0644]
openbox/actions.h [new file with mode: 0644]
openbox/actions/Makefile [new file with mode: 0644]
openbox/actions/addremovedesktop.c [new file with mode: 0644]
openbox/actions/all.c [new file with mode: 0644]
openbox/actions/all.h [new file with mode: 0644]
openbox/actions/breakchroot.c [new file with mode: 0644]
openbox/actions/close.c [new file with mode: 0644]
openbox/actions/cyclewindows.c [new file with mode: 0644]
openbox/actions/debug.c [new file with mode: 0644]
openbox/actions/decorations.c [new file with mode: 0644]
openbox/actions/desktop.c [new file with mode: 0644]
openbox/actions/directionalcyclewindows.c [new file with mode: 0644]
openbox/actions/directionaldesktop.c [new file with mode: 0644]
openbox/actions/directionaltargetwindow.c [new file with mode: 0644]
openbox/actions/dockautohide.c [new file with mode: 0644]
openbox/actions/execute.c [new file with mode: 0644]
openbox/actions/exit.c [new file with mode: 0644]
openbox/actions/focus.c [new file with mode: 0644]
openbox/actions/fullscreen.c [new file with mode: 0644]
openbox/actions/growtoedge.c [new file with mode: 0644]
openbox/actions/iconify.c [new file with mode: 0644]
openbox/actions/if.c [new file with mode: 0644]
openbox/actions/kill.c [new file with mode: 0644]
openbox/actions/layer.c [new file with mode: 0644]
openbox/actions/lower.c [new file with mode: 0644]
openbox/actions/maximize.c [new file with mode: 0644]
openbox/actions/maximizehorizontal.c [new file with mode: 0644]
openbox/actions/maximizevertical.c [new file with mode: 0644]
openbox/actions/menu.c [new file with mode: 0644]
openbox/actions/move.c [new file with mode: 0644]
openbox/actions/moverelative.c [new file with mode: 0644]
openbox/actions/moveresizeto.c [new file with mode: 0644]
openbox/actions/movetoedge.c [new file with mode: 0644]
openbox/actions/omnipresent.c [new file with mode: 0644]
openbox/actions/raise.c [new file with mode: 0644]
openbox/actions/raiselower.c [new file with mode: 0644]
openbox/actions/reconfigure.c [new file with mode: 0644]
openbox/actions/resize.c [new file with mode: 0644]
openbox/actions/resizerelative.c [new file with mode: 0644]
openbox/actions/restart.c [new file with mode: 0644]
openbox/actions/shade.c [new file with mode: 0644]
openbox/actions/showdesktop.c [new file with mode: 0644]
openbox/actions/unfocus.c [new file with mode: 0644]
openbox/client.h
openbox/client_list_combined_menu.c
openbox/client_list_menu.c
openbox/client_menu.c
openbox/composite.c [new file with mode: 0644]
openbox/composite.h [new file with mode: 0644]
openbox/config.c
openbox/event.c
openbox/focus.c
openbox/focus_cycle.c
openbox/focus_cycle.h
openbox/frame.c
openbox/frame.h
openbox/keyboard.c
openbox/keyboard.h
openbox/keytree.c
openbox/keytree.h
openbox/mainloop.c
openbox/mainloop.h
openbox/menu.c
openbox/menu.h
openbox/menuframe.c
openbox/menuframe.h
openbox/mouse.c
openbox/mouse.h
openbox/openbox.c
openbox/place.c
openbox/resist.c
openbox/startupnotify.c
openbox/startupnotify.h
po/.svnignore [deleted file]
po/POTFILES.in
po/ar.po
po/bn_IN.po
po/ca.po
po/cs.po
po/de.po
po/en@boldquot.po
po/en@quot.po
po/es.po
po/et.po
po/fi.po
po/fr.po
po/it.po
po/ja.po
po/nl.po
po/no.po
po/openbox.pot
po/pl.po
po/pt.po
po/pt_BR.po
po/ru.po
po/sk.po
po/sv.po
po/vi.po
po/zh_CN.po
po/zh_TW.po
tests/.svnignore [deleted file]

diff --git a/.svnignore b/.svnignore
deleted file mode 100644 (file)
index 3481fc0..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-configure
-build-stamp
-Makefile.in
-config.rpath
-config.log
-depcomp
-compile
-config.guess
-ltmain.sh
-config.sub
-ABOUT-NLS
-config.status.lineno
-Makefile
-mkinstalldirs
-config.status
-libtool
-autom4te.cache
-missing
-version.h
-aclocal.m4
index d8a4d5007380983b2efd43c26ead957334032bec..27114f80349e186222dadb39250a41c093ab69e0 100644 (file)
@@ -148,8 +148,49 @@ openbox_openbox_LDADD = \
 openbox_openbox_LDFLAGS = -export-dynamic
 openbox_openbox_SOURCES = \
        gettext.h \
-       openbox/action.c \
-       openbox/action.h \
+       openbox/actions/all.c \
+       openbox/actions/all.h \
+       openbox/actions/addremovedesktop.c \
+       openbox/actions/breakchroot.c \
+       openbox/actions/close.c \
+       openbox/actions/cyclewindows.c \
+       openbox/actions/debug.c \
+       openbox/actions/decorations.c \
+       openbox/actions/desktop.c \
+       openbox/actions/dockautohide.c \
+       openbox/actions/directionalcyclewindows.c \
+       openbox/actions/directionaldesktop.c \
+       openbox/actions/directionaltargetwindow.c \
+       openbox/actions/execute.c \
+       openbox/actions/exit.c \
+       openbox/actions/focus.c \
+       openbox/actions/fullscreen.c \
+       openbox/actions/growtoedge.c \
+       openbox/actions/iconify.c \
+       openbox/actions/if.c \
+       openbox/actions/kill.c \
+       openbox/actions/layer.c \
+       openbox/actions/lower.c \
+       openbox/actions/maximize.c \
+       openbox/actions/maximizehorizontal.c \
+       openbox/actions/maximizevertical.c \
+       openbox/actions/menu.c \
+       openbox/actions/move.c \
+       openbox/actions/moverelative.c \
+       openbox/actions/moveresizeto.c \
+       openbox/actions/movetoedge.c \
+       openbox/actions/omnipresent.c \
+       openbox/actions/raise.c \
+       openbox/actions/raiselower.c \
+       openbox/actions/reconfigure.c \
+       openbox/actions/resize.c \
+       openbox/actions/resizerelative.c \
+       openbox/actions/restart.c \
+       openbox/actions/shade.c \
+       openbox/actions/showdesktop.c \
+       openbox/actions/unfocus.c \
+       openbox/actions.c \
+       openbox/actions.h \
        openbox/client.c \
        openbox/client.h \
        openbox/client_list_menu.c \
index aa1c45a93a022a6e436b469f63aa86c825bfada5..debac5bb6ff64a3f636638235ba418c808e6f10a 100644 (file)
@@ -3,8 +3,8 @@
 <!-- XML Schema for the Openbox window manager configuration file -->
 
 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
-    targetNamespace="http://openbox.org/3.4/rc"
-    xmlns:ob="http://openbox.org/3.4/rc"
+    targetNamespace="http://openbox.org/4.0/rc"
+    xmlns:ob="http://openbox.org/4.0/rc"
     elementFormDefault="qualified">
     <!--
          root node
             <xsd:enumeration value="Reconfigure"/>
             <xsd:enumeration value="Resize"/>
             <xsd:enumeration value="ResizeRelative"/>
+            <xsd:enumeration value="ResizeRelativeHorz"/>
+            <xsd:enumeration value="ResizeRelativeVert"/>
             <xsd:enumeration value="Restart"/>
             <xsd:enumeration value="SendToBottomLayer"/>
             <xsd:enumeration value="SendToDesktop"/>
             <xsd:enumeration value="Left"/>
             <xsd:enumeration value="Right"/>
             <xsd:enumeration value="Bottom"/>
-            <xsd:enumeration value="Handle"/>
             <xsd:enumeration value="Maximize"/>
             <xsd:enumeration value="AllDesktops"/>
             <xsd:enumeration value="Shade"/>
diff --git a/data/xsession/.svnignore b/data/xsession/.svnignore
deleted file mode 100644 (file)
index f4018d6..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-openbox.desktop
-openbox-kde.desktop
-openbox-gnome.desktop
-openbox-session
-openbox-kde-session
-openbox-gnome-session
diff --git a/debian/.svnignore b/debian/.svnignore
deleted file mode 100644 (file)
index bb49320..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-openbox.postinst.debhelper
-openbox.postrm.debhelper
-changelog
-files
-openbox.substvars
-openbox
diff --git a/doc/.svnignore b/doc/.svnignore
deleted file mode 100644 (file)
index cbbd841..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-openbox-session.1
-openbox-kde-session.1
-openbox-gnome-session.1
-openbox.1
diff --git a/m4/.svnignore b/m4/.svnignore
deleted file mode 100644 (file)
index 423e303..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-
-lib-link.m4
-printf-posix.m4
-Makefile.in
-intldir.m4
-uintmax_t.m4
-signed.m4
-iconv.m4
-inttypes.m4
-longlong.m4
-glibc21.m4
-codeset.m4
-inttypes_h.m4
-visibility.m4
-lock.m4
-longdouble.m4
-nls.m4
-Makefile
-intmax.m4
-lib-prefix.m4
-glibc2.m4
-xsize.m4
-lcmessage.m4
-lib-ld.m4
-ulonglong.m4
-wint_t.m4
-inttypes-h.m4
-intl.m4
-progtest.m4
-inttypes-pri.m4
-stdint_h.m4
-intdiv0.m4
-po.m4
-isc-posix.m4
-size_max.m4
-gettext.m4
-wchar_t.m4
diff --git a/openbox/action.h b/openbox/action.h
deleted file mode 100644 (file)
index 17e3576..0000000
+++ /dev/null
@@ -1,370 +0,0 @@
-/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-
-   action.h for the Openbox window manager
-   Copyright (c) 2006        Mikael Magnusson
-   Copyright (c) 2003-2007   Dana Jansens
-
-   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.
-
-   See the COPYING file for a copy of the GNU General Public License.
-*/
-
-#ifndef __action_h
-#define __action_h
-
-#include "misc.h"
-#include "frame.h"
-#include "parser/parse.h"
-
-struct _ObClient;
-
-typedef struct _ObAction ObAction;
-
-/* These have to all have a Client* at the top even if they don't use it, so
-   that I can set it blindly later on. So every function will have a Client*
-   available (possibly NULL though) if it wants it.
-*/
-
-typedef enum
-{
-    OB_CLIENT_ACTION_NO,
-    OB_CLIENT_ACTION_OPTIONAL,
-    OB_CLIENT_ACTION_ALWAYS
-} ObClientActionReq;
-
-struct AnyAction {
-    ObClientActionReq client_action;
-    struct _ObClient *c;
-    ObFrameContext context;
-    gboolean interactive;
-    gint x;
-    gint y;
-    gint button;
-    Time time;
-};
-
-struct InteractiveAction {
-    struct AnyAction any;
-    gboolean final;
-    gboolean cancel;
-};
-
-struct InterDirectionalAction{
-    struct InteractiveAction inter;
-    ObDirection direction;
-    gboolean dialog;
-    gboolean dock_windows;
-    gboolean desktop_windows;
-};
-
-struct DirectionalAction{
-    struct AnyAction any;
-    ObDirection direction;
-    gboolean hang;
-};
-
-struct Debug {
-    gchar *string;
-};
-
-struct Execute {
-    struct AnyAction any;
-    gchar *path;
-    gboolean startupnotify;
-    gchar *name;
-    gchar *icon_name;
-};
-
-struct ClientAction {
-    struct AnyAction any;
-};
-
-struct Activate {
-    struct AnyAction any;
-    gboolean here; /* bring it to the current desktop */
-};
-
-struct MoveResizeRelative {
-    struct AnyAction any;
-    gint deltax;
-    gint deltay;
-    gint deltaxl;
-    gint deltayu;
-};
-
-struct SendToDesktop {
-    struct AnyAction any;
-    guint desk;
-    gboolean follow;
-};
-
-struct SendToDesktopDirection {
-    struct InteractiveAction inter;
-    ObDirection dir;
-    gboolean wrap;
-    gboolean linear;
-    gboolean follow;
-};
-
-struct Desktop {
-    struct AnyAction inter;
-    guint desk;
-};
-
-struct Layer {
-    struct AnyAction any;
-    gint layer; /* < 0 = below, 0 = normal, > 0 = above */
-};
-
-struct DesktopDirection {
-    struct InteractiveAction inter;
-    ObDirection dir;
-    gboolean wrap;
-    gboolean linear;
-};
-
-struct MoveResize {
-    struct AnyAction any;
-    gboolean keyboard;
-    guint32 corner;
-};
-
-struct ShowMenu {
-    struct AnyAction any;
-    gchar *name;
-};
-
-struct AddRemoveDesktop {
-    struct AnyAction any;
-    gboolean current;
-};
-
-struct CycleWindows {
-    struct InteractiveAction inter;
-    gboolean linear;
-    gboolean forward;
-    gboolean dialog;
-    gboolean dock_windows;
-    gboolean desktop_windows;
-    gboolean all_desktops;
-};
-
-struct Stacking {
-    struct AnyAction any;
-};
-
-union ActionData {
-    struct AnyAction any;
-    struct InteractiveAction inter;
-    struct InterDirectionalAction interdiraction;
-    struct DirectionalAction diraction;
-    struct Debug debug;
-    struct Execute execute;
-    struct ClientAction client;
-    struct Activate activate;
-    struct MoveResizeRelative relative;
-    struct SendToDesktop sendto;
-    struct SendToDesktopDirection sendtodir;
-    struct Desktop desktop;
-    struct DesktopDirection desktopdir;
-    struct MoveResize moveresize;
-    struct ShowMenu showmenu;
-    struct CycleWindows cycle;
-    struct Layer layer;
-    struct Stacking stacking;
-    struct AddRemoveDesktop addremovedesktop;
-};
-
-struct _ObAction {
-    guint ref;
-
-    /* The func member acts like an enum to tell which one of the structs in
-       the data union are valid.
-    */
-    void (*func)(union ActionData *data);
-    union ActionData data;
-};
-
-/* Creates a new Action from the name of the action
-   A few action types need data set after making this call still. Check if
-   the returned action's "func" is one of these.
-   action_debug - the string to print should be set
-   action_execute - the path needs to be set
-   action_restart - the path can optionally be set
-   action_desktop - the destination desktop needs to be set
-   action_send_to_desktop - the destination desktop needs to be set
-   action_move_relative_horz - the delta
-   action_move_relative_vert - the delta
-   action_resize_relative_horz - the delta
-   action_resize_relative_vert - the delta
-   action_move_relative - the deltas
-   action_resize_relative - the deltas
-*/
-
-ObAction* action_from_string(const gchar *name, ObUserAction uact);
-ObAction* action_parse(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
-                       ObUserAction uact);
-void action_ref(ObAction *a);
-void action_unref(ObAction *a);
-
-ObAction* action_copy(const ObAction *a);
-
-/*! Executes a list of actions.
-  @param c The client associated with the action. Can be NULL.
-  @param state The keyboard modifiers state at the time the user action occured
-  @param button The mouse button used to execute the action.
-  @param x The x coord at which the user action occured.
-  @param y The y coord at which the user action occured.
-  @param cancel If the action is cancelling an interactive action. This only
-         affects interactive actions, but should generally always be FALSE.
-  @param done If the action is completing an interactive action. This only
-         affects interactive actions, but should generally always be FALSE.
-*/
-void action_run_list(GSList *acts, struct _ObClient *c, ObFrameContext context,
-                     guint state, guint button, gint x, gint y, Time time,
-                     gboolean cancel, gboolean done);
-
-#define action_run_mouse(a, c, n, s, b, x, y, t) \
-    action_run_list(a, c, n, s, b, x, y, t, FALSE, FALSE)
-
-#define action_run_interactive(a, c, s, t, n, d) \
-    action_run_list(a, c, OB_FRAME_CONTEXT_NONE, s, 0, -1, -1, t, n, d)
-
-#define action_run_key(a, c, s, x, y, t) \
-    action_run_list(a, c, OB_FRAME_CONTEXT_NONE, s, 0, x, y, t, FALSE, FALSE)
-
-#define action_run(a, c, s, t) \
-    action_run_list(a, c, OB_FRAME_CONTEXT_NONE, s, 0, -1, -1, t, FALSE, FALSE)
-
-void action_run_string(const gchar *name, struct _ObClient *c, Time time);
-
-/* Debug */
-void action_debug(union ActionData *data);
-/* Execute */
-void action_execute(union ActionData *data);
-/* ActivateAction */
-void action_activate(union ActionData *data);
-/* ClientAction */
-void action_focus(union ActionData *data);
-/* ClientAction */
-void action_unfocus(union ActionData *data);
-/* ClientAction */
-void action_iconify(union ActionData *data);
-/* ClientAction */
-void action_focus_order_to_bottom(union ActionData *data);
-/* ClientAction */
-void action_raiselower(union ActionData *data);
-/* ClientAction */
-void action_raise(union ActionData *data);
-/* ClientAction */
-void action_lower(union ActionData *data);
-/* ClientAction */
-void action_close(union ActionData *data);
-/* ClientAction */
-void action_kill(union ActionData *data);
-/* ClientAction */
-void action_shade(union ActionData *data);
-/* ClientAction */
-void action_shadelower(union ActionData *data);
-/* ClientAction */
-void action_unshaderaise(union ActionData *data);
-/* ClientAction */
-void action_unshade(union ActionData *data);
-/* ClientAction */
-void action_toggle_shade(union ActionData *data);
-/* ClientAction */
-void action_toggle_omnipresent(union ActionData *data);
-/* MoveResizeRelative */
-void action_move_relative_horz(union ActionData *data);
-/* MoveResizeRelative */
-void action_move_relative_vert(union ActionData *data);
-/* MoveResizeRelative */
-void action_move_relative(union ActionData *data);
-/* MoveResizeRelative */
-void action_resize_relative(union ActionData *data);
-/* ClientAction */
-void action_move_to_center(union ActionData *data);
-/* MoveResizeRelative */
-void action_resize_relative_horz(union ActionData *data);
-/* MoveResizeRelative */
-void action_resize_relative_vert(union ActionData *data);
-/* ClientAction */
-void action_maximize_full(union ActionData *data);
-/* ClientAction */
-void action_unmaximize_full(union ActionData *data);
-/* ClientAction */
-void action_toggle_maximize_full(union ActionData *data);
-/* ClientAction */
-void action_maximize_horz(union ActionData *data);
-/* ClientAction */
-void action_unmaximize_horz(union ActionData *data);
-/* ClientAction */
-void action_toggle_maximize_horz(union ActionData *data);
-/* ClientAction */
-void action_maximize_vert(union ActionData *data);
-/* ClientAction */
-void action_unmaximize_vert(union ActionData *data);
-/* ClientAction */
-void action_toggle_maximize_vert(union ActionData *data);
-/* ClientAction */
-void action_toggle_fullscreen(union ActionData *data);
-/* SendToDesktop */
-void action_send_to_desktop(union ActionData *data);
-/* SendToDesktopDirection */
-void action_send_to_desktop_dir(union ActionData *data);
-/* Desktop */
-void action_desktop(union ActionData *data);
-/* DesktopDirection */
-void action_desktop_dir(union ActionData *data);
-/* Any */
-void action_desktop_last(union ActionData *data);
-/* ClientAction */
-void action_toggle_decorations(union ActionData *data);
-/* Move */
-void action_move(union ActionData *data);
-/* Resize */
-void action_resize(union ActionData *data);
-/* Any */
-void action_reconfigure(union ActionData *data);
-/* Execute */
-void action_restart(union ActionData *data);
-/* Any */
-void action_exit(union ActionData *data);
-/* ShowMenu */
-void action_showmenu(union ActionData *data);
-/* CycleWindows */
-void action_cycle_windows(union ActionData *data);
-/* InterDirectionalAction */
-void action_directional_focus(union ActionData *data);
-/* DirectionalAction */
-void action_movetoedge(union ActionData *data);
-/* DirectionalAction */
-void action_growtoedge(union ActionData *data);
-/* Layer */
-void action_send_to_layer(union ActionData *data);
-/* Layer */
-void action_toggle_layer(union ActionData *data);
-/* Any */
-void action_toggle_dockautohide(union ActionData *data);
-/* Any */
-void action_toggle_show_desktop(union ActionData *data);
-/* Any */
-void action_show_desktop(union ActionData *data);
-/* Any */
-void action_unshow_desktop(union ActionData *data);
-/* Any */
-void action_break_chroot(union ActionData *data);
-/* AddRemoveDesktop */
-void action_add_desktop(union ActionData *data);
-/* AddRemoveDesktop */
-void action_remove_desktop(union ActionData *data);
-
-#endif
diff --git a/openbox/actions.c b/openbox/actions.c
new file mode 100644 (file)
index 0000000..0f37526
--- /dev/null
@@ -0,0 +1,353 @@
+/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
+
+   actions.h for the Openbox window manager
+   Copyright (c) 2007        Dana Jansens
+
+   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.
+
+   See the COPYING file for a copy of the GNU General Public License.
+*/
+
+#include "actions.h"
+#include "gettext.h"
+#include "grab.h"
+#include "screen.h"
+#include "event.h"
+#include "config.h"
+#include "client.h"
+#include "debug.h"
+
+#include "actions/all.h"
+
+static void     actions_definition_ref(ObActionsDefinition *def);
+static void     actions_definition_unref(ObActionsDefinition *def);
+static gboolean actions_interactive_begin_act(ObActionsAct *act, guint state);
+static void     actions_interactive_end_act();
+static ObActionsAct* actions_build_act_from_string(const gchar *name);
+
+static ObActionsAct *interactive_act = NULL;
+static guint         interactive_initial_state = 0;
+
+struct _ObActionsDefinition {
+    guint ref;
+
+    gchar *name;
+
+    ObActionsDataSetupFunc setup;
+    ObActionsDataFreeFunc free;
+    ObActionsRunFunc run;
+    ObActionsInteractiveInputFunc i_input;
+    ObActionsInteractiveCancelFunc i_cancel;
+};
+
+struct _ObActionsAct {
+    guint ref;
+
+    ObActionsDefinition *def;
+    gpointer options;
+};
+
+static GSList *registered = NULL;
+
+
+void actions_startup(gboolean reconfig)
+{
+    if (reconfig) return;
+
+    action_all_startup();
+}
+
+void actions_shutdown(gboolean reconfig)
+{
+    actions_interactive_cancel_act();
+
+    if (reconfig) return;
+
+    /* free all the registered actions */
+    while (registered) {
+        actions_definition_unref(registered->data);
+        registered = g_slist_delete_link(registered, registered);
+    }
+}
+
+gboolean actions_register(const gchar *name,
+                          ObActionsDataSetupFunc setup,
+                          ObActionsDataFreeFunc free,
+                          ObActionsRunFunc run,
+                          ObActionsInteractiveInputFunc i_input,
+                          ObActionsInteractiveCancelFunc i_cancel)
+{
+    GSList *it;
+    ObActionsDefinition *def;
+
+    g_assert(run != NULL);
+    g_assert((i_input == NULL) == (i_cancel == NULL));
+
+    for (it = registered; it; it = g_slist_next(it)) {
+        def = it->data;
+        if (!g_ascii_strcasecmp(name, def->name)) /* already registered */
+            return FALSE;
+    }
+
+    def = g_new(ObActionsDefinition, 1);
+    def->ref = 1;
+    def->name = g_strdup(name);
+    def->setup = setup;
+    def->free = free;
+    def->run = run;
+    def->i_input = i_input;
+    def->i_cancel = i_cancel;
+
+    registered = g_slist_prepend(registered, def);
+
+    return TRUE;
+}
+
+static void actions_definition_ref(ObActionsDefinition *def)
+{
+    ++def->ref;
+}
+
+static void actions_definition_unref(ObActionsDefinition *def)
+{
+    if (def && --def->ref == 0) {
+        g_free(def->name);
+        g_free(def);
+    }
+}
+
+ObActionsAct* actions_build_act_from_string(const gchar *name)
+{
+    GSList *it;
+    ObActionsDefinition *def = NULL;
+    ObActionsAct *act = NULL;
+
+    /* find the requested action */
+    for (it = registered; it; it = g_slist_next(it)) {
+        def = it->data;
+        if (!g_ascii_strcasecmp(name, def->name))
+            break;
+        def = NULL;
+    }
+
+    /* if we found the action */
+    if (def) {
+        act = g_new(ObActionsAct, 1);
+        act->ref = 1;
+        act->def = def;
+        actions_definition_ref(act->def);
+        act->options = NULL;
+    } else
+        g_message(_("Invalid action '%s' requested. No such action exists."),
+                  name);
+
+    return act;
+}
+
+ObActionsAct* actions_parse_string(const gchar *name)
+{
+    ObActionsAct *act = NULL;
+
+    if ((act = actions_build_act_from_string(name)))
+        if (act->def->setup)
+            act->options = act->def->setup(NULL, NULL, NULL);
+
+    return act;
+}
+
+ObActionsAct* actions_parse(ObParseInst *i,
+                            xmlDocPtr doc,
+                            xmlNodePtr node)
+{
+    gchar *name;
+    ObActionsAct *act = NULL;
+
+    if (parse_attr_string("name", node, &name)) {
+        if ((act = actions_build_act_from_string(name)))
+            /* there is more stuff to parse here */
+            if (act->def->setup)
+                act->options = act->def->setup(i, doc, node->xmlChildrenNode);
+
+        g_free(name);
+    }
+
+    return act;
+}
+
+gboolean actions_act_is_interactive(ObActionsAct *act)
+{
+    return act->def->i_cancel != NULL;
+}
+
+void actions_act_ref(ObActionsAct *act)
+{
+    ++act->ref;
+}
+
+void actions_act_unref(ObActionsAct *act)
+{
+    if (act && --act->ref == 0) {
+        /* free the action specific options */
+        if (act->def->free)
+            act->def->free(act->options);
+        /* unref the definition */
+        actions_definition_unref(act->def);
+        g_free(act);
+    }
+}
+
+static void actions_setup_data(ObActionsData *data,
+                               ObUserAction uact,
+                               guint state,
+                               gint x,
+                               gint y,
+                               gint button,
+                               ObFrameContext con,
+                               struct _ObClient *client)
+{
+    data->uact = uact;
+    data->state = state;
+    data->x = x;
+    data->y = y;
+    data->button = button;
+    data->context = con;
+    data->client = client;
+}
+
+void actions_run_acts(GSList *acts,
+                      ObUserAction uact,
+                      guint state,
+                      gint x,
+                      gint y,
+                      gint button,
+                      ObFrameContext con,
+                      struct _ObClient *client)
+{
+    GSList *it;
+
+    /* Don't allow saving the initial state when running things from the
+       menu */
+    if (uact == OB_USER_ACTION_MENU_SELECTION)
+        state = 0;
+    /* If x and y are < 0 then use the current pointer position */
+    if (x < 0 && y < 0)
+        screen_pointer_pos(&x, &y);
+
+    for (it = acts; it; it = g_slist_next(it)) {
+        ObActionsData data;
+        ObActionsAct *act = it->data;
+        gboolean ok = TRUE;
+
+        actions_setup_data(&data, uact, state, x, y, button, con, client);
+
+        if (!interactive_act || interactive_act->def != act->def) {
+            if (actions_act_is_interactive(act)) {
+                /* cancel the old one */
+                if (interactive_act)
+                    actions_interactive_cancel_act();
+                ok = actions_interactive_begin_act(act, state);
+            }
+        }
+
+        /* fire the action's run function with this data */
+        if (ok) {
+            if (!act->def->run(&data, act->options)) {
+                if (actions_act_is_interactive(act))
+                    actions_interactive_end_act();
+            } else {
+                /* make sure its interactive if it returned TRUE */
+                g_assert(act->def->i_cancel && act->def->i_input);
+
+                /* no actions are run after the interactive one */
+                break;
+            }
+        }
+    }
+}
+
+gboolean actions_interactive_act_running()
+{
+    return interactive_act != NULL;
+}
+
+void actions_interactive_cancel_act()
+{
+    if (interactive_act) {
+        interactive_act->def->i_cancel(interactive_act->options);
+        actions_interactive_end_act();
+    }
+}
+
+static gboolean actions_interactive_begin_act(ObActionsAct *act, guint state)
+{
+    if (grab_keyboard()) {
+        interactive_act = act;
+        actions_act_ref(interactive_act);
+
+        interactive_initial_state = state;
+        return TRUE;
+    }
+    else
+        return FALSE;
+}
+
+static void actions_interactive_end_act()
+{
+    if (interactive_act) {
+        ungrab_keyboard();
+
+        actions_act_unref(interactive_act);
+        interactive_act = NULL;
+    }
+}
+
+gboolean actions_interactive_input_event(XEvent *e)
+{
+    gboolean used = FALSE;
+    if (interactive_act) {
+        if (!interactive_act->def->i_input(interactive_initial_state, e,
+                                           interactive_act->options, &used))
+        {
+            used = TRUE; /* if it cancelled the action then it has to of
+                            been used */
+            actions_interactive_end_act();
+        }
+    }
+    return used;
+}
+
+void actions_client_move(ObActionsData *data, gboolean start)
+{
+    static gulong ignore_start = 0;
+    if (start)
+        ignore_start = event_start_ignore_all_enters();
+    else if (config_focus_follow &&
+             data->context != OB_FRAME_CONTEXT_CLIENT)
+    {
+        if (!data->button && data->client && !config_focus_under_mouse)
+            event_end_ignore_all_enters(ignore_start);
+        else {
+            struct _ObClient *c;
+
+            /* usually this is sorta redundant, but with a press action
+               that moves windows our from under the cursor, the enter
+               event will come as a GrabNotify which is ignored, so this
+               makes a fake enter event
+            */
+            if ((c = client_under_pointer()) && c != data->client) {
+                ob_debug_type(OB_DEBUG_FOCUS,
+                              "Generating fake enter because we did a "
+                              "mouse-event action");
+                event_enter_client(c);
+            }
+        }
+    }
+}
diff --git a/openbox/actions.h b/openbox/actions.h
new file mode 100644 (file)
index 0000000..477e4ba
--- /dev/null
@@ -0,0 +1,95 @@
+/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
+
+   actions.h for the Openbox window manager
+   Copyright (c) 2007        Dana Jansens
+
+   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.
+
+   See the COPYING file for a copy of the GNU General Public License.
+*/
+
+#include "misc.h"
+#include "frame.h"
+#include "parser/parse.h"
+#include <glib.h>
+#include <X11/Xlib.h>
+
+typedef struct _ObActionsDefinition   ObActionsDefinition;
+typedef struct _ObActionsAct          ObActionsAct;
+typedef struct _ObActionsData         ObActionsData;
+typedef struct _ObActionsAnyData      ObActionsAnyData;
+typedef struct _ObActionsGlobalData   ObActionsGlobalData;
+typedef struct _ObActionsClientData   ObActionsClientData;
+typedef struct _ObActionsSelectorData ObActionsSelectorData;
+
+typedef gpointer (*ObActionsDataSetupFunc)(ObParseInst *i,
+                                           xmlDocPtr doc, xmlNodePtr node);
+typedef void     (*ObActionsDataFreeFunc)(gpointer options);
+typedef gboolean (*ObActionsRunFunc)(ObActionsData *data,
+                                     gpointer options);
+typedef gboolean (*ObActionsInteractiveInputFunc)(guint initial_state,
+                                                  XEvent *e,
+                                                  gpointer options,
+                                                  gboolean *used);
+typedef void     (*ObActionsInteractiveCancelFunc)(gpointer options);
+
+struct _ObActionsData {
+    ObUserAction uact;
+    guint state;
+    gint x;
+    gint y;
+    gint button;
+
+    struct _ObClient *client;
+    ObFrameContext context;
+};
+
+void actions_startup(gboolean reconfigure);
+void actions_shutdown(gboolean reconfigure);
+
+/*! If the action is interactive, then i_input and i_cancel are not NULL.
+  Otherwise, they should both be NULL. */
+gboolean actions_register(const gchar *name,
+                          ObActionsDataSetupFunc setup,
+                          ObActionsDataFreeFunc free,
+                          ObActionsRunFunc run,
+                          ObActionsInteractiveInputFunc i_input,
+                          ObActionsInteractiveCancelFunc i_cancel);
+
+ObActionsAct* actions_parse(ObParseInst *i,
+                            xmlDocPtr doc,
+                            xmlNodePtr node);
+ObActionsAct* actions_parse_string(const gchar *name);
+
+gboolean actions_act_is_interactive(ObActionsAct *act);
+
+void actions_act_ref(ObActionsAct *act);
+void actions_act_unref(ObActionsAct *act);
+
+/*! Pass in a GSList of ObActionsAct's to be run.
+  @return TRUE if an action is in interactive state, FALSE is none are
+*/
+void actions_run_acts(GSList *acts,
+                      ObUserAction uact,
+                      guint state,
+                      gint x,
+                      gint y,
+                      gint button,
+                      ObFrameContext con,
+                      struct _ObClient *client);
+
+gboolean actions_interactive_act_running();
+void actions_interactive_cancel_act();
+
+gboolean actions_interactive_input_event(XEvent *e);
+
+/*! Function for actions to call when they are moving a client around */
+void actions_client_move(ObActionsData *data, gboolean start);
diff --git a/openbox/actions/Makefile b/openbox/actions/Makefile
new file mode 100644 (file)
index 0000000..b90edac
--- /dev/null
@@ -0,0 +1,4 @@
+all clean install:
+       $(MAKE) -C .. -$(MAKEFLAGS) $@
+
+.PHONY: all clean install
diff --git a/openbox/actions/addremovedesktop.c b/openbox/actions/addremovedesktop.c
new file mode 100644 (file)
index 0000000..c8904d3
--- /dev/null
@@ -0,0 +1,87 @@
+#include "openbox/actions.h"
+#include "openbox/screen.h"
+#include <glib.h>
+
+typedef struct {
+    gboolean current;
+    gboolean add;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static gpointer setup_add_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static gpointer setup_remove_func(ObParseInst *i,
+                                  xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_addremovedesktop_startup()
+{
+    actions_register("AddDesktop",
+                     setup_add_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+    actions_register("RemoveDesktop",
+                     setup_remove_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+
+    if ((n = parse_find_node("where", node))) {
+        gchar *s = parse_string(doc, n);
+        if (!g_ascii_strcasecmp(s, "last"))
+            o->current = FALSE;
+        else if (!g_ascii_strcasecmp(s, "current"))
+            o->current = TRUE;
+        g_free(s);
+    }
+
+    return o;
+}
+
+static gpointer setup_add_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    Options *o = setup_func(i, doc, node);
+    o->add = TRUE;
+    return o;
+}
+
+static gpointer setup_remove_func(ObParseInst *i,
+                                  xmlDocPtr doc, xmlNodePtr node)
+{
+    Options *o = setup_func(i, doc, node);
+    o->add = FALSE;
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    g_free(o);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+
+    actions_client_move(data, TRUE);
+
+    if (o->add)
+        screen_add_desktop(o->current);
+    else
+        screen_remove_desktop(o->current);
+
+    actions_client_move(data, FALSE);
+
+    return FALSE;
+}
diff --git a/openbox/actions/all.c b/openbox/actions/all.c
new file mode 100644 (file)
index 0000000..1bf963a
--- /dev/null
@@ -0,0 +1,44 @@
+#include "all.h"
+
+void action_all_startup()
+{
+    action_execute_startup();
+    action_debug_startup();
+    action_menu_startup();
+    action_showdesktop_startup();
+    action_reconfigure_startup();
+    action_exit_startup();
+    action_restart_startup();
+    action_cyclewindows_startup();
+    action_breakchroot_startup();
+    action_close_startup();
+    action_move_startup();
+    action_focus_startup();
+    action_raise_startup();
+    action_lower_startup();
+    action_raiselower_startup();
+    action_unfocus_startup();
+    action_iconify_startup();
+    action_fullscreen_startup();
+    action_maximize_startup();
+    action_maximizehorizontal_startup();
+    action_maximizevertical_startup();
+    action_moveresizeto_startup();
+    action_moverelative_startup();
+    action_shade_startup();
+    action_kill_startup();
+    action_omnipresent_startup();
+    action_directionalcyclewindows_startup();
+    action_directionaltargetwindow_startup();
+    action_resize_startup();
+    action_decorations_startup();
+    action_desktop_startup();
+    action_directionaldesktop_startup();
+    action_resizerelative_startup();
+    action_addremovedesktop_startup();
+    action_dockautohide_startup();
+    action_layer_startup();
+    action_movetoedge_startup();
+    action_growtoedge_startup();
+    action_if_startup();
+}
diff --git a/openbox/actions/all.h b/openbox/actions/all.h
new file mode 100644 (file)
index 0000000..acb54dc
--- /dev/null
@@ -0,0 +1,46 @@
+#ifndef __actions_all_h
+#define __actions_all_h
+
+void action_all_startup();
+
+void action_execute_startup();
+void action_debug_startup();
+void action_menu_startup();
+void action_showdesktop_startup();
+void action_reconfigure_startup();
+void action_exit_startup();
+void action_restart_startup();
+void action_cyclewindows_startup();
+void action_breakchroot_startup();
+void action_close_startup();
+void action_move_startup();
+void action_focus_startup();
+void action_raise_startup();
+void action_lower_startup();
+void action_raiselower_startup();
+void action_unfocus_startup();
+void action_iconify_startup();
+void action_fullscreen_startup();
+void action_maximize_startup();
+void action_maximizehorizontal_startup();
+void action_maximizevertical_startup();
+void action_moveresizeto_startup();
+void action_moverelative_startup();
+void action_shade_startup();
+void action_kill_startup();
+void action_omnipresent_startup();
+void action_directionalcyclewindows_startup();
+void action_directionaltargetwindow_startup();
+void action_resize_startup();
+void action_decorations_startup();
+void action_desktop_startup();
+void action_directionaldesktop_startup();
+void action_resizerelative_startup();
+void action_addremovedesktop_startup();
+void action_dockautohide_startup();
+void action_layer_startup();
+void action_movetoedge_startup();
+void action_growtoedge_startup();
+void action_if_startup();
+
+#endif
diff --git a/openbox/actions/breakchroot.c b/openbox/actions/breakchroot.c
new file mode 100644 (file)
index 0000000..bfdbf16
--- /dev/null
@@ -0,0 +1,21 @@
+#include "openbox/actions.h"
+#include "openbox/keyboard.h"
+
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_breakchroot_startup()
+{
+    actions_register("BreakChroot",
+                     NULL, NULL,
+                     run_func,
+                     NULL, NULL);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    /* break out of one chroot */
+    keyboard_reset_chains(1);
+
+    return FALSE;
+}
diff --git a/openbox/actions/close.c b/openbox/actions/close.c
new file mode 100644 (file)
index 0000000..37260e1
--- /dev/null
@@ -0,0 +1,20 @@
+#include "openbox/actions.h"
+#include "openbox/client.h"
+
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_close_startup()
+{
+    actions_register("Close",
+                     NULL, NULL,
+                     run_func,
+                     NULL, NULL);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    if (data->client) client_close(data->client);
+
+    return FALSE;
+}
diff --git a/openbox/actions/cyclewindows.c b/openbox/actions/cyclewindows.c
new file mode 100644 (file)
index 0000000..23b2c51
--- /dev/null
@@ -0,0 +1,160 @@
+#include "openbox/actions.h"
+#include "openbox/event.h"
+#include "openbox/focus_cycle.h"
+#include "openbox/openbox.h"
+#include "gettext.h"
+
+typedef struct {
+    gboolean linear;
+    gboolean dialog;
+    gboolean dock_windows;
+    gboolean desktop_windows;
+    gboolean all_desktops;
+    gboolean forward;
+    GSList *actions;
+} Options;
+
+static gboolean cycling = FALSE;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+static gboolean i_input_func(guint initial_state,
+                             XEvent *e,
+                             gpointer options,
+                             gboolean *used);
+static void     i_cancel_func(gpointer options);
+
+static void     end_cycle(gboolean cancel, guint state, Options *o);
+
+void action_cyclewindows_startup()
+{
+    actions_register("CycleWindows",
+                     setup_func,
+                     free_func,
+                     run_func,
+                     i_input_func,
+                     i_cancel_func);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+    o->dialog = TRUE;
+    o->forward = TRUE;
+
+    if ((n = parse_find_node("forward", node)))
+        o->forward = parse_bool(doc, n);
+    if ((n = parse_find_node("linear", node)))
+        o->linear = parse_bool(doc, n);
+    if ((n = parse_find_node("dialog", node)))
+        o->dialog = parse_bool(doc, n);
+    if ((n = parse_find_node("panels", node)))
+        o->dock_windows = parse_bool(doc, n);
+    if ((n = parse_find_node("desktop", node)))
+        o->desktop_windows = parse_bool(doc, n);
+    if ((n = parse_find_node("allDesktops", node)))
+        o->all_desktops = parse_bool(doc, n);
+
+    if ((n = parse_find_node("finalactions", node))) {
+        xmlNodePtr m;
+
+        m = parse_find_node("action", n->xmlChildrenNode);
+        while (m) {
+            ObActionsAct *action = actions_parse(i, doc, m);
+            if (action) o->actions = g_slist_prepend(o->actions, action);
+            m = parse_find_node("action", m->next);
+        }
+    }
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    g_free(o);
+}
+
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+
+    /* if using focus_delay, stop the timer now so that focus doesn't go moving
+       on us */
+    event_halt_focus_delay();
+    
+    focus_cycle(o->forward,
+                o->all_desktops,
+                o->dock_windows,
+                o->desktop_windows,
+                o->linear,
+                TRUE,
+                o->dialog,
+                FALSE, FALSE);
+    cycling = TRUE;
+
+    return TRUE;
+}
+
+static gboolean i_input_func(guint initial_state,
+                             XEvent *e,
+                             gpointer options,
+                             gboolean *used)
+{
+    if (e->type == KeyPress) {
+        /* Escape cancels no matter what */
+        if (e->xkey.keycode == ob_keycode(OB_KEY_ESCAPE)) {
+            end_cycle(TRUE, e->xkey.state, options);
+            return FALSE;
+        }
+
+        /* There were no modifiers and they pressed enter */
+        else if (e->xkey.keycode == ob_keycode(OB_KEY_RETURN) &&
+                 !initial_state)
+        {
+            end_cycle(FALSE, e->xkey.state, options);
+            return FALSE;
+        }
+    }
+    /* They released the modifiers */
+    else if (e->type == KeyRelease && initial_state &&
+             (e->xkey.state & initial_state) == 0)
+    {
+        end_cycle(FALSE, e->xkey.state, options);
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
+static void i_cancel_func(gpointer options)
+{
+    /* we get cancelled when we move focus, but we're not cycling anymore, so
+       just ignore that */
+    if (cycling)
+        end_cycle(TRUE, 0, options);
+}
+
+static void end_cycle(gboolean cancel, guint state, Options *o)
+{
+    struct _ObClient *ft;
+
+    ft = focus_cycle(o->forward,
+                     o->all_desktops,
+                     o->dock_windows,
+                     o->desktop_windows,
+                     o->linear,
+                     TRUE,
+                     o->dialog,
+                     TRUE, cancel);
+
+    if (ft) {
+        actions_run_acts(o->actions, OB_USER_ACTION_KEYBOARD_KEY,
+                         state, -1, -1, 0, OB_FRAME_CONTEXT_NONE, ft);
+    }
+    cycling = FALSE;
+}
diff --git a/openbox/actions/debug.c b/openbox/actions/debug.c
new file mode 100644 (file)
index 0000000..bbc9cca
--- /dev/null
@@ -0,0 +1,51 @@
+#include "openbox/actions.h"
+#include <glib.h>
+
+typedef struct {
+    gchar   *str;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_debug_startup()
+{
+    actions_register("Debug",
+                     setup_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+
+    if ((n = parse_find_node("string", node)))
+        o->str = parse_string(doc, n);
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    if (o) {
+        g_free(o->str);
+        g_free(o);
+    }
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+
+    if (o->str) g_print("%s\n", o->str);
+
+    return FALSE;
+}
diff --git a/openbox/actions/decorations.c b/openbox/actions/decorations.c
new file mode 100644 (file)
index 0000000..a8f0929
--- /dev/null
@@ -0,0 +1,62 @@
+#include "openbox/actions.h"
+#include "openbox/client.h"
+
+typedef struct {
+    gboolean toggle;
+    gboolean on;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_decorations_startup()
+{
+    actions_register("Decorations",
+                     setup_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+    o->toggle = TRUE;
+
+    if ((n = parse_find_node("state", node))) {
+        gchar *s = parse_string(doc, n);
+        if (g_ascii_strcasecmp(s, "toggle")) {
+            o->toggle = FALSE;
+            o->on = parse_bool(doc, n);
+        }
+        g_free(s);
+    }
+
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    g_free(o);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+
+    if (data->client) {
+        actions_client_move(data, TRUE);
+        if (o->toggle || o->on != !data->client->undecorated)
+            client_set_undecorated(data->client, !data->client->undecorated);
+        actions_client_move(data, FALSE);
+    }
+
+    return FALSE;
+}
diff --git a/openbox/actions/desktop.c b/openbox/actions/desktop.c
new file mode 100644 (file)
index 0000000..4489f81
--- /dev/null
@@ -0,0 +1,80 @@
+#include "openbox/actions.h"
+#include "openbox/screen.h"
+#include "openbox/client.h"
+#include <glib.h>
+
+typedef struct {
+    gboolean last;
+    guint desktop;
+    gboolean send;
+    gboolean follow;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_desktop_startup()
+{
+    actions_register("Desktop",
+                     setup_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+    o->follow = TRUE;
+
+    if ((n = parse_find_node("desktop", node))) {
+        gchar *s = parse_string(doc, n);
+        if (!g_ascii_strcasecmp(s, "last"))
+            o->last = TRUE;
+        else
+            o->desktop = parse_int(doc, n) - 1;
+        g_free(s);
+    }
+    if ((n = parse_find_node("send", node)))
+        o->send = parse_bool(doc, n);
+    if ((n = parse_find_node("follow", node)))
+        o->follow = parse_bool(doc, n);
+
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    g_free(o);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+    guint d;
+
+    if (o->last)
+        d = screen_last_desktop;
+    else
+        d = o->desktop;
+
+    if (d < screen_num_desktops && d != screen_desktop) {
+        gboolean go = !o->send;
+        if (o->send) {
+            if (data->client && client_normal(data->client)) {
+                client_set_desktop(data->client, d, o->follow, FALSE);
+                go = TRUE;
+            }
+        }
+        if (go)
+            screen_set_desktop(d, TRUE);
+    }
+    return FALSE;
+}
diff --git a/openbox/actions/directionalcyclewindows.c b/openbox/actions/directionalcyclewindows.c
new file mode 100644 (file)
index 0000000..3eea00d
--- /dev/null
@@ -0,0 +1,165 @@
+#include "openbox/actions.h"
+#include "openbox/event.h"
+#include "openbox/focus_cycle.h"
+#include "openbox/openbox.h"
+#include "openbox/misc.h"
+#include "gettext.h"
+
+typedef struct {
+    gboolean dialog;
+    gboolean dock_windows;
+    gboolean desktop_windows;
+    ObDirection direction;
+    GSList *actions;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+static gboolean i_input_func(guint initial_state,
+                             XEvent *e,
+                             gpointer options,
+                             gboolean *used);
+static void     i_cancel_func(gpointer options);
+
+static void     end_cycle(gboolean cancel, guint state, Options *o);
+
+void action_directionalcyclewindows_startup()
+{
+    actions_register("DirectionalCycleWindows",
+                     setup_func,
+                     free_func,
+                     run_func,
+                     i_input_func,
+                     i_cancel_func);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+    o->dialog = TRUE;
+
+    if ((n = parse_find_node("dialog", node)))
+        o->dialog = parse_bool(doc, n);
+    if ((n = parse_find_node("panels", node)))
+        o->dock_windows = parse_bool(doc, n);
+    if ((n = parse_find_node("desktop", node)))
+        o->desktop_windows = parse_bool(doc, n);
+    if ((n = parse_find_node("direction", node))) {
+        gchar *s = parse_string(doc, n);
+        if (!g_ascii_strcasecmp(s, "north") ||
+            !g_ascii_strcasecmp(s, "up"))
+            o->direction = OB_DIRECTION_NORTH;
+        else if (!g_ascii_strcasecmp(s, "northwest"))
+            o->direction = OB_DIRECTION_NORTHWEST;
+        else if (!g_ascii_strcasecmp(s, "northeast"))
+            o->direction = OB_DIRECTION_NORTHEAST;
+        else if (!g_ascii_strcasecmp(s, "west") ||
+                 !g_ascii_strcasecmp(s, "left"))
+            o->direction = OB_DIRECTION_WEST;
+        else if (!g_ascii_strcasecmp(s, "east") ||
+                 !g_ascii_strcasecmp(s, "right"))
+            o->direction = OB_DIRECTION_EAST;
+        else if (!g_ascii_strcasecmp(s, "south") ||
+                 !g_ascii_strcasecmp(s, "down"))
+            o->direction = OB_DIRECTION_SOUTH;
+        else if (!g_ascii_strcasecmp(s, "southwest"))
+            o->direction = OB_DIRECTION_SOUTHWEST;
+        else if (!g_ascii_strcasecmp(s, "southeast"))
+            o->direction = OB_DIRECTION_SOUTHEAST;
+        g_free(s);
+    }
+
+    if ((n = parse_find_node("finalactions", node))) {
+        xmlNodePtr m;
+
+        m = parse_find_node("action", n->xmlChildrenNode);
+        while (m) {
+            ObActionsAct *action = actions_parse(i, doc, m);
+            if (action) o->actions = g_slist_prepend(o->actions, action);
+            m = parse_find_node("action", m->next);
+        }
+    }
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    g_free(o);
+}
+
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+
+    /* if using focus_delay, stop the timer now so that focus doesn't go moving
+       on us */
+    event_halt_focus_delay();
+    
+    focus_directional_cycle(o->direction,
+                            o->dock_windows,
+                            o->desktop_windows,
+                            TRUE,
+                            o->dialog,
+                            FALSE, FALSE);
+
+    return TRUE;
+}
+
+static gboolean i_input_func(guint initial_state,
+                             XEvent *e,
+                             gpointer options,
+                             gboolean *used)
+{
+    if (e->type == KeyPress) {
+        /* Escape cancels no matter what */
+        if (e->xkey.keycode == ob_keycode(OB_KEY_ESCAPE)) {
+            end_cycle(TRUE, e->xkey.state, options);
+            return FALSE;
+        }
+
+        /* There were no modifiers and they pressed enter */
+        else if (e->xkey.keycode == ob_keycode(OB_KEY_RETURN) &&
+                 !initial_state)
+        {
+            end_cycle(FALSE, e->xkey.state, options);
+            return FALSE;
+        }
+    }
+    /* They released the modifiers */
+    else if (e->type == KeyRelease && initial_state &&
+             (e->xkey.state & initial_state) == 0)
+    {
+        end_cycle(FALSE, e->xkey.state, options);
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
+static void i_cancel_func(gpointer options)
+{
+    end_cycle(TRUE, 0, options);
+}
+
+static void end_cycle(gboolean cancel, guint state, Options *o)
+{
+    struct _ObClient *ft;
+
+    ft = focus_directional_cycle(o->direction,
+                                 o->dock_windows,
+                                 o->desktop_windows,
+                                 TRUE,
+                                 o->dialog,
+                                 TRUE, cancel);
+
+    if (ft) {
+        actions_run_acts(o->actions, OB_USER_ACTION_KEYBOARD_KEY,
+                         state, -1, -1, 0, OB_FRAME_CONTEXT_NONE, ft);
+    }
+}
diff --git a/openbox/actions/directionaldesktop.c b/openbox/actions/directionaldesktop.c
new file mode 100644 (file)
index 0000000..d9aacdd
--- /dev/null
@@ -0,0 +1,101 @@
+#include "openbox/actions.h"
+#include "openbox/screen.h"
+#include "openbox/client.h"
+#include <glib.h>
+
+typedef struct {
+    gboolean linear;
+    gboolean wrap;
+    ObDirection dir;
+    gboolean send;
+    gboolean follow;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_directionaldesktop_startup()
+{
+    actions_register("DirectionalDesktop",
+                     setup_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+    o->wrap = TRUE;
+    o->dir = OB_DIRECTION_EAST;
+    o->follow = TRUE;
+
+    if ((n = parse_find_node("wrap", node)))
+        o->wrap = parse_bool(doc, n);
+    if ((n = parse_find_node("direction", node))) {
+        gchar *s = parse_string(doc, n);
+        if (!g_ascii_strcasecmp(s, "next")) {
+            o->linear = TRUE;
+            o->dir = OB_DIRECTION_EAST;
+        }
+        else if (!g_ascii_strcasecmp(s, "previous")) {
+            o->linear = TRUE;
+            o->dir = OB_DIRECTION_WEST;
+        }
+        else if (!g_ascii_strcasecmp(s, "north") ||
+                 !g_ascii_strcasecmp(s, "up"))
+            o->dir = OB_DIRECTION_NORTH;
+        else if (!g_ascii_strcasecmp(s, "south") ||
+                 !g_ascii_strcasecmp(s, "down"))
+            o->dir = OB_DIRECTION_SOUTH;
+        else if (!g_ascii_strcasecmp(s, "west") ||
+                 !g_ascii_strcasecmp(s, "left"))
+            o->dir = OB_DIRECTION_WEST;
+        else if (!g_ascii_strcasecmp(s, "east") ||
+                 !g_ascii_strcasecmp(s, "right"))
+            o->dir = OB_DIRECTION_EAST;
+        g_free(s);
+    }
+    if ((n = parse_find_node("send", node)))
+        o->send = parse_bool(doc, n);
+    if ((n = parse_find_node("follow", node)))
+        o->follow = parse_bool(doc, n);
+
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    g_free(o);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+    guint d;
+
+    d = screen_cycle_desktop(o->dir,
+                             o->wrap,
+                             o->linear,
+                             FALSE, TRUE, FALSE);
+    if (d < screen_num_desktops && d != screen_desktop) {
+        gboolean go = !o->send;
+        if (o->send) {
+            if (data->client && client_normal(data->client)) {
+                client_set_desktop(data->client, d, o->follow, FALSE);
+                go = TRUE;
+            }
+        }
+        if (go)
+            screen_set_desktop(d, TRUE);
+    }
+
+    return FALSE;
+}
diff --git a/openbox/actions/directionaltargetwindow.c b/openbox/actions/directionaltargetwindow.c
new file mode 100644 (file)
index 0000000..9cebda2
--- /dev/null
@@ -0,0 +1,109 @@
+#include "openbox/actions.h"
+#include "openbox/event.h"
+#include "openbox/focus_cycle.h"
+#include "openbox/openbox.h"
+#include "openbox/misc.h"
+#include "gettext.h"
+
+typedef struct {
+    gboolean dialog;
+    gboolean dock_windows;
+    gboolean desktop_windows;
+    ObDirection direction;
+    GSList *actions;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_directionaltargetwindow_startup()
+{
+    actions_register("DirectionalTargetWindow",
+                     setup_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+    o->dialog = TRUE;
+
+    if ((n = parse_find_node("dialog", node)))
+        o->dialog = parse_bool(doc, n);
+    if ((n = parse_find_node("panels", node)))
+        o->dock_windows = parse_bool(doc, n);
+    if ((n = parse_find_node("desktop", node)))
+        o->desktop_windows = parse_bool(doc, n);
+    if ((n = parse_find_node("direction", node))) {
+        gchar *s = parse_string(doc, n);
+        if (!g_ascii_strcasecmp(s, "north") ||
+            !g_ascii_strcasecmp(s, "up"))
+            o->direction = OB_DIRECTION_NORTH;
+        else if (!g_ascii_strcasecmp(s, "northwest"))
+            o->direction = OB_DIRECTION_NORTHWEST;
+        else if (!g_ascii_strcasecmp(s, "northeast"))
+            o->direction = OB_DIRECTION_NORTHEAST;
+        else if (!g_ascii_strcasecmp(s, "west") ||
+                 !g_ascii_strcasecmp(s, "left"))
+            o->direction = OB_DIRECTION_WEST;
+        else if (!g_ascii_strcasecmp(s, "east") ||
+                 !g_ascii_strcasecmp(s, "right"))
+            o->direction = OB_DIRECTION_EAST;
+        else if (!g_ascii_strcasecmp(s, "south") ||
+                 !g_ascii_strcasecmp(s, "down"))
+            o->direction = OB_DIRECTION_NORTH;
+        else if (!g_ascii_strcasecmp(s, "southwest"))
+            o->direction = OB_DIRECTION_NORTHWEST;
+        else if (!g_ascii_strcasecmp(s, "southeast"))
+            o->direction = OB_DIRECTION_NORTHEAST;
+        g_free(s);
+    }
+
+    if ((n = parse_find_node("finalactions", node))) {
+        xmlNodePtr m;
+
+        m = parse_find_node("action", n->xmlChildrenNode);
+        while (m) {
+            ObActionsAct *action = actions_parse(i, doc, m);
+            if (action) o->actions = g_slist_prepend(o->actions, action);
+            m = parse_find_node("action", m->next);
+        }
+    }
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    g_free(o);
+}
+
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+    struct _ObClient *ft;
+
+    /* if using focus_delay, stop the timer now so that focus doesn't go moving
+       on us */
+    event_halt_focus_delay();
+    
+    ft = focus_directional_cycle(o->direction,
+                                 o->dock_windows,
+                                 o->desktop_windows,
+                                 FALSE,
+                                 o->dialog,
+                                 TRUE, FALSE);
+
+    if (ft)
+        actions_run_acts(o->actions, data->uact, data->state,
+                         data->x, data->y, data->button, data->context, ft);
+
+    return FALSE;
+}
diff --git a/openbox/actions/dockautohide.c b/openbox/actions/dockautohide.c
new file mode 100644 (file)
index 0000000..e7f6505
--- /dev/null
@@ -0,0 +1,22 @@
+#include "openbox/actions.h"
+#include "openbox/dock.h"
+#include "openbox/config.h"
+
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_dockautohide_startup()
+{
+    actions_register("DockAutoHide",
+                     NULL, NULL,
+                     run_func,
+                     NULL, NULL);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    config_dock_hide = !config_dock_hide;
+    dock_configure();
+
+    return FALSE;
+}
diff --git a/openbox/actions/execute.c b/openbox/actions/execute.c
new file mode 100644 (file)
index 0000000..7e58fe7
--- /dev/null
@@ -0,0 +1,129 @@
+#include "openbox/actions.h"
+#include "openbox/event.h"
+#include "openbox/startupnotify.h"
+#include "openbox/screen.h"
+#include "gettext.h"
+
+typedef struct {
+    gchar   *cmd;
+    gboolean sn;
+    gchar   *sn_name;
+    gchar   *sn_icon;
+    gchar   *sn_wmclass;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+/*
+static gboolean i_input_func(guint initial_state,
+                             XEvent *e,
+                             gpointer options,
+                             gboolean *used);
+static void     i_cancel_func(gpointer options);
+*/
+
+void action_execute_startup()
+{
+    actions_register("Execute",
+                     setup_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+
+    if ((n = parse_find_node("command", node))) {
+        gchar *s = parse_string(doc, n);
+        o->cmd = parse_expand_tilde(s);
+        g_free(s);
+    }
+
+    if ((n = parse_find_node("startupnotify", node))) {
+        xmlNodePtr m;
+        if ((m = parse_find_node("enabled", n->xmlChildrenNode)))
+            o->sn = parse_bool(doc, m);
+        if ((m = parse_find_node("name", n->xmlChildrenNode)))
+            o->sn_name = parse_string(doc, m);
+        if ((m = parse_find_node("icon", n->xmlChildrenNode)))
+            o->sn_icon = parse_string(doc, m);
+        if ((m = parse_find_node("wmclass", n->xmlChildrenNode)))
+            o->sn_wmclass = parse_string(doc, m);
+    }
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    if (o) {
+        g_free(o->cmd);
+        g_free(o->sn_name);
+        g_free(o->sn_icon);
+        g_free(o->sn_wmclass);
+        g_free(o);
+    }
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    GError *e = NULL;
+    gchar **argv = NULL;
+    gchar *cmd;
+    Options *o = options;
+
+    if (!o->cmd) return FALSE;
+    cmd = g_filename_from_utf8(o->cmd, -1, NULL, NULL, NULL);
+    if (!cmd) {
+        g_message(_("Failed to convert the path '%s' from utf8"), o->cmd);
+        return FALSE;
+    }
+
+    /* If there is a keyboard grab going on then we need to cancel
+       it so the application can grab things */
+    event_cancel_all_key_grabs();
+
+    if (!g_shell_parse_argv(cmd, NULL, &argv, &e)) {
+        g_message(_("Failed to execute '%s': %s"), o->cmd, e->message);
+        g_error_free(e);
+    }
+    else {
+        gchar *program = NULL;
+
+        if (o->sn) {
+            program = g_path_get_basename(argv[0]);
+            /* sets up the environment */
+            sn_setup_spawn_environment(program, o->sn_name, o->sn_icon,
+                                       /* launch it on the current desktop */
+                                       screen_desktop);
+        }
+
+        if (!g_spawn_async(NULL, argv, NULL,
+                           G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
+                           NULL, NULL, NULL, &e))
+        {
+            g_message(_("Failed to execute '%s': %s"), o->cmd, e->message);
+            g_error_free(e);
+
+            if (o->sn)
+                sn_spawn_cancel();
+        }
+        if (o->sn)
+            unsetenv("DESKTOP_STARTUP_ID");
+
+        g_free(program);
+        g_strfreev(argv);
+    }
+
+    g_free(cmd);
+
+    return FALSE;
+}
diff --git a/openbox/actions/exit.c b/openbox/actions/exit.c
new file mode 100644 (file)
index 0000000..68b5cef
--- /dev/null
@@ -0,0 +1,20 @@
+#include "openbox/actions.h"
+#include "openbox/openbox.h"
+
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_exit_startup()
+{
+    actions_register("Exit",
+                     NULL, NULL,
+                     run_func,
+                     NULL, NULL);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    ob_exit(0);
+
+    return FALSE;
+}
diff --git a/openbox/actions/focus.c b/openbox/actions/focus.c
new file mode 100644 (file)
index 0000000..d0acfbd
--- /dev/null
@@ -0,0 +1,67 @@
+#include "openbox/actions.h"
+#include "openbox/event.h"
+#include "openbox/client.h"
+#include "openbox/focus.h"
+
+typedef struct {
+    gboolean here;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_focus_startup()
+{
+    actions_register("Focus",
+                     setup_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+
+    if ((n = parse_find_node("here", node)))
+        o->here = parse_bool(doc, n);
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    g_free(o);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+
+    if (data->client) {
+/*
+        ob_debug("button %d focusable %d context %d %d %d\n",
+                 data->button, client_mouse_focusable(data->client),
+                 data->context, 
+                 OB_FRAME_CONTEXT_CLIENT, OB_FRAME_CONTEXT_FRAME);
+*/
+        if (data->button == 0 || client_mouse_focusable(data->client) ||
+            (data->context != OB_FRAME_CONTEXT_CLIENT &&
+             data->context != OB_FRAME_CONTEXT_FRAME))
+        {
+            client_activate(data->client, o->here, FALSE, FALSE, TRUE);
+        }
+    } else if (data->context == OB_FRAME_CONTEXT_DESKTOP) {
+        /* focus action on the root window. make keybindings work for this
+           openbox instance, but don't focus any specific client */
+        focus_nothing();
+    }
+
+    return FALSE;
+}
diff --git a/openbox/actions/fullscreen.c b/openbox/actions/fullscreen.c
new file mode 100644 (file)
index 0000000..c791191
--- /dev/null
@@ -0,0 +1,24 @@
+#include "openbox/actions.h"
+#include "openbox/client.h"
+
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_fullscreen_startup()
+{
+    actions_register("Fullscreen",
+                     NULL, NULL,
+                     run_func,
+                     NULL, NULL);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    if (data->client) {
+        actions_client_move(data, TRUE);
+        client_fullscreen(data->client, !data->client->fullscreen);
+        actions_client_move(data, FALSE);
+    }
+
+    return FALSE;
+}
diff --git a/openbox/actions/growtoedge.c b/openbox/actions/growtoedge.c
new file mode 100644 (file)
index 0000000..fffcc4e
--- /dev/null
@@ -0,0 +1,86 @@
+#include "openbox/actions.h"
+#include "openbox/misc.h"
+#include "openbox/client.h"
+#include "openbox/frame.h"
+#include "openbox/screen.h"
+#include <glib.h>
+
+typedef struct {
+    ObDirection dir;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_growtoedge_startup()
+{
+    actions_register("GrowToEdge",
+                     setup_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+    o->dir = OB_DIRECTION_NORTH;
+
+    if ((n = parse_find_node("direction", node))) {
+        gchar *s = parse_string(doc, n);
+        if (!g_ascii_strcasecmp(s, "north") ||
+            !g_ascii_strcasecmp(s, "up"))
+            o->dir = OB_DIRECTION_NORTH;
+        else if (!g_ascii_strcasecmp(s, "south") ||
+                 !g_ascii_strcasecmp(s, "down"))
+            o->dir = OB_DIRECTION_SOUTH;
+        else if (!g_ascii_strcasecmp(s, "west") ||
+                 !g_ascii_strcasecmp(s, "left"))
+            o->dir = OB_DIRECTION_WEST;
+        else if (!g_ascii_strcasecmp(s, "east") ||
+                 !g_ascii_strcasecmp(s, "right"))
+            o->dir = OB_DIRECTION_EAST;
+        g_free(s);
+    }
+
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    g_free(o);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+
+    if (data->client) {
+        gint x, y, w, h;
+
+        /* don't allow vertical resize if shaded */
+        if (o->dir != OB_DIRECTION_NORTH || o->dir != OB_DIRECTION_SOUTH ||
+            !data->client->shaded)
+        {
+            client_find_resize_directional(data->client, o->dir, TRUE,
+                                           &x, &y, &w, &h);
+            if (x != data->client->area.x || y != data->client->area.y ||
+                w != data->client->area.width ||
+                h != data->client->area.height)
+            {
+                actions_client_move(data, TRUE);
+                client_move_resize(data->client, x, y, w, h);
+                actions_client_move(data, FALSE);
+            }
+        }
+    }
+
+    return FALSE;
+}
diff --git a/openbox/actions/iconify.c b/openbox/actions/iconify.c
new file mode 100644 (file)
index 0000000..b82684e
--- /dev/null
@@ -0,0 +1,24 @@
+#include "openbox/actions.h"
+#include "openbox/client.h"
+
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_iconify_startup()
+{
+    actions_register("Iconify",
+                     NULL, NULL,
+                     run_func,
+                     NULL, NULL);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    if (data->client) {
+        actions_client_move(data, TRUE);
+        client_iconify(data->client, TRUE, TRUE, FALSE);
+        actions_client_move(data, FALSE);
+    }
+
+    return FALSE;
+}
diff --git a/openbox/actions/if.c b/openbox/actions/if.c
new file mode 100644 (file)
index 0000000..25d899c
--- /dev/null
@@ -0,0 +1,144 @@
+#include "openbox/actions.h"
+#include "openbox/misc.h"
+#include "openbox/client.h"
+#include "openbox/frame.h"
+#include "openbox/screen.h"
+#include "openbox/focus.h"
+#include <glib.h>
+
+typedef struct {
+    gboolean shaded_on;
+    gboolean shaded_off;
+    gboolean maxvert_on;
+    gboolean maxvert_off;
+    gboolean maxhorz_on;
+    gboolean maxhorz_off;
+    gboolean maxfull_on;
+    gboolean maxfull_off;
+    gboolean iconic_on;
+    gboolean iconic_off;
+    gboolean focused;
+    gboolean unfocused;
+    GSList *thenacts;
+    GSList *elseacts;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_if_startup()
+{
+    actions_register("If",
+                     setup_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+
+    if ((n = parse_find_node("shaded", node))) {
+        if (parse_bool(doc, n))
+            o->shaded_on = TRUE;
+        else
+            o->shaded_off = TRUE;
+    }
+    if ((n = parse_find_node("maximized", node))) {
+        if (parse_bool(doc, n))
+            o->maxfull_on = TRUE;
+        else
+            o->maxfull_off = TRUE;
+    }
+    if ((n = parse_find_node("maximizedhorizontal", node))) {
+        if (parse_bool(doc, n))
+            o->maxhorz_on = TRUE;
+        else
+            o->maxhorz_off = TRUE;
+    }
+    if ((n = parse_find_node("maximizedvertical", node))) {
+        if (parse_bool(doc, n))
+            o->maxvert_on = TRUE;
+        else
+            o->maxvert_off = TRUE;
+    }
+    if ((n = parse_find_node("iconified", node))) {
+        if (parse_bool(doc, n))
+            o->iconic_on = TRUE;
+        else
+            o->iconic_off = TRUE;
+    }
+    if ((n = parse_find_node("focused", node))) {
+        if (parse_bool(doc, n))
+            o->focused = TRUE;
+        else
+            o->unfocused = TRUE;
+    }
+
+    if ((n = parse_find_node("then", node))) {
+        xmlNodePtr m;
+
+        m = parse_find_node("action", n->xmlChildrenNode);
+        while (m) {
+            ObActionsAct *action = actions_parse(i, doc, m);
+            if (action) o->thenacts = g_slist_prepend(o->thenacts, action);
+            m = parse_find_node("action", m->next);
+        }
+    }
+    if ((n = parse_find_node("else", node))) {
+        xmlNodePtr m;
+
+        m = parse_find_node("action", n->xmlChildrenNode);
+        while (m) {
+            ObActionsAct *action = actions_parse(i, doc, m);
+            if (action) o->elseacts = g_slist_prepend(o->elseacts, action);
+            m = parse_find_node("action", m->next);
+        }
+    }
+
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    g_free(o);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+    GSList *acts;
+    ObClient *c = data->client;
+
+    if ((!o->shaded_on || (c && c->shaded)) &&
+        (!o->shaded_off || (c && !c->shaded)) &&
+        (!o->iconic_on || (c && c->iconic)) &&
+        (!o->iconic_off || (c && !c->iconic)) &&
+        (!o->maxhorz_on || (c && c->max_horz)) &&
+        (!o->maxhorz_off || (c && !c->max_horz)) &&
+        (!o->maxvert_on || (c && c->max_vert)) &&
+        (!o->maxvert_off || (c && !c->max_vert)) &&
+        (!o->maxfull_on || (c && c->max_vert && c->max_horz)) &&
+        (!o->maxfull_off || (c && !(c->max_vert && c->max_horz))) &&
+        (!o->focused || (c && (c == focus_client))) &&
+        (!o->unfocused || (c && !(c == focus_client))))
+    {
+        acts = o->thenacts;
+    }
+    else
+        acts = o->elseacts;
+
+    actions_run_acts(acts, data->uact, data->state,
+                     data->x, data->y, data->button,
+                     data->context, data->client);
+
+    return FALSE;
+}
diff --git a/openbox/actions/kill.c b/openbox/actions/kill.c
new file mode 100644 (file)
index 0000000..5e14cb7
--- /dev/null
@@ -0,0 +1,21 @@
+#include "openbox/actions.h"
+#include "openbox/client.h"
+
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_kill_startup()
+{
+    actions_register("Kill",
+                     NULL, NULL,
+                     run_func,
+                     NULL, NULL);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    if (data->client)
+        client_kill(data->client);
+
+    return FALSE;
+}
diff --git a/openbox/actions/layer.c b/openbox/actions/layer.c
new file mode 100644 (file)
index 0000000..6f83983
--- /dev/null
@@ -0,0 +1,90 @@
+#include "openbox/actions.h"
+#include "openbox/client.h"
+
+typedef struct {
+    gint layer; /*!< -1 for below, 0 for normal, and 1 for above */
+    gboolean toggle;
+    gboolean on;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_layer_startup()
+{
+    actions_register("Layer",
+                     setup_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+    o->toggle = TRUE;
+
+    if ((n = parse_find_node("layer", node))) {
+        gchar *s = parse_string(doc, n);
+        if (!g_ascii_strcasecmp(s, "above") ||
+            !g_ascii_strcasecmp(s, "top"))
+            o->layer = 1;
+        else if (!g_ascii_strcasecmp(s, "below") ||
+                 !g_ascii_strcasecmp(s, "bottom"))
+            o->layer = -1;
+        else if (!g_ascii_strcasecmp(s, "normal") ||
+                 !g_ascii_strcasecmp(s, "middle"))
+            o->layer = 0;
+        g_free(s);
+    }
+    if ((n = parse_find_node("state", node))) {
+        gchar *s = parse_string(doc, n);
+        if (g_ascii_strcasecmp(s, "toggle")) {
+            o->toggle = FALSE;
+            o->on = parse_bool(doc, n);
+        }
+        g_free(s);
+    }
+
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    g_free(o);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+
+    if (data->client) {
+        ObClient *c = data->client;
+
+        actions_client_move(data, TRUE);
+
+        if (o->layer < 0) {
+            if (o->toggle || c->below != o->on)
+                client_set_layer(c, c->below ? 0 : -1);
+        }
+        else if (o->layer > 0) {
+            if (o->toggle || c->above != o->on)
+                client_set_layer(c, c->above ? 0 : 1);
+        }
+        else {
+            if ((o->toggle || o->on) && (c->above || c->below))
+                client_set_layer(c, 0);
+        }
+
+        actions_client_move(data, FALSE);
+    }
+
+    return FALSE;
+}
diff --git a/openbox/actions/lower.c b/openbox/actions/lower.c
new file mode 100644 (file)
index 0000000..1abf590
--- /dev/null
@@ -0,0 +1,24 @@
+#include "openbox/actions.h"
+#include "openbox/stacking.h"
+
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_lower_startup()
+{
+    actions_register("Lower",
+                     NULL, NULL,
+                     run_func,
+                     NULL, NULL);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    if (data->client) {
+        actions_client_move(data, TRUE);
+        stacking_lower(CLIENT_AS_WINDOW(data->client));
+        actions_client_move(data, FALSE);
+    }
+
+    return FALSE;
+}
diff --git a/openbox/actions/maximize.c b/openbox/actions/maximize.c
new file mode 100644 (file)
index 0000000..443ff7e
--- /dev/null
@@ -0,0 +1,68 @@
+#include "openbox/actions.h"
+#include "openbox/client.h"
+
+typedef struct {
+    gboolean toggle;
+    gboolean on;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_maximize_startup()
+{
+    actions_register("Maximize",
+                     setup_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+    o->toggle = TRUE;
+
+    if ((n = parse_find_node("state", node))) {
+        gchar *s = parse_string(doc, n);
+        if (g_ascii_strcasecmp(s, "toggle")) {
+            o->toggle = FALSE;
+            o->on = parse_bool(doc, n);
+        }
+        g_free(s);
+    }
+
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    g_free(o);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+
+    if (data->client) {
+        actions_client_move(data, TRUE);
+
+        if (o->toggle)
+            client_maximize(data->client,
+                            !data->client->max_horz || !data->client->max_vert,
+                            0);
+        else
+            client_maximize(data->client, o->on, 0);
+
+        actions_client_move(data, FALSE);
+    }
+
+    return FALSE;
+}
diff --git a/openbox/actions/maximizehorizontal.c b/openbox/actions/maximizehorizontal.c
new file mode 100644 (file)
index 0000000..abb8a8e
--- /dev/null
@@ -0,0 +1,66 @@
+#include "openbox/actions.h"
+#include "openbox/client.h"
+
+typedef struct {
+    gboolean toggle;
+    gboolean on;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_maximizehorizontal_startup()
+{
+    actions_register("MaximizeHorizontal",
+                     setup_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+    o->toggle = TRUE;
+
+    if ((n = parse_find_node("state", node))) {
+        gchar *s = parse_string(doc, n);
+        if (g_ascii_strcasecmp(s, "toggle")) {
+            o->toggle = FALSE;
+            o->on = parse_bool(doc, n);
+        }
+        g_free(s);
+    }
+
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    g_free(o);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+
+    if (data->client) {
+        actions_client_move(data, TRUE);
+
+        if (o->toggle)
+            client_maximize(data->client, !data->client->max_horz, 1);
+        else
+            client_maximize(data->client, o->on, 1);
+
+        actions_client_move(data, FALSE);
+    }
+
+    return FALSE;
+}
diff --git a/openbox/actions/maximizevertical.c b/openbox/actions/maximizevertical.c
new file mode 100644 (file)
index 0000000..516463c
--- /dev/null
@@ -0,0 +1,66 @@
+#include "openbox/actions.h"
+#include "openbox/client.h"
+
+typedef struct {
+    gboolean toggle;
+    gboolean on;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_maximizevertical_startup()
+{
+    actions_register("MaximizeVertical",
+                     setup_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+    o->toggle = TRUE;
+
+    if ((n = parse_find_node("state", node))) {
+        gchar *s = parse_string(doc, n);
+        if (g_ascii_strcasecmp(s, "toggle")) {
+            o->toggle = FALSE;
+            o->on = parse_bool(doc, n);
+        }
+        g_free(s);
+    }
+
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    g_free(o);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+
+    if (data->client) {
+        actions_client_move(data, TRUE);
+
+        if (o->toggle)
+            client_maximize(data->client, !data->client->max_vert, 2);
+        else
+            client_maximize(data->client, o->on, 2);
+
+        actions_client_move(data, FALSE);
+    }
+
+    return FALSE;
+}
diff --git a/openbox/actions/menu.c b/openbox/actions/menu.c
new file mode 100644 (file)
index 0000000..64a4d27
--- /dev/null
@@ -0,0 +1,57 @@
+#include "openbox/actions.h"
+#include "openbox/menu.h"
+#include <glib.h>
+
+typedef struct {
+    gchar   *name;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_menu_startup()
+{
+    actions_register("Menu",
+                     setup_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+
+    if ((n = parse_find_node("menu", node)))
+        o->name = parse_string(doc, n);
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    if (o) {
+        g_free(o->name);
+        g_free(o);
+    }
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+
+    /* you cannot call ShowMenu from inside a menu */
+    if (data->uact == OB_USER_ACTION_MENU_SELECTION) return FALSE;
+
+    if (o->name) {
+        menu_show(o->name, data->x, data->y, data->button != 0, data->client);
+    }
+
+    return FALSE;
+}
diff --git a/openbox/actions/move.c b/openbox/actions/move.c
new file mode 100644 (file)
index 0000000..bf140c3
--- /dev/null
@@ -0,0 +1,29 @@
+#include "openbox/actions.h"
+#include "openbox/prop.h"
+#include "openbox/moveresize.h"
+
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_move_startup()
+{
+    actions_register("Move",
+                     NULL, NULL,
+                     run_func,
+                     NULL, NULL);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    if (data->client) {
+        guint32 corner;
+
+        corner = data->button != 0 ?
+            prop_atoms.net_wm_moveresize_move :
+            prop_atoms.net_wm_moveresize_move_keyboard;
+
+        moveresize_start(data->client, data->x, data->y, data->button, corner);
+    }
+
+    return FALSE;
+}
diff --git a/openbox/actions/moverelative.c b/openbox/actions/moverelative.c
new file mode 100644 (file)
index 0000000..deb1eae
--- /dev/null
@@ -0,0 +1,70 @@
+#include "openbox/actions.h"
+#include "openbox/client.h"
+#include "openbox/screen.h"
+#include "openbox/frame.h"
+#include <stdlib.h> /* for atoi */
+
+typedef struct {
+    gint x;
+    gint y;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_moverelative_startup()
+{
+    actions_register("MoveRelative",
+                     setup_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+
+    if ((n = parse_find_node("x", node)))
+        o->x = parse_int(doc, n);
+    if ((n = parse_find_node("y", node)))
+        o->y = parse_int(doc, n);
+
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    g_free(o);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+
+    if (data->client) {
+        ObClient *c;
+        gint x, y, lw, lh, w, h;
+
+        c = data->client;
+        x = data->client->area.x + o->x;
+        y = data->client->area.y + o->y;
+        w = data->client->area.width;
+        h = data->client->area.height;
+        client_try_configure(data->client, &x, &y, &w, &h, &lw, &lh, TRUE);
+        client_find_onscreen(data->client, &x, &y, w, h, FALSE);
+
+        actions_client_move(data, TRUE);
+        client_configure(data->client, x, y, w, h, TRUE, TRUE, FALSE);
+        actions_client_move(data, FALSE);
+    }
+
+    return FALSE;
+}
diff --git a/openbox/actions/moveresizeto.c b/openbox/actions/moveresizeto.c
new file mode 100644 (file)
index 0000000..0f339e8
--- /dev/null
@@ -0,0 +1,149 @@
+#include "openbox/actions.h"
+#include "openbox/client.h"
+#include "openbox/screen.h"
+#include "openbox/frame.h"
+#include <stdlib.h> /* for atoi */
+
+typedef struct {
+    gboolean xcenter;
+    gboolean ycenter;
+    gboolean xopposite;
+    gboolean yopposite;
+    gint x;
+    gint y;
+    gint w;
+    gint h;
+    gint monitor;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_moveresizeto_startup()
+{
+    actions_register("MoveResizeTo",
+                     setup_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+}
+
+static void parse_coord(xmlDocPtr doc, xmlNodePtr n, gint *pos,
+                        gboolean *opposite, gboolean *center)
+{
+    gchar *s = parse_string(doc, n);
+    if (!g_ascii_strcasecmp(s, "center"))
+        *center = TRUE;
+    else {
+        if (s[0] == '-')
+            *opposite = TRUE;
+        if (s[0] == '-' || s[0] == '+')
+            *pos = atoi(s+1);
+        else
+            *pos = atoi(s);
+    }
+    g_free(s);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+    o->x = G_MININT;
+    o->y = G_MININT;
+    o->w = G_MININT;
+    o->h = G_MININT;
+    o->monitor = -1;
+
+    if ((n = parse_find_node("x", node)))
+        parse_coord(doc, n, &o->x, &o->xopposite, &o->xcenter);
+
+    if ((n = parse_find_node("y", node)))
+        parse_coord(doc, n, &o->y, &o->yopposite, &o->ycenter);
+
+    if ((n = parse_find_node("width", node)))
+        o->w = parse_int(doc, n) - 1;
+    if ((n = parse_find_node("height", node)))
+        o->h = parse_int(doc, n) - 1;
+
+    if ((n = parse_find_node("monitor", node)))
+        o->monitor = parse_int(doc, n) - 1;
+
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    g_free(o);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+
+    if (data->client) {
+        Rect *area, *carea;
+        ObClient *c;
+        gint mon, cmon;
+        gint x, y, lw, lh, w, h;
+
+        c = data->client;
+        mon = o->monitor;
+        cmon = client_monitor(c);
+        if (mon < 0) mon = cmon;
+        area = screen_area(c->desktop, mon, NULL);
+        carea = screen_area(c->desktop, cmon, NULL);
+
+        w = o->w;
+        if (w == G_MININT) w = c->area.width;
+
+        h = o->h;
+        if (h == G_MININT) h = c->area.height;
+
+        /* it might not be able to resize how they requested, so find out what
+           it will actually be resized to */
+        x = c->area.x;
+        y = c->area.y;
+        client_try_configure(c, &x, &y, &w, &h, &lw, &lh, TRUE);
+
+        /* get the frame's size */
+        w += c->frame->size.left + c->frame->size.right;
+        h += c->frame->size.top + c->frame->size.bottom;
+
+        x = o->x;
+        if (o->xcenter) x = (area->width - w) / 2;
+        else if (x == G_MININT) x = c->frame->area.x - carea->x;
+        else if (o->xopposite) x = area->width - w;
+        x += area->x;
+
+        y = o->y;
+        if (o->ycenter) y = (area->height - h) / 2;
+        else if (y == G_MININT) y = c->frame->area.y - carea->y;
+        else if (o->yopposite) y = area->height - h;
+        y += area->y;
+
+        /* get the client's size back */
+        w -= c->frame->size.left + c->frame->size.right;
+        h -= c->frame->size.top + c->frame->size.bottom;        
+
+        frame_frame_gravity(c->frame, &x, &y); /* get the client coords */
+        client_try_configure(c, &x, &y, &w, &h, &lw, &lh, TRUE);
+        /* force it on screen if its moving to another monitor */
+        client_find_onscreen(c, &x, &y, w, h, mon != cmon);
+
+        actions_client_move(data, TRUE);
+        client_configure(c, x, y, w, h, TRUE, TRUE, FALSE);
+        actions_client_move(data, FALSE);
+
+        g_free(area);
+        g_free(carea);
+    }
+
+    return FALSE;
+}
diff --git a/openbox/actions/movetoedge.c b/openbox/actions/movetoedge.c
new file mode 100644 (file)
index 0000000..768783f
--- /dev/null
@@ -0,0 +1,77 @@
+#include "openbox/actions.h"
+#include "openbox/misc.h"
+#include "openbox/client.h"
+#include "openbox/frame.h"
+#include "openbox/geom.h"
+#include <glib.h>
+
+typedef struct {
+    ObDirection dir;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_movetoedge_startup()
+{
+    actions_register("MoveToEdge",
+                     setup_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+    o->dir = OB_DIRECTION_NORTH;
+
+    if ((n = parse_find_node("direction", node))) {
+        gchar *s = parse_string(doc, n);
+        if (!g_ascii_strcasecmp(s, "north") ||
+            !g_ascii_strcasecmp(s, "up"))
+            o->dir = OB_DIRECTION_NORTH;
+        else if (!g_ascii_strcasecmp(s, "south") ||
+                 !g_ascii_strcasecmp(s, "down"))
+            o->dir = OB_DIRECTION_SOUTH;
+        else if (!g_ascii_strcasecmp(s, "west") ||
+                 !g_ascii_strcasecmp(s, "left"))
+            o->dir = OB_DIRECTION_WEST;
+        else if (!g_ascii_strcasecmp(s, "east") ||
+                 !g_ascii_strcasecmp(s, "right"))
+            o->dir = OB_DIRECTION_EAST;
+        g_free(s);
+    }
+
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    g_free(o);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+
+    if (data->client) {
+        gint x, y;
+
+        client_find_move_directional(data->client, o->dir, &x, &y);
+        if (x != data->client->area.x || y != data->client->area.y) {
+            actions_client_move(data, TRUE);
+            client_move(data->client, x, y);
+            actions_client_move(data, FALSE);
+        }
+    }
+
+    return FALSE;
+}
diff --git a/openbox/actions/omnipresent.c b/openbox/actions/omnipresent.c
new file mode 100644 (file)
index 0000000..92cdfb3
--- /dev/null
@@ -0,0 +1,62 @@
+#include "openbox/actions.h"
+#include "openbox/client.h"
+#include "openbox/screen.h"
+
+typedef struct {
+    gboolean toggle;
+    gboolean on;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_omnipresent_startup()
+{
+    actions_register("omnipresent",
+                     setup_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+    o->toggle = TRUE;
+
+    if ((n = parse_find_node("state", node))) {
+        gchar *s = parse_string(doc, n);
+        if (g_ascii_strcasecmp(s, "toggle")) {
+            o->toggle = FALSE;
+            o->on = parse_bool(doc, n);
+        }
+        g_free(s);
+    }
+
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    g_free(o);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+
+    if (data->client)
+        if (o->toggle || (o->on != (data->client->desktop == DESKTOP_ALL)))
+            client_set_desktop(data->client,
+                               data->client->desktop == DESKTOP_ALL ?
+                               screen_desktop : DESKTOP_ALL, FALSE, TRUE);
+
+    return FALSE;
+}
diff --git a/openbox/actions/raise.c b/openbox/actions/raise.c
new file mode 100644 (file)
index 0000000..916c27b
--- /dev/null
@@ -0,0 +1,24 @@
+#include "openbox/actions.h"
+#include "openbox/stacking.h"
+
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_raise_startup()
+{
+    actions_register("Raise",
+                     NULL, NULL,
+                     run_func,
+                     NULL, NULL);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    if (data->client) {
+        actions_client_move(data, TRUE);
+        stacking_raise(CLIENT_AS_WINDOW(data->client));
+        actions_client_move(data, FALSE);
+    }
+
+    return FALSE;
+}
diff --git a/openbox/actions/raiselower.c b/openbox/actions/raiselower.c
new file mode 100644 (file)
index 0000000..f75410a
--- /dev/null
@@ -0,0 +1,24 @@
+#include "openbox/actions.h"
+#include "openbox/stacking.h"
+
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_raiselower_startup()
+{
+    actions_register("RaiseLower",
+                     NULL, NULL,
+                     run_func,
+                     NULL, NULL);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    if (data->client) {
+        actions_client_move(data, TRUE);
+        stacking_restack_request(data->client, NULL, Opposite);
+        actions_client_move(data, FALSE);
+    }
+
+    return FALSE;
+}
diff --git a/openbox/actions/reconfigure.c b/openbox/actions/reconfigure.c
new file mode 100644 (file)
index 0000000..8802a37
--- /dev/null
@@ -0,0 +1,20 @@
+#include "openbox/actions.h"
+#include "openbox/openbox.h"
+
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_reconfigure_startup()
+{
+    actions_register("Reconfigure",
+                     NULL, NULL,
+                     run_func,
+                     NULL, NULL);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    ob_reconfigure();
+
+    return FALSE;
+}
diff --git a/openbox/actions/resize.c b/openbox/actions/resize.c
new file mode 100644 (file)
index 0000000..2695137
--- /dev/null
@@ -0,0 +1,198 @@
+#include "openbox/actions.h"
+#include "openbox/prop.h"
+#include "openbox/moveresize.h"
+#include "openbox/client.h"
+#include "openbox/frame.h"
+
+typedef struct {
+    guint32 corner;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+static guint32 pick_corner(gint x, gint y, gint cx, gint cy, gint cw, gint ch,
+                           gboolean shaded);
+
+void action_resize_startup()
+{
+    actions_register("Resize",
+                     setup_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+
+    if ((n = parse_find_node("edge", node))) {
+        gchar *s = parse_string(doc, n);
+        if (!g_ascii_strcasecmp(s, "top"))
+            o->corner = prop_atoms.net_wm_moveresize_size_top;
+        else if (!g_ascii_strcasecmp(s, "bottom"))
+            o->corner = prop_atoms.net_wm_moveresize_size_bottom;
+        else if (!g_ascii_strcasecmp(s, "left"))
+            o->corner = prop_atoms.net_wm_moveresize_size_left;
+        else if (!g_ascii_strcasecmp(s, "right"))
+            o->corner = prop_atoms.net_wm_moveresize_size_right;
+        else if (!g_ascii_strcasecmp(s, "topleft"))
+            o->corner = prop_atoms.net_wm_moveresize_size_topleft;
+        else if (!g_ascii_strcasecmp(s, "topright"))
+            o->corner = prop_atoms.net_wm_moveresize_size_topright;
+        else if (!g_ascii_strcasecmp(s, "bottomleft"))
+            o->corner = prop_atoms.net_wm_moveresize_size_bottomleft;
+        else if (!g_ascii_strcasecmp(s, "bottomright"))
+            o->corner = prop_atoms.net_wm_moveresize_size_bottomright;
+        g_free(s);
+    }
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    g_free(o);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+
+    if (data->client) {
+        ObClient *c = data->client;
+        guint32 corner;
+
+        if (!data->button)
+            corner = prop_atoms.net_wm_moveresize_size_keyboard;
+        else if (o->corner)
+            corner = o->corner; /* it was specified in the binding */
+        else
+            corner = pick_corner(data->x, data->y,
+                                 c->frame->area.x, c->frame->area.y,
+                                 /* use the client size because the frame
+                                    can be differently sized (shaded
+                                    windows) and we want this based on the
+                                    clients size */
+                                 c->area.width + c->frame->size.left +
+                                 c->frame->size.right,
+                                 c->area.height + c->frame->size.top +
+                                 c->frame->size.bottom, c->shaded);
+
+        moveresize_start(c, data->x, data->y, data->button, corner);
+    }
+
+    return FALSE;
+}
+
+static guint32 pick_corner(gint x, gint y, gint cx, gint cy, gint cw, gint ch,
+                           gboolean shaded)
+{
+    /* let's make x and y client relative instead of screen relative */
+    x = x - cx;
+    y = ch - (y - cy); /* y is inverted, 0 is at the bottom of the window */
+
+#define X x*ch/cw
+#define A -4*X + 7*ch/3
+#define B  4*X -15*ch/9
+#define C -X/4 + 2*ch/3
+#define D  X/4 + 5*ch/12
+#define E  X/4 +   ch/3
+#define F -X/4 + 7*ch/12
+#define G  4*X - 4*ch/3
+#define H -4*X + 8*ch/3
+#define a (y > 5*ch/9)
+#define b (x < 4*cw/9)
+#define c (x > 5*cw/9)
+#define d (y < 4*ch/9)
+
+    /*
+      Each of these defines (except X which is just there for fun), represents
+      the equation of a line. The lines they represent are shown in the diagram
+      below. Checking y against these lines, we are able to choose a region
+      of the window as shown.
+
+      +---------------------A-------|-------|-------B---------------------+
+      |                     |A                     B|                     |
+      |                     |A      |       |      B|                     |
+      |                     | A                   B |                     |
+      |                     | A     |       |     B |                     |
+      |                     |  A                 B  |                     |
+      |                     |  A    |       |    B  |                     |
+      |        northwest    |   A     north     B   |   northeast         |
+      |                     |   A   |       |   B   |                     |
+      |                     |    A             B    |                     |
+      C---------------------+----A--+-------+--B----+---------------------D
+      |CCCCCCC              |     A           B     |              DDDDDDD|
+      |       CCCCCCCC      |     A |       | B     |      DDDDDDDD       |
+      |               CCCCCCC      A         B      DDDDDDD               |
+      - - - - - - - - - - - +CCCCCCC+aaaaaaa+DDDDDDD+ - - - - - - - - - - - -
+      |                     |       b       c       |                     | sh
+      |             west    |       b  move c       |   east              | ad
+      |                     |       b       c       |                     | ed
+      - - - - - - - - - - - +EEEEEEE+ddddddd+FFFFFFF+- - - - - - - - - - -  -
+      |               EEEEEEE      G         H      FFFFFFF               |
+      |       EEEEEEEE      |     G |       | H     |      FFFFFFFF       |
+      |EEEEEEE              |     G           H     |              FFFFFFF|
+      E---------------------+----G--+-------+--H----+---------------------F
+      |                     |    G             H    |                     |
+      |                     |   G   |       |   H   |                     |
+      |        southwest    |   G     south     H   |   southeast         |
+      |                     |  G    |       |    H  |                     |
+      |                     |  G                 H  |                     |
+      |                     | G     |       |     H |                     |
+      |                     | G                   H |                     |
+      |                     |G      |       |      H|                     |
+      |                     |G                     H|                     |
+      +---------------------G-------|-------|-------H---------------------+
+    */
+
+    if (shaded) {
+        /* for shaded windows, you can only resize west/east and move */
+        if (b)
+            return prop_atoms.net_wm_moveresize_size_left;
+        if (c)
+            return prop_atoms.net_wm_moveresize_size_right;
+        return prop_atoms.net_wm_moveresize_move;
+    }
+
+    if (y < A && y >= C)
+        return prop_atoms.net_wm_moveresize_size_topleft;
+    else if (y >= A && y >= B && a)
+        return prop_atoms.net_wm_moveresize_size_top;
+    else if (y < B && y >= D)
+        return prop_atoms.net_wm_moveresize_size_topright;
+    else if (y < C && y >= E && b)
+        return prop_atoms.net_wm_moveresize_size_left;
+    else if (y < D && y >= F && c)
+        return prop_atoms.net_wm_moveresize_size_right;
+    else if (y < E && y >= G)
+        return prop_atoms.net_wm_moveresize_size_bottomleft;
+    else if (y < G && y < H && d)
+        return prop_atoms.net_wm_moveresize_size_bottom;
+    else if (y >= H && y < F)
+        return prop_atoms.net_wm_moveresize_size_bottomright;
+    else
+        return prop_atoms.net_wm_moveresize_move;
+
+#undef X
+#undef A
+#undef B
+#undef C
+#undef D
+#undef E
+#undef F
+#undef G
+#undef H
+#undef a
+#undef b
+#undef c
+#undef d
+}
diff --git a/openbox/actions/resizerelative.c b/openbox/actions/resizerelative.c
new file mode 100644 (file)
index 0000000..075c9e7
--- /dev/null
@@ -0,0 +1,85 @@
+#include "openbox/actions.h"
+#include "openbox/client.h"
+#include "openbox/screen.h"
+#include "openbox/frame.h"
+#include <stdlib.h> /* for atoi */
+
+typedef struct {
+    gint left;
+    gint right;
+    gint top;
+    gint bottom;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_resizerelative_startup()
+{
+    actions_register("ResizeRelative",
+                     setup_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+
+    if ((n = parse_find_node("left", node)))
+        o->left = parse_int(doc, n);
+    if ((n = parse_find_node("right", node)))
+        o->right = parse_int(doc, n);
+    if ((n = parse_find_node("top", node)))
+        o->top = parse_int(doc, n);
+    if ((n = parse_find_node("bottom", node)))
+        o->bottom = parse_int(doc, n);
+
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    g_free(o);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+
+    if (data->client) {
+        ObClient *c = data->client;
+        gint x, y, ow, xoff, nw, oh, yoff, nh, lw, lh;
+
+        x = c->area.x;
+        y = c->area.y;
+        ow = c->area.width;
+        xoff = -o->left * c->size_inc.width;
+        nw = ow + o->right * c->size_inc.width
+            + o->left * c->size_inc.width;
+        oh = c->area.height;
+        yoff = -o->top * c->size_inc.height;
+        nh = oh + o->bottom * c->size_inc.height
+            + o->top * c->size_inc.height;
+
+        client_try_configure(c, &x, &y, &nw, &nh, &lw, &lh, TRUE);
+        xoff = xoff == 0 ? 0 :
+            (xoff < 0 ? MAX(xoff, ow-nw) : MIN(xoff, ow-nw));
+        yoff = yoff == 0 ? 0 :
+            (yoff < 0 ? MAX(yoff, oh-nh) : MIN(yoff, oh-nh));
+
+        actions_client_move(data, TRUE);
+        client_move_resize(c, x + xoff, y + yoff, nw, nh);
+        actions_client_move(data, FALSE);
+    }
+
+    return FALSE;
+}
diff --git a/openbox/actions/restart.c b/openbox/actions/restart.c
new file mode 100644 (file)
index 0000000..f7f1dfc
--- /dev/null
@@ -0,0 +1,54 @@
+#include "openbox/actions.h"
+#include "openbox/openbox.h"
+
+typedef struct {
+    gchar   *cmd;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_restart_startup()
+{
+    actions_register("Restart",
+                     setup_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+
+    if ((n = parse_find_node("execute", node))) {
+        gchar *s = parse_string(doc, n);
+        o->cmd = parse_expand_tilde(s);
+        g_free(s);
+    }
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    if (o) {
+        g_free(o->cmd);
+        g_free(o);
+    }
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+
+    ob_restart_other(o->cmd);
+
+    return FALSE;
+}
diff --git a/openbox/actions/shade.c b/openbox/actions/shade.c
new file mode 100644 (file)
index 0000000..d28f91e
--- /dev/null
@@ -0,0 +1,64 @@
+#include "openbox/actions.h"
+#include "openbox/client.h"
+
+typedef struct {
+    gboolean toggle;
+    gboolean on;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_shade_startup()
+{
+    actions_register("Shade",
+                     setup_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+    o->toggle = TRUE;
+
+    if ((n = parse_find_node("state", node))) {
+        gchar *s = parse_string(doc, n);
+        if (g_ascii_strcasecmp(s, "toggle")) {
+            o->toggle = FALSE;
+            o->on = parse_bool(doc, n);
+        }
+        g_free(s);
+    }
+
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    g_free(o);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+
+    if (data->client) {
+        actions_client_move(data, TRUE);
+        if (o->toggle)
+            client_shade(data->client, !data->client->shaded);
+        else
+            client_shade(data->client, o->on);
+        actions_client_move(data, FALSE);
+    }
+
+    return FALSE;
+}
diff --git a/openbox/actions/showdesktop.c b/openbox/actions/showdesktop.c
new file mode 100644 (file)
index 0000000..8781f95
--- /dev/null
@@ -0,0 +1,20 @@
+#include "openbox/actions.h"
+#include "openbox/screen.h"
+
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_showdesktop_startup()
+{
+    actions_register("ShowDesktop",
+                     NULL, NULL,
+                     run_func,
+                     NULL, NULL);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    screen_show_desktop(!screen_showing_desktop, NULL);
+
+    return FALSE;
+}
diff --git a/openbox/actions/unfocus.c b/openbox/actions/unfocus.c
new file mode 100644 (file)
index 0000000..d581864
--- /dev/null
@@ -0,0 +1,53 @@
+#include "openbox/actions.h"
+#include "openbox/focus.h"
+
+typedef struct {
+    gboolean tobottom;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static void     free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_unfocus_startup()
+{
+    actions_register("Unfocus",
+                     setup_func,
+                     free_func,
+                     run_func,
+                     NULL, NULL);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+    xmlNodePtr n;
+    Options *o;
+
+    o = g_new0(Options, 1);
+    o->tobottom = TRUE;
+
+    if ((n = parse_find_node("tobottom", node)))
+        o->tobottom = parse_bool(doc, n);
+    return o;
+}
+
+static void free_func(gpointer options)
+{
+    Options *o = options;
+
+    g_free(o);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+    Options *o = options;
+
+    if (data->client && data->client == focus_client) {
+        if (o->tobottom)
+            focus_order_to_bottom(data->client);
+        focus_fallback(FALSE, FALSE, TRUE);
+    }
+
+    return FALSE;
+}
index ed6779264454bdca6e9c82ea5d662ae21f0bba3b..e33b89e4da72e9280f25768e5d4afa75deddf017 100644 (file)
@@ -455,6 +455,18 @@ gboolean client_find_onscreen(ObClient *self, gint *x, gint *y, gint w, gint h,
 */
 void client_move_onscreen(ObClient *self, gboolean rude);
 
+/*! dir is either North, South, East or West. It can't be, for example,
+  Northwest */
+void client_find_edge_directional(ObClient *self, ObDirection dir,
+                                  gint my_head, gint my_tail,
+                                  gint my_edge_start, gint my_edge_size,
+                                  gint *dest, gboolean *near_edge);
+void client_find_move_directional(ObClient *self, ObDirection dir,
+                                  gint *x, gint *y);
+void client_find_resize_directional(ObClient *self, ObDirection side,
+                                    gboolean grow,
+                                    gint *x, gint *y, gint *w, gint *h);
+
 /*! Fullscreen's or unfullscreen's the client window
   @param fs true if the window should be made fullscreen; false if it should
             be returned to normal state.
@@ -550,10 +562,13 @@ gboolean client_focus(ObClient *self);
   when the user deliberately selects a window for use.
   @param here If true, then the client is brought to the current desktop;
               otherwise, the desktop is changed to where the client lives.
+  @param raise If true, the client is brought to the front.
+  @param unshade If true, the client is unshaded (if it is shaded)
   @param user If true, then a user action is what requested the activation;
               otherwise, it means an application requested it on its own
 */
-void client_activate(ObClient *self, gboolean here, gboolean user);
+void client_activate(ObClient *self, gboolean here, gboolean raise,
+                     gboolean unshade, gboolean user);
 
 /*! Bring all of its helper windows to its desktop. These are the utility and
   stuff windows. */
@@ -679,9 +694,6 @@ ObClient *client_search_parent(ObClient *self, ObClient *search);
   NULL is returned if the given search is not a transient of the client. */
 ObClient *client_search_transient(ObClient *self, ObClient *search);
 
-/*! Return the closest edge in the given direction */
-gint client_directional_edge_search(ObClient *c, ObDirection dir, gboolean hang);
-
 /*! Set a client window to be above/below other clients.
   @layer < 0 indicates the client should be placed below other clients.<br />
          = 0 indicates the client should be placed with other clients.<br />
index ef3b5c0a6dadaea31bb1dc118486741dbc9c4371..556245df3981970e61471c1248478924d1680afa 100644 (file)
@@ -104,12 +104,11 @@ static gboolean self_update(ObMenuFrame *frame, gpointer data)
 }
 
 static void menu_execute(ObMenuEntry *self, ObMenuFrame *f,
-                         ObClient *c, guint state, gpointer data,
-                         Time time)
+                         ObClient *c, guint state, gpointer data)
 {
     if (self->id == CLIENT) {
         if (self->data.normal.data) /* it's set to NULL if its destroyed */
-            client_activate(self->data.normal.data, FALSE, TRUE);
+            client_activate(self->data.normal.data, FALSE, TRUE, TRUE, TRUE);
     }
     else if (self->id == ADD_DESKTOP) {
         screen_add_desktop(FALSE);
index bae6e8f0d03497633a647cd0d61b4e47b28dc325..62558ef4a0a313b0923b87084d1bb1bd4200db28 100644 (file)
@@ -99,12 +99,11 @@ static gboolean desk_menu_update(ObMenuFrame *frame, gpointer data)
 }
 
 static void desk_menu_execute(ObMenuEntry *self, ObMenuFrame *f,
-                              ObClient *c, guint state, gpointer data,
-                              Time time)
+                              ObClient *c, guint state, gpointer data)
 {
     if (self->id == CLIENT) {
         if (self->data.normal.data) /* it's set to NULL if its destroyed */
-            client_activate(self->data.normal.data, FALSE, TRUE);
+            client_activate(self->data.normal.data, FALSE, TRUE, TRUE, TRUE);
     }
     else
         screen_set_desktop(self->id, TRUE);
index dacbf89d8a9aa1657d83b8051bb00aa7b7d71280..fbca23d17b4ff44f7793bb6cadcb32e59055ba1f 100644 (file)
@@ -103,8 +103,7 @@ static gboolean client_menu_update(ObMenuFrame *frame, gpointer data)
 }
 
 static void client_menu_execute(ObMenuEntry *e, ObMenuFrame *f,
-                                ObClient *c, guint state, gpointer data,
-                                Time time)
+                                ObClient *c, guint state, gpointer data)
 {
     gint x, y;
     gulong ignore_start;
@@ -202,8 +201,7 @@ static gboolean layer_menu_update(ObMenuFrame *frame, gpointer data)
 }
 
 static void layer_menu_execute(ObMenuEntry *e, ObMenuFrame *f,
-                               ObClient *c, guint state, gpointer data,
-                               Time time)
+                               ObClient *c, guint state, gpointer data)
 {
     gulong ignore_start;
 
@@ -281,8 +279,7 @@ static gboolean send_to_menu_update(ObMenuFrame *frame, gpointer data)
 }
 
 static void send_to_menu_execute(ObMenuEntry *e, ObMenuFrame *f,
-                                 ObClient *c, guint state, gpointer data,
-                                 Time time)
+                                 ObClient *c, guint state, gpointer data)
 {
     g_assert(c);
 
@@ -293,11 +290,11 @@ static void send_to_menu_execute(ObMenuEntry *e, ObMenuFrame *f,
 }
 
 static void client_menu_place(ObMenuFrame *frame, gint *x, gint *y,
-                              gint button, gpointer data)
+                              gboolean mouse, gpointer data)
 {
     gint dx, dy;
 
-    if (button == 0 && frame->client) {
+    if (!mouse && frame->client) {
         *x = frame->client->frame->area.x;
 
         /* try below the titlebar */
diff --git a/openbox/composite.c b/openbox/composite.c
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/openbox/composite.h b/openbox/composite.h
new file mode 100644 (file)
index 0000000..e69de29
index 69ba1595d4cb2f3c199fc4960954c2dd5eb8d6ae..72ac4108accf3989958c78d7fbf5db44d156a7c2 100644 (file)
@@ -782,22 +782,6 @@ typedef struct
     const gchar *actname;
 } ObDefKeyBind;
 
-static void bind_default_keyboard()  
-{  
-    ObDefKeyBind *it;  
-    ObDefKeyBind binds[] = {  
-        { "A-Tab", "NextWindow" },  
-        { "S-A-Tab", "PreviousWindow" },  
-        { "A-F4", "Close" },  
-        { NULL, NULL }  
-    };  
-     
-    for (it = binds; it->key; ++it) {  
-        GList *l = g_list_append(NULL, g_strdup(it->key));  
-        keyboard_bind(l, actions_parse_string(it->actname));
-    }  
-}  
 typedef struct
 {
     const gchar *button;
@@ -842,14 +826,18 @@ static void bind_default_mouse()
         { "Left", "AllDesktops", OB_MOUSE_ACTION_CLICK, "Raise" },
         { "Left", "Shade", OB_MOUSE_ACTION_CLICK, "Raise" },
         { "Left", "Close", OB_MOUSE_ACTION_CLICK, "Close" },
-        { "Left", "Maximize", OB_MOUSE_ACTION_CLICK, "ToggleMaximizeFull" },
+        { "Left", "Maximize", OB_MOUSE_ACTION_CLICK, "Maximize" },
         { "Left", "Iconify", OB_MOUSE_ACTION_CLICK, "Iconify" },
-        { "Left", "AllDesktops", OB_MOUSE_ACTION_CLICK, "ToggleOmnipresent" },
-        { "Left", "Shade", OB_MOUSE_ACTION_CLICK, "ToggleShade" },
+        { "Left", "AllDesktops", OB_MOUSE_ACTION_CLICK, "Omnipresent" },
+        { "Left", "Shade", OB_MOUSE_ACTION_CLICK, "Shade" },
         { "Left", "TLCorner", OB_MOUSE_ACTION_MOTION, "Resize" },
         { "Left", "TRCorner", OB_MOUSE_ACTION_MOTION, "Resize" },
         { "Left", "BLCorner", OB_MOUSE_ACTION_MOTION, "Resize" },
         { "Left", "BRCorner", OB_MOUSE_ACTION_MOTION, "Resize" },
+        { "Left", "Top", OB_MOUSE_ACTION_MOTION, "Resize" },
+        { "Left", "Bottom", OB_MOUSE_ACTION_MOTION, "Resize" },
+        { "Left", "Left", OB_MOUSE_ACTION_MOTION, "Resize" },
+        { "Left", "Right", OB_MOUSE_ACTION_MOTION, "Resize" },
         { "Left", "Titlebar", OB_MOUSE_ACTION_MOTION, "Move" },
         { "A-Left", "Frame", OB_MOUSE_ACTION_MOTION, "Move" },
         { "A-Middle", "Frame", OB_MOUSE_ACTION_MOTION, "Resize" },
@@ -925,8 +913,6 @@ void config_startup(ObParseInst *i)
     translate_key("C-g", &config_keyboard_reset_state,
                   &config_keyboard_reset_keycode);
 
-    bind_default_keyboard();
-
     parse_register(i, "keyboard", parse_keyboard, NULL);
 
     config_mouse_threshold = 8;
index 8f26f482095ad58c7b0c6d9307927f3034548654..c3a17fbdddc9649929144946f534b7e377488d1d 100644 (file)
@@ -22,6 +22,7 @@
 #include "window.h"
 #include "openbox.h"
 #include "dock.h"
+#include "actions.h"
 #include "client.h"
 #include "xerror.h"
 #include "prop.h"
@@ -808,8 +809,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
            want to deal with them
         */
         if (!(e->xbutton.button == 4 || e->xbutton.button == 5) &&
-            !keyboard_interactively_grabbed() &&
-            !menu_frame_visible)
+            !grab_on_keyboard())
         {
             /* use where the press occured */
             con = frame_context(client, e->xbutton.window, px, py);
@@ -956,7 +956,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
                           (e->type == EnterNotify ? "Enter" : "Leave"),
                           e->xcrossing.mode,
                           e->xcrossing.detail, (client?client->window:0));
-            if (keyboard_interactively_grabbed())
+            if (grab_on_keyboard())
                 break;
             if (config_focus_follow && config_focus_delay &&
                 /* leave inferior events can happen when the mouse goes onto
@@ -999,7 +999,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
             frame_adjust_state(client->frame);
             break;
         case OB_FRAME_CONTEXT_FRAME:
-            if (keyboard_interactively_grabbed())
+            if (grab_on_keyboard())
                 break;
             if (e->xcrossing.mode == NotifyGrab ||
                 e->xcrossing.mode == NotifyUngrab ||
@@ -1219,7 +1219,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
                                        it can happen now when the window is on
                                        another desktop, but we still don't
                                        want it! */
-        client_activate(client, FALSE, TRUE);
+        client_activate(client, FALSE, TRUE, TRUE, TRUE);
         break;
     case ClientMessage:
         /* validate cuz we query stuff off the client here */
@@ -1297,7 +1297,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
                 ob_debug_type(OB_DEBUG_APP_BUGS,
                               "_NET_ACTIVE_WINDOW message for window %s is "
                               "missing source indication\n");
-            client_activate(client, FALSE,
+            client_activate(client, FALSE, TRUE, TRUE,
                             (e->xclient.data.l[0] == 0 ||
                              e->xclient.data.l[0] == 2));
         } else if (msgtype == prop_atoms.net_wm_moveresize) {
@@ -1630,7 +1630,7 @@ static gboolean event_handle_menu_keyboard(XEvent *ev)
         if (frame->child)
             menu_frame_select_next(frame->child);
         else if (frame->selected)
-            menu_entry_frame_execute(frame->selected, state, ev->xkey.time);
+            menu_entry_frame_execute(frame->selected, state);
     }
 
     else if (keycode == ob_keycode(OB_KEY_LEFT) && ev->xkey.state == 0) {
@@ -1700,7 +1700,7 @@ static gboolean event_handle_menu_keyboard(XEvent *ev)
                 menu_frame_select(frame, found, TRUE);
                 usleep(50000); /* highlight the item for a short bit so the
                                   user can see what happened */
-                menu_entry_frame_execute(found, state, ev->xkey.time);
+                menu_entry_frame_execute(found, state);
             } else {
                 menu_frame_select(frame, found, TRUE);
                 if (num_found == 1)
@@ -1730,8 +1730,7 @@ static gboolean event_handle_menu(XEvent *ev)
                                             ev->xbutton.y_root)))
             {
                 menu_frame_select(e->frame, e, TRUE);
-                menu_entry_frame_execute(e, ev->xbutton.state,
-                                         ev->xbutton.time);
+                menu_entry_frame_execute(e, ev->xbutton.state);
             }
             else
                 menu_frame_hide_all();
@@ -1792,9 +1791,7 @@ static void event_handle_user_input(ObClient *client, XEvent *e)
 
     /* if the keyboard interactive action uses the event then dont
        use it for bindings. likewise is moveresize uses the event. */
-    if (!keyboard_process_interactive_grab(e, &client) &&
-        !(moveresize_in_progress && moveresize_event(e)))
-    {
+    if (!actions_interactive_input_event(e) && !moveresize_event(e)) {
         if (moveresize_in_progress)
             /* make further actions work on the client being
                moved/resized */
@@ -1899,9 +1896,9 @@ static gboolean is_enter_focus_event_ignored(XEvent *e)
 
 void event_cancel_all_key_grabs()
 {
-    if (keyboard_interactively_grabbed()) {
-        keyboard_interactive_cancel();
-        ob_debug("KILLED interactive event\n");
+    if (actions_interactive_act_running()) {
+        actions_interactive_cancel_act();
+        ob_debug("KILLED interactive action\n");
     }
     else if (menu_frame_visible) {
         menu_frame_hide_all();
index 0609877194c4bfe3758f3a80fa27f50559af6bd9..9a0b2bdc31b466c21ab6c151fbed345c2225ed5c 100644 (file)
@@ -122,12 +122,12 @@ static ObClient* focus_fallback_target(gboolean allow_refocus,
            1. it is on the current desktop. this ignores omnipresent
            windows, which are problematic in their own rite, unless they are
            specifically allowed
-           2. it is a normal type window, don't fall back onto a dock or
-           a splashscreen or a desktop window (save the desktop as a
-           backup fallback though)
+           2. it is a valid auto-focus target
+           3. it is not shaded
         */
         if ((allow_omnipresent || c->desktop == screen_desktop) &&
             focus_valid_target(c, TRUE, FALSE, FALSE, FALSE, FALSE) &&
+            !c->shaded &&
             (allow_refocus || client_focus_target(c) != old) &&
             client_focus(c))
         {
index 4e77452e6dc598a4682f3ce2460fe96c17ac2075..02510c4db5f6bf58c65c89a2dfd8fdbe16e32aba 100644 (file)
@@ -67,15 +67,16 @@ void focus_cycle_stop(ObClient *ifclient)
     }
 }
 
-void focus_cycle(gboolean forward, gboolean all_desktops,
-                 gboolean dock_windows, gboolean desktop_windows,
-                 gboolean linear, gboolean interactive,
-                 gboolean dialog, gboolean done, gboolean cancel)
+ObClient* focus_cycle(gboolean forward, gboolean all_desktops,
+                      gboolean dock_windows, gboolean desktop_windows,
+                      gboolean linear, gboolean interactive,
+                      gboolean dialog, gboolean done, gboolean cancel)
 {
     static ObClient *t = NULL;
     static GList *order = NULL;
     GList *it, *start, *list;
     ObClient *ft = NULL;
+    ObClient *ret = NULL;
 
     if (interactive) {
         if (cancel) {
@@ -136,7 +137,7 @@ void focus_cycle(gboolean forward, gboolean all_desktops,
                                            focus_cycle_all_desktops,
                                            focus_cycle_dock_windows,
                                            focus_cycle_desktop_windows);
-                return;
+                return focus_cycle_target;
             } else if (ft != focus_cycle_target) {
                 focus_cycle_target = ft;
                 done = TRUE;
@@ -146,8 +147,7 @@ void focus_cycle(gboolean forward, gboolean all_desktops,
     } while (it != start);
 
 done_cycle:
-    if (done && focus_cycle_target)
-        client_activate(focus_cycle_target, FALSE, TRUE);
+    if (done && !cancel) ret = focus_cycle_target;
 
     t = NULL;
     focus_cycle_target = NULL;
@@ -159,7 +159,7 @@ done_cycle:
         focus_cycle_popup_hide();
     }
 
-    return;
+    return ret;
 }
 
 /* this be mostly ripped from fvwm */
@@ -258,12 +258,15 @@ static ObClient *focus_find_directional(ObClient *c, ObDirection dir,
     return best_client;
 }
 
-void focus_directional_cycle(ObDirection dir, gboolean dock_windows,
-                             gboolean desktop_windows, gboolean interactive,
-                             gboolean dialog, gboolean done, gboolean cancel)
+ObClient* focus_directional_cycle(ObDirection dir, gboolean dock_windows,
+                                  gboolean desktop_windows,
+                                  gboolean interactive,
+                                  gboolean dialog,
+                                  gboolean done, gboolean cancel)
 {
     static ObClient *first = NULL;
     ObClient *ft = NULL;
+    ObClient *ret = NULL;
 
     if (cancel) {
         focus_cycle_target = NULL;
@@ -313,11 +316,10 @@ void focus_directional_cycle(ObDirection dir, gboolean dock_windows,
                                       focus_cycle_all_desktops,
                                       focus_cycle_dock_windows,
                                       focus_cycle_desktop_windows);
-    return;
+    return focus_cycle_target;
 
 done_cycle:
-    if (done && focus_cycle_target)
-        client_activate(focus_cycle_target, FALSE, TRUE);
+    if (done && !cancel) ret = focus_cycle_target;
 
     first = NULL;
     focus_cycle_target = NULL;
@@ -325,5 +327,5 @@ done_cycle:
     focus_cycle_draw_indicator(NULL);
     focus_cycle_popup_single_hide();
 
-    return;
+    return ret;
 }
index 2e32805f1948bef39a109a807c519471eb0a051a..68b8d929d149d856a08e1f5ad5dc416804063102 100644 (file)
@@ -34,13 +34,16 @@ void focus_cycle_startup(gboolean reconfig);
 void focus_cycle_shutdown(gboolean reconfig);
 
 /*! Cycle focus amongst windows. */
-void focus_cycle(gboolean forward, gboolean all_desktops,
-                 gboolean dock_windows, gboolean desktop_windows,
-                 gboolean linear, gboolean interactive,
-                 gboolean dialog, gboolean done, gboolean cancel);
-void focus_directional_cycle(ObDirection dir, gboolean dock_windows,
-                             gboolean desktop_windows, gboolean interactive,
-                             gboolean dialog, gboolean done, gboolean cancel);
+struct _ObClient* focus_cycle(gboolean forward, gboolean all_desktops,
+                              gboolean dock_windows, gboolean desktop_windows,
+                              gboolean linear, gboolean interactive,
+                              gboolean dialog, gboolean done, gboolean cancel);
+struct _ObClient* focus_directional_cycle(ObDirection dir,
+                                          gboolean dock_windows,
+                                          gboolean desktop_windows,
+                                          gboolean interactive,
+                                          gboolean dialog,
+                                          gboolean done, gboolean cancel);
 
 void focus_cycle_stop(struct _ObClient *ifclient);
 
index 144f8649f025b9ee5c4d879b24c79d135f8e91fc..a4843d6ff9f577f5407c57e1120f2cf18f07855b 100644 (file)
@@ -758,9 +758,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
            frame_client_gravity. */
         self->area.x = self->client->area.x;
         self->area.y = self->client->area.y;
-        frame_client_gravity(self, &self->area.x, &self->area.y,
-                             self->client->area.width,
-                             self->client->area.height);
+        frame_client_gravity(self, &self->area.x, &self->area.y);
     }
 
     if (!fake) {
@@ -1254,8 +1252,6 @@ ObFrameContext frame_context_from_string(const gchar *name)
         return OB_FRAME_CONTEXT_TOP;
     else if (!g_ascii_strcasecmp("Bottom", name))
         return OB_FRAME_CONTEXT_BOTTOM;
-    else if (!g_ascii_strcasecmp("Handle", name))
-        return OB_FRAME_CONTEXT_BOTTOM;
     else if (!g_ascii_strcasecmp("Left", name))
         return OB_FRAME_CONTEXT_LEFT;
     else if (!g_ascii_strcasecmp("Right", name))
@@ -1403,7 +1399,7 @@ ObFrameContext frame_context(ObClient *client, Window win, gint x, gint y)
     return OB_FRAME_CONTEXT_NONE;
 }
 
-void frame_client_gravity(ObFrame *self, gint *x, gint *y, gint w, gint h)
+void frame_client_gravity(ObFrame *self, gint *x, gint *y)
 {
     /* horizontal */
     switch (self->client->gravity) {
@@ -1466,7 +1462,7 @@ void frame_client_gravity(ObFrame *self, gint *x, gint *y, gint w, gint h)
     }
 }
 
-void frame_frame_gravity(ObFrame *self, gint *x, gint *y, gint w, gint h)
+void frame_frame_gravity(ObFrame *self, gint *x, gint *y)
 {
     /* horizontal */
     switch (self->client->gravity) {
@@ -1527,7 +1523,7 @@ void frame_rect_to_frame(ObFrame *self, Rect *r)
 {
     r->width += self->size.left + self->size.right;
     r->height += self->size.top + self->size.bottom;
-    frame_client_gravity(self, &r->x, &r->y, r->width, r->height);
+    frame_client_gravity(self, &r->x, &r->y);
 }
 
 static void flash_done(gpointer data)
index cf840bdf1b4aabee568579411a8bd38a2787992e..edf75b059ffee51033d385505b1e4f88253945e4 100644 (file)
@@ -225,13 +225,13 @@ ObFrameContext frame_context(struct _ObClient *self, Window win,
   be positioned.
   @return The proper coordinates for the frame, based on the client.
 */
-void frame_client_gravity(ObFrame *self, gint *x, gint *y, gint w, gint h);
+void frame_client_gravity(ObFrame *self, gint *x, gint *y);
 
 /*! Reversly applies gravity to the frame's position to find where the client
   should be positioned.
     @return The proper coordinates for the client, based on the frame.
 */
-void frame_frame_gravity(ObFrame *self, gint *x, gint *y, gint w, gint h);
+void frame_frame_gravity(ObFrame *self, gint *x, gint *y);
 
 /*! Convert a rectangle in client coordinates/sizes to what it would be
   for the frame, given its current decorations sizes */
index 7fdd18704eee5cfed3483054d070b2446474b1ed..6e45e5c49b6ddd624f4b46462bc1fc948729f310 100644 (file)
@@ -25,7 +25,7 @@
 #include "event.h"
 #include "grab.h"
 #include "client.h"
-#include "action.h"
+#include "actions.h"
 #include "prop.h"
 #include "menuframe.h"
 #include "config.h"
 
 #include <glib.h>
 
-typedef struct {
-    gboolean active;
-    guint state;
-    ObClient *client;
-    ObAction *action;
-} ObInteractiveState;
-
 KeyBindingTree *keyboard_firstnode = NULL;
 static ObPopup *popup = NULL;
-static ObInteractiveState istate;
 static KeyBindingTree *curpos;
 
 static void grab_keys(gboolean grab)
@@ -142,7 +134,7 @@ void keyboard_chroot(GList *keylist)
     }
 }
 
-gboolean keyboard_bind(GList *keylist, ObAction *action)
+gboolean keyboard_bind(GList *keylist, ObActionsAct *action)
 {
     KeyBindingTree *tree, *t;
     gboolean conflict;
@@ -169,14 +161,6 @@ gboolean keyboard_bind(GList *keylist, ObAction *action)
     /* find the bottom node */
     for (; t->first_child; t = t->first_child);
 
-    /* when there are no modifiers in the binding, then the action cannot
-       be interactive */
-    if (!t->state && action->data.any.interactive) {
-        g_print("not interactive\n");
-        action->data.any.interactive = FALSE;
-        action->data.inter.final = TRUE;
-    }
-
     /* set the action */
     t->actions = g_slist_append(t->actions, action);
     /* assimilate this built tree into the main tree. assimilation
@@ -186,60 +170,7 @@ gboolean keyboard_bind(GList *keylist, ObAction *action)
     return TRUE;
 }
 
-static void keyboard_interactive_end(guint state, gboolean cancel, Time time,
-                                     gboolean ungrab)
-{
-    GSList *alist;
-
-    g_assert(istate.active);
-
-    /* ungrab first so they won't be NotifyWhileGrabbed */
-    if (ungrab)
-        ungrab_keyboard();
-
-    /* set this before running the actions so they know the keyboard is not
-       grabbed */
-    istate.active = FALSE;
-
-    alist = g_slist_append(NULL, istate.action);
-    action_run_interactive(alist, istate.client, state, time, cancel, TRUE);
-    g_slist_free(alist);
-
-    keyboard_reset_chains(0);
-}
-
-static void keyboard_interactive_end_client(ObClient *client, gpointer data)
-{
-    if (istate.active && istate.client == client)
-        istate.client = NULL;
-}
-
-
-void keyboard_interactive_cancel()
-{
-    keyboard_interactive_end(0, TRUE, event_curtime, TRUE);
-}
-
-gboolean keyboard_interactive_grab(guint state, ObClient *client,
-                                   ObAction *action)
-{
-    g_assert(action->data.any.interactive);
-
-    if (!istate.active) {
-        if (!grab_keyboard())
-            return FALSE;
-    } else if (action->func != istate.action->func) {
-        keyboard_interactive_end(state, TRUE, action->data.any.time, FALSE);
-    }
-
-    istate.active = TRUE;
-    istate.state = state;
-    istate.client = client;
-    istate.action = action;
-
-    return TRUE;
-}
-
+#if 0
 gboolean keyboard_process_interactive_grab(const XEvent *e, ObClient **client)
 {
     gboolean handled = FALSE;
@@ -272,6 +203,7 @@ gboolean keyboard_process_interactive_grab(const XEvent *e, ObClient **client)
 
     return handled;
 }
+#endif
 
 void keyboard_event(ObClient *client, const XEvent *e)
 {
@@ -316,17 +248,15 @@ void keyboard_event(ObClient *client, const XEvent *e)
                 set_curpos(p);
             else {
                 GSList *it;
-                gboolean inter = FALSE;
 
-                for (it = p->actions; it && !inter; it = g_slist_next(it))
-                    if (((ObAction*)it->data)->data.any.interactive)
-                        inter = TRUE;
-                if (!inter) /* don't reset if the action is interactive */
+                for (it = p->actions; it; it = g_slist_next(it))
+                    if (actions_act_is_interactive(it->data)) break;
+                if (it == NULL) /* reset if the actions are not interactive */
                     keyboard_reset_chains(0);
 
-                action_run_key(p->actions, client, e->xkey.state,
-                               e->xkey.x_root, e->xkey.y_root,
-                               e->xkey.time);
+                actions_run_acts(p->actions, OB_USER_ACTION_KEYBOARD_KEY,
+                                 e->xkey.state, e->xkey.x_root, e->xkey.y_root,
+                                 0, OB_FRAME_CONTEXT_NONE, client);
             }
             break;
         }
@@ -334,29 +264,15 @@ void keyboard_event(ObClient *client, const XEvent *e)
     }
 }
 
-gboolean keyboard_interactively_grabbed()
-{
-    return istate.active;
-}
-
 void keyboard_startup(gboolean reconfig)
 {
     grab_keys(TRUE);
     popup = popup_new(FALSE);
     popup_set_text_align(popup, RR_JUSTIFY_CENTER);
-
-    if (!reconfig)
-        client_add_destroy_notify(keyboard_interactive_end_client, NULL);
 }
 
 void keyboard_shutdown(gboolean reconfig)
 {
-    if (!reconfig)
-        client_remove_destroy_notify(keyboard_interactive_end_client);
-
-    if (istate.active)
-        keyboard_interactive_cancel();
-
     ob_main_loop_timeout_remove(ob_main_loop, chain_timeout);
 
     keyboard_unbind_all();
index 3d70448f4655c9215421087a6cede97a0b3c0b52..1c55e05079a8b673b776ffa656a2143e42a1d7c9 100644 (file)
@@ -27,7 +27,7 @@
 #include <X11/Xlib.h>
 
 struct _ObClient;
-struct _ObAction;
+struct _ObActionsAct;
 
 extern KeyBindingTree *keyboard_firstnode;
 
@@ -35,7 +35,7 @@ void keyboard_startup(gboolean reconfig);
 void keyboard_shutdown(gboolean reconfig);
 
 void keyboard_chroot(GList *keylist);
-gboolean keyboard_bind(GList *keylist, ObAction *action);
+gboolean keyboard_bind(GList *keylist, struct _ObActionsAct *action);
 void keyboard_unbind_all();
 
 void keyboard_event(struct _ObClient *client, const XEvent *e);
@@ -43,12 +43,4 @@ void keyboard_event(struct _ObClient *client, const XEvent *e);
  */
 void keyboard_reset_chains(gint break_chroots);
 
-gboolean keyboard_interactive_grab(guint state, struct _ObClient *client,
-                                   struct _ObAction *action);
-gboolean keyboard_process_interactive_grab(const XEvent *e,
-                                           struct _ObClient **client);
-gboolean keyboard_interactively_grabbed();
-
-void keyboard_interactive_cancel();
-
 #endif
index 202dd32c9864e55c1623c7b04852bbcead34e871..fb26624d0732d88105c97094d036137d5d5fcf9d 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "keyboard.h"
 #include "translate.h"
+#include "actions.h"
 #include <glib.h>
 
 void tree_destroy(KeyBindingTree *tree)
@@ -35,7 +36,7 @@ void tree_destroy(KeyBindingTree *tree)
                 g_free(it->data);
             g_list_free(tree->keylist);
             for (sit = tree->actions; sit != NULL; sit = sit->next)
-                action_unref(sit->data);
+                actions_act_unref(sit->data);
             g_slist_free(tree->actions);
         }
         g_free(tree);
index d3544f80b6988f392d102d9cd5795c0a829e8182..59a515c7944de450632766333413fad856e26bc4 100644 (file)
@@ -19,8 +19,6 @@
 #ifndef __plugin_keyboard_tree_h
 #define __plugin_keyboard_tree_h
 
-#include "action.h"
-
 #include <glib.h>
 
 typedef struct KeyBindingTree {
index 36bba6278c8183c6e06e7f50d1b9016e4e9b2003..f2a25133befed2eb78ea656401ed920dd161c93c 100644 (file)
@@ -18,8 +18,6 @@
 */
 
 #include "mainloop.h"
-#include "action.h"
-#include "client.h"
 #include "event.h"
 
 #include <stdio.h>
@@ -90,8 +88,6 @@ struct _ObMainLoop
     gboolean signal_fired;
     guint signals_fired[NUM_SIGNALS];
     GSList *signal_handlers[NUM_SIGNALS];
-
-    GSList *action_queue;
 };
 
 struct _ObMainLoopTimer
@@ -182,8 +178,6 @@ ObMainLoop *ob_main_loop_new(Display *display)
 
     all_loops = g_slist_prepend(all_loops, loop);
 
-    loop->action_queue = NULL;
-
     return loop;
 }
 
@@ -234,10 +228,6 @@ void ob_main_loop_destroy(ObMainLoop *loop)
             }
         }
 
-        for (it = loop->action_queue; it; it = g_slist_next(it))
-            action_unref(it->data);
-        g_slist_free(loop->action_queue);
-
         g_free(loop);
     }
 }
@@ -253,37 +243,16 @@ static void fd_handle_foreach(gpointer key,
         h->func(h->fd, h->data);
 }
 
-void ob_main_loop_queue_action(ObMainLoop *loop, ObAction *act)
-{
-    loop->action_queue = g_slist_append(loop->action_queue, action_copy(act));
-}
-
-static void ob_main_loop_client_destroy(ObClient *client, gpointer data)
-{
-    ObMainLoop *loop = data;
-    GSList *it;
-
-    for (it = loop->action_queue; it; it = g_slist_next(it)) {
-        ObAction *act = it->data;
-
-        if (act->data.any.c == client)
-            act->data.any.c = NULL;
-    }
-}
-
 void ob_main_loop_run(ObMainLoop *loop)
 {
     XEvent e;
     struct timeval *wait;
     fd_set selset;
     GSList *it;
-    ObAction *act;
 
     loop->run = TRUE;
     loop->running = TRUE;
 
-    client_add_destroy_notify(ob_main_loop_client_destroy, loop);
-
     while (loop->run) {
         if (loop->signal_fired) {
             guint i;
@@ -315,33 +284,6 @@ void ob_main_loop_run(ObMainLoop *loop)
                     h->func(&e, h->data);
                 }
             } while (XPending(loop->display) && loop->run);
-        } else if (loop->action_queue) {
-            /* only fire off one action at a time, then go back for more
-               X events, since the action might cause some X events (like
-               FocusIn :) */
-
-            do {
-                act = loop->action_queue->data;
-                if (act->data.any.client_action == OB_CLIENT_ACTION_ALWAYS &&
-                    !act->data.any.c)
-                {
-                    loop->action_queue =
-                        g_slist_delete_link(loop->action_queue,
-                                            loop->action_queue);
-                    action_unref(act);
-                    act = NULL;
-                }
-            } while (!act && loop->action_queue && loop->run);
-
-            if  (act) {
-                event_curtime = act->data.any.time;
-                act->func(&act->data);
-                event_curtime = CurrentTime;
-                loop->action_queue =
-                    g_slist_delete_link(loop->action_queue,
-                                        loop->action_queue);
-                action_unref(act);
-            }
         } else {
             /* this only runs if there were no x events received */
 
@@ -365,8 +307,6 @@ void ob_main_loop_run(ObMainLoop *loop)
         }
     }
 
-    client_remove_destroy_notify(ob_main_loop_client_destroy);
-
     loop->running = FALSE;
 }
 
index 03f00359e01f2e476e433d3f0f7f357a8c6d4b16..373528e35f730db3ac1cb40c1febe7698d6749fd 100644 (file)
@@ -70,12 +70,6 @@ void ob_main_loop_timeout_remove_data(ObMainLoop *loop,
                                       gpointer data,
                                       gboolean cancel_dest);
 
-struct _ObAction;
-
-/*! Queues an action, which will be run when there are no more X events
-  to process */
-void ob_main_loop_queue_action(ObMainLoop *loop, struct _ObAction *act);
-
 void ob_main_loop_run(ObMainLoop *loop);
 void ob_main_loop_exit(ObMainLoop *loop);
 
index 6496275f4916854fde67a3d6492a3cd7ab6d1eac..b49177ba8b4473059ed05dfec7f970acecbc4d38 100644 (file)
 #include "openbox.h"
 #include "mainloop.h"
 #include "stacking.h"
+#include "grab.h"
 #include "client.h"
 #include "config.h"
+#include "actions.h"
 #include "screen.h"
 #include "menuframe.h"
 #include "keyboard.h"
@@ -273,8 +275,7 @@ static void parse_menu_item(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
 
             for (node = node->children; node; node = node->next)
                 if (!xmlStrcasecmp(node->name, (const xmlChar*) "action")) {
-                    ObAction *a = action_parse
-                        (i, doc, node, OB_USER_ACTION_MENU_SELECTION);
+                    ObActionsAct *a = actions_parse(i, doc, node);
                     if (a)
                         acts = g_slist_append(acts, a);
                 }
@@ -417,13 +418,13 @@ static gboolean menu_hide_delay_func(gpointer data)
     return FALSE; /* no repeat */
 }
 
-void menu_show(gchar *name, gint x, gint y, gint button, ObClient *client)
+void menu_show(gchar *name, gint x, gint y, gboolean mouse, ObClient *client)
 {
     ObMenu *self;
     ObMenuFrame *frame;
 
-    if (!(self = menu_from_name(name))
-        || keyboard_interactively_grabbed()) return;
+    if (!(self = menu_from_name(name)) ||
+        grab_on_keyboard() || grab_on_pointer()) return;
 
     /* if the requested menu is already the top visible menu, then don't
        bother */
@@ -439,32 +440,35 @@ void menu_show(gchar *name, gint x, gint y, gint button, ObClient *client)
     menu_clear_pipe_caches();
 
     frame = menu_frame_new(self, 0, client);
-    if (!menu_frame_show_topmenu(frame, x, y, button))
+    if (!menu_frame_show_topmenu(frame, x, y, mouse))
         menu_frame_free(frame);
-    else if (!button) {
-        /* select the first entry if it's not a submenu and we opened
-         * the menu with the keyboard, and skip all headers */
-        GList *it = frame->entries;
-        while (it) {
-            ObMenuEntryFrame *e = it->data;
-            if (e->entry->type == OB_MENU_ENTRY_TYPE_NORMAL) {
-                menu_frame_select(frame, e, FALSE);
-                break;
-            } else if (e->entry->type == OB_MENU_ENTRY_TYPE_SEPARATOR)
-                it = g_list_next(it);
-            else
-                break;
+    else {
+        if (!mouse) {
+            /* select the first entry if it's not a submenu and we opened
+             * the menu with the keyboard, and skip all headers */
+            GList *it = frame->entries;
+            while (it) {
+                ObMenuEntryFrame *e = it->data;
+                if (e->entry->type == OB_MENU_ENTRY_TYPE_NORMAL) {
+                    menu_frame_select(frame, e, FALSE);
+                    break;
+                } else if (e->entry->type == OB_MENU_ENTRY_TYPE_SEPARATOR)
+                    it = g_list_next(it);
+                else
+                    break;
+            }
         }
-    }
 
-    if (!button)
-        menu_can_hide = TRUE;
-    else {
-        menu_can_hide = FALSE;
-        ob_main_loop_timeout_add(ob_main_loop,
-                                 config_menu_hide_delay * 1000,
-                                 menu_hide_delay_func,
-                                 NULL, g_direct_equal, NULL);
+        /* reset the hide timer */
+        if (!mouse)
+            menu_can_hide = TRUE;
+        else {
+            menu_can_hide = FALSE;
+            ob_main_loop_timeout_add(ob_main_loop,
+                                     config_menu_hide_delay * 1000,
+                                     menu_hide_delay_func,
+                                     NULL, g_direct_equal, NULL);
+        }
     }
 }
 
@@ -509,7 +513,7 @@ void menu_entry_unref(ObMenuEntry *self)
         case OB_MENU_ENTRY_TYPE_NORMAL:
             g_free(self->data.normal.label);
             while (self->data.normal.actions) {
-                action_unref(self->data.normal.actions->data);
+                actions_act_unref(self->data.normal.actions->data);
                 self->data.normal.actions =
                     g_slist_delete_link(self->data.normal.actions,
                                         self->data.normal.actions);
index 8913509dcb672f710a76de5d3332af0a0f1dc864..8832a1241f5c1d49dbeb5ce07b97abb6903f2bfc 100644 (file)
@@ -19,7 +19,6 @@
 #ifndef __menu_h
 #define __menu_h
 
-#include "action.h"
 #include "window.h"
 #include "geom.h"
 #include "render/render.h"
@@ -44,7 +43,7 @@ typedef gboolean (*ObMenuUpdateFunc)(struct _ObMenuFrame *frame,
 typedef void (*ObMenuExecuteFunc)(struct _ObMenuEntry *entry,
                                   struct _ObMenuFrame *frame,
                                   struct _ObClient *client,
-                                  guint state, gpointer data, Time time);
+                                  guint state, gpointer data);
 typedef void (*ObMenuDestroyFunc)(struct _ObMenu *menu, gpointer data);
 /*! @param x is the mouse x coordinate. on return it should be the x coordinate
              for the menu
@@ -52,7 +51,7 @@ typedef void (*ObMenuDestroyFunc)(struct _ObMenu *menu, gpointer data);
              for the menu
 */
 typedef void (*ObMenuPlaceFunc)(struct _ObMenuFrame *frame, gint *x, gint *y,
-                                gint button, gpointer data);
+                                gboolean mouse, gpointer data);
 
 struct _ObMenu
 {
@@ -176,7 +175,7 @@ void menu_clear_pipe_caches();
 
 void menu_show_all_shortcuts(ObMenu *self, gboolean show);
 
-void menu_show(gchar *name, gint x, gint y, gint button,
+void menu_show(gchar *name, gint x, gint y, gboolean mouse,
                struct _ObClient *client);
 gboolean menu_hide_delay_reached();
 
index 12cb30634185f058c2dbb184981d4fd165c34a30..2010bf8fe4289b799ff96c3d422d41ee92c4245d 100644 (file)
@@ -21,6 +21,7 @@
 #include "client.h"
 #include "menu.h"
 #include "screen.h"
+#include "actions.h"
 #include "grab.h"
 #include "openbox.h"
 #include "mainloop.h"
@@ -942,7 +943,7 @@ static gboolean menu_frame_show(ObMenuFrame *self)
 }
 
 gboolean menu_frame_show_topmenu(ObMenuFrame *self, gint x, gint y,
-                                 gint button)
+                                 gboolean mouse)
 {
     gint px, py;
     guint i;
@@ -964,7 +965,7 @@ gboolean menu_frame_show_topmenu(ObMenuFrame *self, gint x, gint y,
     }
 
     if (self->menu->place_func)
-        self->menu->place_func(self, &x, &y, button, self->menu->data);
+        self->menu->place_func(self, &x, &y, mouse, self->menu->data);
     else
         menu_frame_place_topmenu(self, &x, &y);
 
@@ -1180,7 +1181,7 @@ void menu_entry_frame_show_submenu(ObMenuEntryFrame *self)
     menu_frame_show_submenu(f, self->frame, self);
 }
 
-void menu_entry_frame_execute(ObMenuEntryFrame *self, guint state, Time time)
+void menu_entry_frame_execute(ObMenuEntryFrame *self, guint state)
 {
     if (self->entry->type == OB_MENU_ENTRY_TYPE_NORMAL &&
         self->entry->data.normal.enabled)
@@ -1201,9 +1202,10 @@ void menu_entry_frame_execute(ObMenuEntryFrame *self, guint state, Time time)
         }
 
         if (func)
-            func(entry, frame, client, state, data, time);
+            func(entry, frame, client, state, data);
         else
-            action_run(acts, client, state, time);
+            actions_run_acts(acts, OB_USER_ACTION_MENU_SELECTION,
+                             state, -1, -1, 0, OB_FRAME_CONTEXT_NONE, client);
     }
 }
 
index 75e03da451ad73fd57351b04309370679095fde3..191bcfe8f4c5d68eb1397d7db94e56d40988199b 100644 (file)
@@ -141,6 +141,6 @@ ObMenuEntryFrame* menu_entry_frame_under(gint x, gint y);
 
 void menu_entry_frame_show_submenu(ObMenuEntryFrame *self);
 
-void menu_entry_frame_execute(ObMenuEntryFrame *self, guint state, Time time);
+void menu_entry_frame_execute(ObMenuEntryFrame *self, guint state);
 
 #endif
index f74063edbbffc394bf8db31fb42dc889a4236b31..97abf70840e10531dc8f064a73aee1e5d70ca145 100644 (file)
@@ -20,7 +20,7 @@
 #include "openbox.h"
 #include "config.h"
 #include "xerror.h"
-#include "action.h"
+#include "actions.h"
 #include "event.h"
 #include "client.h"
 #include "prop.h"
@@ -156,7 +156,7 @@ void mouse_unbind_all()
                 GSList *it;
 
                 for (it = b->actions[j]; it; it = g_slist_next(it))
-                    action_unref(it->data);
+                    actions_act_unref(it->data);
                 g_slist_free(b->actions[j]);
             }
             g_free(b);
@@ -166,9 +166,23 @@ void mouse_unbind_all()
     }
 }
 
+static ObUserAction mouse_action_to_user_action(ObMouseAction a)
+{
+    switch (a) {
+    case OB_MOUSE_ACTION_PRESS: return OB_USER_ACTION_MOUSE_PRESS;
+    case OB_MOUSE_ACTION_RELEASE: return OB_USER_ACTION_MOUSE_RELEASE;
+    case OB_MOUSE_ACTION_CLICK: return OB_USER_ACTION_MOUSE_CLICK;
+    case OB_MOUSE_ACTION_DOUBLE_CLICK:
+        return OB_USER_ACTION_MOUSE_DOUBLE_CLICK;
+    case OB_MOUSE_ACTION_MOTION: return OB_USER_ACTION_MOUSE_MOTION;
+    default:
+        g_assert_not_reached();
+    }
+}
+
 static gboolean fire_binding(ObMouseAction a, ObFrameContext context,
                              ObClient *c, guint state,
-                             guint button, gint x, gint y, Time time)
+                             guint button, gint x, gint y)
 {
     GSList *it;
     ObMouseBinding *b;
@@ -181,7 +195,8 @@ static gboolean fire_binding(ObMouseAction a, ObFrameContext context,
     /* if not bound, then nothing to do! */
     if (it == NULL) return FALSE;
 
-    action_run_mouse(b->actions[a], c, context, state, button, x, y, time);
+    actions_run_acts(b->actions[a], mouse_action_to_user_action(a),
+                     state, x, y, button, context, c);
     return TRUE;
 }
 
@@ -213,8 +228,7 @@ void mouse_event(ObClient *client, XEvent *e)
         fire_binding(OB_MOUSE_ACTION_PRESS, context,
                      client, e->xbutton.state,
                      e->xbutton.button,
-                     e->xbutton.x_root, e->xbutton.y_root,
-                     e->xbutton.time);
+                     e->xbutton.x_root, e->xbutton.y_root);
 
         /* if the bindings grab the pointer, there won't be a ButtonRelease
            event for us */
@@ -278,22 +292,19 @@ void mouse_event(ObClient *client, XEvent *e)
                      client, e->xbutton.state,
                      e->xbutton.button,
                      e->xbutton.x_root,
-                     e->xbutton.y_root,
-                     e->xbutton.time);
+                     e->xbutton.y_root);
         if (click)
             fire_binding(OB_MOUSE_ACTION_CLICK, context,
                          client, e->xbutton.state,
                          e->xbutton.button,
                          e->xbutton.x_root,
-                         e->xbutton.y_root,
-                         e->xbutton.time);
+                         e->xbutton.y_root);
         if (dclick)
             fire_binding(OB_MOUSE_ACTION_DOUBLE_CLICK, context,
                          client, e->xbutton.state,
                          e->xbutton.button,
                          e->xbutton.x_root,
-                         e->xbutton.y_root,
-                         e->xbutton.time);
+                         e->xbutton.y_root);
         break;
 
     case MotionNotify:
@@ -314,7 +325,7 @@ void mouse_event(ObClient *client, XEvent *e)
                     break;
 
                 fire_binding(OB_MOUSE_ACTION_MOTION, context,
-                             client, state, button, px, py, e->xmotion.time);
+                             client, state, button, px, py);
                 button = 0;
                 state = 0;
             }
@@ -327,7 +338,7 @@ void mouse_event(ObClient *client, XEvent *e)
 }
 
 gboolean mouse_bind(const gchar *buttonstr, const gchar *contextstr,
-                    ObMouseAction mact, ObAction *action)
+                    ObMouseAction mact, ObActionsAct *action)
 {
     guint state, button;
     ObFrameContext context;
@@ -353,13 +364,6 @@ gboolean mouse_bind(const gchar *buttonstr, const gchar *contextstr,
         }
     }
 
-    /* when there are no modifiers in the binding, then the action cannot
-       be interactive */
-    if (!state && action->data.any.interactive) {
-        action->data.any.interactive = FALSE;
-        action->data.inter.final = TRUE;
-    }
-
     /* add the binding */
     b = g_new0(ObMouseBinding, 1);
     b->state = state;
index befe1296f0b6526124ad02d9c431db86b2ef0dec..44d563a3b640262ae97234723b43bebe96312e7d 100644 (file)
 #ifndef ob__mouse_h
 #define ob__mouse_h
 
-#include "action.h"
 #include "frame.h"
 #include "misc.h"
 
 #include <X11/Xlib.h>
 
+struct _ObActionsAct;
+
 void mouse_startup(gboolean reconfig);
 void mouse_shutdown(gboolean reconfig);
 
 gboolean mouse_bind(const gchar *buttonstr, const gchar *contextstr,
-                    ObMouseAction mact, ObAction *action);
+                    ObMouseAction mact, struct _ObActionsAct *action);
 void mouse_unbind_all();
 
 void mouse_event(struct _ObClient *client, XEvent *e);
index 1e1e3bf0f5f6268478525550ba043c8cb46ecd42..00fe6e6e997310ef7b1e60308a6c4bb4bfb2ad16 100644 (file)
@@ -28,6 +28,7 @@
 #include "xerror.h"
 #include "prop.h"
 #include "screen.h"
+#include "actions.h"
 #include "startupnotify.h"
 #include "focus.h"
 #include "focus_cycle.h"
@@ -238,6 +239,8 @@ gint main(gint argc, gchar **argv)
                    of the rc */
                 i = parse_startup();
 
+                /* register all the available actions */
+                actions_startup(reconfigure);
                 /* start up config which sets up with the parser */
                 config_startup(i);
 
@@ -371,6 +374,7 @@ gint main(gint argc, gchar **argv)
             window_shutdown(reconfigure);
             event_shutdown(reconfigure);
             config_shutdown();
+            actions_shutdown(reconfigure);
             modkeys_shutdown(reconfigure);
         } while (reconfigure);
     }
index aadd044561eea53bf26e2cabdec4e90c349d90bf..d290be3db2289805579a87a6c39f3020a0a6b23b 100644 (file)
@@ -490,7 +490,6 @@ gboolean place_client(ObClient *client, gint *x, gint *y,
     g_assert(ret);
 
     /* get where the client should be */
-    frame_frame_gravity(client->frame, x, y,
-                        client->area.width, client->area.height);
+    frame_frame_gravity(client->frame, x, y);
     return ret;
 }
index 211a012c78215461a5983d3ee5fc4deb7aa95d81..49875fbb7ca02153b7f2d9c8dfbb75af20e298d3 100644 (file)
@@ -36,7 +36,7 @@ void resist_move_windows(ObClient *c, gint resist, gint *x, gint *y)
 
     if (!resist) return;
 
-    frame_client_gravity(c->frame, x, y, c->area.width, c->area.height);
+    frame_client_gravity(c->frame, x, y);
 
     w = c->frame->area.width;
     h = c->frame->area.height;
@@ -113,7 +113,7 @@ void resist_move_windows(ObClient *c, gint resist, gint *x, gint *y)
         if (snapx && snapy) break;
     }
 
-    frame_frame_gravity(c->frame, x, y, c->area.width, c->area.height);
+    frame_frame_gravity(c->frame, x, y);
 }
 
 void resist_move_monitors(ObClient *c, gint resist, gint *x, gint *y)
@@ -129,7 +129,7 @@ void resist_move_monitors(ObClient *c, gint resist, gint *x, gint *y)
 
     if (!resist) return;
 
-    frame_client_gravity(c->frame, x, y, c->area.width, c->area.height);
+    frame_client_gravity(c->frame, x, y);
 
     w = c->frame->area.width;
     h = c->frame->area.height;
@@ -188,7 +188,7 @@ void resist_move_monitors(ObClient *c, gint resist, gint *x, gint *y)
         g_free(parea);
     }
 
-    frame_frame_gravity(c->frame, x, y, c->area.width, c->area.height);
+    frame_frame_gravity(c->frame, x, y);
 }
 
 void resist_size_windows(ObClient *c, gint resist, gint *w, gint *h,
index 83e8c75b0f34723652fe35044b8dbcedba2b2df4..f1b067c7a36b4e84515c06a8bfd2c5982817f356 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "startupnotify.h"
 #include "gettext.h"
+#include "event.h"
 
 #include <stdlib.h>
 
@@ -228,8 +229,7 @@ static gboolean sn_launch_wait_timeout(gpointer data)
 }
 
 void sn_setup_spawn_environment(gchar *program, gchar *name,
-                                gchar *icon_name, gint desktop,
-                                Time time)
+                                gchar *icon_name, gint desktop)
 {
     gchar *desc;
     const char *id;
@@ -247,7 +247,8 @@ void sn_setup_spawn_environment(gchar *program, gchar *name,
     sn_launcher_context_set_binary_name(sn_launcher, program);
     if (desktop >= 0 && (unsigned) desktop < screen_num_desktops)
         sn_launcher_context_set_workspace(sn_launcher, (signed) desktop);
-    sn_launcher_context_initiate(sn_launcher, "openbox", program, time);
+    sn_launcher_context_initiate(sn_launcher, "openbox", program,
+                                 event_curtime);
     id = sn_launcher_context_get_startup_id(sn_launcher);
 
     /* 20 second timeout for apps to start */
index 82b87a58c11c02549aadeeebbb9c55638b6445db..7c28faba10b478749a7da6983004c38e8c76f151 100644 (file)
@@ -36,8 +36,7 @@ gboolean sn_get_desktop(gchar *id, guint *desktop);
 
 /* Get the environment to run the program in, with startup notification */
 void sn_setup_spawn_environment(gchar *program, gchar *name,
-                                gchar *icon_name, gint desktop,
-                                Time time);
+                                gchar *icon_name, gint desktop);
 
 /* Tell startup notification we're not actually running the program we
    told it we were
diff --git a/po/.svnignore b/po/.svnignore
deleted file mode 100644 (file)
index fb5e504..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-*.gmo
-Makefile.in
-remove-potcdate.sin
-Makefile.in.in
-quot.sed
-Makefile
-Rules-quot
-insert-header.sin
-Makevars.template
-POTFILES
-stamp-po
-en@quot.header
-en@boldquot.header
-boldquot.sed
index 46c13af95d9f9e97522145a6b128b40cda0363d9..8146eda914ca3fd8f22459153ae35b86c11a1244 100644 (file)
@@ -1,5 +1,5 @@
 # List of source files containing translatable strings.
-openbox/action.c
+openbox/actions/execute.c
 openbox/client_list_combined_menu.c
 openbox/client_list_menu.c
 openbox/client_menu.c
index c40ff926ed4ea433c1fc496bb9a175c471bff83f..57d9c8748500e5a415267379e61177dceab51bf0 100644 (file)
--- a/po/ar.po
+++ b/po/ar.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Openbox 3.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2007-06-10 19:32-0400\n"
+"POT-Creation-Date: 2007-06-07 14:18+0200\n"
 "PO-Revision-Date: 2007-05-26 03:11+0300\n"
 "Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n"
 "Language-Team: Arabic <doc@arabeyes.org>\n"
@@ -110,12 +110,12 @@ msgstr "ضع/أزل الحواف (_D)"
 msgid "_Close"
 msgstr "أغلق (_C)"
 
-#: openbox/config.c:716
+#: openbox/config.c:704
 #, c-format
 msgid "Invalid button '%s' specified in config file"
 msgstr "زر غير صحيح '%s' محدد في ملف الإعدادات"
 
-#: openbox/keyboard.c:163
+#: openbox/keyboard.c:162
 msgid "Conflict with key binding in config file"
 msgstr "يتعارض مع ارتباط المفاتيح في ملف الإعدادات"
 
@@ -124,22 +124,22 @@ msgstr "يتعارض مع ارتباط المفاتيح في ملف الإعدا
 msgid "Unable to find a valid menu file '%s'"
 msgstr "لم أعثر على ملف قائمة سليم '%s'"
 
-#: openbox/menu.c:168
+#: openbox/menu.c:151
 #, c-format
 msgid "Failed to execute command for pipe-menu '%s': %s"
 msgstr "فشل تنفيذ أمر ل pipe-menu '%s': %s"
 
-#: openbox/menu.c:182
+#: openbox/menu.c:168
 #, c-format
 msgid "Invalid output from pipe-menu '%s'"
 msgstr "خرج غير سليم من pipe-menu '%s'"
 
-#: openbox/menu.c:195
+#: openbox/menu.c:181
 #, c-format
 msgid "Attempted to access menu '%s' but it does not exist"
 msgstr "حاولت الوصول إلى القائمة '%s' لكنها غير موجودة"
 
-#: openbox/menu.c:356 openbox/menu.c:357
+#: openbox/menu.c:342 openbox/menu.c:343
 msgid "More..."
 msgstr "المزيد..."
 
@@ -288,7 +288,7 @@ msgstr "تعذّر الحصول على انتقاء مدير النوافذ عل
 msgid "The WM on screen %d is not exiting"
 msgstr "مدير النوافذ على الشاشة %Id لا وجود له"
 
-#: openbox/screen.c:993
+#: openbox/screen.c:991
 #, c-format
 msgid "desktop %i"
 msgstr "سطح المكتب %Ii"
index 040c8228bb8033b28c86a8eefb70ab67d7a283b9..29102d4bbf4642e66e0fd15f74efbbda13c22daf 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Openbox 3.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2007-06-10 19:32-0400\n"
+"POT-Creation-Date: 2007-06-07 14:18+0200\n"
 "PO-Revision-Date: 2007-06-01 19:02+0530\n"
 "Last-Translator: Runa Bhattacharjee <runabh@gmail.com>\n"
 "Language-Team: Bengali (India) <en@li.org>\n"
@@ -110,12 +110,12 @@ msgstr "বিন্যাস পরিবর্তন (_D)"
 msgid "_Close"
 msgstr "বন্ধ করুন (_C)"
 
-#: openbox/config.c:716
+#: openbox/config.c:704
 #, c-format
 msgid "Invalid button '%s' specified in config file"
 msgstr "কনফিগ ফাইলে অবৈধ বাটন '%s' উল্লিখিত হয়েছে"
 
-#: openbox/keyboard.c:163
+#: openbox/keyboard.c:162
 msgid "Conflict with key binding in config file"
 msgstr "কনফিগ ফাইলে কি-বাইন্ডিং সংক্রান্ত দ্বন্দ্ব"
 
@@ -124,22 +124,22 @@ msgstr "কনফিগ ফাইলে কি-বাইন্ডিং সং
 msgid "Unable to find a valid menu file '%s'"
 msgstr "বৈধ মেনু ফাইল '%s' সনাক্ত করতে ব্যর্থ"
 
-#: openbox/menu.c:168
+#: openbox/menu.c:151
 #, c-format
 msgid "Failed to execute command for pipe-menu '%s': %s"
 msgstr "পাইপ-মেনু '%s'-র জন্য কমান্ড সঞ্চালন করতে ব্যর্থ: %s"
 
-#: openbox/menu.c:182
+#: openbox/menu.c:168
 #, c-format
 msgid "Invalid output from pipe-menu '%s'"
 msgstr "পাইপ-মেনু '%s' থেকে অবৈধ ফলাফল প্রাপ্ত হয়েছে"
 
-#: openbox/menu.c:195
+#: openbox/menu.c:181
 #, c-format
 msgid "Attempted to access menu '%s' but it does not exist"
 msgstr "অনুপস্থিত মেনু '%s' ব্যবহারের প্রচেষ্টা হয়েছে"
 
-#: openbox/menu.c:356 openbox/menu.c:357
+#: openbox/menu.c:342 openbox/menu.c:343
 msgid "More..."
 msgstr "অতিরিক্ত..."
 
@@ -291,7 +291,7 @@ msgstr "পর্দা %d-এ উইন্ডো পরিচালন ব্
 msgid "The WM on screen %d is not exiting"
 msgstr "পর্দা %d-র উপর চলমান উইন্ডো পরিচালন ব্যবস্থাটি বন্ধ করতে ব্যর্থ"
 
-#: openbox/screen.c:993
+#: openbox/screen.c:991
 #, c-format
 msgid "desktop %i"
 msgstr "desktop %i"
index d874506bf28577b5bbe69c398531664fb6f821db..e82c374a13f7d58c71c476e5e43b41ba25e1a70c 100644 (file)
--- a/po/ca.po
+++ b/po/ca.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Openbox 3.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2007-06-10 19:32-0400\n"
+"POT-Creation-Date: 2007-06-07 14:18+0200\n"
 "PO-Revision-Date: 2007-05-28 15:54+0200\n"
 "Last-Translator: David Majà Martínez <davidmaja@gmail.com>\n"
 "Language-Team: catalan\n"
@@ -107,12 +107,12 @@ msgstr "Sense/Amb _decoració"
 msgid "_Close"
 msgstr "_Tanca"
 
-#: openbox/config.c:716
+#: openbox/config.c:704
 #, c-format
 msgid "Invalid button '%s' specified in config file"
 msgstr "El botó especificat al fitxer de configuració '%s' no és vàlid."
 
-#: openbox/keyboard.c:163
+#: openbox/keyboard.c:162
 msgid "Conflict with key binding in config file"
 msgstr "Conflicte amb la tecla vinculada en el fitxer de configuració"
 
@@ -121,23 +121,23 @@ msgstr "Conflicte amb la tecla vinculada en el fitxer de configuració"
 msgid "Unable to find a valid menu file '%s'"
 msgstr "No s'ha pogut trobar un fitxer de menú '%s' vàlid"
 
-#: openbox/menu.c:168
+#: openbox/menu.c:151
 #, c-format
 msgid "Failed to execute command for pipe-menu '%s': %s"
 msgstr ""
 "S'ha produït un error en executar l'ordre per al menú de conducte '%s': %s"
 
-#: openbox/menu.c:182
+#: openbox/menu.c:168
 #, c-format
 msgid "Invalid output from pipe-menu '%s'"
 msgstr "La sortida del menú de conducte '%s' no és vàlida"
 
-#: openbox/menu.c:195
+#: openbox/menu.c:181
 #, c-format
 msgid "Attempted to access menu '%s' but it does not exist"
 msgstr "S'ha intentat accedir al menú '%s' ja que no existeix"
 
-#: openbox/menu.c:356 openbox/menu.c:357
+#: openbox/menu.c:342 openbox/menu.c:343
 msgid "More..."
 msgstr "Més..."
 
@@ -298,7 +298,7 @@ msgstr ""
 msgid "The WM on screen %d is not exiting"
 msgstr "El gestor de finestres de la pantalla %d no està sortint"
 
-#: openbox/screen.c:993
+#: openbox/screen.c:991
 #, c-format
 msgid "desktop %i"
 msgstr "escriptori %i"
index 243ff49e454c2c3e162ac42f98701fcc89d8a6af..b2ff125bbb2744351db5c19d43855efeed8242af 100644 (file)
--- a/po/cs.po
+++ b/po/cs.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Openbox 3.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2007-06-10 19:32-0400\n"
+"POT-Creation-Date: 2007-06-07 14:18+0200\n"
 "PO-Revision-Date: 2007-06-04 12:46+0200\n"
 "Last-Translator: tezlo <tezlo@gmx.net>\n"
 "Language-Team: Czech <cs@li.org>\n"
@@ -110,12 +110,12 @@ msgstr "Oz_dobit/Odzdobit"
 msgid "_Close"
 msgstr "_Zavřít"
 
-#: openbox/config.c:716
+#: openbox/config.c:704
 #, c-format
 msgid "Invalid button '%s' specified in config file"
 msgstr "Neplatné tlačítko '%s' v konfiguračním souboru"
 
-#: openbox/keyboard.c:163
+#: openbox/keyboard.c:162
 msgid "Conflict with key binding in config file"
 msgstr "Konflikt klávesových zkratek v konfiguračním souboru"
 
@@ -124,23 +124,23 @@ msgstr "Konflikt klávesových zkratek v konfiguračním souboru"
 msgid "Unable to find a valid menu file '%s'"
 msgstr "Nepodařilo se najít platný menu soubor '%s'"
 
-#: openbox/menu.c:168
+#: openbox/menu.c:151
 #, c-format
 msgid "Failed to execute command for pipe-menu '%s': %s"
 msgstr "Nepodařilo se spustit příkaz pro pipe-menu '%s': %s"
 
-#: openbox/menu.c:182
+#: openbox/menu.c:168
 #, c-format
 msgid "Invalid output from pipe-menu '%s'"
 msgstr "Neplatný výstup z pipe-menu '%s'"
 
 # TODO: heh
-#: openbox/menu.c:195
+#: openbox/menu.c:181
 #, c-format
 msgid "Attempted to access menu '%s' but it does not exist"
 msgstr "Pokus o přístup k menu '%s', ale ono neexistuje"
 
-#: openbox/menu.c:356 openbox/menu.c:357
+#: openbox/menu.c:342 openbox/menu.c:343
 msgid "More..."
 msgstr "Víc..."
 
@@ -293,7 +293,7 @@ msgstr "Nepodařilo se získat výseč pro window manager na obrazovce %d"
 msgid "The WM on screen %d is not exiting"
 msgstr "Window manager na obrazovce %d ne a ne skončit"
 
-#: openbox/screen.c:993
+#: openbox/screen.c:991
 #, c-format
 msgid "desktop %i"
 msgstr "plochu %i"
index 8a56893e8727cc898be7a7a1ec01f39fc0400c5b..fa1b51675060d27ff51d31839421ce1e22a05d89 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Openbox 3.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2007-06-10 19:32-0400\n"
+"POT-Creation-Date: 2007-06-07 14:18+0200\n"
 "PO-Revision-Date: 2007-06-04 00:47+0200\n"
 "Last-Translator: Sebastian Sareyko <public@nooms.de>\n"
 "Language-Team:  <de@li.org>\n"
@@ -107,12 +107,12 @@ msgstr "Dekoration entfernen/_Dekorieren"
 msgid "_Close"
 msgstr "_Schließen"
 
-#: openbox/config.c:716
+#: openbox/config.c:704
 #, c-format
 msgid "Invalid button '%s' specified in config file"
 msgstr "Unzulässiger Knopf '%s' in der Konfigurationsdatei angegeben"
 
-#: openbox/keyboard.c:163
+#: openbox/keyboard.c:162
 msgid "Conflict with key binding in config file"
 msgstr "Konflikt mit Tastenkombination in der Konfigurationsdatei"
 
@@ -121,22 +121,22 @@ msgstr "Konflikt mit Tastenkombination in der Konfigurationsdatei"
 msgid "Unable to find a valid menu file '%s'"
 msgstr "Konnte keine gültige Menü-Datei '%s' finden"
 
-#: openbox/menu.c:168
+#: openbox/menu.c:151
 #, c-format
 msgid "Failed to execute command for pipe-menu '%s': %s"
 msgstr "Konnte Befehl '%s' für pipe-menu nicht ausführen: %s"
 
-#: openbox/menu.c:182
+#: openbox/menu.c:168
 #, c-format
 msgid "Invalid output from pipe-menu '%s'"
 msgstr "Ungültige Ausgabe vom pipe-menu '%s'"
 
-#: openbox/menu.c:195
+#: openbox/menu.c:181
 #, c-format
 msgid "Attempted to access menu '%s' but it does not exist"
 msgstr "Das Menü '%s' wurde bei dem Versuch darauf zuzugreifen nicht gefunden"
 
-#: openbox/menu.c:356 openbox/menu.c:357
+#: openbox/menu.c:342 openbox/menu.c:343
 msgid "More..."
 msgstr "Mehr..."
 
@@ -290,7 +290,7 @@ msgstr "Konnte die Fenstermanager auswahl auf Bildschirm %d nicht reservieren"
 msgid "The WM on screen %d is not exiting"
 msgstr "Der Fenstermanager auf Bildschirm %d beendet sich nicht"
 
-#: openbox/screen.c:993
+#: openbox/screen.c:991
 #, c-format
 msgid "desktop %i"
 msgstr "desktop %i"
index 9aa0fa62c110c73a173fae0c935e75e42d540f76..c3cb9aa2757171f395a5a7bfc7a425990f188c91 100644 (file)
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: openbox 3.4.2\n"
+"Project-Id-Version: openbox 3.4.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2007-06-10 19:32-0400\n"
-"PO-Revision-Date: 2007-06-10 19:32-0400\n"
+"POT-Creation-Date: 2007-06-07 14:18+0200\n"
+"PO-Revision-Date: 2007-06-07 14:18+0200\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
 "MIME-Version: 1.0\n"
@@ -133,12 +133,12 @@ msgstr "Un/_Decorate"
 msgid "_Close"
 msgstr "_Close"
 
-#: openbox/config.c:716
+#: openbox/config.c:704
 #, c-format
 msgid "Invalid button '%s' specified in config file"
 msgstr "Invalid button ‘\e[1m%s\e[0m’ specified in config file"
 
-#: openbox/keyboard.c:163
+#: openbox/keyboard.c:162
 msgid "Conflict with key binding in config file"
 msgstr "Conflict with key binding in config file"
 
@@ -147,22 +147,22 @@ msgstr "Conflict with key binding in config file"
 msgid "Unable to find a valid menu file '%s'"
 msgstr "Unable to find a valid menu file ‘\e[1m%s\e[0m’"
 
-#: openbox/menu.c:168
+#: openbox/menu.c:151
 #, c-format
 msgid "Failed to execute command for pipe-menu '%s': %s"
 msgstr "Failed to execute command for pipe-menu '%s': %s"
 
-#: openbox/menu.c:182
+#: openbox/menu.c:168
 #, c-format
 msgid "Invalid output from pipe-menu '%s'"
 msgstr "Invalid output from pipe-menu ‘\e[1m%s\e[0m’"
 
-#: openbox/menu.c:195
+#: openbox/menu.c:181
 #, c-format
 msgid "Attempted to access menu '%s' but it does not exist"
 msgstr "Attempted to access menu ‘\e[1m%s\e[0m’ but it does not exist"
 
-#: openbox/menu.c:356 openbox/menu.c:357
+#: openbox/menu.c:342 openbox/menu.c:343
 msgid "More..."
 msgstr "More..."
 
@@ -311,7 +311,7 @@ msgstr "Could not acquire window manager selection on screen %d"
 msgid "The WM on screen %d is not exiting"
 msgstr "The WM on screen %d is not exiting"
 
-#: openbox/screen.c:993
+#: openbox/screen.c:991
 #, c-format
 msgid "desktop %i"
 msgstr "desktop %i"
index 792e2d7adc2656a0e682d75ca2bbcb5e941d17e5..f2bea62244b1b9c296705178192903a8f69512f2 100644 (file)
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: openbox 3.4.2\n"
+"Project-Id-Version: openbox 3.4.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2007-06-10 19:32-0400\n"
-"PO-Revision-Date: 2007-06-10 19:32-0400\n"
+"POT-Creation-Date: 2007-06-07 14:18+0200\n"
+"PO-Revision-Date: 2007-06-07 14:18+0200\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
 "MIME-Version: 1.0\n"
@@ -130,12 +130,12 @@ msgstr "Un/_Decorate"
 msgid "_Close"
 msgstr "_Close"
 
-#: openbox/config.c:716
+#: openbox/config.c:704
 #, c-format
 msgid "Invalid button '%s' specified in config file"
 msgstr "Invalid button ‘%s’ specified in config file"
 
-#: openbox/keyboard.c:163
+#: openbox/keyboard.c:162
 msgid "Conflict with key binding in config file"
 msgstr "Conflict with key binding in config file"
 
@@ -144,22 +144,22 @@ msgstr "Conflict with key binding in config file"
 msgid "Unable to find a valid menu file '%s'"
 msgstr "Unable to find a valid menu file ‘%s’"
 
-#: openbox/menu.c:168
+#: openbox/menu.c:151
 #, c-format
 msgid "Failed to execute command for pipe-menu '%s': %s"
 msgstr "Failed to execute command for pipe-menu '%s': %s"
 
-#: openbox/menu.c:182
+#: openbox/menu.c:168
 #, c-format
 msgid "Invalid output from pipe-menu '%s'"
 msgstr "Invalid output from pipe-menu ‘%s’"
 
-#: openbox/menu.c:195
+#: openbox/menu.c:181
 #, c-format
 msgid "Attempted to access menu '%s' but it does not exist"
 msgstr "Attempted to access menu ‘%s’ but it does not exist"
 
-#: openbox/menu.c:356 openbox/menu.c:357
+#: openbox/menu.c:342 openbox/menu.c:343
 msgid "More..."
 msgstr "More..."
 
@@ -308,7 +308,7 @@ msgstr "Could not acquire window manager selection on screen %d"
 msgid "The WM on screen %d is not exiting"
 msgstr "The WM on screen %d is not exiting"
 
-#: openbox/screen.c:993
+#: openbox/screen.c:991
 #, c-format
 msgid "desktop %i"
 msgstr "desktop %i"
index f4a108a65b635affdc71161c14ada9bfa8427bc1..43e33dd6e19fb5a381909f1025f6333306a20f0a 100644 (file)
--- a/po/es.po
+++ b/po/es.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Openbox 3.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2007-06-10 19:32-0400\n"
+"POT-Creation-Date: 2007-06-07 14:18+0200\n"
 "PO-Revision-Date: 2007-05-22 20:48+0200\n"
 "Last-Translator:  Gustavo Varela <gustavo.varela [en] gmail [punto] com>\n"
 "Language-Team: None\n"
@@ -107,12 +107,12 @@ msgstr "_Decorar"
 msgid "_Close"
 msgstr "_Cerrar"
 
-#: openbox/config.c:716
+#: openbox/config.c:704
 #, c-format
 msgid "Invalid button '%s' specified in config file"
 msgstr "Botón invalido '%s' especificado en el archivo de configuración"
 
-#: openbox/keyboard.c:163
+#: openbox/keyboard.c:162
 msgid "Conflict with key binding in config file"
 msgstr "Conflicto con la combinación de teclas en el archivo de configuración"
 
@@ -121,22 +121,22 @@ msgstr "Conflicto con la combinación de teclas en el archivo de configuración"
 msgid "Unable to find a valid menu file '%s'"
 msgstr "No es posible encontrar un archivo de menú '%s' valido"
 
-#: openbox/menu.c:168
+#: openbox/menu.c:151
 #, c-format
 msgid "Failed to execute command for pipe-menu '%s': %s"
 msgstr "Falló al ejecutar el comando para el pipe-menu '%s': '%s'"
 
-#: openbox/menu.c:182
+#: openbox/menu.c:168
 #, c-format
 msgid "Invalid output from pipe-menu '%s'"
 msgstr "Salida inválida del pipe-menu '%s'"
 
-#: openbox/menu.c:195
+#: openbox/menu.c:181
 #, c-format
 msgid "Attempted to access menu '%s' but it does not exist"
 msgstr "Intentó acceder al menú '%s' pero este no existe"
 
-#: openbox/menu.c:356 openbox/menu.c:357
+#: openbox/menu.c:342 openbox/menu.c:343
 msgid "More..."
 msgstr "Más..."
 
@@ -293,7 +293,7 @@ msgstr ""
 msgid "The WM on screen %d is not exiting"
 msgstr "El WM en la pantalla %d no esta saliendo"
 
-#: openbox/screen.c:993
+#: openbox/screen.c:991
 #, c-format
 msgid "desktop %i"
 msgstr "Escritorio %i"
index f61700a47c4b8424e937fbe13cc11f0271bea6bf..28aa10c8b0965acf801b2624162dcf0ab29e2f73 100644 (file)
--- a/po/et.po
+++ b/po/et.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Openbox 3.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2007-06-10 19:32-0400\n"
+"POT-Creation-Date: 2007-06-07 14:18+0200\n"
 "PO-Revision-Date: 2007-05-21 20:11+0300\n"
 "Last-Translator: Andres Järv <andresjarv@gmail.com>\n"
 "Language-Team: Estonian <et@li.org>\n"
@@ -109,12 +109,12 @@ msgstr "Äär_ed sisse/välja"
 msgid "_Close"
 msgstr "S_ulge"
 
-#: openbox/config.c:716
+#: openbox/config.c:704
 #, c-format
 msgid "Invalid button '%s' specified in config file"
 msgstr "Vigane nupp '%s' määratletud konfiguratsioonifailis"
 
-#: openbox/keyboard.c:163
+#: openbox/keyboard.c:162
 msgid "Conflict with key binding in config file"
 msgstr "Konflikt kiirklahviga konfiguratsioonifailis"
 
@@ -123,22 +123,22 @@ msgstr "Konflikt kiirklahviga konfiguratsioonifailis"
 msgid "Unable to find a valid menu file '%s'"
 msgstr "Ei suudetud leida kehtivat menüüfaili '%s'"
 
-#: openbox/menu.c:168
+#: openbox/menu.c:151
 #, c-format
 msgid "Failed to execute command for pipe-menu '%s': %s"
 msgstr "Ei suudetud käivitada torumenüü '%s' käsku: %s"
 
-#: openbox/menu.c:182
+#: openbox/menu.c:168
 #, c-format
 msgid "Invalid output from pipe-menu '%s'"
 msgstr "Vigane väljund torumenüüst '%s'"
 
-#: openbox/menu.c:195
+#: openbox/menu.c:181
 #, c-format
 msgid "Attempted to access menu '%s' but it does not exist"
 msgstr "Üritati ligi pääseda menüüle '%s', aga seda pole olemas"
 
-#: openbox/menu.c:356 openbox/menu.c:357
+#: openbox/menu.c:342 openbox/menu.c:343
 msgid "More..."
 msgstr "Rohkem..."
 
@@ -289,7 +289,7 @@ msgstr "Ei suuda hankida aknahaldurite loetelu ekraanil %d"
 msgid "The WM on screen %d is not exiting"
 msgstr "Aknahaldur ekraanil %d ei sulgu"
 
-#: openbox/screen.c:993
+#: openbox/screen.c:991
 #, c-format
 msgid "desktop %i"
 msgstr "töölaud %i"
index aac8e942e232a26081b3ab6640ea757b07723e09..10e17b123b218979da6d4c3710d3afdc0743ca43 100644 (file)
--- a/po/fi.po
+++ b/po/fi.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: openbox 3.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2007-06-10 19:32-0400\n"
+"POT-Creation-Date: 2007-06-07 14:18+0200\n"
 "PO-Revision-Date: 2007-05-21 00:06+0200\n"
 "Last-Translator: Lauri Hakko\n"
 "Language-Team: None\n"
@@ -108,12 +108,12 @@ msgstr "(Epä)reunusta"
 msgid "_Close"
 msgstr "_Sulje"
 
-#: openbox/config.c:716
+#: openbox/config.c:704
 #, c-format
 msgid "Invalid button '%s' specified in config file"
 msgstr "Virheellinen painike '%s' määritelty konfiguraatio tiedostossa"
 
-#: openbox/keyboard.c:163
+#: openbox/keyboard.c:162
 msgid "Conflict with key binding in config file"
 msgstr "Päällekäisiä key bindejä konfiguraatio tiedostossa"
 
@@ -122,22 +122,22 @@ msgstr "Päällekäisiä key bindejä konfiguraatio tiedostossa"
 msgid "Unable to find a valid menu file '%s'"
 msgstr "Toimivaa menu tiedostoa ei löytynyt '%s'"
 
-#: openbox/menu.c:168
+#: openbox/menu.c:151
 #, c-format
 msgid "Failed to execute command for pipe-menu '%s': %s"
 msgstr "Putki-menun komennon suorittaminen epäonnistui '%s': %s"
 
-#: openbox/menu.c:182
+#: openbox/menu.c:168
 #, c-format
 msgid "Invalid output from pipe-menu '%s'"
 msgstr "Virheellinen tulos putki-menusta '%s'"
 
-#: openbox/menu.c:195
+#: openbox/menu.c:181
 #, c-format
 msgid "Attempted to access menu '%s' but it does not exist"
 msgstr "Menun '%s' lukemista yritettiin mutta sitä ei ole olemassa"
 
-#: openbox/menu.c:356 openbox/menu.c:357
+#: openbox/menu.c:342 openbox/menu.c:343
 msgid "More..."
 msgstr "Lisää..."
 
@@ -286,7 +286,7 @@ msgstr ""
 msgid "The WM on screen %d is not exiting"
 msgstr ""
 
-#: openbox/screen.c:993
+#: openbox/screen.c:991
 #, c-format
 msgid "desktop %i"
 msgstr "työtila %i"
index 28848f0d7d7890882e9a46a64e73e6ddf7271e8b..5842fe0642aabeefe9b3865b9e930ba7f6adf36b 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Openbox 3.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2007-06-10 19:32-0400\n"
+"POT-Creation-Date: 2007-06-07 14:18+0200\n"
 "PO-Revision-Date: 2007-05-21 00:53+0200\n"
 "Last-Translator: Cyrille Bagard <nocbos@gmail.com>\n"
 "Language-Team: French <traduc@traduc.org>\n"
@@ -108,12 +108,12 @@ msgstr "Ne pas/D
 msgid "_Close"
 msgstr "_Fermer"
 
-#: openbox/config.c:716
+#: openbox/config.c:704
 #, c-format
 msgid "Invalid button '%s' specified in config file"
 msgstr "Bouton indiqué dans le fichier de configuration '%s' invalide"
 
-#: openbox/keyboard.c:163
+#: openbox/keyboard.c:162
 msgid "Conflict with key binding in config file"
 msgstr "Conflit entre les raccourcis clavier dans le fichier de configuration"
 
@@ -122,22 +122,22 @@ msgstr "Conflit entre les raccourcis clavier dans le fichier de configuration"
 msgid "Unable to find a valid menu file '%s'"
 msgstr "Impossible de trouver un fichier de menus valide '%s'"
 
-#: openbox/menu.c:168
+#: openbox/menu.c:151
 #, c-format
 msgid "Failed to execute command for pipe-menu '%s': %s"
 msgstr "Echec lors de l'exécution de la commande pour un pipe-menu '%s': %s"
 
-#: openbox/menu.c:182
+#: openbox/menu.c:168
 #, c-format
 msgid "Invalid output from pipe-menu '%s'"
 msgstr "Sortie du pipe-menu invalide '%s'"
 
-#: openbox/menu.c:195
+#: openbox/menu.c:181
 #, c-format
 msgid "Attempted to access menu '%s' but it does not exist"
 msgstr "Tentative d'accès au menu '%s' qui n'existe pas"
 
-#: openbox/menu.c:356 openbox/menu.c:357
+#: openbox/menu.c:342 openbox/menu.c:343
 msgid "More..."
 msgstr "D'avantage..."
 
@@ -300,7 +300,7 @@ msgid "The WM on screen %d is not exiting"
 msgstr ""
 "Le gestionnaire de fenêtres sur l'écran %d n'est pas en train de quitter"
 
-#: openbox/screen.c:993
+#: openbox/screen.c:991
 #, c-format
 msgid "desktop %i"
 msgstr "bureau %i"
index eb3e676e75838d9696308177bcb5f3513dce5f43..63b9948b1e3ec9e76718841f80d4274185278c0e 100644 (file)
--- a/po/it.po
+++ b/po/it.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Openbox 3.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2007-06-10 19:32-0400\n"
+"POT-Creation-Date: 2007-06-07 14:18+0200\n"
 "PO-Revision-Date: 2007-06-04 03:06+0200\n"
 "Last-Translator: Davide Truffa <davide@catoblepa.org>\n"
 "Language-Team: Italian <tp@lists.linux.it>\n"
@@ -106,12 +106,12 @@ msgstr "Si/No _Decorazioni"
 msgid "_Close"
 msgstr "_Chiudi"
 
-#: openbox/config.c:716
+#: openbox/config.c:704
 #, c-format
 msgid "Invalid button '%s' specified in config file"
 msgstr "Il pulsante '%s' specificato nel file di configurazione non è valido"
 
-#: openbox/keyboard.c:163
+#: openbox/keyboard.c:162
 msgid "Conflict with key binding in config file"
 msgstr ""
 "Conflitto con la scorciatoia da tastiera specificata nel file di "
@@ -122,22 +122,22 @@ msgstr ""
 msgid "Unable to find a valid menu file '%s'"
 msgstr "Impossibile trovare il file di menu '%s'"
 
-#: openbox/menu.c:168
+#: openbox/menu.c:151
 #, c-format
 msgid "Failed to execute command for pipe-menu '%s': %s"
 msgstr "Impossibile eseguire il comando nel pipe-menu '%s': %s"
 
-#: openbox/menu.c:182
+#: openbox/menu.c:168
 #, c-format
 msgid "Invalid output from pipe-menu '%s'"
 msgstr "L'output del pipe-menu '%s' non è valido"
 
-#: openbox/menu.c:195
+#: openbox/menu.c:181
 #, c-format
 msgid "Attempted to access menu '%s' but it does not exist"
 msgstr "Tentativo di accedere al menu '%s'. Il menu non esiste"
 
-#: openbox/menu.c:356 openbox/menu.c:357
+#: openbox/menu.c:342 openbox/menu.c:343
 msgid "More..."
 msgstr "Ancora..."
 
@@ -292,7 +292,7 @@ msgstr "Impossibile acquisire la selezione del window manager sullo schermo %d"
 msgid "The WM on screen %d is not exiting"
 msgstr "Il WM sullo schermo %d non sta terminando"
 
-#: openbox/screen.c:993
+#: openbox/screen.c:991
 #, c-format
 msgid "desktop %i"
 msgstr "desktop %i"
index 2cb998af04295354a9e67bf08dd95d2d712ef23e..8c41fed9bd4b32d7f0756b39a362f8b2d72d500d 100644 (file)
--- a/po/ja.po
+++ b/po/ja.po
@@ -2,39 +2,30 @@
 # Copyright (C) 2004 Mikael Magnusson
 # This file is distributed under the same license as the Openbox package.
 # Yukihiro Nakai <nakai@gnome.gr.jp>, 2003.
+# Ryoichiro Suzuki <ryoichiro.suzuki@gmail.com>, 2007.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: Openbox 3.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2007-07-05 16:02+0200\n"
+"POT-Creation-Date: 2007-07-05 16:00+0200\n"
 "PO-Revision-Date: 2007-06-07 14:49+0200\n"
-"Last-Translator: Yukihiro Nakai <nakai@gnome.gr.jp>\n"
+"Last-Translator: Ryoichiro Suzuki <ryoichiro.suzuki@gmail.com>\n"
 "Language-Team: Japanese <ja@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: openbox/action.c:991
+#: openbox/actions/execute.c:86
 #, c-format
-msgid "Invalid action '%s' requested. No such action exists."
-msgstr ""
-
-#: openbox/action.c:994
-#, c-format
-msgid "Invalid use of action '%s'. Action will be ignored."
-msgstr ""
+msgid "Failed to convert the path '%s' from utf8"
+msgstr "パス'%s'を utf8 から変換するのに失敗しました。"
 
-#: openbox/action.c:1261 openbox/action.c:1279 openbox/action.c:1292
+#: openbox/actions/execute.c:95 openbox/actions/execute.c:113
 #, c-format
 msgid "Failed to execute '%s': %s"
-msgstr ""
-
-#: openbox/action.c:1300
-#, c-format
-msgid "Failed to convert the path '%s' from utf8"
-msgstr ""
+msgstr "'%s'の実行に失敗しました: %s"
 
 #: openbox/client_list_combined_menu.c:92 openbox/client_list_menu.c:93
 msgid "Go there..."
@@ -44,257 +35,257 @@ msgstr "移動する..."
 msgid "Manage desktops"
 msgstr "デスクトップを管理"
 
-#: openbox/client_list_combined_menu.c:99 openbox/client_list_menu.c:153
+#: openbox/client_list_combined_menu.c:99 openbox/client_list_menu.c:152
 msgid "_Add new desktop"
 msgstr "新しくデスクトップを追加(_A)"
 
-#: openbox/client_list_combined_menu.c:100 openbox/client_list_menu.c:154
+#: openbox/client_list_combined_menu.c:100 openbox/client_list_menu.c:153
 msgid "_Remove last desktop"
 msgstr "最後のデスクトップを削除(_R)"
 
-#: openbox/client_list_combined_menu.c:147
+#: openbox/client_list_combined_menu.c:146
 msgid "Windows"
 msgstr "ウィンドウ"
 
-#: openbox/client_list_menu.c:200
+#: openbox/client_list_menu.c:199
 msgid "Desktops"
 msgstr "デスクトップ"
 
-#: openbox/client_menu.c:258
+#: openbox/client_menu.c:256
 msgid "All desktops"
 msgstr "すべてのデスクトップ(_A)"
 
-#: openbox/client_menu.c:363
+#: openbox/client_menu.c:360
 msgid "_Layer"
-msgstr "レイヤー(_L)"
+msgstr "階層(_L)"
 
-#: openbox/client_menu.c:368
+#: openbox/client_menu.c:365
 msgid "Always on _top"
 msgstr "常に最上位にする(_T)"
 
-#: openbox/client_menu.c:369
+#: openbox/client_menu.c:366
 msgid "_Normal"
-msgstr "ノーマル(_N)"
+msgstr "通常(_N)"
 
-#: openbox/client_menu.c:370
+#: openbox/client_menu.c:367
 msgid "Always on _bottom"
 msgstr "常に最下位にする(_B)"
 
-#: openbox/client_menu.c:373
+#: openbox/client_menu.c:370
 msgid "_Send to desktop"
 msgstr "デスクトップに送る(_S)"
 
-#: openbox/client_menu.c:377
+#: openbox/client_menu.c:374
 msgid "Client menu"
 msgstr "クライアントメニュー"
 
-#: openbox/client_menu.c:383
+#: openbox/client_menu.c:380
 msgid "R_estore"
-msgstr "リストア(_E)"
+msgstr "復元(_E)"
 
-#: openbox/client_menu.c:391
+#: openbox/client_menu.c:388
 msgid "_Move"
 msgstr "移動(_M)"
 
-#: openbox/client_menu.c:393
+#: openbox/client_menu.c:390
 msgid "Resi_ze"
-msgstr "ã\83ªã\82µã\82¤ã\82º(_Z)"
+msgstr "ã\82µã\82¤ã\82ºã\81®å¤\89æ\9b´(_Z)"
 
-#: openbox/client_menu.c:395
+#: openbox/client_menu.c:392
 msgid "Ico_nify"
 msgstr "アイコン化(_N)"
 
-#: openbox/client_menu.c:403
+#: openbox/client_menu.c:400
 msgid "Ma_ximize"
 msgstr "最大化(_X)"
 
-#: openbox/client_menu.c:411
+#: openbox/client_menu.c:408
 msgid "_Roll up/down"
-msgstr "ロールアップ/ダウン(_R)"
+msgstr "巻き上げ/展開(_R)"
 
 # not sure about this one
-#: openbox/client_menu.c:413
+#: openbox/client_menu.c:410
 msgid "Un/_Decorate"
 msgstr "非/装飾(_D)"
 
-#: openbox/client_menu.c:423
+#: openbox/client_menu.c:420
 msgid "_Close"
 msgstr "閉じる(_C)"
 
-#: openbox/config.c:722
+#: openbox/config.c:718
 #, c-format
 msgid "Invalid button '%s' specified in config file"
-msgstr ""
+msgstr "不正なボタン'%s'が設定ファイルで指定されています。"
 
-#: openbox/keyboard.c:164
+#: openbox/keyboard.c:156
 msgid "Conflict with key binding in config file"
-msgstr ""
+msgstr "設定ファイルにキー割り当ての衝突があります。"
 
-#: openbox/menu.c:101 openbox/menu.c:109
+#: openbox/menu.c:103 openbox/menu.c:111
 #, c-format
 msgid "Unable to find a valid menu file '%s'"
-msgstr ""
+msgstr "正当なメニューファイル'%s'を見つけることができません。"
 
-#: openbox/menu.c:169
+#: openbox/menu.c:171
 #, c-format
 msgid "Failed to execute command for pipe-menu '%s': %s"
-msgstr ""
+msgstr "パイプメニューの為のコマンド'%s'の実行に失敗しました: %s"
 
-#: openbox/menu.c:183
+#: openbox/menu.c:185
 #, c-format
 msgid "Invalid output from pipe-menu '%s'"
-msgstr ""
+msgstr "パイプメニュー'%s'からの不正な出力です。"
 
-#: openbox/menu.c:196
+#: openbox/menu.c:198
 #, c-format
 msgid "Attempted to access menu '%s' but it does not exist"
-msgstr ""
+msgstr "メニュー'%s'へのアクセスを試みましたが、それは存在しません。"
 
-#: openbox/menu.c:361 openbox/menu.c:362
+#: openbox/menu.c:362 openbox/menu.c:363
 msgid "More..."
-msgstr ""
+msgstr "もっと..."
 
-#: openbox/mouse.c:338
+#: openbox/mouse.c:349
 #, c-format
 msgid "Invalid button '%s' in mouse binding"
-msgstr ""
+msgstr "マウス割り当てに於いて不正なボタン '%s'"
 
-#: openbox/mouse.c:344
+#: openbox/mouse.c:355
 #, c-format
 msgid "Invalid context '%s' in mouse binding"
-msgstr ""
+msgstr "マウス割り当てに於いて不正なコンテクスト '%s'"
 
-#: openbox/openbox.c:129
+#: openbox/openbox.c:131
 #, c-format
 msgid "Unable to change to home directory '%s': %s"
-msgstr ""
+msgstr "ホームディレクトリ'%s'に移動できません: %s"
 
-#: openbox/openbox.c:149
+#: openbox/openbox.c:151
 msgid "Failed to open the display from the DISPLAY environment variable."
-msgstr ""
+msgstr "環境変数 DISPLAY からディスプレイを開くのに失敗しました。"
 
-#: openbox/openbox.c:180
+#: openbox/openbox.c:182
 msgid "Failed to initialize the obrender library."
-msgstr ""
+msgstr "obrender ライブラリの初期化に失敗しました。"
 
-#: openbox/openbox.c:186
+#: openbox/openbox.c:188
 msgid "X server does not support locale."
-msgstr ""
+msgstr "Xサーバはロケールをサポートしていません。"
 
-#: openbox/openbox.c:188
+#: openbox/openbox.c:190
 msgid "Cannot set locale modifiers for the X server."
-msgstr ""
+msgstr "Xサーバの為のロケール修飾子を設定できません。"
 
-#: openbox/openbox.c:249
+#: openbox/openbox.c:253
 msgid "Unable to find a valid config file, using some simple defaults"
-msgstr ""
+msgstr "正当な設定ファイルを見つけられません。単純な初期設定を使います。"
 
-#: openbox/openbox.c:275
+#: openbox/openbox.c:279
 msgid "Unable to load a theme."
-msgstr ""
+msgstr "テーマを読み込めません。"
 
-#: openbox/openbox.c:401
+#: openbox/openbox.c:408
 #, c-format
 msgid "Restart failed to execute new executable '%s': %s"
-msgstr ""
+msgstr "再起動の際新しい実行ファイル'%s'の実行に失敗しました: %s"
 
-#: openbox/openbox.c:471 openbox/openbox.c:473
+#: openbox/openbox.c:478 openbox/openbox.c:480
 msgid "Copyright (c)"
 msgstr ""
 
-#: openbox/openbox.c:482
+#: openbox/openbox.c:489
 msgid "Syntax: openbox [options]\n"
 msgstr ""
 
-#: openbox/openbox.c:483
+#: openbox/openbox.c:490
 msgid ""
 "\n"
 "Options:\n"
 msgstr ""
 
-#: openbox/openbox.c:484
+#: openbox/openbox.c:491
 msgid "  --help              Display this help and exit\n"
 msgstr ""
 
-#: openbox/openbox.c:485
+#: openbox/openbox.c:492
 msgid "  --version           Display the version and exit\n"
 msgstr ""
 
-#: openbox/openbox.c:486
+#: openbox/openbox.c:493
 msgid "  --replace           Replace the currently running window manager\n"
 msgstr ""
 
-#: openbox/openbox.c:487
+#: openbox/openbox.c:494
 msgid "  --sm-disable        Disable connection to the session manager\n"
 msgstr ""
 
-#: openbox/openbox.c:488
+#: openbox/openbox.c:495
 msgid ""
 "\n"
 "Passing messages to a running Openbox instance:\n"
 msgstr ""
 
-#: openbox/openbox.c:489
+#: openbox/openbox.c:496
 msgid "  --reconfigure       Reload Openbox's configuration\n"
 msgstr ""
 
-#: openbox/openbox.c:490
+#: openbox/openbox.c:497
 msgid "  --restart           Restart Openbox\n"
 msgstr ""
 
-#: openbox/openbox.c:491
+#: openbox/openbox.c:498
 msgid ""
 "\n"
 "Debugging options:\n"
 msgstr ""
 
-#: openbox/openbox.c:492
+#: openbox/openbox.c:499
 msgid "  --sync              Run in synchronous mode\n"
 msgstr ""
 
-#: openbox/openbox.c:493
+#: openbox/openbox.c:500
 msgid "  --debug             Display debugging output\n"
 msgstr ""
 
-#: openbox/openbox.c:494
+#: openbox/openbox.c:501
 msgid "  --debug-focus       Display debugging output for focus handling\n"
 msgstr ""
 
-#: openbox/openbox.c:495
+#: openbox/openbox.c:502
 msgid "  --debug-xinerama    Split the display into fake xinerama screens\n"
 msgstr ""
 
-#: openbox/openbox.c:496
+#: openbox/openbox.c:503
 #, c-format
 msgid ""
 "\n"
 "Please report bugs at %s\n"
 msgstr ""
 
-#: openbox/openbox.c:593
+#: openbox/openbox.c:600
 #, c-format
 msgid "Invalid command line argument '%s'\n"
-msgstr ""
+msgstr "不正なコマンドライン引数 '%s'\n"
 
-#: openbox/screen.c:94 openbox/screen.c:195
+#: openbox/screen.c:95 openbox/screen.c:196
 #, c-format
 msgid "A window manager is already running on screen %d"
-msgstr ""
+msgstr "スクリーン%dでウィンドウマネージャが既に起動しています。"
 
-#: openbox/screen.c:131
+#: openbox/screen.c:132
 #, c-format
 msgid "Could not acquire window manager selection on screen %d"
-msgstr ""
+msgstr "スクリーン%dでウィンドウマネージャの選択を取得できませんでした。"
 
-#: openbox/screen.c:152
+#: openbox/screen.c:153
 #, c-format
 msgid "The WM on screen %d is not exiting"
-msgstr ""
+msgstr "スクリーン%dのWMが終了しません。"
 
-#: openbox/screen.c:1073
+#: openbox/screen.c:1077
 #, c-format
 msgid "desktop %i"
-msgstr ""
+msgstr "デスクトップ%i"
 
 #: openbox/session.c:103
 #, c-format
@@ -304,39 +295,46 @@ msgstr "ディレクトリ'%s'を作れません: %s"
 #: openbox/session.c:451
 #, c-format
 msgid "Unable to save the session to '%s': %s"
-msgstr ""
+msgstr "セッションを'%s'に保存できません: %s"
 
 #: openbox/session.c:583
 #, c-format
 msgid "Error while saving the session to '%s': %s"
-msgstr ""
+msgstr "セッションを'%s'に保存中にエラーが起きました: %s"
 
 #: openbox/startupnotify.c:237
 #, c-format
 msgid "Running %s\n"
-msgstr ""
+msgstr "起動中 %s\n"
 
 #: openbox/translate.c:58
 #, c-format
 msgid "Invalid modifier key '%s' in key/mouse binding"
-msgstr ""
+msgstr "キー/マウス割り当ての中の不正な修飾キー '%s'"
 
 #: openbox/translate.c:135
 #, c-format
 msgid "Invalid key code '%s' in key binding"
-msgstr ""
+msgstr "キー割り当ての中の不正なキーコード '%s'"
 
 #: openbox/translate.c:142
 #, c-format
 msgid "Invalid key name '%s' in key binding"
-msgstr ""
+msgstr "キー割り当ての中の不正なキー名称 '%s'"
 
 #: openbox/translate.c:148
 #, c-format
 msgid "Requested key '%s' does not exist on the display"
-msgstr ""
+msgstr "要求されたキー'%s'はそのディスプレイに存在しません。"
 
 #: openbox/xerror.c:39
 #, c-format
 msgid "X Error: %s"
-msgstr ""
+msgstr "Xエラー: %s"
+
+#~ msgid "Invalid action '%s' requested. No such action exists."
+#~ msgstr ""
+#~ "不正なアクション'%s'が要求されました。そのようなアクションは存在しません。"
+
+#~ msgid "Invalid use of action '%s'. Action will be ignored."
+#~ msgstr "アクション'%s'の不正な使用です。このアクションは無視されます。"
index 9b01d023bed7d139fa0753c7e9f07e2336df3299..a9c8b62936e21710cb30823c8b02c05253c99e53 100644 (file)
--- a/po/nl.po
+++ b/po/nl.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Openbox 3.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2007-06-10 19:32-0400\n"
+"POT-Creation-Date: 2007-06-07 14:18+0200\n"
 "PO-Revision-Date: 2007-05-24 16:39+0200\n"
 "Last-Translator: Mark Pustjens <pustjens@dds.nl>\n"
 "Language-Team: Dutch <nl@li.org>\n"
@@ -108,12 +108,12 @@ msgstr "_Vensterrand weghalen/toevoegen"
 msgid "_Close"
 msgstr "_Sluiten"
 
-#: openbox/config.c:716
+#: openbox/config.c:704
 #, c-format
 msgid "Invalid button '%s' specified in config file"
 msgstr "Ongeldige knop '%s' gespecificeerd in het configuratie bestand"
 
-#: openbox/keyboard.c:163
+#: openbox/keyboard.c:162
 msgid "Conflict with key binding in config file"
 msgstr "Conflict met toetsen binding in het configuratie bestand"
 
@@ -122,22 +122,22 @@ msgstr "Conflict met toetsen binding in het configuratie bestand"
 msgid "Unable to find a valid menu file '%s'"
 msgstr "Het vinden van een geldig menu bestand '%s' is mislukt"
 
-#: openbox/menu.c:168
+#: openbox/menu.c:151
 #, c-format
 msgid "Failed to execute command for pipe-menu '%s': %s"
 msgstr "Uitvoeren mislukt van het commando '%s' voor pipe-menu: %s"
 
-#: openbox/menu.c:182
+#: openbox/menu.c:168
 #, c-format
 msgid "Invalid output from pipe-menu '%s'"
 msgstr "Ongeldige uitvoer van pipe-menu '%s'"
 
-#: openbox/menu.c:195
+#: openbox/menu.c:181
 #, c-format
 msgid "Attempted to access menu '%s' but it does not exist"
 msgstr "Toegang gevraagd tot menu '%s' maar het besstaat niet"
 
-#: openbox/menu.c:356 openbox/menu.c:357
+#: openbox/menu.c:342 openbox/menu.c:343
 msgid "More..."
 msgstr "Meer..."
 
@@ -289,7 +289,7 @@ msgstr "Kon window manager selectie op scherm %d niet verkrijgen"
 msgid "The WM on screen %d is not exiting"
 msgstr "De window manager op scherm %d sluit zichzelf niet af"
 
-#: openbox/screen.c:993
+#: openbox/screen.c:991
 #, c-format
 msgid "desktop %i"
 msgstr "bureaublad %i"
index 3a8217a47acbf83364038313e316e88470224f71..47f8cccf6a57d8ab2aa6a30e7d885b2110951a4e 100644 (file)
--- a/po/no.po
+++ b/po/no.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: openbox 3.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2007-06-10 19:32-0400\n"
+"POT-Creation-Date: 2007-06-07 14:18+0200\n"
 "PO-Revision-Date: 2007-05-20 18:41+0200\n"
 "Last-Translator: Michael Kjelbergvik Thung <postlogic@switch-case.org>\n"
 "Language-Team: None\n"
@@ -107,12 +107,12 @@ msgstr "Fjern/Legg til _dekorasjon"
 msgid "_Close"
 msgstr "_Lukk"
 
-#: openbox/config.c:716
+#: openbox/config.c:704
 #, c-format
 msgid "Invalid button '%s' specified in config file"
 msgstr "Ugyldig tast '%s' spesifisert i konfigurasjonsfilen"
 
-#: openbox/keyboard.c:163
+#: openbox/keyboard.c:162
 msgid "Conflict with key binding in config file"
 msgstr "Konflikt med hurtigtastbinding i konfigurasjonsfilen"
 
@@ -121,22 +121,22 @@ msgstr "Konflikt med hurtigtastbinding i konfigurasjonsfilen"
 msgid "Unable to find a valid menu file '%s'"
 msgstr "Kan ikke finne en gyldig menyfil '%s'"
 
-#: openbox/menu.c:168
+#: openbox/menu.c:151
 #, c-format
 msgid "Failed to execute command for pipe-menu '%s': %s"
 msgstr "Kunne ikke kjøre kommando for pipe-meny '%s': %s"
 
-#: openbox/menu.c:182
+#: openbox/menu.c:168
 #, c-format
 msgid "Invalid output from pipe-menu '%s'"
 msgstr "Ugyldig utdata fra pipe-menyen '%s'"
 
-#: openbox/menu.c:195
+#: openbox/menu.c:181
 #, c-format
 msgid "Attempted to access menu '%s' but it does not exist"
 msgstr "Forsøkte å åpne menyen '%s', men denne finnes ikke"
 
-#: openbox/menu.c:356 openbox/menu.c:357
+#: openbox/menu.c:342 openbox/menu.c:343
 msgid "More..."
 msgstr "Mer..."
 
@@ -285,7 +285,7 @@ msgstr "Kunne ikke hendte vindusbehandlerens markering på skjerm %d"
 msgid "The WM on screen %d is not exiting"
 msgstr "Vindusbehandleren på skjerm %d vil ikke avslutte"
 
-#: openbox/screen.c:993
+#: openbox/screen.c:991
 #, c-format
 msgid "desktop %i"
 msgstr "skrivebord %i"
index 50ba83cdbd79d37ac2c525cd025c23fc53743e0a..00cbc398f5bbe14fc4bc9273a62774b8de83b8c4 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2007-06-10 19:32-0400\n"
+"POT-Creation-Date: 2007-06-07 14:18+0200\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"
@@ -108,12 +108,12 @@ msgstr ""
 msgid "&Close"
 msgstr ""
 
-#: openbox/config.c:716
+#: openbox/config.c:704
 #, c-format
 msgid "Invalid button '%s' specified in config file"
 msgstr ""
 
-#: openbox/keyboard.c:163
+#: openbox/keyboard.c:162
 msgid "Conflict with key binding in config file"
 msgstr ""
 
@@ -122,22 +122,22 @@ msgstr ""
 msgid "Unable to find a valid menu file '%s'"
 msgstr ""
 
-#: openbox/menu.c:168
+#: openbox/menu.c:151
 #, c-format
 msgid "Failed to execute command for pipe-menu '%s': %s"
 msgstr ""
 
-#: openbox/menu.c:182
+#: openbox/menu.c:168
 #, c-format
 msgid "Invalid output from pipe-menu '%s'"
 msgstr ""
 
-#: openbox/menu.c:195
+#: openbox/menu.c:181
 #, c-format
 msgid "Attempted to access menu '%s' but it does not exist"
 msgstr ""
 
-#: openbox/menu.c:356 openbox/menu.c:357
+#: openbox/menu.c:342 openbox/menu.c:343
 msgid "More..."
 msgstr ""
 
@@ -278,7 +278,7 @@ msgstr ""
 msgid "The WM on screen %d is not exiting"
 msgstr ""
 
-#: openbox/screen.c:993
+#: openbox/screen.c:991
 #, c-format
 msgid "desktop %i"
 msgstr ""
index 4c999f558accc6f7622cd29671b8a0a85432139e..5d04cfd18221318494ab56c74a9461f1b958e754 100644 (file)
--- a/po/pl.po
+++ b/po/pl.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Openbox 3.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2007-06-10 19:32-0400\n"
+"POT-Creation-Date: 2007-06-07 14:18+0200\n"
 "PO-Revision-Date: 2007-05-21 18:09+0100\n"
 "Last-Translator: Paweł Rusinek <p.rusinek@gmail.com>\n"
 "Language-Team: None\n"
@@ -108,12 +108,12 @@ msgstr "Pokaż/Ukryj _dekoracje"
 msgid "_Close"
 msgstr "Z_amknij"
 
-#: openbox/config.c:716
+#: openbox/config.c:704
 #, c-format
 msgid "Invalid button '%s' specified in config file"
 msgstr "Niepoprawny klawisz '%s' użyty w pliku konfiguracyjnym"
 
-#: openbox/keyboard.c:163
+#: openbox/keyboard.c:162
 msgid "Conflict with key binding in config file"
 msgstr "Konflikt z powiązaniem klawiaturowym w pliku konfiguracyjnym"
 
@@ -122,22 +122,22 @@ msgstr "Konflikt z powiązaniem klawiaturowym w pliku konfiguracyjnym"
 msgid "Unable to find a valid menu file '%s'"
 msgstr "Nie można odnaleźć poprawnego pliku menu '%s'"
 
-#: openbox/menu.c:168
+#: openbox/menu.c:151
 #, c-format
 msgid "Failed to execute command for pipe-menu '%s': %s"
 msgstr "Nie udało się wykonać polecenia dla pipe-menu '%s': %s"
 
-#: openbox/menu.c:182
+#: openbox/menu.c:168
 #, c-format
 msgid "Invalid output from pipe-menu '%s'"
 msgstr "Niepoprawny wynik z pipe-menu '%s'"
 
-#: openbox/menu.c:195
+#: openbox/menu.c:181
 #, c-format
 msgid "Attempted to access menu '%s' but it does not exist"
 msgstr "Plik menu '%s' nie istnieje"
 
-#: openbox/menu.c:356 openbox/menu.c:357
+#: openbox/menu.c:342 openbox/menu.c:343
 msgid "More..."
 msgstr "Więcej..."
 
@@ -292,7 +292,7 @@ msgstr "Nie można uzyskać wyboru menedżera okien na ekranie %d"
 msgid "The WM on screen %d is not exiting"
 msgstr "Menedżer okien na ekranie %d nie kończy działania"
 
-#: openbox/screen.c:993
+#: openbox/screen.c:991
 #, c-format
 msgid "desktop %i"
 msgstr "pulpit %i"
index a28ab60b1a289c84a0a6c2193018baf0710d8d66..4085c13958fc8302eb4864067a7e4df05042e019 100644 (file)
--- a/po/pt.po
+++ b/po/pt.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Openbox 3.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2007-06-10 19:32-0400\n"
+"POT-Creation-Date: 2007-06-07 14:18+0200\n"
 "PO-Revision-Date: 2007-05-23 00:34+0200\n"
 "Last-Translator: Althaser <Althaser@gmail.com>\n"
 "Language-Team: None\n"
@@ -108,12 +108,12 @@ msgstr "Des/_Decorar"
 msgid "_Close"
 msgstr "_Fechar"
 
-#: openbox/config.c:716
+#: openbox/config.c:704
 #, c-format
 msgid "Invalid button '%s' specified in config file"
 msgstr "Botão inválido '%s' especificado no ficheiro de configuração"
 
-#: openbox/keyboard.c:163
+#: openbox/keyboard.c:162
 msgid "Conflict with key binding in config file"
 msgstr "Conflito com tecla de atalho no ficheiro de configuração"
 
@@ -122,22 +122,22 @@ msgstr "Conflito com tecla de atalho no ficheiro de configura
 msgid "Unable to find a valid menu file '%s'"
 msgstr "Incapaz de encontrar um ficheiro de menu válido '%s'"
 
-#: openbox/menu.c:168
+#: openbox/menu.c:151
 #, c-format
 msgid "Failed to execute command for pipe-menu '%s': %s"
 msgstr "Falha no comando de execução para o menu de processamento '%s': %s"
 
-#: openbox/menu.c:182
+#: openbox/menu.c:168
 #, c-format
 msgid "Invalid output from pipe-menu '%s'"
 msgstr "Resultado inválido do menu de processamento '%s'"
 
-#: openbox/menu.c:195
+#: openbox/menu.c:181
 #, c-format
 msgid "Attempted to access menu '%s' but it does not exist"
 msgstr "Tentei aceder ao menu '%s' mas ele não existe"
 
-#: openbox/menu.c:356 openbox/menu.c:357
+#: openbox/menu.c:342 openbox/menu.c:343
 msgid "More..."
 msgstr "Mais..."
 
@@ -290,7 +290,7 @@ msgstr "N
 msgid "The WM on screen %d is not exiting"
 msgstr "O gestor de janelas no ecrã %d não está fechando"
 
-#: openbox/screen.c:993
+#: openbox/screen.c:991
 #, c-format
 msgid "desktop %i"
 msgstr "área de trabalho %i"
index bcc7f35eb310e45d2277004b0766eacfa4ed6ac5..dc9d94059157cd6c04e2c827f05a5c5d54829813 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Openbox 3.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2007-06-10 19:32-0400\n"
+"POT-Creation-Date: 2007-06-07 14:18+0200\n"
 "PO-Revision-Date: 2007-05-22 19:35+0200\n"
 "Last-Translator: Og Maciel <ogmaciel@ubuntu.com>\n"
 "Language-Team: Brazilian Portuguese <gnome-l10n-br@listas.cipsga.org.br>\n"
@@ -109,12 +109,12 @@ msgstr "(Não) _Decorar"
 msgid "_Close"
 msgstr "_Fechar"
 
-#: openbox/config.c:716
+#: openbox/config.c:704
 #, c-format
 msgid "Invalid button '%s' specified in config file"
 msgstr "Botão inválido '%s' especificado no arquivo de configuração"
 
-#: openbox/keyboard.c:163
+#: openbox/keyboard.c:162
 msgid "Conflict with key binding in config file"
 msgstr "Conflito com associação de chave no arquivo de configuração"
 
@@ -123,22 +123,22 @@ msgstr "Conflito com associação de chave no arquivo de configuração"
 msgid "Unable to find a valid menu file '%s'"
 msgstr "Não foi possível encontrar um arquivo de menu '%s' válido"
 
-#: openbox/menu.c:168
+#: openbox/menu.c:151
 #, c-format
 msgid "Failed to execute command for pipe-menu '%s': %s"
 msgstr "Falha ao executar comando para menu de processamento '%s': %s"
 
-#: openbox/menu.c:182
+#: openbox/menu.c:168
 #, c-format
 msgid "Invalid output from pipe-menu '%s'"
 msgstr "Saída inválida do menu de processamento '%s'"
 
-#: openbox/menu.c:195
+#: openbox/menu.c:181
 #, c-format
 msgid "Attempted to access menu '%s' but it does not exist"
 msgstr "Tentou acessar menu '%s' mas ele não existe"
 
-#: openbox/menu.c:356 openbox/menu.c:357
+#: openbox/menu.c:342 openbox/menu.c:343
 msgid "More..."
 msgstr "Mais.."
 
@@ -295,7 +295,7 @@ msgstr ""
 msgid "The WM on screen %d is not exiting"
 msgstr "O gerenciador de janelas na tela %d não está saindo"
 
-#: openbox/screen.c:993
+#: openbox/screen.c:991
 #, c-format
 msgid "desktop %i"
 msgstr "área de trabalho %i"
index 97dbd022c7406a26cec64fd7c7687cff8cecc91f..ad6813bf08394ac8d3bc6dec2de838935956799c 100644 (file)
--- a/po/ru.po
+++ b/po/ru.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: openbox 3.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2007-06-10 19:32-0400\n"
+"POT-Creation-Date: 2007-06-07 14:18+0200\n"
 "PO-Revision-Date: 2007-05-24 19:41+0100\n"
 "Last-Translator: Pavel Shevchuk <stlwrt@gmail.com>\n"
 "Language-Team: Russian <gnome-cyr@gnome.org>\n"
@@ -108,12 +108,12 @@ msgstr "(От)декорировать(_D)"
 msgid "_Close"
 msgstr "Закрыть(_C)"
 
-#: openbox/config.c:716
+#: openbox/config.c:704
 #, c-format
 msgid "Invalid button '%s' specified in config file"
 msgstr "Некорректная клавиша '%s' упомянута в конфигурационном файле"
 
-#: openbox/keyboard.c:163
+#: openbox/keyboard.c:162
 msgid "Conflict with key binding in config file"
 msgstr "Конфликт привязок клавиш в конфигурационном файле"
 
@@ -122,22 +122,22 @@ msgstr "Конфликт привязок клавиш в конфигураци
 msgid "Unable to find a valid menu file '%s'"
 msgstr "Не могу найти корректный файл меню '%s'"
 
-#: openbox/menu.c:168
+#: openbox/menu.c:151
 #, c-format
 msgid "Failed to execute command for pipe-menu '%s': %s"
 msgstr "Не могу запустить команду pipe-меню '%s': %s"
 
-#: openbox/menu.c:182
+#: openbox/menu.c:168
 #, c-format
 msgid "Invalid output from pipe-menu '%s'"
 msgstr "Некорректный вывод pipe-меню '%s'"
 
-#: openbox/menu.c:195
+#: openbox/menu.c:181
 #, c-format
 msgid "Attempted to access menu '%s' but it does not exist"
 msgstr "Попытка доступа к несуществующему меню '%s'."
 
-#: openbox/menu.c:356 openbox/menu.c:357
+#: openbox/menu.c:342 openbox/menu.c:343
 msgid "More..."
 msgstr "Больше..."
 
@@ -290,7 +290,7 @@ msgstr "Не могу получить выбор менеджера окон н
 msgid "The WM on screen %d is not exiting"
 msgstr "Менеджер окон на экране %d не завершается"
 
-#: openbox/screen.c:993
+#: openbox/screen.c:991
 #, c-format
 msgid "desktop %i"
 msgstr "рабочий стол %i"
index 90f5d84e53117c5a9be1ffd90e0b30d861d849c5..292a1b95f1ac4cac59c5f92aa89556260c7c2cfe 100644 (file)
--- a/po/sk.po
+++ b/po/sk.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Openbox-3.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2007-06-10 19:32-0400\n"
+"POT-Creation-Date: 2007-06-07 14:18+0200\n"
 "PO-Revision-Date: 2007-05-27 13:43Central Europe Daylight Time\n"
 "Last-Translator: Jozef Riha <jose1711@gmail.com\n"
 "Language-Team: Slovak <LL@li.org>\n"
@@ -107,12 +107,12 @@ msgstr "(Ne)_Dekorovať"
 msgid "_Close"
 msgstr "Z_avrieť"
 
-#: openbox/config.c:716
+#: openbox/config.c:704
 #, c-format
 msgid "Invalid button '%s' specified in config file"
 msgstr "Neplatné tlačidlo '%s' špecifikované v konfiguračnom súbore"
 
-#: openbox/keyboard.c:163
+#: openbox/keyboard.c:162
 msgid "Conflict with key binding in config file"
 msgstr "Konflikt priradenie klávesov v konfiguračnom súbore"
 
@@ -121,22 +121,22 @@ msgstr "Konflikt priradenie klávesov v konfiguračnom súbore"
 msgid "Unable to find a valid menu file '%s'"
 msgstr "Nepodarilo sa nájsť platný súbor menu '%s'"
 
-#: openbox/menu.c:168
+#: openbox/menu.c:151
 #, c-format
 msgid "Failed to execute command for pipe-menu '%s': %s"
 msgstr "Nepodarilo sa spustiť príkaz pre pipe-menu '%s': %s"
 
-#: openbox/menu.c:182
+#: openbox/menu.c:168
 #, c-format
 msgid "Invalid output from pipe-menu '%s'"
 msgstr "Neplatný výstup z pipe-menu '%s'"
 
-#: openbox/menu.c:195
+#: openbox/menu.c:181
 #, c-format
 msgid "Attempted to access menu '%s' but it does not exist"
 msgstr "Pokus o sprístupnenie menu '%s', ale to neexistuje"
 
-#: openbox/menu.c:356 openbox/menu.c:357
+#: openbox/menu.c:342 openbox/menu.c:343
 msgid "More..."
 msgstr "Viac..."
 
@@ -289,7 +289,7 @@ msgstr "Nepodarilo sa získať výber okenného manažéra na obrazovke %d"
 msgid "The WM on screen %d is not exiting"
 msgstr "Okenný manažér na obrazovke %d sa neukončuje"
 
-#: openbox/screen.c:993
+#: openbox/screen.c:991
 #, c-format
 msgid "desktop %i"
 msgstr "plocha %i"
index 498cb89a377e2ccbb81ceaf6415585ea311af8ab..265e6bf2b8960824cf65978adf0ffdb56f194190 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: openbox 3.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2007-07-05 16:02+0200\n"
+"POT-Creation-Date: 2007-07-05 16:00+0200\n"
 "PO-Revision-Date: 2007-05-22 00:29+0200\n"
 "Last-Translator: Mikael Magnusson <mikachu@icculus.org>\n"
 "Language-Team: None\n"
@@ -15,26 +15,16 @@ msgstr ""
 "Content-Type: text/plain; charset=iso-8859-1\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: openbox/action.c:991
+#: openbox/actions/execute.c:86
 #, c-format
-msgid "Invalid action '%s' requested. No such action exists."
-msgstr "Ogiltig action '%s' efterfrågades, men den finns inte."
-
-#: openbox/action.c:994
-#, c-format
-msgid "Invalid use of action '%s'. Action will be ignored."
-msgstr "Ogiltigt användande av action '%s', den kommer ignoreras."
+msgid "Failed to convert the path '%s' from utf8"
+msgstr "Lyckades inte konvertera sökvägen '%s' från utf8"
 
-#: openbox/action.c:1261 openbox/action.c:1279 openbox/action.c:1292
+#: openbox/actions/execute.c:95 openbox/actions/execute.c:113
 #, c-format
 msgid "Failed to execute '%s': %s"
 msgstr "Kunde inte exekvera '%s': %s"
 
-#: openbox/action.c:1300
-#, c-format
-msgid "Failed to convert the path '%s' from utf8"
-msgstr "Lyckades inte konvertera sökvägen '%s' från utf8"
-
 #: openbox/client_list_combined_menu.c:92 openbox/client_list_menu.c:93
 msgid "Go there..."
 msgstr "Gå dit..."
@@ -43,169 +33,169 @@ msgstr "G
 msgid "Manage desktops"
 msgstr "Hantera skrivbord"
 
-#: openbox/client_list_combined_menu.c:99 openbox/client_list_menu.c:153
+#: openbox/client_list_combined_menu.c:99 openbox/client_list_menu.c:152
 msgid "_Add new desktop"
 msgstr "_Lägg till nytt skrivbord"
 
-#: openbox/client_list_combined_menu.c:100 openbox/client_list_menu.c:154
+#: openbox/client_list_combined_menu.c:100 openbox/client_list_menu.c:153
 msgid "_Remove last desktop"
 msgstr "_Ta bort sista skrivbordet"
 
-#: openbox/client_list_combined_menu.c:147
+#: openbox/client_list_combined_menu.c:146
 msgid "Windows"
 msgstr "Fönster"
 
-#: openbox/client_list_menu.c:200
+#: openbox/client_list_menu.c:199
 msgid "Desktops"
 msgstr "Skrivbord"
 
-#: openbox/client_menu.c:258
+#: openbox/client_menu.c:256
 msgid "All desktops"
 msgstr "Alla skrivbord"
 
-#: openbox/client_menu.c:363
+#: openbox/client_menu.c:360
 msgid "_Layer"
 msgstr "_Lager"
 
-#: openbox/client_menu.c:368
+#: openbox/client_menu.c:365
 msgid "Always on _top"
 msgstr "Alltid ö_verst"
 
-#: openbox/client_menu.c:369
+#: openbox/client_menu.c:366
 msgid "_Normal"
 msgstr "_Normal"
 
-#: openbox/client_menu.c:370
+#: openbox/client_menu.c:367
 msgid "Always on _bottom"
 msgstr "Alltid _underst"
 
-#: openbox/client_menu.c:373
+#: openbox/client_menu.c:370
 msgid "_Send to desktop"
 msgstr "_Skicka till skrivbord"
 
-#: openbox/client_menu.c:377
+#: openbox/client_menu.c:374
 msgid "Client menu"
 msgstr "Klientmeny"
 
-#: openbox/client_menu.c:383
+#: openbox/client_menu.c:380
 msgid "R_estore"
 msgstr "Åt_erställ"
 
-#: openbox/client_menu.c:391
+#: openbox/client_menu.c:388
 msgid "_Move"
 msgstr "_Flytta"
 
-#: openbox/client_menu.c:393
+#: openbox/client_menu.c:390
 msgid "Resi_ze"
 msgstr "Ändra s_torlek"
 
-#: openbox/client_menu.c:395
+#: openbox/client_menu.c:392
 msgid "Ico_nify"
 msgstr "Mi_nimera"
 
-#: openbox/client_menu.c:403
+#: openbox/client_menu.c:400
 msgid "Ma_ximize"
 msgstr "Ma_ximera"
 
-#: openbox/client_menu.c:411
+#: openbox/client_menu.c:408
 msgid "_Roll up/down"
 msgstr "_Rulla upp/ner"
 
-#: openbox/client_menu.c:413
+#: openbox/client_menu.c:410
 msgid "Un/_Decorate"
 msgstr "_Dekorationer"
 
-#: openbox/client_menu.c:423
+#: openbox/client_menu.c:420
 msgid "_Close"
 msgstr "Stän_g"
 
-#: openbox/config.c:722
+#: openbox/config.c:718
 #, c-format
 msgid "Invalid button '%s' specified in config file"
 msgstr "Ogiltig knapp '%s' angiven i konfigurationsfilen"
 
-#: openbox/keyboard.c:164
+#: openbox/keyboard.c:156
 msgid "Conflict with key binding in config file"
 msgstr "Konflikt med annan tangentbindning i konfigurationsfilen"
 
-#: openbox/menu.c:101 openbox/menu.c:109
+#: openbox/menu.c:103 openbox/menu.c:111
 #, c-format
 msgid "Unable to find a valid menu file '%s'"
 msgstr "Kunde inte hitta en giltig menyfil '%s'"
 
-#: openbox/menu.c:169
+#: openbox/menu.c:171
 #, c-format
 msgid "Failed to execute command for pipe-menu '%s': %s"
 msgstr "Misslyckades att köra kommando för pipe-menyn '%s': %s"
 
-#: openbox/menu.c:183
+#: openbox/menu.c:185
 #, c-format
 msgid "Invalid output from pipe-menu '%s'"
 msgstr "Ogiltig utdata från pipe-menyn '%s'"
 
-#: openbox/menu.c:196
+#: openbox/menu.c:198
 #, c-format
 msgid "Attempted to access menu '%s' but it does not exist"
 msgstr "Försökte öppna menyn '%s', men den finns inte"
 
-#: openbox/menu.c:361 openbox/menu.c:362
+#: openbox/menu.c:362 openbox/menu.c:363
 msgid "More..."
 msgstr "Mer..."
 
-#: openbox/mouse.c:338
+#: openbox/mouse.c:349
 #, c-format
 msgid "Invalid button '%s' in mouse binding"
 msgstr "Ogiltig knapp '%s' i musbindning"
 
-#: openbox/mouse.c:344
+#: openbox/mouse.c:355
 #, c-format
 msgid "Invalid context '%s' in mouse binding"
 msgstr "Ogiltig kontext '%s' i musbindning"
 
-#: openbox/openbox.c:129
+#: openbox/openbox.c:131
 #, c-format
 msgid "Unable to change to home directory '%s': %s"
 msgstr "Kunde inte gå till hemkatalogen '%s': %s"
 
-#: openbox/openbox.c:149
+#: openbox/openbox.c:151
 msgid "Failed to open the display from the DISPLAY environment variable."
 msgstr "Kunde inte öppna en display från miljövariabeln DISPLAY."
 
-#: openbox/openbox.c:180
+#: openbox/openbox.c:182
 msgid "Failed to initialize the obrender library."
 msgstr "Kunde inte initialisera obrender-biblioteket."
 
-#: openbox/openbox.c:186
+#: openbox/openbox.c:188
 msgid "X server does not support locale."
 msgstr "X-servern stödjer inte lokalisering."
 
-#: openbox/openbox.c:188
+#: openbox/openbox.c:190
 msgid "Cannot set locale modifiers for the X server."
 msgstr "Kan inte sätta lokaliseringsmodifierare för X-servern."
 
-#: openbox/openbox.c:249
+#: openbox/openbox.c:253
 msgid "Unable to find a valid config file, using some simple defaults"
 msgstr ""
 "Kunde inte hitta en giltig konfigurationsfil, använder enkla standardvärden"
 
-#: openbox/openbox.c:275
+#: openbox/openbox.c:279
 msgid "Unable to load a theme."
 msgstr "Kunde inte ladda ett tema."
 
-#: openbox/openbox.c:401
+#: openbox/openbox.c:408
 #, c-format
 msgid "Restart failed to execute new executable '%s': %s"
 msgstr "Restart misslyckades att starta nytt program '%s': %s"
 
-#: openbox/openbox.c:471 openbox/openbox.c:473
+#: openbox/openbox.c:478 openbox/openbox.c:480
 msgid "Copyright (c)"
 msgstr "Copyright (c)"
 
-#: openbox/openbox.c:482
+#: openbox/openbox.c:489
 msgid "Syntax: openbox [options]\n"
 msgstr "Syntax: openbox [alternativ]\n"
 
-#: openbox/openbox.c:483
+#: openbox/openbox.c:490
 msgid ""
 "\n"
 "Options:\n"
@@ -213,23 +203,23 @@ msgstr ""
 "\n"
 "Alternativ:\n"
 
-#: openbox/openbox.c:484
+#: openbox/openbox.c:491
 msgid "  --help              Display this help and exit\n"
 msgstr "  --help              Visa den här hjälpen och avsluta\n"
 
-#: openbox/openbox.c:485
+#: openbox/openbox.c:492
 msgid "  --version           Display the version and exit\n"
 msgstr "  --version           Visa versionen och avsluta\n"
 
-#: openbox/openbox.c:486
+#: openbox/openbox.c:493
 msgid "  --replace           Replace the currently running window manager\n"
 msgstr "  --replace           Ersätt den befintliga fönsterhanteraren\n"
 
-#: openbox/openbox.c:487
+#: openbox/openbox.c:494
 msgid "  --sm-disable        Disable connection to the session manager\n"
 msgstr "  --sm-disable        Avaktivera anslutning till sessionshanteraren\n"
 
-#: openbox/openbox.c:488
+#: openbox/openbox.c:495
 msgid ""
 "\n"
 "Passing messages to a running Openbox instance:\n"
@@ -237,15 +227,15 @@ msgstr ""
 "\n"
 "Skicka meddelanden till en exekverande instans av Openbox:\n"
 
-#: openbox/openbox.c:489
+#: openbox/openbox.c:496
 msgid "  --reconfigure       Reload Openbox's configuration\n"
 msgstr "  --reconfigure       Ladda om Openbox konfiguration\n"
 
-#: openbox/openbox.c:490
+#: openbox/openbox.c:497
 msgid "  --restart           Restart Openbox\n"
 msgstr "  --restart           Starta om Openbox\n"
 
-#: openbox/openbox.c:491
+#: openbox/openbox.c:498
 msgid ""
 "\n"
 "Debugging options:\n"
@@ -253,23 +243,23 @@ msgstr ""
 "\n"
 "Debug-alternativ:\n"
 
-#: openbox/openbox.c:492
+#: openbox/openbox.c:499
 msgid "  --sync              Run in synchronous mode\n"
 msgstr "  --sync              Kör i synkroniserat läge\n"
 
-#: openbox/openbox.c:493
+#: openbox/openbox.c:500
 msgid "  --debug             Display debugging output\n"
 msgstr "  --debug             Visa debuginformation\n"
 
-#: openbox/openbox.c:494
+#: openbox/openbox.c:501
 msgid "  --debug-focus       Display debugging output for focus handling\n"
 msgstr "  --debug-focus       Visa debuginformation för fokushantering\n"
 
-#: openbox/openbox.c:495
+#: openbox/openbox.c:502
 msgid "  --debug-xinerama    Split the display into fake xinerama screens\n"
 msgstr "  --debug-xinerama    Dela skärmen i simulerade xinerama-skärmar\n"
 
-#: openbox/openbox.c:496
+#: openbox/openbox.c:503
 #, c-format
 msgid ""
 "\n"
@@ -278,27 +268,27 @@ msgstr ""
 "\n"
 "Rapportera buggar till %s\n"
 
-#: openbox/openbox.c:593
+#: openbox/openbox.c:600
 #, c-format
 msgid "Invalid command line argument '%s'\n"
 msgstr "Ogiltigt kommandoradsargument '%s'\n"
 
-#: openbox/screen.c:94 openbox/screen.c:195
+#: openbox/screen.c:95 openbox/screen.c:196
 #, c-format
 msgid "A window manager is already running on screen %d"
 msgstr "En fönsterhanterare körs redan på skärm %d"
 
-#: openbox/screen.c:131
+#: openbox/screen.c:132
 #, c-format
 msgid "Could not acquire window manager selection on screen %d"
 msgstr "Kunde inte erhålla fönsterhanterarmarkeringen på skärm %d"
 
-#: openbox/screen.c:152
+#: openbox/screen.c:153
 #, c-format
 msgid "The WM on screen %d is not exiting"
 msgstr "Fönsterhanteraren på skärm %d avslutar inte"
 
-#: openbox/screen.c:1073
+#: openbox/screen.c:1077
 #, c-format
 msgid "desktop %i"
 msgstr "skrivbord %i"
@@ -347,3 +337,9 @@ msgstr "Efterfr
 #, c-format
 msgid "X Error: %s"
 msgstr "X-fel: %s"
+
+#~ msgid "Invalid action '%s' requested. No such action exists."
+#~ msgstr "Ogiltig action '%s' efterfrågades, men den finns inte."
+
+#~ msgid "Invalid use of action '%s'. Action will be ignored."
+#~ msgstr "Ogiltigt användande av action '%s', den kommer ignoreras."
index 2c1f3e92fcfe30a0771b4653395b3aa544fa4e16..64c2aa4d9c4748316e19e57105de26717d946ec9 100644 (file)
--- a/po/vi.po
+++ b/po/vi.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Openbox 3.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2007-06-10 19:32-0400\n"
+"POT-Creation-Date: 2007-06-07 14:18+0200\n"
 "PO-Revision-Date: 2007-06-07 06:50-0500\n"
 "Last-Translator: Quan Tran <qeed.quan@gmail.com>\n"
 "Language-Team: None\n"
@@ -107,12 +107,12 @@ msgstr "_Trang/Không Trang trí"
 msgid "_Close"
 msgstr "Đón_g"
 
-#: openbox/config.c:716
+#: openbox/config.c:704
 #, c-format
 msgid "Invalid button '%s' specified in config file"
 msgstr "Sai nút '%s' ở trong hình thể"
 
-#: openbox/keyboard.c:163
+#: openbox/keyboard.c:162
 msgid "Conflict with key binding in config file"
 msgstr "Xung đột với chữ trói ở trong hình thể"
 
@@ -121,22 +121,22 @@ msgstr "Xung đột với chữ trói ở trong hình thể"
 msgid "Unable to find a valid menu file '%s'"
 msgstr "Không có thể tìm vững chắc thực đơn '%s'"
 
-#: openbox/menu.c:168
+#: openbox/menu.c:151
 #, c-format
 msgid "Failed to execute command for pipe-menu '%s': %s"
 msgstr "Không có thể chạy lệnh cho ống-thực đơn '%s': %s"
 
-#: openbox/menu.c:182
+#: openbox/menu.c:168
 #, c-format
 msgid "Invalid output from pipe-menu '%s'"
 msgstr "Vô hiệu sản xuất của ống-thực đơn '%s'"
 
-#: openbox/menu.c:195
+#: openbox/menu.c:181
 #, c-format
 msgid "Attempted to access menu '%s' but it does not exist"
 msgstr "Thử mở thực đơn '%s' nhưng mà cái đó không có"
 
-#: openbox/menu.c:356 openbox/menu.c:357
+#: openbox/menu.c:342 openbox/menu.c:343
 msgid "More..."
 msgstr "Thêm nữa"
 
@@ -287,7 +287,7 @@ msgstr "Không thể lấy được chương trình quản lý cửa sổ ở tr
 msgid "The WM on screen %d is not exiting"
 msgstr "Chương trình quản lý cửa sổ trên màn hình %d không đi ra"
 
-#: openbox/screen.c:993
+#: openbox/screen.c:991
 #, c-format
 msgid "desktop %i"
 msgstr "chỗ làm việc %i"
index 40a8e06ad162d5bb4dbd970fccb5c035b7ef6bd0..e1ae3a0da317fe128a588a9d18e685209c2a6c4d 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Openbox 3.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2007-06-10 19:32-0400\n"
+"POT-Creation-Date: 2007-06-07 14:18+0200\n"
 "PO-Revision-Date: 2007-05-28 13:00+0800\n"
 "Last-Translator: Xiaoyu PENG <peng.xiaoyu@gmail.com>\n"
 "Language-Team: None\n"
@@ -107,12 +107,12 @@ msgstr "去除装饰(_D)"
 msgid "_Close"
 msgstr "关闭(_C)"
 
-#: openbox/config.c:716
+#: openbox/config.c:704
 #, c-format
 msgid "Invalid button '%s' specified in config file"
 msgstr "配置文件中指定的按钮 '%s' 无效"
 
-#: openbox/keyboard.c:163
+#: openbox/keyboard.c:162
 msgid "Conflict with key binding in config file"
 msgstr "配置文件中的组合键冲突"
 
@@ -121,22 +121,22 @@ msgstr "配置文件中的组合键冲突"
 msgid "Unable to find a valid menu file '%s'"
 msgstr "无法找到有效的菜单文件 '%s'"
 
-#: openbox/menu.c:168
+#: openbox/menu.c:151
 #, c-format
 msgid "Failed to execute command for pipe-menu '%s': %s"
 msgstr "执行管道菜单的命令 '%s' 时失败: %s"
 
-#: openbox/menu.c:182
+#: openbox/menu.c:168
 #, c-format
 msgid "Invalid output from pipe-menu '%s'"
 msgstr "无效的管道菜单输出 '%s'"
 
-#: openbox/menu.c:195
+#: openbox/menu.c:181
 #, c-format
 msgid "Attempted to access menu '%s' but it does not exist"
 msgstr "尝试读取菜单 '%s',但是它不存在"
 
-#: openbox/menu.c:356 openbox/menu.c:357
+#: openbox/menu.c:342 openbox/menu.c:343
 msgid "More..."
 msgstr "更多..."
 
@@ -285,7 +285,7 @@ msgstr "在屏幕 %d 无法被选为窗口管理器"
 msgid "The WM on screen %d is not exiting"
 msgstr "屏幕 %d 的窗口管理器没有退出"
 
-#: openbox/screen.c:993
+#: openbox/screen.c:991
 #, c-format
 msgid "desktop %i"
 msgstr "桌面 %i"
index 05e6fbacad4383da448e4e4cee40c4263681f9ff..29463072dc60173ea3861f2a338a21d1fee13c60 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: openbox 3.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2007-06-10 19:32-0400\n"
+"POT-Creation-Date: 2007-06-07 14:18+0200\n"
 "PO-Revision-Date: 2007-05-23 16:22+0200\n"
 "Last-Translator: Wei-Lun Chao <chaoweilun@gmail.com>\n"
 "Language-Team: Chinese (traditional) <zh-l10n@linux.org.tw>\n"
@@ -108,12 +108,12 @@ msgstr "去除/裝飾(_D)"
 msgid "_Close"
 msgstr "關閉(_C)"
 
-#: openbox/config.c:716
+#: openbox/config.c:704
 #, c-format
 msgid "Invalid button '%s' specified in config file"
 msgstr "在配置檔中指定的按鈕「%s」無效"
 
-#: openbox/keyboard.c:163
+#: openbox/keyboard.c:162
 msgid "Conflict with key binding in config file"
 msgstr "與配置檔中的按鍵組合衝突"
 
@@ -122,22 +122,22 @@ msgstr "與配置檔中的按鍵組合衝突"
 msgid "Unable to find a valid menu file '%s'"
 msgstr "無法找到有效的選單檔案「%s」"
 
-#: openbox/menu.c:168
+#: openbox/menu.c:151
 #, c-format
 msgid "Failed to execute command for pipe-menu '%s': %s"
 msgstr "執行命令於管線選單「%s」時失敗:%s"
 
-#: openbox/menu.c:182
+#: openbox/menu.c:168
 #, c-format
 msgid "Invalid output from pipe-menu '%s'"
 msgstr "從管線選單「%s」的輸出無效"
 
-#: openbox/menu.c:195
+#: openbox/menu.c:181
 #, c-format
 msgid "Attempted to access menu '%s' but it does not exist"
 msgstr "試圖存取選單「%s」但是它不存在"
 
-#: openbox/menu.c:356 openbox/menu.c:357
+#: openbox/menu.c:342 openbox/menu.c:343
 msgid "More..."
 msgstr "更多…"
 
@@ -286,7 +286,7 @@ msgstr "無法於螢幕 %d 獲選為視窗管理員"
 msgid "The WM on screen %d is not exiting"
 msgstr "螢幕 %d 中的視窗管理員並未離開"
 
-#: openbox/screen.c:993
+#: openbox/screen.c:991
 #, c-format
 msgid "desktop %i"
 msgstr "桌面 %i"
diff --git a/tests/.svnignore b/tests/.svnignore
deleted file mode 100644 (file)
index 2376957..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-title
-confignotify
-fallback
-grouptran2
-grouptrancircular
-fakeunmap
-showhide
-modal2
-skiptaskbar
-skiptaskbar2
-modal3
-override
-grouptran
-borderchange
-grouptrancircular2
-restack
-stacking
-groupmodal
-icons
-duplicatesession
-aspect
-modal
-noresize
-shape
-big
-urgent
-focusout
-positioned
-strut
-grav
-resize
-fullscreen
-mapiconic
-extentsrequest
-usertimewin
-confignotifymax