+++ /dev/null
-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
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 \
<!-- 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"/>
+++ /dev/null
-openbox.desktop
-openbox-kde.desktop
-openbox-gnome.desktop
-openbox-session
-openbox-kde-session
-openbox-gnome-session
+++ /dev/null
-openbox.postinst.debhelper
-openbox.postrm.debhelper
-changelog
-files
-openbox.substvars
-openbox
+++ /dev/null
-openbox-session.1
-openbox-kde-session.1
-openbox-gnome-session.1
-openbox.1
+++ /dev/null
-
-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
+++ /dev/null
-/* -*- 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
--- /dev/null
+/* -*- 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);
+ }
+ }
+ }
+}
--- /dev/null
+/* -*- 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);
--- /dev/null
+all clean install:
+ $(MAKE) -C .. -$(MAKEFLAGS) $@
+
+.PHONY: all clean install
--- /dev/null
+#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;
+}
--- /dev/null
+#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();
+}
--- /dev/null
+#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
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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);
+ }
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
*/
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.
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. */
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 />
}
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);
}
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);
}
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;
}
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;
}
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);
}
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 */
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;
{ "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" },
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;
#include "window.h"
#include "openbox.h"
#include "dock.h"
+#include "actions.h"
#include "client.h"
#include "xerror.h"
#include "prop.h"
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);
(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
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 ||
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 */
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) {
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) {
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)
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();
/* 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 */
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();
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))
{
}
}
-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) {
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;
} 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;
focus_cycle_popup_hide();
}
- return;
+ return ret;
}
/* this be mostly ripped from fvwm */
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;
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;
focus_cycle_draw_indicator(NULL);
focus_cycle_popup_single_hide();
- return;
+ return ret;
}
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);
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) {
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))
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) {
}
}
-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) {
{
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)
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 */
#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)
}
}
-gboolean keyboard_bind(GList *keylist, ObAction *action)
+gboolean keyboard_bind(GList *keylist, ObActionsAct *action)
{
KeyBindingTree *tree, *t;
gboolean conflict;
/* 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
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;
return handled;
}
+#endif
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;
}
}
}
-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();
#include <X11/Xlib.h>
struct _ObClient;
-struct _ObAction;
+struct _ObActionsAct;
extern KeyBindingTree *keyboard_firstnode;
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);
*/
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
#include "keyboard.h"
#include "translate.h"
+#include "actions.h"
#include <glib.h>
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);
#ifndef __plugin_keyboard_tree_h
#define __plugin_keyboard_tree_h
-#include "action.h"
-
#include <glib.h>
typedef struct KeyBindingTree {
*/
#include "mainloop.h"
-#include "action.h"
-#include "client.h"
#include "event.h"
#include <stdio.h>
gboolean signal_fired;
guint signals_fired[NUM_SIGNALS];
GSList *signal_handlers[NUM_SIGNALS];
-
- GSList *action_queue;
};
struct _ObMainLoopTimer
all_loops = g_slist_prepend(all_loops, loop);
- loop->action_queue = NULL;
-
return 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);
}
}
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;
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 */
}
}
- client_remove_destroy_notify(ob_main_loop_client_destroy);
-
loop->running = FALSE;
}
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);
#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"
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);
}
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 */
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);
+ }
}
}
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);
#ifndef __menu_h
#define __menu_h
-#include "action.h"
#include "window.h"
#include "geom.h"
#include "render/render.h"
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
for the menu
*/
typedef void (*ObMenuPlaceFunc)(struct _ObMenuFrame *frame, gint *x, gint *y,
- gint button, gpointer data);
+ gboolean mouse, gpointer data);
struct _ObMenu
{
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();
#include "client.h"
#include "menu.h"
#include "screen.h"
+#include "actions.h"
#include "grab.h"
#include "openbox.h"
#include "mainloop.h"
}
gboolean menu_frame_show_topmenu(ObMenuFrame *self, gint x, gint y,
- gint button)
+ gboolean mouse)
{
gint px, py;
guint i;
}
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);
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)
}
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);
}
}
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
#include "openbox.h"
#include "config.h"
#include "xerror.h"
-#include "action.h"
+#include "actions.h"
#include "event.h"
#include "client.h"
#include "prop.h"
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);
}
}
+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;
/* 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;
}
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 */
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:
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;
}
}
gboolean mouse_bind(const gchar *buttonstr, const gchar *contextstr,
- ObMouseAction mact, ObAction *action)
+ ObMouseAction mact, ObActionsAct *action)
{
guint state, button;
ObFrameContext context;
}
}
- /* 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;
#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);
#include "xerror.h"
#include "prop.h"
#include "screen.h"
+#include "actions.h"
#include "startupnotify.h"
#include "focus.h"
#include "focus_cycle.h"
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);
window_shutdown(reconfigure);
event_shutdown(reconfigure);
config_shutdown();
+ actions_shutdown(reconfigure);
modkeys_shutdown(reconfigure);
} while (reconfigure);
}
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;
}
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;
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)
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;
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,
#include "startupnotify.h"
#include "gettext.h"
+#include "event.h"
#include <stdlib.h>
}
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;
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 */
/* 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
+++ /dev/null
-*.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
# 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
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"
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 "يتعارض مع ارتباط المفاتيح في ملف الإعدادات"
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 "المزيد..."
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"
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"
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 "কনফিগ ফাইলে কি-বাইন্ডিং সংক্রান্ত দ্বন্দ্ব"
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 "অতিরিক্ত..."
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"
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"
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ó"
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..."
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"
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"
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"
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..."
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"
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"
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"
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..."
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"
#
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"
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"
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..."
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"
#
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"
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"
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..."
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"
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"
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"
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..."
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"
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"
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"
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..."
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"
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"
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"
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ää..."
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"
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"
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"
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..."
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"
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"
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 "
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..."
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"
# 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..."
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
#: 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'の不正な使用です。このアクションは無視されます。"
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"
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"
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..."
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"
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"
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"
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..."
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"
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"
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 ""
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 ""
msgid "The WM on screen %d is not exiting"
msgstr ""
-#: openbox/screen.c:993
+#: openbox/screen.c:991
#, c-format
msgid "desktop %i"
msgstr ""
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"
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"
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..."
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"
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"
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"
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..."
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"
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"
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"
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.."
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"
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"
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 "Конфликт привязок клавиш в конфигурационном файле"
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 "Больше..."
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"
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"
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"
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..."
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"
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"
"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..."
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"
"\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"
"\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"
"\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"
"\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"
#, 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."
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"
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ể"
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"
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"
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"
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 "配置文件中的组合键冲突"
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 "更多..."
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"
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"
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 "與配置檔中的按鍵組合衝突"
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 "更多…"
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"
+++ /dev/null
-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