all repos — openbox @ acafa38c8ea210b12ed92fc16281b915ab61542c

openbox fork - make it a bit more like ryudo

Merge branch 'backport' into work

Conflicts:
	openbox/config.c
	openbox/event.c
	openbox/prop.c
	openbox/prop.h
	openbox/screen.c
	openbox/screen.h
Dana Jansens danakj@orodu.net
commit

acafa38c8ea210b12ed92fc16281b915ab61542c

parent

2f09e0ce388f63c341cb328d795766e2bd0dc24b

M Makefile.amMakefile.am

@@ -13,6 +13,7 @@ rrpubincludedir = $(includedir)/openbox/@RR_VERSION@/render

pixmapdir = $(datadir)/pixmaps xsddir = $(datadir)/openbox secretbindir = $(libdir)/openbox +appsdir = $(datadir)/applications theme = Clearlooks

@@ -422,6 +423,9 @@ render/obrender-4.0.pc \

obt/obt-4.0.pc ## data ## + +dist_apps_DATA = \ + data/openbox.desktop dist_pixmap_DATA = \ data/openbox.png
M data/menu.xmldata/menu.xml

@@ -369,11 +369,6 @@ <separator />

<item label="Reconfigure Openbox"> <action name="Reconfigure" /> </item> - <item label="Exit Openbox"> - <action name="Exit"> - <prompt>yes</prompt> - </action> - </item> </menu> <menu id="root-menu" label="Openbox 3">

@@ -390,7 +385,7 @@ <separator label="System" />

<menu id="system-menu"/> <separator /> <item label="Log Out"> - <action name="SessionLogout"> + <action name="Exit"> <prompt>yes</prompt> </action> </item>
A data/openbox.desktop

@@ -0,0 +1,12 @@

+[Desktop Entry] +Type=Application +Encoding=UTF-8 +Name=Openbox +Exec=openbox +Icon=openbox +NoDisplay=true +# name we put on the WM spec check window +X-GNOME-WMName=Openbox +X-GNOME-Autostart-Phase=WindowManager +X-GNOME-Provides=windowmanager +X-GNOME-Autostart-Notify=true
M data/rc.xmldata/rc.xml

@@ -35,10 +35,16 @@ <!-- 'Smart' or 'UnderMouse' -->

<center>yes</center> <!-- whether to place windows in the center of the free area found or the top left corner --> - <monitor>Any</monitor> + <monitor>Active</monitor> <!-- with Smart placement on a multi-monitor system, try to place new windows on: 'Any' - any monitor, 'Mouse' - where the mouse is, 'Active' - where the active window is --> + <primaryMonitor>1</primaryMonitor> + <!-- The monitor where Openbox should place popup dialogs such as the + focus cycling popup, or the desktop switch popup. It can be an index + from 1, specifying a particular monitor. Or it can be one of the + following: 'Mouse' - where the mouse is, or + 'Active' - where the active window is --> </placement> <theme>
M data/xsession/openbox-gnome-session.indata/xsession/openbox-gnome-session.in

@@ -7,6 +7,54 @@ echo "See the openbox-gnome-session(1) manpage for help."

exit fi -# Run GNOME with Openbox as its window manager -export WINDOW_MANAGER="@bindir@/openbox" -exec gnome-session --choose-session=openbox-session "$@" +# Clean up after GDM +xprop -root -remove _NET_NUMBER_OF_DESKTOPS \ + -remove _NET_DESKTOP_NAMES \ + -remove _NET_CURRENT_DESKTOP 2> /dev/null + +VER=$(gnome-session --version 2>/dev/null | \ + sed -e 's/[^0-9.]*\([0-9.]\+\)/\1/') + +MAJOR=$(echo $VER | cut -d . -f 1) +MINOR=$(echo $VER | cut -d . -f 2) + +# run GNOME with Openbox as its window manager + +if test $MAJOR -lt 2 || (test $MAJOR = 2 && test $MINOR -le 22); then + # old gnome-session was easy to work with + export WINDOW_MANAGER="@bindir@/openbox" + exec gnome-session --choose-session=openbox-session "$@" +else + # new gnome-session requires openbox to be set in gconf and an + # openbox.desktop to be installed in the applications directory + + SPATH=/desktop/gnome/session + + # get the current default session + SESSION=$(gconftool-2 -g $SPATH/default_session 2> /dev/null) + + # make sure openbox is going to be run + if test -z "$SESSION"; then + # if its empty then just run openbox + SESSION="[openbox]" + elif test -z $(echo "$SESSION" | grep -q openbox); then + # if openbox isn't in the session then append it + SESSION="${SESSION%]},openbox]" + fi + + # get the current GNOME/Openbox session + OB_SESSION=$(gconftool-2 -g $SPATH/openbox_session 2> /dev/null) + + # update the GNOME/Openbox session if needed + if x$OB_SESSION != x$SESSION; then + # the default session changed or we didn't run GNOME/Openbox before + gconftool-2 -t list --list-type=strings -s $SPATH/openbox_session \ + "$SESSION" 2> /dev/null + fi + + # run GNOME/Openbox + exec gnome-session --default-session-key $SPATH/openbox_session "$@" +fi + + +
M data/xsession/openbox-kde-session.indata/xsession/openbox-kde-session.in

@@ -7,6 +7,11 @@ echo "See the openbox-kde-session(1) manpage for help."

exit fi +# Clean up after GDM +xprop -root -remove _NET_NUMBER_OF_DESKTOPS \ + -remove _NET_DESKTOP_NAMES \ + -remove _NET_CURRENT_DESKTOP 2> /dev/null + # Run KDE with Openbox as its window manager export KDEWM="@bindir@/openbox" exec startkde "$@"
M data/xsession/openbox-session.indata/xsession/openbox-session.in

@@ -7,13 +7,18 @@ echo "See the openbox-session(1) manpage for help."

exit fi +# Clean up after GDM +xprop -root -remove _NET_NUMBER_OF_DESKTOPS \ + -remove _NET_DESKTOP_NAMES \ + -remove _NET_CURRENT_DESKTOP 2> /dev/null + AUTOSTART="${XDG_CONFIG_HOME:-"$HOME/.config"}/openbox/autostart.sh" GLOBALAUTOSTART="@configdir@/openbox/autostart.sh" -if test -e $AUTOSTART; then +if test -r $AUTOSTART; then . $AUTOSTART else - if test -e $GLOBALAUTOSTART; then + if test -r $GLOBALAUTOSTART; then . $GLOBALAUTOSTART fi fi
M obt/prop.cobt/prop.c

@@ -190,6 +190,9 @@ CREATE_(OB_CONFIG_FILE);

CREATE_(OB_WM_ACTION_UNDECORATE); CREATE_(OB_WM_STATE_UNDECORATED); CREATE_(OB_CONTROL); + CREATE_(OB_ROLE); + CREATE_(OB_NAME); + CREATE_(OB_CLASS); } Atom obt_prop_atom(ObtPropAtom a)
M obt/prop.hobt/prop.h

@@ -211,6 +211,9 @@ OBT_PROP_OPENBOX_PID, /* this is depreecated in favour of ob_control */

OBT_PROP_OB_THEME, OBT_PROP_OB_CONFIG_FILE, OBT_PROP_OB_CONTROL, + OBT_PROP_OB_ROLE, + OBT_PROP_OB_NAME, + OBT_PROP_OB_CLASS, OBT_PROP_NUM_ATOMS } ObtPropAtom;
M openbox/actions/focus.copenbox/actions/focus.c

@@ -2,6 +2,7 @@ #include "openbox/actions.h"

#include "openbox/event.h" #include "openbox/client.h" #include "openbox/focus.h" +#include "openbox/screen.h" typedef struct { gboolean here;

@@ -44,7 +45,7 @@ (data->context != OB_FRAME_CONTEXT_CLIENT &&

data->context != OB_FRAME_CONTEXT_FRAME)) { actions_client_move(data, TRUE); - client_activate(data->client, o->here, FALSE, FALSE, TRUE); + client_activate(data->client, TRUE, o->here, FALSE, FALSE, TRUE); actions_client_move(data, FALSE); } } else if (data->context == OB_FRAME_CONTEXT_DESKTOP) {
M openbox/client.copenbox/client.c

@@ -75,6 +75,7 @@

static void client_get_all(ObClient *self, gboolean real); static void client_get_startup_id(ObClient *self); static void client_get_session_ids(ObClient *self); +static void client_save_session_ids(ObClient *self); static void client_get_area(ObClient *self); static void client_get_desktop(ObClient *self); static void client_get_state(ObClient *self);

@@ -289,7 +290,8 @@ /* NET_WM_USER_TIME 0 when mapping means don't focus */

(user_time != 0) && /* this checks for focus=false for the window */ (!settings || settings->focus != 0) && - focus_valid_target(self, FALSE, FALSE, TRUE, FALSE, FALSE)) + focus_valid_target(self, FALSE, FALSE, TRUE, FALSE, FALSE, + settings->focus == 1)) { activate = TRUE; }

@@ -1075,6 +1077,7 @@

/* get the session related properties, these can change decorations from per-app settings */ client_get_session_ids(self); + client_save_session_ids(self); /* now we got everything that can affect the decorations */ if (!real)

@@ -2031,7 +2034,7 @@ if (!got)

STRUT_PARTIAL_SET(strut, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - if (!STRUT_EQUAL(strut, self->strut)) { + if (!PARTIAL_STRUT_EQUAL(strut, self->strut)) { self->strut = strut; /* updating here is pointless while we're being mapped cuz we're not in

@@ -2288,6 +2291,15 @@ self->pid = pid;

} } +/*! Save the session IDs as seen by Openbox when the window mapped, so that + users can still access them later if the app changes them */ +static void client_save_session_ids(ObClient *self) +{ + OBT_PROP_SETS(self->window, OB_ROLE, utf8, self->role); + OBT_PROP_SETS(self->window, OB_NAME, utf8, self->name); + OBT_PROP_SETS(self->window, OB_CLASS, utf8, self->class); +} + static void client_change_wm_state(ObClient *self) { gulong state[2];

@@ -3817,7 +3829,8 @@ client_focus(self);

} /* this function exists to map to the net_active_window message in the ewmh */ -void client_activate(ObClient *self, gboolean desktop, gboolean raise, +void client_activate(ObClient *self, gboolean desktop, + gboolean here, gboolean raise, gboolean unshade, gboolean user) { if ((user && (desktop ||

@@ -3825,7 +3838,7 @@ self->desktop == DESKTOP_ALL ||

self->desktop == screen_desktop)) || client_can_steal_focus(self, event_curtime, CurrentTime)) { - client_present(self, FALSE, raise, unshade); + client_present(self, here, raise, unshade); } else client_hilite(self, TRUE);

@@ -4122,39 +4135,26 @@ gint my_edge_start, gint my_edge_size,

gint *dest, gboolean *near_edge) { GList *it; - Rect *a, *mon; + Rect *a; Rect dock_area; gint edge; + guint i; a = screen_area(self->desktop, SCREEN_AREA_ALL_MONITORS, &self->frame->area); - mon = screen_area(self->desktop, SCREEN_AREA_ONE_MONITOR, - &self->frame->area); switch (dir) { case OB_DIRECTION_NORTH: - if (my_head >= RECT_TOP(*mon) + 1) - edge = RECT_TOP(*mon) - 1; - else - edge = RECT_TOP(*a) - 1; + edge = RECT_TOP(*a) - 1; break; case OB_DIRECTION_SOUTH: - if (my_head <= RECT_BOTTOM(*mon) - 1) - edge = RECT_BOTTOM(*mon) + 1; - else - edge = RECT_BOTTOM(*a) + 1; + edge = RECT_BOTTOM(*a) + 1; break; case OB_DIRECTION_EAST: - if (my_head <= RECT_RIGHT(*mon) - 1) - edge = RECT_RIGHT(*mon) + 1; - else - edge = RECT_RIGHT(*a) + 1; + edge = RECT_RIGHT(*a) + 1; break; case OB_DIRECTION_WEST: - if (my_head >= RECT_LEFT(*mon) + 1) - edge = RECT_LEFT(*mon) - 1; - else - edge = RECT_LEFT(*a) - 1; + edge = RECT_LEFT(*a) - 1; break; default: g_assert_not_reached();

@@ -4163,6 +4163,15 @@ /* default to the far edge, then narrow it down */

*dest = edge; *near_edge = TRUE; + /* search for edges of monitors */ + for (i = 0; i < screen_num_monitors; ++i) { + Rect *area = screen_area(self->desktop, i, NULL); + detect_edge(*area, dir, my_head, my_size, my_edge_start, + my_edge_size, dest, near_edge); + g_free(area); + } + + /* search for edges of clients */ for (it = client_list; it; it = g_list_next(it)) { ObClient *cur = it->data;

@@ -4184,7 +4193,6 @@ dock_get_area(&dock_area);

detect_edge(dock_area, dir, my_head, my_size, my_edge_start, my_edge_size, dest, near_edge); g_free(a); - g_free(mon); } void client_find_move_directional(ObClient *self, ObDirection dir,
M openbox/client.hopenbox/client.h

@@ -575,13 +575,16 @@ /*! Activates the client for use, focusing, uniconifying it, etc. To be used

when the user deliberately selects a window for use. @param desktop If true, and the window is on another desktop, it will still be activated. + @param here If true, and the window is on another desktop, it will be moved + to the current desktop, otherwise the desktop will switch to + where the window is. @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 desktop, gboolean raise, - gboolean unshade, gboolean user); +void client_activate(ObClient *self, gboolean desktop, gboolean here, + gboolean raise, gboolean unshade, gboolean user); /*! Bring all of its helper windows to its desktop. These are the utility and stuff windows. */
M openbox/client_list_combined_menu.copenbox/client_list_combined_menu.c

@@ -114,7 +114,7 @@ }

else { ObClient *t = self->data.normal.data; if (t) { /* it's set to NULL if its destroyed */ - client_activate(t, TRUE, TRUE, TRUE, TRUE); + client_activate(t, TRUE, FALSE, TRUE, TRUE, TRUE); /* if the window is omnipresent then we need to go to its desktop */ if (t->desktop == DESKTOP_ALL)
M openbox/client_list_menu.copenbox/client_list_menu.c

@@ -101,7 +101,7 @@ ObClient *c, guint state, gpointer data)

{ ObClient *t = self->data.normal.data; if (t) { /* it's set to NULL if its destroyed */ - client_activate(t, TRUE, TRUE, TRUE, TRUE); + client_activate(t, TRUE, FALSE, TRUE, TRUE, TRUE); /* if the window is omnipresent then we need to go to its desktop */ if (t->desktop == DESKTOP_ALL)
M openbox/config.copenbox/config.c

@@ -39,6 +39,9 @@ ObPlacePolicy config_place_policy;

gboolean config_place_center; ObPlaceMonitor config_place_monitor; +guint config_primary_monitor_index; +ObPlaceMonitor config_primary_monitor; + StrutPartial config_margins; gchar *config_theme;

@@ -437,8 +440,13 @@ if ((n = obt_parse_find_node(node, "dragThreshold")))

config_mouse_threshold = obt_parse_node_int(n); if ((n = obt_parse_find_node(node, "doubleClickTime"))) config_mouse_dclicktime = obt_parse_node_int(n); - if ((n = obt_parse_find_node(node, "screenEdgeWarpTime"))) + if ((n = obt_parse_find_node(node, "screenEdgeWarpTime"))) { config_mouse_screenedgetime = obt_parse_node_int(n); + /* minimum value of 25 for this property, when it is 1 and you hit the + edge it basically never stops */ + if (config_mouse_screenedgetime && config_mouse_screenedgetime < 25) + config_mouse_screenedgetime = 25; + } n = obt_parse_find_node(node, "context"); while (n) {

@@ -515,6 +523,13 @@ config_place_monitor = OB_PLACE_MONITOR_ACTIVE;

else if (obt_parse_node_contains(n, "mouse")) config_place_monitor = OB_PLACE_MONITOR_MOUSE; } + if ((n = obt_parse_find_node(node, "primaryMonitor"))) { + config_primary_monitor_index = obt_parse_node_int(n); + if (!config_primary_monitor_index) { + if (obt_parse_node_contains(n, "mouse")) + config_primary_monitor = OB_PLACE_MONITOR_MOUSE; + } + } } static void parse_margins(xmlNodePtr node, gpointer d)

@@ -917,6 +932,9 @@

config_place_policy = OB_PLACE_POLICY_SMART; config_place_center = TRUE; config_place_monitor = OB_PLACE_MONITOR_ANY; + + config_primary_monitor_index = 1; + config_primary_monitor = OB_PLACE_MONITOR_ACTIVE; obt_parse_register(i, "placement", parse_placement, NULL);
M openbox/config.hopenbox/config.h

@@ -82,6 +82,12 @@ /*! Place windows on the active monitor (unless they are part of an application

already on another monitor) */ extern ObPlaceMonitor config_place_monitor; +/*! Place dialogs and stuff on this monitor. Index starts at 1. If this is + 0, then use the config_primary_monitor instead. */ +extern guint config_primary_monitor_index; +/*! Where to place dialogs and stuff if it is not specified by index. */ +extern ObPlaceMonitor config_primary_monitor; + /*! User-specified margins around the edge of the screen(s) */ extern StrutPartial config_margins;
M openbox/event.copenbox/event.c

@@ -1282,7 +1282,7 @@ does, we don't want it!

it can happen now when the window is on another desktop, but we still don't want it! */ - client_activate(client, FALSE, TRUE, TRUE, TRUE); + client_activate(client, FALSE, FALSE, TRUE, TRUE, TRUE); break; case ClientMessage: /* validate cuz we query stuff off the client here */

@@ -1338,7 +1338,7 @@ } else

ob_debug_type(OB_DEBUG_APP_BUGS, "_NET_ACTIVE_WINDOW message for window %s is " "missing source indication", client->title); - client_activate(client, FALSE, TRUE, TRUE, + client_activate(client, FALSE, FALSE, TRUE, TRUE, (e->xclient.data.l[0] == 0 || e->xclient.data.l[0] == 2)); } else if (msgtype == OBT_PROP_ATOM(NET_WM_MOVERESIZE)) {
M openbox/focus.copenbox/focus.c

@@ -129,7 +129,7 @@ 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) && + focus_valid_target(c, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE) && !c->shaded && (allow_refocus || client_focus_target(c) != old) && client_focus(c))

@@ -149,7 +149,7 @@ 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) */ - if (focus_valid_target(c, TRUE, FALSE, FALSE, FALSE, TRUE) && + if (focus_valid_target(c, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE) && (allow_refocus || client_focus_target(c) != old) && client_focus(c)) {

@@ -183,12 +183,6 @@ }

void focus_nothing(void) { - /* Install our own colormap */ - if (focus_client != NULL) { - screen_install_colormap(focus_client, FALSE); - screen_install_colormap(NULL, TRUE); - } - /* nothing is focused, update the colormap and _the root property_ */ focus_set_client(NULL);

@@ -280,7 +274,7 @@ ObClient *c = it->data;

/* check that it's not a helper window to avoid infinite recursion */ if (c != ft && c->type == OB_CLIENT_TYPE_NORMAL && focus_valid_target(c, TRUE, iconic_windows, all_desktops, - FALSE, FALSE)) + FALSE, FALSE, FALSE)) { return TRUE; }

@@ -293,7 +287,8 @@ gboolean helper_windows,

gboolean iconic_windows, gboolean all_desktops, gboolean dock_windows, - gboolean desktop_windows) + gboolean desktop_windows, + gboolean user_request) { gboolean ok = FALSE;

@@ -332,9 +327,11 @@ that can be focused instead */

!focus_target_has_siblings(ft, iconic_windows, all_desktops)))); /* it's not set to skip the taskbar (but this only applies to normal typed - windows, and is overridden if the window is modal) */ + windows, and is overridden if the window is modal or if the user asked + for this window to be focused) */ ok = ok && (ft->type != OB_CLIENT_TYPE_NORMAL || ft->modal || + user_request || !ft->skip_taskbar); /* it's not going to just send focus off somewhere else (modal window),

@@ -347,7 +344,8 @@ TRUE,

iconic_windows, all_desktops, dock_windows, - desktop_windows)); + desktop_windows, + FALSE)); } return ok;
M openbox/focus.hopenbox/focus.h

@@ -69,6 +69,7 @@ gboolean helper_windows,

gboolean iconic_windows, gboolean all_desktops, gboolean dock_windows, - gboolean desktop_windows); + gboolean desktop_windows, + gboolean user_request); #endif
M openbox/focus_cycle.copenbox/focus_cycle.c

@@ -59,7 +59,8 @@ focus_valid_target(ifclient, TRUE,

focus_cycle_iconic_windows, focus_cycle_all_desktops, focus_cycle_dock_windows, - focus_cycle_desktop_windows)) + focus_cycle_desktop_windows, + FALSE)) { focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,TRUE); focus_directional_cycle(0, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE);

@@ -121,7 +122,8 @@ if (focus_valid_target(ft, TRUE,

focus_cycle_iconic_windows, focus_cycle_all_desktops, focus_cycle_dock_windows, - focus_cycle_desktop_windows)) + focus_cycle_desktop_windows, + FALSE)) { if (interactive) { if (ft != focus_cycle_target) { /* prevents flicker */

@@ -188,7 +190,7 @@ /* the currently selected window isn't interesting */

if (cur == c) continue; if (!focus_valid_target(it->data, TRUE, FALSE, FALSE, dock_windows, - desktop_windows)) + desktop_windows, FALSE)) continue; /* find the centre coords of this window, from the

@@ -296,7 +298,7 @@ if (focus_valid_target(it->data, TRUE,

focus_cycle_iconic_windows, focus_cycle_all_desktops, focus_cycle_dock_windows, - focus_cycle_desktop_windows)) + focus_cycle_desktop_windows, FALSE)) ft = it->data; }
M openbox/focus_cycle_popup.copenbox/focus_cycle_popup.c

@@ -263,7 +263,8 @@ if (focus_valid_target(ft, TRUE,

iconic_windows, all_desktops, dock_windows, - desktop_windows)) + desktop_windows, + FALSE)) { gchar *text = popup_get_name(ft);

@@ -350,7 +351,7 @@

g_assert(mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS || mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST); - screen_area = screen_physical_area_active(); + screen_area = screen_physical_area_primary(); /* get the outside margins */ RrMargins(p->a_bg, &ml, &mt, &mr, &mb);

@@ -714,7 +715,7 @@ dock_windows, desktop_windows);

g_assert(popup.targets == NULL); /* position the popup */ - a = screen_physical_area_active(); + a = screen_physical_area_primary(); icon_popup_position(single_popup, CenterGravity, a->x + a->width / 2, a->y + a->height / 2); icon_popup_height(single_popup, POPUP_HEIGHT);
M openbox/frame.copenbox/frame.c

@@ -21,6 +21,7 @@ #include "frame.h"

#include "client.h" #include "openbox.h" #include "grab.h" +#include "debug.h" #include "config.h" #include "framerender.h" #include "focus_cycle.h"

@@ -368,8 +369,7 @@ (ob_rr_theme->grip_width + self->bwidth) * 2 + 1);

STRUT_SET(self->size, self->cbwidth_l + (!self->max_horz ? self->bwidth : 0), - self->cbwidth_t + - (!self->max_horz || !self->max_vert ? self->bwidth : 0), + self->cbwidth_t + self->bwidth, self->cbwidth_r + (!self->max_horz ? self->bwidth : 0), self->cbwidth_b + (!self->max_horz || !self->max_vert ? self->bwidth : 0));

@@ -948,6 +948,9 @@ }

void frame_adjust_focus(ObFrame *self, gboolean hilite) { + ob_debug_type(OB_DEBUG_FOCUS, + "Frame for 0x%x has focus: %d\n", + self->client->window, hilite); self->focused = hilite; self->need_render = TRUE; framerender_frame(self);
M openbox/keyboard.copenbox/keyboard.c

@@ -89,7 +89,7 @@ text = g_strconcat(text, " - ", it->data, NULL);

g_free(oldtext); } - a = screen_physical_area_active(); + a = screen_physical_area_primary(); popup_position(popup, NorthWestGravity, a->x + 10, a->y + 10); /* 1 second delay for the popup to show */ popup_delay_show(popup, G_USEC_PER_SEC, text);
M openbox/openbox.copenbox/openbox.c

@@ -546,8 +546,21 @@ }

static void parse_env(void) { + const gchar *id; + /* unset this so we don't pass it on unknowingly */ unsetenv("DESKTOP_STARTUP_ID"); + + /* this is how gnome-session passes in a session client id */ + id = g_getenv("DESKTOP_AUTOSTART_ID"); + if (id) { + unsetenv("DESKTOP_AUTOSTART_ID"); + if (ob_sm_id) g_free(ob_sm_id); + ob_sm_id = g_strdup(id); + ob_debug_type(OB_DEBUG_SM, + "DESKTOP_AUTOSTART_ID %s supercedes --sm-client-id\n", + ob_sm_id); + } } static void parse_args(gint *argc, gchar **argv)
M openbox/place.copenbox/place.c

@@ -43,20 +43,7 @@ }

static Rect *pick_pointer_head(ObClient *c) { - guint i; - gint px, py; - - if (screen_pointer_pos(&px, &py)) { - for (i = 0; i < screen_num_monitors; ++i) { - Rect *monitor = screen_physical_area_monitor(i); - gboolean contain = RECT_CONTAINS(*monitor, px, py); - g_free(monitor); - if (contain) - return screen_area(c->desktop, i, NULL); - } - g_assert_not_reached(); - } else - return NULL; + return screen_area(c->desktop, screen_monitor_pointer(), NULL); } /*! Pick a monitor to place a window on. */
M openbox/screen.copenbox/screen.c

@@ -56,7 +56,7 @@ static void screen_tell_ksplash(void);

static void screen_fallback_focus(void); guint screen_num_desktops; -guint screen_num_monitors = 0; +guint screen_num_monitors; guint screen_desktop; guint screen_last_desktop; gboolean screen_showing_desktop;

@@ -76,7 +76,7 @@ static GSList *struts_left = NULL;

static GSList *struts_right = NULL; static GSList *struts_bottom = NULL; -static ObPagerPopup **desktop_popup = NULL; +static ObPagerPopup *desktop_popup; /*! The number of microseconds that you need to be on a desktop before it will replace the remembered "last desktop" */

@@ -292,6 +292,9 @@ supported[i++] = OBT_PROP_ATOM(OPENBOX_PID);

supported[i++] = OBT_PROP_ATOM(OB_THEME); supported[i++] = OBT_PROP_ATOM(OB_CONFIG_FILE); supported[i++] = OBT_PROP_ATOM(OB_CONTROL); + supported[i++] = OBT_PROP_ATOM(OB_ROLE); + supported[i++] = OBT_PROP_ATOM(OB_NAME); + supported[i++] = OBT_PROP_ATOM(OB_CLASS); g_assert(i == num_support); OBT_PROP_SETA32(obt_root(ob_screen),

@@ -343,20 +346,14 @@ gchar **names = NULL;

guint32 d; gboolean namesexist = FALSE; - if (reconfig) { - guint i; + desktop_popup = pager_popup_new(); + pager_popup_height(desktop_popup, POPUP_HEIGHT); - /* recreate the pager popups to use any new theme stuff. it was - freed in screen_shutdown() already. */ - desktop_popup = g_new(ObPagerPopup*, screen_num_monitors); - for (i = 0; i < screen_num_monitors; i++) { - desktop_popup[i] = pager_popup_new(); - pager_popup_height(desktop_popup[i], POPUP_HEIGHT); - pager_popup_text_width_to_strings(desktop_popup[i], - screen_desktop_names, - screen_num_desktops); - } - + if (reconfig) { + /* update the pager popup's width */ + pager_popup_text_width_to_strings(desktop_popup, + screen_desktop_names, + screen_num_desktops); return; }

@@ -446,12 +443,7 @@ }

void screen_shutdown(gboolean reconfig) { - guint i; - - for (i = 0; i < screen_num_monitors; i++) - pager_popup_free(desktop_popup[i]); - g_free(desktop_popup); - desktop_popup = NULL; + pager_popup_free(desktop_popup); if (reconfig) return;

@@ -497,7 +489,6 @@

screen_update_areas(); dock_configure(); - /* make sure all windows are visible */ for (it = client_list; it; it = g_list_next(it)) client_move_onscreen(it->data, FALSE); }

@@ -711,6 +702,15 @@ for (it = g_list_last(stacking_list); it; it = g_list_previous(it)) {

if (WINDOW_IS_CLIENT(it->data)) { ObClient *c = it->data; client_hide(c); + if (c == focus_client) { + /* c was focused and we didn't do fallback clearly so make sure + openbox doesnt still consider the window focused. + this happens when using NextWindow with allDesktops, since + it doesnt want to move focus on desktop change, but the + focus is not going to stay with the current window, which + has now disappeared */ + focus_set_client(NULL); + } } }

@@ -918,52 +918,41 @@ }

static gboolean hide_desktop_popup_func(gpointer data) { - guint i; - - for (i = 0; i < screen_num_monitors; i++) { - pager_popup_hide(desktop_popup[i]); - } + pager_popup_hide(desktop_popup); return FALSE; /* don't repeat */ } void screen_show_desktop_popup(guint d) { Rect *a; - guint i; /* 0 means don't show the popup */ if (!config_desktop_popup_time) return; - for (i = 0; i < screen_num_monitors; i++) { - a = screen_physical_area_monitor(i); - pager_popup_position(desktop_popup[i], CenterGravity, - a->x + a->width / 2, a->y + a->height / 2); - pager_popup_icon_size_multiplier(desktop_popup[i], - (screen_desktop_layout.columns / - screen_desktop_layout.rows) / 2, - (screen_desktop_layout.rows/ - screen_desktop_layout.columns) / 2); - pager_popup_max_width(desktop_popup[i], - MAX(a->width/3, POPUP_WIDTH)); - pager_popup_show(desktop_popup[i], screen_desktop_names[d], d); + a = screen_physical_area_primary(); + pager_popup_position(desktop_popup, CenterGravity, + a->x + a->width / 2, a->y + a->height / 2); + pager_popup_icon_size_multiplier(desktop_popup, + (screen_desktop_layout.columns / + screen_desktop_layout.rows) / 2, + (screen_desktop_layout.rows/ + screen_desktop_layout.columns) / 2); + pager_popup_max_width(desktop_popup, + MAX(a->width/3, POPUP_WIDTH)); + pager_popup_show(desktop_popup, screen_desktop_names[d], d); - obt_main_loop_timeout_remove(ob_main_loop, hide_desktop_popup_func); - obt_main_loop_timeout_add(ob_main_loop, config_desktop_popup_time * 1000, - hide_desktop_popup_func, desktop_popup[i], - g_direct_equal, NULL); - g_free(a); - } + obt_main_loop_timeout_remove(ob_main_loop, hide_desktop_popup_func); + obt_main_loop_timeout_add(ob_main_loop, config_desktop_popup_time * 1000, + hide_desktop_popup_func, desktop_popup, + g_direct_equal, NULL); + g_free(a); } void screen_hide_desktop_popup(void) { - guint i; - - for (i = 0; i < screen_num_monitors; i++) { - obt_main_loop_timeout_remove_data(ob_main_loop, hide_desktop_popup_func, - desktop_popup[i], FALSE); - pager_popup_hide(desktop_popup[i]); - } + obt_main_loop_timeout_remove_data(ob_main_loop, hide_desktop_popup_func, + desktop_popup, FALSE); + pager_popup_hide(desktop_popup); } guint screen_find_desktop(guint from, ObDirection dir,

@@ -1198,11 +1187,9 @@ utf8, (const gchar**)screen_desktop_names);

} /* resize the pager for these names */ - for (i = 0; i < screen_num_monitors; i++) { - pager_popup_text_width_to_strings(desktop_popup[i], - screen_desktop_names, - screen_num_desktops); - } + pager_popup_text_width_to_strings(desktop_popup, + screen_desktop_names, + screen_num_desktops); } void screen_show_desktop(gboolean show, ObClient *show_only)

@@ -1372,38 +1359,14 @@ }

void screen_update_areas(void) { - guint i, j, onum; + guint i, j; gulong *dims; GList *it; GSList *sit; - onum = screen_num_monitors; - g_free(monitor_area); get_xinerama_screens(&monitor_area, &screen_num_monitors); - if (screen_num_monitors < onum) { - /* free some of the pager popups */ - for (i = screen_num_monitors; i < onum; ++i) - pager_popup_free(desktop_popup[i]); - desktop_popup = g_renew(ObPagerPopup*, desktop_popup, - screen_num_monitors); - } - else { - /* add some more pager popups */ - desktop_popup = g_renew(ObPagerPopup*, desktop_popup, - screen_num_monitors); - for (i = onum; i < screen_num_monitors; ++i) { - desktop_popup[i] = pager_popup_new(); - pager_popup_height(desktop_popup[i], POPUP_HEIGHT); - if (screen_desktop_names) /* the areas are initialized before the - desktop names */ - pager_popup_text_width_to_strings(desktop_popup[i], - screen_desktop_names, - screen_num_desktops); - } - } - /* set up the user-specified margins */ config_margins.top_start = RECT_LEFT(monitor_area[screen_num_monitors]); config_margins.top_end = RECT_RIGHT(monitor_area[screen_num_monitors]);

@@ -1746,24 +1709,38 @@ g_assert(search);

return RECT_INTERSECTS_RECT(monitor_area[head], *search); } -Rect* screen_physical_area_active(void) +guint screen_monitor_active(void) { - Rect *a; - gint x, y; - if (moveresize_client) - a = screen_physical_area_monitor(client_monitor(focus_client)); + return client_monitor(moveresize_client); else if (focus_client) - a = screen_physical_area_monitor(client_monitor(focus_client)); - else { - Rect mon; - if (screen_pointer_pos(&x, &y)) - RECT_SET(mon, x, y, 1, 1); + return client_monitor(focus_client); + else + return screen_monitor_pointer(); +} + +Rect* screen_physical_area_active(void) +{ + return screen_physical_area_monitor(screen_monitor_active()); +} + +guint screen_monitor_primary(void) +{ + if (config_primary_monitor_index > 0) { + if (config_primary_monitor_index-1 < screen_num_monitors) + return config_primary_monitor_index - 1; else - RECT_SET(mon, 0, 0, 1, 1); - a = screen_physical_area_monitor(screen_find_monitor(&mon)); + return 0; } - return a; + else if (config_primary_monitor == OB_PLACE_MONITOR_ACTIVE) + return screen_monitor_active(); + else /* config_primary_monitor == OB_PLACE_MONITOR_MOUSE */ + return screen_monitor_pointer(); +} + +Rect *screen_physical_area_primary(void) +{ + return screen_physical_area_monitor(screen_monitor_primary()); } void screen_set_root_cursor(void)

@@ -1774,6 +1751,17 @@ ob_cursor(OB_CURSOR_BUSYPOINTER));

else XDefineCursor(obt_display, obt_root(ob_screen), ob_cursor(OB_CURSOR_POINTER)); +} + +guint screen_monitor_pointer() +{ + Rect mon; + gint x, y; + if (screen_pointer_pos(&x, &y)) + RECT_SET(mon, x, y, 1, 1); + else + RECT_SET(mon, 0, 0, 1, 1); + return screen_find_monitor(&mon); } gboolean screen_pointer_pos(gint *x, gint *y)
M openbox/screen.hopenbox/screen.h

@@ -104,7 +104,16 @@ Rect *screen_physical_area_all_monitors(void);

Rect *screen_physical_area_monitor(guint head); +/*! Returns the monitor which contains the active window, or the one + containing the pointer otherwise. */ +guint screen_monitor_active(void); + Rect *screen_physical_area_active(void); + +/*! Returns the primary monitor, as specified by the config */ +guint screen_monitor_primary(void); + +Rect *screen_physical_area_primary(void); /* doesn't include struts which the search area is already outside of when 'search' is not NULL */

@@ -132,5 +141,8 @@

/*! Gives back the pointer's position in x and y. Returns TRUE if the pointer is on this screen and FALSE if it is on another screen. */ gboolean screen_pointer_pos(gint *x, gint *y); + +/*! Returns the monitor which contains the pointer device */ +guint screen_monitor_pointer(void); #endif
M openbox/stacking.copenbox/stacking.c

@@ -218,6 +218,7 @@ {

GList *it, *last, *below, *above, *next; GList *wins = NULL; + GList *group_helpers = NULL; GList *group_modals = NULL; GList *group_trans = NULL; GList *modals = NULL;

@@ -248,6 +249,8 @@ ObClient *ch = it->data;

/* only move windows in the same stacking layer */ if (ch->layer == selected->layer && + /* looking for windows that are transients, and so would + remain above the selected window */ client_search_transient(selected, ch)) { if (client_is_direct_child(selected, ch)) {

@@ -256,6 +259,13 @@ modals = g_list_prepend(modals, ch);

else trans = g_list_prepend(trans, ch); } + else if (client_helper(ch)) { + if (selected->transient) { + /* helpers do not stay above transient windows */ + continue; + } + group_helpers = g_list_prepend(group_helpers, ch); + } else { if (ch->modal) group_modals = g_list_prepend(group_modals, ch);

@@ -268,8 +278,13 @@ }

} } - /* put transients of the selected window right above it */ + /* put modals above other direct transients */ wins = g_list_concat(modals, trans); + + /* put helpers below direct transients */ + wins = g_list_concat(wins, group_helpers); + + /* put the selected window right below these children */ wins = g_list_append(wins, selected); /* if selected window is transient for group then raise it above others */
M po/POTFILES.inpo/POTFILES.in

@@ -2,7 +2,6 @@ # List of source files containing translatable strings.

openbox/actions.c openbox/actions/execute.c openbox/actions/exit.c -openbox/actions/session.c openbox/client.c openbox/client_list_combined_menu.c openbox/client_list_menu.c
M render/image.crender/image.c

@@ -221,7 +221,7 @@

return pic; } -/*! This drawns an RGBA picture into the target, within the rectangle specified +/*! This draws an RGBA picture into the target, within the rectangle specified by the area parameter. If the area's size differs from the source's then it will be centered within the rectangle */ void DrawRGBA(RrPixel32 *target, gint target_w, gint target_h,

@@ -405,11 +405,13 @@ self = img->image;

pic = NULL; free_pic = FALSE; - /* is there an original of this size? (only w or h has to be right cuz - we maintain aspect ratios) */ + /* is there an original of this size? (only the larger of + w or h has to be right cuz we maintain aspect ratios) */ for (i = 0; i < self->n_original; ++i) - if (self->original[i]->width == area->width || - self->original[i]->height == area->height) + if ((self->original[i]->width >= self->original[i]->height && + self->original[i]->width == area->width) || + (self->original[i]->width <= self->original[i]->height && + self->original[i]->height == area->height)) { pic = self->original[i]; break;

@@ -417,8 +419,10 @@ }

/* is there a resize of this size? */ for (i = 0; i < self->n_resized; ++i) - if (self->resized[i]->width == area->width || - self->resized[i]->height == area->height) + if ((self->resized[i]->width >= self->resized[i]->height && + self->resized[i]->width == area->width) || + (self->resized[i]->width <= self->resized[i]->height && + self->resized[i]->height == area->height)) { gint j; RrImagePic *saved;
M render/render.crender/render.c

@@ -135,12 +135,14 @@ g_assert(!transferred);

{ RrRect narea = tarea; RrTextureImage *img = &a->texture[i].data.image; - if (img->twidth) - narea.width = MIN(tarea.width, img->twidth); - if (img->theight) - narea.height = MIN(tarea.height, img->theight); narea.x += img->tx; + narea.width -= img->tx; narea.y += img->ty; + narea.height -= img->ty; + if (img->twidth) + narea.width = MIN(narea.width, img->twidth); + if (img->theight) + narea.height = MIN(narea.height, img->theight); RrImageDrawImage(a->surface.pixel_data, &a->texture[i].data.image, a->w, a->h,

@@ -153,12 +155,14 @@ g_assert(!transferred);

{ RrRect narea = tarea; RrTextureRGBA *rgb = &a->texture[i].data.rgba; - if (rgb->twidth) - narea.width = MIN(tarea.width, rgb->twidth); - if (rgb->theight) - narea.height = MIN(tarea.height, rgb->theight); narea.x += rgb->tx; + narea.width -= rgb->tx; narea.y += rgb->ty; + narea.height -= rgb->ty; + if (rgb->twidth) + narea.width = MIN(narea.width, rgb->twidth); + if (rgb->theight) + narea.height = MIN(narea.height, rgb->theight); RrImageDrawRGBA(a->surface.pixel_data, &a->texture[i].data.rgba, a->w, a->h,
M tests/skiptaskbar.ctests/skiptaskbar.c

@@ -26,6 +26,7 @@ Display *display;

Window win; XEvent report; Atom state, skip; + XClassHint classhint; int x=10,y=10,h=400,w=400; display = XOpenDisplay(NULL);

@@ -46,6 +47,10 @@ XSetWindowBackground(display,win,WhitePixel(display,0));

XChangeProperty(display, win, state, XA_ATOM, 32, PropModeReplace, (unsigned char*)&skip, 1); + + classhint.res_name = "test"; + classhint.res_class = "Test"; + XSetClassHint(display, win, &classhint); XMapWindow(display, win); XFlush(display);
M tools/xdg-autostart/xdg-autostarttools/xdg-autostart/xdg-autostart

@@ -80,7 +80,7 @@

def __str__(self): return self.path + " : " + self.de.getName() - def _isexecfile(path): + def _isexecfile(self, path): return os.access(path, os.X_OK) def _findFile(self, path, search, match_func):