<theme>
<name>Clearlooks</name>
<titleLayout>NLIMC</titleLayout>
- <titleNumber>yes</titleNumber>
<!--
avaible characters are NDSLIMC, each can occur at most once.
N: window icon
<mousebind button="A-Down" action="Click">
<action name="DesktopNext"/>
</mousebind>
+ <mousebind button="C-A-Up" action="Click">
+ <action name="DesktopPrevious"/>
+ </mousebind>
+ <mousebind button="C-A-Down" action="Click">
+ <action name="DesktopNext"/>
+ </mousebind>
<mousebind button="A-S-Up" action="Click">
<action name="SendToDesktopPrevious"/>
</mousebind>
<mousebind button="A-Down" action="Press">
<action name="DesktopNext"/>
</mousebind>
+ <mousebind button="C-A-Up" action="Press">
+ <action name="DesktopPrevious"/>
+ </mousebind>
+ <mousebind button="C-A-Down" action="Press">
+ <action name="DesktopNext"/>
+ </mousebind>
<mousebind button="Left" action="Press">
<action name="Activate"/>
<xsd:complexType name="theme">
<xsd:element minOccurs="0" name="name" type="xsd:string"/>
<xsd:element minOccurs="0" name="titleLayout" type="xsd:string"/>
- <xsd:element minOccurs="0" name="titleNumber" type="ob:bool"/>
<xsd:element minOccurs="0" name="keepBorder" type="ob:bool"/>
<xsd:element minOccurs="0" name="animateIconify" type="ob:bool"/>
<xsd:element minOccurs="0" name="font" type="ob:font"/>
<theme>
<name>Clearlooks</name>
<titleLayout>NLIMC</titleLayout>
- <titleNumber>yes</titleNumber>
<!--
avaible characters are NDSLIMC, each can occur at most once.
N: window icon
if (data->sendto.desk < screen_num_desktops ||
data->sendto.desk == DESKTOP_ALL) {
client_set_desktop(c, data->sendto.desk, data->sendto.follow);
- if (data->sendto.follow)
+ if (data->sendto.follow && data->sendto.desk != screen_desktop)
screen_set_desktop(data->sendto.desk, TRUE);
}
}
if (!data->sendtodir.inter.any.interactive ||
(data->sendtodir.inter.final && !data->sendtodir.inter.cancel))
{
- if (d != screen_desktop) screen_set_desktop(d, TRUE);
+ if (d != screen_desktop)
+ screen_set_desktop(d, TRUE);
}
}
placex = self->area.x;
placey = self->area.y;
- /* figure out placement for the window */
+ /* figure out placement for the window if the window is new */
if (ob_state() == OB_STATE_RUNNING) {
gboolean transient;
transient = place_client(self, &placex, &placey, settings);
+ /* if the window isn't user-positioned, then make it fit inside
+ the visible screen area on its monitor.
+
+ the monitor is chosen by place_client! */
+ if (!(self->positioned & USPosition)) {
+ /* make a copy to modify */
+ Rect a = *screen_area_monitor(self->desktop, client_monitor(self));
+
+ /* shrink by the frame's area */
+ a.width -= self->frame->size.left + self->frame->size.right;
+ a.height -= self->frame->size.top + self->frame->size.bottom;
+
+ /* fit the window inside the area */
+ self->area.width = MIN(self->area.width, a.width);
+ self->area.height = MIN(self->area.height, a.height);
+
+ ob_debug("setting window size to %dx%d\n",
+ self->area.width, self->area.height);
+
+ /* adjust the frame to the client's new size */
+ frame_adjust_area(self->frame, FALSE, TRUE, FALSE);
+ frame_adjust_client_area(self->frame);
+ }
+
/* make sure the window is visible. */
client_find_onscreen(self, &placex, &placey,
self->area.width, self->area.height,
"Not focusing the window because the time is "
"too old\n");
}
+ /* If its a transient (and parents aren't focused) and the time
+ is ambiguous (either the current focus target doesn't have
+ a timestamp, or they are the same (we probably inherited it
+ from them) */
+ else if (self->transient_for != NULL &&
+ (!last_time || self->user_time == last_time))
+ {
+ activate = FALSE;
+ ob_debug_type(OB_DEBUG_FOCUS,
+ "Not focusing the window because it is a "
+ "transient, and the time is very ambiguous\n");
+ }
/* Don't steal focus from globally active clients.
I stole this idea from KWin. It seems nice.
*/
- if (!(focus_client->can_focus || focus_client->focus_notify)) {
+ else if (!(focus_client->can_focus ||
+ focus_client->focus_notify))
+ {
activate = FALSE;
ob_debug_type(OB_DEBUG_FOCUS,
"Not focusing the window because a globally "
self->desktop = self->transient_for->desktop;
trdesk = TRUE;
} else {
+ /* if all the group is on one desktop, then open it on the
+ same desktop */
GSList *it;
+ gboolean first = TRUE;
+ guint all = screen_num_desktops; /* not a valid value */
- for (it = self->group->members; it; it = g_slist_next(it))
- if (it->data != self &&
- !((ObClient*)it->data)->transient_for) {
- self->desktop = ((ObClient*)it->data)->desktop;
- trdesk = TRUE;
- break;
+ for (it = self->group->members; it; it = g_slist_next(it)) {
+ ObClient *c = it->data;
+ if (c != self) {
+ if (first) {
+ all = c->desktop;
+ first = FALSE;
+ }
+ else if (all != c->desktop)
+ all = screen_num_desktops; /* make it invalid */
}
+ }
+ if (all != screen_num_desktops) {
+ self->desktop = all;
+ trdesk = TRUE;
+ }
}
}
if (!trdesk) {
}
/* the WM_HINTS can contain an icon */
- client_update_icons(self);
+ if (hints->flags & IconPixmapHint)
+ client_update_icons(self);
XFree(hints);
}
PROP_GETS(self->window, wm_icon_name, utf8, &data)))
data = g_strdup(self->title);
- PROP_SETS(self->window, net_wm_visible_icon_name, data);
- self->icon_title = data;
+ if (self->client_machine) {
+ visible = g_strdup_printf("%s (%s)", data, self->client_machine);
+ g_free(data);
+ } else
+ visible = data;
+
+ PROP_SETS(self->window, net_wm_visible_icon_name, visible);
+ self->icon_title = visible;
}
void client_update_strut(ObClient *self)
self->iconic = iconic;
/* update the focus lists.. iconic windows go to the bottom of
- the list, put the new iconic window at the 'top of the
- bottom'. */
- focus_order_to_top(self);
+ the list */
+ focus_order_to_bottom(self);
changed = TRUE;
}
for (i = 1; i < self->nicons; ++i) {
gulong diff;
- diff = ABS(self->icons[0].width - w) + ABS(self->icons[0].height - h);
+ diff = ABS(self->icons[i].width - w) + ABS(self->icons[i].height - h);
if (diff < min_diff) {
min_diff = diff;
min_i = i;
if (!w || !WINDOW_IS_CLIENT(w))
return FALSE;
}
+ else {
+ /* This means focus reverted to parent from the client (this
+ happens often during iconify animation) */
+ if (detail == NotifyInferior)
+ return TRUE;
+ }
/* This means focus moved from the root window to a client */
if (detail == NotifyVirtual)
{
XEvent ce;
- ob_debug_type(OB_DEBUG_FOCUS, "Focus went to pointer root/none\n");
+ ob_debug_type(OB_DEBUG_FOCUS, "Focus went to pointer root/none or"
+ " the frame window\n");
/* If another FocusIn is in the queue then don't fallback yet. This
fixes the fun case of:
ob_debug_type(OB_DEBUG_FOCUS,
" but another FocusIn is coming\n");
} else {
- /* Focus has been reverted to the root window or nothing.
+ /* Focus has been reverted.
FocusOut events come after UnmapNotify, so we don't need to
worry about focusing an invalid window
gboolean nomove = FALSE;
XEvent ce;
+ if (client) {
+ frame_adjust_focus(client->frame, FALSE);
+ /* focus_set_client(NULL) has already been called in this
+ section or by focus_fallback */
+ client_calc_layer(client);
+ }
+
/* Look for the followup FocusIn */
if (!XCheckIfEvent(ob_display, &ce, event_look_for_focusin, NULL)) {
/* There is no FocusIn, this means focus went to a window that
xerror_set_ignore(FALSE);
/* nothing is focused */
focus_set_client(NULL);
- } else if (ce.xany.window == e->xany.window) {
- ob_debug_type(OB_DEBUG_FOCUS, "Focus didn't go anywhere\n");
- /* If focus didn't actually move anywhere, there is nothing to do*/
- nomove = TRUE;
} else {
- /* Focus did move, so process the FocusIn event */
+ /* Focus moved, so process the FocusIn event */
ObEventData ed = { .ignored = FALSE };
event_process(&ce, &ed);
if (ed.ignored) {
focus_fallback(TRUE);
}
}
-
- if (client && !nomove) {
- frame_adjust_focus(client->frame, FALSE);
- if (client == focus_client)
- focus_set_client(NULL);
- client_calc_layer(client);
- }
} else if (timewinclients)
event_handle_user_time_window_clients(timewinclients, e);
else if (client)
menu_frame_select_next(frame);
}
- /* keyboard accelerator shortcuts. */
- else if (ev->xkey.state == 0 &&
+ /* keyboard accelerator shortcuts. (allow controlmask) */
+ else if ((ev->xkey.state & ~ControlMask) == 0 &&
/* was it a valid key? */
unikey != 0 &&
/* don't bother if the menu is empty. */
}
}
-static ObClient* focus_fallback_target(gboolean allow_refocus)
+static ObClient* focus_fallback_target(gboolean allow_refocus, ObClient *old)
{
GList *it;
ObClient *c;
- ObClient *old = focus_client;
ob_debug_type(OB_DEBUG_FOCUS, "trying pointer stuff\n");
if (config_focus_follow && !config_focus_last)
return c;
}
- ob_debug_type(OB_DEBUG_FOCUS, "trying omnipresentness\n");
- if (allow_refocus && old &&
- old->desktop == DESKTOP_ALL &&
- client_normal(old) &&
- client_focus(old))
- {
- ob_debug_type(OB_DEBUG_FOCUS, "found in omnipresentness\n");
- return old;
- }
-
-
ob_debug_type(OB_DEBUG_FOCUS, "trying the focus order\n");
for (it = focus_order; it; it = g_list_next(it)) {
c = it->data;
ObClient* focus_fallback(gboolean allow_refocus)
{
ObClient *new;
+ ObClient *old = focus_client;
/* unfocus any focused clients.. they can be focused by Pointer events
and such, and then when we try focus them, we won't get a FocusIn
event at all for them. */
focus_nothing();
- new = focus_fallback_target(allow_refocus);
+ new = focus_fallback_target(allow_refocus, old);
return new;
}
screen_install_colormap(NULL, TRUE);
}
- /* Don't set focus_client to NULL here. It will be set to NULL when the
- FocusOut event comes. Otherwise, if we focus nothing and then focus the
- same window again, The focus code says nothing changed, but focus_client
- ends up being NULL anyways.
- focus_client = NULL;
- */
+ /* nothing is focused, update the colormap and _the root property_ */
+ focus_set_client(NULL);
/* if there is a grab going on, then we need to cancel it. if we move
focus during the grab, applications will get NotifyWhileGrabbed events
if (!self->visible) {
self->visible = TRUE;
XMapWindow(ob_display, self->client->window);
- XMapWindow(ob_display, self->plate);
XMapWindow(ob_display, self->window);
}
}
self->visible = FALSE;
if (!frame_iconify_animating(self))
XUnmapWindow(ob_display, self->window);
- /* unmap the plate along with the client. some people (libwnck) look
- to see if it is unmapped when the client is iconified, for whatever
- reason. so let's play along... */
- XUnmapWindow(ob_display, self->plate);
/* we unmap the client itself so that we can get MapRequest
events, and because the ICCCM tells us to! */
XUnmapWindow(ob_display, self->client->window);
} else
self->width = self->client->area.width + self->cbwidth_x * 2;
+ /* some elements are sized based of the width, so don't let them have
+ negative values */
+ self->width = MAX(self->width,
+ (ob_rr_theme->grip_width + self->bwidth) * 2) + 1;
+
STRUT_SET(self->size,
self->cbwidth_x + (!self->max_horz ? self->bwidth : 0),
self->cbwidth_y + self->bwidth,
if (resized && (self->decorations & OB_FRAME_DECOR_TITLEBAR))
XResizeWindow(ob_display, self->label, self->label_width,
ob_rr_theme->label_height);
+
}
static void frame_adjust_cursors(ObFrame *self)
else
screen_set_num_desktops(config_desktops_num);
+ screen_desktop = screen_num_desktops; /* something invalid */
/* start on the current desktop when a wm was already running */
if (PROP_GET32(RootWindow(ob_display, ob_screen),
net_current_desktop, cardinal, &d) &&
else
screen_set_desktop(MIN(config_screen_firstdesk,
screen_num_desktops) - 1, FALSE);
+ screen_last_desktop = screen_desktop;
/* don't start in showing-desktop mode */
screen_showing_desktop = FALSE;
g_assert(num < screen_num_desktops);
+ if (old == num) return;
+
old = screen_desktop;
screen_desktop = num;
PROP_SET32(RootWindow(ob_display, ob_screen),
net_current_desktop, cardinal, num);
- if (old == num) return;
-
screen_last_desktop = old;
ob_debug("Moving to desktop %d\n", num+1);
}
}
+ if (focus_client && (focus_client->desktop == DESKTOP_ALL ||
+ focus_client->desktop == screen_desktop))
+ dofocus = FALSE;
+
/* have to try focus here because when you leave an empty desktop
there is no focus out to watch for
do this before hiding the windows so if helper windows are coming
with us, they don't get hidden
*/
- if (dofocus && (c = focus_fallback(TRUE))) {
+ if (dofocus && (c = focus_fallback(TRUE)))
+ {
/* only do the flicker reducing stuff ahead of time if we are going
to call xsetinputfocus on the window ourselves. otherwise there is
no guarantee the window will actually take focus.. */
it = g_slist_nth(config_desktops_names, i);
for (; i < screen_num_desktops; ++i) {
- if (it)
+ if (it && ((char*)it->data)[0]) /* not empty */
/* use the names from the config file when possible */
screen_desktop_names[i] = g_strdup(it->data);
else
#
msgid ""
msgstr ""
-"Project-Id-Version: openbox 3.3.991\n"
+"Project-Id-Version: openbox 3.3.992\n"
"Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
"POT-Creation-Date: 2007-05-24 14:51+0200\n"
"PO-Revision-Date: 2007-05-24 14:51+0200\n"
#
msgid ""
msgstr ""
-"Project-Id-Version: openbox 3.3.991\n"
+"Project-Id-Version: openbox 3.3.992\n"
"Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
"POT-Creation-Date: 2007-05-24 14:51+0200\n"
"PO-Revision-Date: 2007-05-24 14:51+0200\n"
--- /dev/null
+/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
+
+ big.c for the Openbox window manager
+ 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.
+*/
+
+#include <stdio.h>
+#include <unistd.h>
+#include <X11/Xlib.h>
+
+int main () {
+ Display *display;
+ Window win;
+ XEvent report;
+ XEvent msg;
+ int x=10,y=10,h=2000,w=2000;
+
+ display = XOpenDisplay(NULL);
+
+ if (display == NULL) {
+ fprintf(stderr, "couldn't connect to X server :0\n");
+ return 0;
+ }
+
+ win = XCreateWindow(display, RootWindow(display, 0),
+ x, y, w, h, 10, CopyFromParent, CopyFromParent,
+ CopyFromParent, 0, NULL);
+
+ XSetWindowBackground(display,win,WhitePixel(display,0));
+
+ XMapWindow(display, win);
+ XFlush(display);
+ sleep(2);
+
+ XSelectInput(display, win, ExposureMask | StructureNotifyMask);
+
+ while (1) {
+ XNextEvent(display, &report);
+
+ switch (report.type) {
+ case Expose:
+ printf("exposed\n");
+ break;
+ case ConfigureNotify:
+ x = report.xconfigure.x;
+ y = report.xconfigure.y;
+ w = report.xconfigure.width;
+ h = report.xconfigure.height;
+ printf("confignotify %i,%i-%ix%i\n",x,y,w,h);
+ break;
+ }
+
+ }
+
+ return 1;
+}