#include "popup.h"
#include "extensions.h"
#include "render/render.h"
+#include "gettext.h"
#include <X11/Xlib.h>
#ifdef HAVE_UNISTD_H
DesktopLayout screen_desktop_layout;
gchar **screen_desktop_names;
Window screen_support_win;
+Time screen_desktop_user_time = CurrentTime;
static Rect **area; /* array of desktop holding array of xinerama areas */
static Rect *monitor_area;
current_wm_sn_owner = None;
if (current_wm_sn_owner) {
if (!ob_replace_wm) {
- g_warning("A window manager is already running on screen %d",
+ g_message(_("A window manager is already running on screen %d"),
ob_screen);
return FALSE;
}
timestamp);
if (XGetSelectionOwner(ob_display, wm_sn_atom) != screen_support_win) {
- g_warning("Could not acquire window manager selection on screen %d",
+ g_message(_("Could not acquire window manager selection on screen %d"),
ob_screen);
return FALSE;
}
}
if (wait >= timeout) {
- g_warning("Timeout expired while waiting for the current WM to die "
- "on screen %d", ob_screen);
+ g_message(_("The WM on screen %d is not exiting"), ob_screen);
return FALSE;
}
}
/* Send client message indicating that we are now the WM */
prop_message(RootWindow(ob_display, ob_screen), prop_atoms.manager,
- timestamp, wm_sn_atom, 0, 0, SubstructureNotifyMask);
-
+ timestamp, wm_sn_atom, screen_support_win, 0,
+ SubstructureNotifyMask);
return TRUE;
}
ROOT_EVENTMASK);
xerror_set_ignore(FALSE);
if (xerror_occured) {
- g_warning("A window manager is already running on screen %d",
+ g_message(_("A window manager is already running on screen %d"),
ob_screen);
XDestroyWindow(ob_display, screen_support_win);
/* set the _NET_SUPPORTED_ATOMS hint */
num_support = 55;
+#ifdef SYNC
+ num_support += 2;
+#endif
i = 0;
supported = g_new(gulong, num_support);
supported[i++] = prop_atoms.net_wm_full_placement;
supported[i++] = prop_atoms.net_wm_moveresize;
supported[i++] = prop_atoms.net_wm_user_time;
supported[i++] = prop_atoms.net_frame_extents;
+#ifdef SYNC
+ supported[i++] = prop_atoms.net_wm_sync_request;
+ supported[i++] = prop_atoms.net_wm_sync_request_counter;
+#endif
supported[i++] = prop_atoms.ob_wm_state_undecorated;
g_assert(i == num_support);
-/*
- supported[] = prop_atoms.net_wm_action_stick;
-*/
PROP_SETA32(RootWindow(ob_display, ob_screen),
net_supported, atom, supported, num_support);
void screen_set_desktop(guint num)
{
+ ObClient *c;
GList *it;
guint old;
}
}
- focus_hilite = focus_fallback_target(TRUE, focus_client);
- if (focus_hilite) {
- frame_adjust_focus(focus_hilite->frame, TRUE);
-
- /*!
- When this focus_client check is not used, you can end up with
- races, as demonstrated with gnome-panel, sometimes the window
- you click on another desktop ends up losing focus cuz of the
- focus change here.
- */
- /*if (!focus_client)*/
- client_focus(focus_hilite);
+ /* have to try focus here because when you leave an empty desktop
+ there is no focus out to watch for */
+ if ((c = focus_fallback_target(TRUE, focus_client))) {
+ /* reduce flicker by hiliting now rather than waiting for the server
+ FocusIn event */
+ frame_adjust_focus(c->frame, TRUE);
+ client_focus(c);
}
event_ignore_queued_enters();
+
+ if (event_curtime != CurrentTime)
+ screen_desktop_user_time = event_curtime;
}
static void get_row_col(guint d, guint *r, guint *c)
a = screen_physical_area_monitor(0);
pager_popup_position(desktop_cycle_popup, CenterGravity,
a->x + a->width / 2, a->y + a->height / 2);
- /* XXX the size and the font extents need to be related on some level
- */
- pager_popup_size(desktop_cycle_popup, POPUP_WIDTH, POPUP_HEIGHT);
-
- pager_popup_set_text_align(desktop_cycle_popup, RR_JUSTIFY_CENTER);
+ pager_popup_width(desktop_cycle_popup, MAX(a->width/3, POPUP_WIDTH));
+ pager_popup_height(desktop_cycle_popup, POPUP_HEIGHT);
pager_popup_show(desktop_cycle_popup, screen_desktop_names[d], d);
}
break;
}
} else {
+ ObClient *c;
+
/* use NULL for the "old" argument because the desktop was focused
and we don't want to fallback to the desktop by default */
- focus_hilite = focus_fallback_target(TRUE, NULL);
- if (focus_hilite) {
- frame_adjust_focus(focus_hilite->frame, TRUE);
-
- /*!
- When this focus_client check is not used, you can end up with
- races, as demonstrated with gnome-panel, sometimes the window
- you click on another desktop ends up losing focus cuz of the
- focus change here.
- */
- /*if (!focus_client)*/
- client_focus(focus_hilite);
- }
+ if ((c = focus_fallback_target(TRUE, NULL)))
+ client_focus(c);
}
show = !!show; /* make it boolean */
void screen_install_colormap(ObClient *client, gboolean install)
{
- XWindowAttributes wa;
-
if (client == NULL) {
if (install)
XInstallColormap(RrDisplay(ob_rr_inst), RrColormap(ob_rr_inst));
else
XUninstallColormap(RrDisplay(ob_rr_inst), RrColormap(ob_rr_inst));
} else {
- if (XGetWindowAttributes(ob_display, client->window, &wa) &&
- wa.colormap != None) {
- xerror_set_ignore(TRUE);
- if (install)
- XInstallColormap(RrDisplay(ob_rr_inst), wa.colormap);
- else
- XUninstallColormap(RrDisplay(ob_rr_inst), wa.colormap);
- xerror_set_ignore(FALSE);
- }
+ xerror_set_ignore(TRUE);
+ if (install) {
+ if (client->colormap != None)
+ XInstallColormap(RrDisplay(ob_rr_inst), client->colormap);
+ } else
+ XUninstallColormap(RrDisplay(ob_rr_inst), client->colormap);
+ xerror_set_ignore(FALSE);
}
}