#include "startupnotify.h"
#include "moveresize.h"
#include "config.h"
-#include "mainloop.h"
#include "screen.h"
#include "client.h"
#include "session.h"
#include "gettext.h"
#include "obt/display.h"
#include "obt/prop.h"
+#include "obt/mainloop.h"
#include <X11/Xlib.h>
#ifdef HAVE_UNISTD_H
guint screen_num_desktops;
guint screen_num_monitors;
guint screen_desktop;
-guint screen_last_desktop = 1;
+guint screen_last_desktop;
gboolean screen_showing_desktop;
ObDesktopLayout screen_desktop_layout;
gchar **screen_desktop_names;
}
/* Send client message indicating that we are now the WM */
- obt_prop_message(ob_screen, RootWindow(obt_display, ob_screen),
- OBT_PROP_ATOM(MANAGER),
+ obt_prop_message(ob_screen, obt_root(ob_screen), OBT_PROP_ATOM(MANAGER),
timestamp, wm_sn_atom, screen_support_win, 0, 0,
SubstructureNotifyMask);
/* create the netwm support window */
attrib.override_redirect = TRUE;
attrib.event_mask = PropertyChangeMask;
- screen_support_win = XCreateWindow(obt_display,
- RootWindow(obt_display, ob_screen),
+ screen_support_win = XCreateWindow(obt_display, obt_root(ob_screen),
-100, -100, 1, 1, 0,
CopyFromParent, InputOutput,
CopyFromParent,
}
obt_display_ignore_errors(TRUE);
- XSelectInput(obt_display, RootWindow(obt_display, ob_screen),
- ROOT_EVENTMASK);
+ XSelectInput(obt_display, obt_root(ob_screen), ROOT_EVENTMASK);
obt_display_ignore_errors(FALSE);
if (obt_display_error_occured) {
g_message(_("A window manager is already running on screen %d"),
/* set the OPENBOX_PID hint */
pid = getpid();
- OBT_PROP_SET32(RootWindow(obt_display, ob_screen),
- OPENBOX_PID, CARDINAL, pid);
+ OBT_PROP_SET32(obt_root(ob_screen), OPENBOX_PID, CARDINAL, pid);
/* set supporting window */
- OBT_PROP_SET32(RootWindow(obt_display, ob_screen),
+ OBT_PROP_SET32(obt_root(ob_screen),
NET_SUPPORTING_WM_CHECK, WINDOW, screen_support_win);
/* set properties on the supporting window */
supported[i++] = OBT_PROP_ATOM(OB_WM_STATE_UNDECORATED);
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);
g_assert(i == num_support);
- OBT_PROP_SETA32(RootWindow(obt_display, ob_screen),
+ OBT_PROP_SETA32(obt_root(ob_screen),
NET_SUPPORTED, ATOM, supported, num_support);
g_free(supported);
something. oh well. */
e.xclient.type = ClientMessage;
e.xclient.display = obt_display;
- e.xclient.window = RootWindow(obt_display, ob_screen);
+ e.xclient.window = obt_root(ob_screen);
e.xclient.message_type =
XInternAtom(obt_display, "_KDE_SPLASH_PROGRESS", False );
e.xclient.format = 8;
strcpy(e.xclient.data.b, "wm started");
- XSendEvent(obt_display, RootWindow(obt_display, ob_screen),
- False, SubstructureNotifyMask, &e );
+ XSendEvent(obt_display, obt_root(ob_screen),
+ False, SubstructureNotifyMask, &e);
}
void screen_startup(gboolean reconfig)
screen_resize();
/* have names already been set for the desktops? */
- if (OBT_PROP_GETSS(RootWindow(obt_display, ob_screen),
- NET_DESKTOP_NAMES, utf8, &names))
- {
+ if (OBT_PROP_GETSS(obt_root(ob_screen), NET_DESKTOP_NAMES, utf8, &names)) {
g_strfreev(names);
namesexist = TRUE;
}
names[i] = g_strdup(it->data);
/* set the root window property */
- OBT_PROP_SETSS(RootWindow(obt_display, ob_screen),
- NET_DESKTOP_NAMES, utf8, names);
+ OBT_PROP_SETSS(obt_root(ob_screen),
+ NET_DESKTOP_NAMES, utf8, (const gchar**)names);
g_strfreev(names);
}
this will also set the default names from the config file up for
desktops that don't have names yet */
screen_num_desktops = 0;
- if (OBT_PROP_GET32(RootWindow(obt_display, ob_screen),
+ if (OBT_PROP_GET32(obt_root(ob_screen),
NET_NUMBER_OF_DESKTOPS, CARDINAL, &d))
+ {
+ if (d != config_desktops_num) {
+ /* TRANSLATORS: If you need to specify a different order of the
+ arguments, you can use %1$d for the first one and %2$d for the
+ second one. For example,
+ "The current session has %2$d desktops, but Openbox is configured for %1$d ..." */
+ g_warning(_("Openbox is configured for %d desktops, but the current session has %d. Overriding the Openbox configuration."),
+ config_desktops_num, d);
+ }
screen_set_num_desktops(d);
+ }
/* restore from session if possible */
else if (session_num_desktops)
screen_set_num_desktops(session_num_desktops);
screen_desktop = screen_num_desktops; /* something invalid */
/* start on the current desktop when a wm was already running */
- if (OBT_PROP_GET32(RootWindow(obt_display, ob_screen),
+ if (OBT_PROP_GET32(obt_root(ob_screen),
NET_CURRENT_DESKTOP, CARDINAL, &d) &&
d < screen_num_desktops)
{
/* don't start in showing-desktop mode */
screen_showing_desktop = FALSE;
- OBT_PROP_SET32(RootWindow(obt_display, ob_screen),
+ OBT_PROP_SET32(obt_root(ob_screen),
NET_SHOWING_DESKTOP, CARDINAL, screen_showing_desktop);
if (session_desktop_layout_present &&
if (reconfig)
return;
- XSelectInput(obt_display, RootWindow(obt_display, ob_screen),
- NoEventMask);
+ XSelectInput(obt_display, obt_root(ob_screen), NoEventMask);
/* we're not running here no more! */
- OBT_PROP_ERASE(RootWindow(obt_display, ob_screen), OPENBOX_PID);
+ OBT_PROP_ERASE(obt_root(ob_screen), OPENBOX_PID);
/* not without us */
- OBT_PROP_ERASE(RootWindow(obt_display, ob_screen), NET_SUPPORTED);
+ OBT_PROP_ERASE(obt_root(ob_screen), NET_SUPPORTED);
/* don't keep this mode */
- OBT_PROP_ERASE(RootWindow(obt_display, ob_screen), NET_SHOWING_DESKTOP);
+ OBT_PROP_ERASE(obt_root(ob_screen), NET_SHOWING_DESKTOP);
XDestroyWindow(obt_display, screen_support_win);
/* Set the _NET_DESKTOP_GEOMETRY hint */
screen_physical_size.width = geometry[0] = w;
screen_physical_size.height = geometry[1] = h;
- OBT_PROP_SETA32(RootWindow(obt_display, ob_screen),
+ OBT_PROP_SETA32(obt_root(ob_screen),
NET_DESKTOP_GEOMETRY, CARDINAL, geometry, 2);
if (ob_state() == OB_STATE_STARTING)
old = screen_num_desktops;
screen_num_desktops = num;
- OBT_PROP_SET32(RootWindow(obt_display, ob_screen),
- NET_NUMBER_OF_DESKTOPS, CARDINAL, num);
+ OBT_PROP_SET32(obt_root(ob_screen), NET_NUMBER_OF_DESKTOPS, CARDINAL, num);
/* set the viewport hint */
viewport = g_new0(gulong, num * 2);
- OBT_PROP_SETA32(RootWindow(obt_display, ob_screen),
+ OBT_PROP_SETA32(obt_root(ob_screen),
NET_DESKTOP_VIEWPORT, CARDINAL, viewport, num * 2);
g_free(viewport);
if (previous == num) return;
- OBT_PROP_SET32(RootWindow(obt_display, ob_screen),
- NET_CURRENT_DESKTOP, CARDINAL, num);
+ OBT_PROP_SET32(obt_root(ob_screen), NET_CURRENT_DESKTOP, CARDINAL, num);
/* This whole thing decides when/how to save the screen_last_desktop so
that it can be restored later if you want */
/* If screen_desktop_timeout is true, then we've been on this desktop
long enough and we can save it as the last desktop. */
- /* save the "last desktop" as the "old desktop" */
- screen_old_desktop = screen_last_desktop;
- /* save the desktop we're coming from as the "last desktop" */
- screen_last_desktop = previous;
+ if (screen_last_desktop == previous)
+ /* this is the startup state only */
+ screen_old_desktop = screen_desktop;
+ else {
+ /* save the "last desktop" as the "old desktop" */
+ screen_old_desktop = screen_last_desktop;
+ /* save the desktop we're coming from as the "last desktop" */
+ screen_last_desktop = previous;
+ }
}
else {
/* If screen_desktop_timeout is false, then we just got to this desktop
}
}
screen_desktop_timeout = FALSE;
- ob_main_loop_timeout_remove(ob_main_loop, last_desktop_func);
- ob_main_loop_timeout_add(ob_main_loop, REMEMBER_LAST_DESKTOP_TIME,
- last_desktop_func, NULL, NULL, NULL);
+ obt_main_loop_timeout_remove(ob_main_loop, last_desktop_func);
+ obt_main_loop_timeout_add(ob_main_loop, REMEMBER_LAST_DESKTOP_TIME,
+ last_desktop_func, NULL, NULL, NULL);
- ob_debug("Moving to desktop %d\n", num+1);
+ ob_debug("Moving to desktop %d", num+1);
/* ignore enter events caused by the move */
ignore_start = event_start_ignore_all_enters();
parent - which will have to be on the same desktop */
!client_direct_parent(c))
{
- ob_debug("moving window %s\n", c->title);
+ ob_debug("moving window %s", c->title);
client_set_desktop(c, c->desktop+1, FALSE, TRUE);
}
}
parent - which will have to be on the same desktop */
!client_direct_parent(c))
{
- ob_debug("moving window %s\n", c->title);
+ ob_debug("moving window %s", c->title);
client_set_desktop(c, c->desktop - 1, TRUE, TRUE);
}
/* raise all the windows that are on the current desktop which
(d == DESKTOP_ALL || d == screen_desktop))
{
stacking_raise(CLIENT_AS_WINDOW(c));
- ob_debug("raising window %s\n", c->title);
+ ob_debug("raising window %s", c->title);
}
}
}
/* fallback focus like we're changing desktops */
if (screen_desktop < screen_num_desktops - 1) {
screen_fallback_focus();
- ob_debug("fake desktop change\n");
+ ob_debug("fake desktop change");
}
screen_set_num_desktops(screen_num_desktops-1);
MAX(a->width/3, POPUP_WIDTH));
pager_popup_show(desktop_popup, screen_desktop_names[d], d);
- ob_main_loop_timeout_remove(ob_main_loop, hide_desktop_popup_func);
- ob_main_loop_timeout_add(ob_main_loop, config_desktop_popup_time * 1000,
- hide_desktop_popup_func, NULL, NULL, NULL);
+ 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, NULL, NULL, NULL);
g_free(a);
}
void screen_hide_desktop_popup(void)
{
- ob_main_loop_timeout_remove(ob_main_loop, hide_desktop_popup_func);
+ obt_main_loop_timeout_remove(ob_main_loop, hide_desktop_popup_func);
pager_popup_hide(desktop_popup);
}
screen_desktop_layout.rows = 1;
screen_desktop_layout.columns = screen_num_desktops;
- if (OBT_PROP_GETA32(RootWindow(obt_display, ob_screen),
+ if (OBT_PROP_GETA32(obt_root(ob_screen),
NET_DESKTOP_LAYOUT, CARDINAL, &data, &num)) {
if (num == 3 || num == 4) {
g_strfreev(screen_desktop_names);
screen_desktop_names = NULL;
- if (OBT_PROP_GETSS(RootWindow(obt_display, ob_screen),
+ if (OBT_PROP_GETSS(obt_root(ob_screen),
NET_DESKTOP_NAMES, utf8, &screen_desktop_names))
for (i = 0; screen_desktop_names[i] && i < screen_num_desktops; ++i);
else
/* if we changed any names, then set the root property so we can
all agree on the names */
- OBT_PROP_SETSS(RootWindow(obt_display, ob_screen), NET_DESKTOP_NAMES,
- utf8, screen_desktop_names);
+ OBT_PROP_SETSS(obt_root(ob_screen), NET_DESKTOP_NAMES,
+ utf8, (const gchar**)screen_desktop_names);
}
/* resize the pager for these names */
}
show = !!show; /* make it boolean */
- OBT_PROP_SET32(RootWindow(obt_display, ob_screen),
- NET_SHOWING_DESKTOP, CARDINAL, show);
+ OBT_PROP_SET32(obt_root(ob_screen), NET_SHOWING_DESKTOP, CARDINAL, show);
}
void screen_install_colormap(ObClient *client, gboolean install)
gint l, r, t, b;
if (ob_debug_xinerama) {
- g_print("Using fake xinerama !\n");
gint w = WidthOfScreen(ScreenOfDisplay(obt_display, ob_screen));
gint h = HeightOfScreen(ScreenOfDisplay(obt_display, ob_screen));
*nxin = 2;
/* all the work areas are not used here, only the ones for the first
monitor are */
- OBT_PROP_SETA32(RootWindow(obt_display, ob_screen), NET_WORKAREA, CARDINAL,
+ OBT_PROP_SETA32(obt_root(ob_screen), NET_WORKAREA, CARDINAL,
dims, 4 * screen_num_desktops);
/* the area has changed, adjust all the windows if they need it */
void screen_set_root_cursor(void)
{
if (sn_app_starting())
- XDefineCursor(obt_display, RootWindow(obt_display, ob_screen),
+ XDefineCursor(obt_display, obt_root(ob_screen),
ob_cursor(OB_CURSOR_BUSYPOINTER));
else
- XDefineCursor(obt_display, RootWindow(obt_display, ob_screen),
+ XDefineCursor(obt_display, obt_root(ob_screen),
ob_cursor(OB_CURSOR_POINTER));
}
guint u;
gboolean ret;
- ret = !!XQueryPointer(obt_display, RootWindow(obt_display, ob_screen),
+ ret = !!XQueryPointer(obt_display, obt_root(ob_screen),
&w, &w, x, y, &i, &i, &u);
if (!ret) {
for (i = 0; i < ScreenCount(obt_display); ++i)
if (i != ob_screen)
- if (XQueryPointer(obt_display, RootWindow(obt_display, i),
+ if (XQueryPointer(obt_display, obt_root(i),
&w, &w, x, y, &i, &i, &u))
break;
}