merge r6816-6862 from trunk
authorDana Jansens <danakj@orodu.net>
Fri, 25 May 2007 19:18:55 +0000 (19:18 +0000)
committerDana Jansens <danakj@orodu.net>
Fri, 25 May 2007 19:18:55 +0000 (19:18 +0000)
12 files changed:
data/rc.xml
data/rc.xsd
doc/rc-mouse-focus.xml
openbox/action.c
openbox/client.c
openbox/event.c
openbox/focus.c
openbox/frame.c
openbox/screen.c
po/en@boldquot.po
po/en@quot.po
tests/big.c [new file with mode: 0644]

index 2f45893775843cfa469257b34eb9fc5692c286af..3ff65747564f3518d9fcd212eb22295b7323528b 100644 (file)
@@ -26,7 +26,6 @@
 <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"/>
index ecc22cad260d0700ea948b102726a5647790cbc2..17b52158b44e39f5cebc5463f7abccf478422b96 100644 (file)
@@ -56,7 +56,6 @@
     <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"/>
index 0685257c2051d8ec9a0542603c3f8132c94addb0..eb140b8ebb6ecf01e40767cb9b3c92a069fbb4ed 100644 (file)
@@ -26,7 +26,6 @@
 <theme>
   <name>Clearlooks</name>
   <titleLayout>NLIMC</titleLayout>
-  <titleNumber>yes</titleNumber>
   <!--
       avaible characters are NDSLIMC, each can occur at most once.
       N: window icon
index 85d84798ab991e3eb433afbc01f8887d92671d92..faf065a12fedd0bf10057a27b7f14a2a43ff0efa 100644 (file)
@@ -1587,7 +1587,7 @@ void action_send_to_desktop(union ActionData *data)
     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);
     }
 }
@@ -1621,7 +1621,8 @@ void action_desktop_dir(union ActionData *data)
     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);
     }
 }
 
index 2a41ab8da41be0d15fa1743bc8e789a54c5b7239..9c8b2ee172cd3fd183ed85d433c676e75ed85091 100644 (file)
@@ -369,7 +369,7 @@ void client_manage(Window window)
     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;
 
@@ -381,6 +381,30 @@ void client_manage(Window window)
 
         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,
@@ -462,10 +486,24 @@ void client_manage(Window window)
                               "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 "
@@ -1139,15 +1177,27 @@ static void client_get_desktop(ObClient *self)
                 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) {
@@ -1882,7 +1932,8 @@ void client_update_wmhints(ObClient *self)
         }
 
         /* the WM_HINTS can contain an icon */
-        client_update_icons(self);
+        if (hints->flags & IconPixmapHint)
+            client_update_icons(self);
 
         XFree(hints);
     }
@@ -1934,8 +1985,14 @@ void client_update_title(ObClient *self)
               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)
@@ -2945,9 +3002,8 @@ static void client_iconify_recursive(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;
             }
@@ -3605,7 +3661,7 @@ static ObClientIcon* client_icon_recursive(ObClient *self, gint w, gint h)
     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;
index c19f70175d1567323b8a28a906cd70e476f3b094..231b09e663a8cfc010e1a8b27fcc0d99b80cf49e 100644 (file)
@@ -319,6 +319,12 @@ static gboolean wanted_focusevent(XEvent *e, gboolean in_client_only)
             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)
@@ -480,7 +486,8 @@ static void event_process(const XEvent *ec, gpointer data)
         {
             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:
@@ -502,7 +509,7 @@ static void event_process(const XEvent *ec, gpointer data)
                 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
@@ -532,6 +539,13 @@ static void event_process(const XEvent *ec, gpointer data)
         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
@@ -554,12 +568,8 @@ static void event_process(const XEvent *ec, gpointer data)
             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) {
@@ -571,13 +581,6 @@ static void event_process(const XEvent *ec, gpointer data)
                 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)
@@ -1585,8 +1588,8 @@ static gboolean event_handle_menu_keyboard(XEvent *ev)
         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. */
index 42241224534e35fc07f021b0c4f86d4d0d1705c3..fad53e92dcf67897f927076129ce3f2465f44ad6 100644 (file)
@@ -94,11 +94,10 @@ void focus_set_client(ObClient *client)
     }
 }
 
-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)
@@ -111,17 +110,6 @@ static ObClient* focus_fallback_target(gboolean allow_refocus)
             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;
@@ -167,13 +155,14 @@ static ObClient* focus_fallback_target(gboolean allow_refocus)
 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;
 }
@@ -186,12 +175,8 @@ void focus_nothing()
         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
index 9fca8ea56df34525225b0fbaa1c8a51a806fe337..574d1816fcd4cb463924bdd5fa77bd5ad6156063 100644 (file)
@@ -251,7 +251,6 @@ void frame_show(ObFrame *self)
     if (!self->visible) {
         self->visible = TRUE;
         XMapWindow(ob_display, self->client->window);
-        XMapWindow(ob_display, self->plate);
         XMapWindow(ob_display, self->window);
     }
 }
@@ -262,10 +261,6 @@ void frame_hide(ObFrame *self)
         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);
@@ -358,6 +353,11 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
         } 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,
@@ -748,6 +748,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
     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)
index c566a908046c5e5a10547ef549a5bdf5ef978905..08b2d74036dc663f625d3b77be2eb2f8004df586 100644 (file)
@@ -368,6 +368,7 @@ void screen_startup(gboolean reconfig)
     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) &&
@@ -380,6 +381,7 @@ void screen_startup(gboolean reconfig)
     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;
@@ -506,13 +508,13 @@ void screen_set_desktop(guint num, gboolean dofocus)
      
     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);
@@ -530,13 +532,18 @@ void screen_set_desktop(guint num, gboolean dofocus)
         }
     }
 
+    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.. */
@@ -931,7 +938,7 @@ void screen_update_desktop_names()
         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
index 2b6eb228632cc68429d47b30558d3848d1d83f0b..443fe0fe0991d52ffbe013a927365f6802d0ded5 100644 (file)
@@ -30,7 +30,7 @@
 #
 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"
index fc3a414a1cd518f56cad93a7756a42cfd69315b2..7ab707157a76a47f303fa9e33b385aa7353269b6 100644 (file)
@@ -27,7 +27,7 @@
 #
 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"
diff --git a/tests/big.c b/tests/big.c
new file mode 100644 (file)
index 0000000..b1bdf67
--- /dev/null
@@ -0,0 +1,68 @@
+/* -*- 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;
+}