]> Dogcows Code - chaz/openbox/commitdiff
Merge branch 'backport' into work
authorDana Jansens <danakj@orodu.net>
Sat, 12 Dec 2009 00:02:11 +0000 (19:02 -0500)
committerDana Jansens <danakj@orodu.net>
Sat, 12 Dec 2009 00:02:11 +0000 (19:02 -0500)
Conflicts:
openbox/config.c
openbox/event.c
openbox/prop.c
openbox/prop.h
openbox/screen.c
openbox/screen.h

33 files changed:
Makefile.am
data/menu.xml
data/openbox.desktop [new file with mode: 0644]
data/rc.xml
data/xsession/openbox-gnome-session.in
data/xsession/openbox-kde-session.in
data/xsession/openbox-session.in
obt/prop.c
obt/prop.h
openbox/actions/focus.c
openbox/client.c
openbox/client.h
openbox/client_list_combined_menu.c
openbox/client_list_menu.c
openbox/config.c
openbox/config.h
openbox/event.c
openbox/focus.c
openbox/focus.h
openbox/focus_cycle.c
openbox/focus_cycle_popup.c
openbox/frame.c
openbox/keyboard.c
openbox/openbox.c
openbox/place.c
openbox/screen.c
openbox/screen.h
openbox/stacking.c
po/POTFILES.in
render/image.c
render/render.c
tests/skiptaskbar.c
tools/xdg-autostart/xdg-autostart

index c72a40b3d2c3e63d022470e419faef34ed3c33e5..786b97b0cb44f5a1e4d318d07bdbc2d7d46155db 100644 (file)
@@ -13,6 +13,7 @@ rrpubincludedir = $(includedir)/openbox/@RR_VERSION@/render
 pixmapdir       = $(datadir)/pixmaps
 xsddir          = $(datadir)/openbox
 secretbindir    = $(libdir)/openbox
+appsdir         = $(datadir)/applications
 
 theme = Clearlooks
 
@@ -423,6 +424,9 @@ nodist_pkgconfig_DATA = \
 
 ## data ##
 
+dist_apps_DATA = \
+       data/openbox.desktop
+
 dist_pixmap_DATA = \
        data/openbox.png
 
index 61fba66437cd7efa76eb452c23d6abf0d6f28d7d..39da04d617a2eeac4af6df63b1a0c875b3f4cc49 100644 (file)
   <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">
   <menu id="system-menu"/>
   <separator />
   <item label="Log Out">
-    <action name="SessionLogout">
+    <action name="Exit">
       <prompt>yes</prompt>
     </action>
   </item>
diff --git a/data/openbox.desktop b/data/openbox.desktop
new file mode 100644 (file)
index 0000000..9c19e67
--- /dev/null
@@ -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
index f223f67889522ec7894268f8fc7919d5e41960f7..4e96305dbf63cacf65fc293989c1ef1bb09ec25e 100644 (file)
   <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>
index 278ac6a8ed5a42aa55d1caaa3aef5ab913d40a84..de46bec534476029cb6567e269bb5c9e7cc80345 100644 (file)
@@ -7,6 +7,54 @@ if test -n "$1"; then
   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
+
+
+
index 160172605b06e160120fda8133ab59fe52ec4389..5299b0456dee6b66858724e409024f514fc61372 100644 (file)
@@ -7,6 +7,11 @@ if test -n "$1"; then
   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 "$@"
index 259dc580cd594331b4dce946995fa3aaba3c0bcd..fa1bb99693a96654945825845488681b12d1f31e 100644 (file)
@@ -7,13 +7,18 @@ if test -n "$1"; then
   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
index 185bf5374eaa99d3d7362c56307fb871db262be0..f4c8db17a7cbe466028d0f0596de385a49663c96 100644 (file)
@@ -190,6 +190,9 @@ void obt_prop_startup(void)
     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)
index ae22b6fd65258a880af715f1cb08fee4cbf986c3..52c1de1eee68b89f56e4d515939ee074be5f13f3 100644 (file)
@@ -211,6 +211,9 @@ typedef enum {
     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;
index 4d0f220d1320dcc9ada4b8546d26c2aee35ec498..e25a79eac09b6b653d7ec21e4b3986339202603e 100644 (file)
@@ -2,6 +2,7 @@
 #include "openbox/event.h"
 #include "openbox/client.h"
 #include "openbox/focus.h"
+#include "openbox/screen.h"
 
 typedef struct {
     gboolean here;
@@ -44,7 +45,7 @@ static gboolean run_func(ObActionsData *data, gpointer options)
              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) {
index 50a0dbeee956fc743e8a0423f75598ed5d4140e6..184ae171e8d2b50a0fee2f1a64391cd36eb6a81a 100644 (file)
@@ -75,6 +75,7 @@ static RrImage *client_default_icon     = NULL;
 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 @@ void client_manage(Window window, ObPrompt *prompt)
         (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 @@ static void client_get_all(ObClient *self, gboolean real)
     /* 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 @@ void client_update_strut(ObClient *self)
         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 @@ static void client_get_session_ids(ObClient *self)
     }
 }
 
+/*! 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 @@ static void client_present(ObClient *self, gboolean here, gboolean raise,
 }
 
 /* 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 @@ void client_activate(ObClient *self, gboolean desktop, gboolean raise,
                   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 @@ void client_find_edge_directional(ObClient *self, ObDirection dir,
                                   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 @@ void client_find_edge_directional(ObClient *self, ObDirection dir,
     *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 @@ void client_find_edge_directional(ObClient *self, ObDirection dir,
     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,
index 30cab17b31f70988981f413805760814d98ca5a8..8126abe2d2fa76bb9c701d7fb09ff38b6c871b0b 100644 (file)
@@ -575,13 +575,16 @@ gboolean client_focus(ObClient *self);
   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. */
index ad23cd4886d04581c45a9fbc1f51a1c1eced43ec..593010ebf5fd4691d50570e97cd31818bfab9ec9 100644 (file)
@@ -114,7 +114,7 @@ static void menu_execute(ObMenuEntry *self, ObMenuFrame *f,
     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)
index ca4534baec1c1c3db96c410af0e872954805475c..2e87259befef7828d6ef5e1e6d6d2352469e0c3a 100644 (file)
@@ -101,7 +101,7 @@ static void desk_menu_execute(ObMenuEntry *self, ObMenuFrame *f,
 {
     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)
index 5c0691ca93d01857393b4493c1206f4d0eae67a5..0d28be2cb8d1568f59559249478fee2e89040c68 100644 (file)
@@ -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 @@ static void parse_mouse(xmlNodePtr node, gpointer d)
         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 @@ static void parse_placement(xmlNodePtr node, gpointer d)
         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)
@@ -918,6 +933,9 @@ void config_startup(ObtParseInst *i)
     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);
 
     STRUT_PARTIAL_SET(config_margins, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
index 248f97b36279fac14d73c5e8da65001039aab405..d9e897a16c18e2ccb155dc3ca7d501b7e2e07fee 100644 (file)
@@ -82,6 +82,12 @@ extern gboolean config_place_center;
   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;
 
index 4ddb7ac75c906b6a41c9b19c173c355916d84932..04c6a7c6914f1d371dd9d5fd99a36ab1be38aef5 100644 (file)
@@ -1282,7 +1282,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
                                        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 @@ static void event_handle_client(ObClient *client, XEvent *e)
                 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)) {
index fc0fd99bac47c560ce05de3fe114b25d407b675a..a75c170f649e72bf62c07456e603742e976e1229 100644 (file)
@@ -129,7 +129,7 @@ static ObClient* focus_fallback_target(gboolean allow_refocus,
            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 @@ static ObClient* focus_fallback_target(gboolean allow_refocus,
            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 @@ ObClient* focus_fallback(gboolean allow_refocus, gboolean allow_pointer,
 
 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 @@ static gboolean focus_target_has_siblings(ObClient *ft,
         /* 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 focus_valid_target(ObClient *ft,
                             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 @@ gboolean focus_valid_target(ObClient *ft,
                !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 @@ gboolean focus_valid_target(ObClient *ft,
                                                      iconic_windows,
                                                      all_desktops,
                                                      dock_windows,
-                                                     desktop_windows));
+                                                     desktop_windows,
+                                                     FALSE));
     }
 
     return ok;
index 4f37b7281fce234a4850b0967a9f2efa4f1b14dc..80ce3a38728dcfd29586e190336da1690eeb52de 100644 (file)
@@ -69,6 +69,7 @@ gboolean focus_valid_target(struct _ObClient *ft,
                             gboolean iconic_windows,
                             gboolean all_desktops,
                             gboolean dock_windows,
-                            gboolean desktop_windows);
+                            gboolean desktop_windows,
+                            gboolean user_request);
 
 #endif
index 063de6447bfa3b5f44d9483a752e1ac768764888..d5654b3d1e627f3dedbf3582b2255e408d11cf38 100644 (file)
@@ -59,7 +59,8 @@ void focus_cycle_stop(ObClient *ifclient)
                            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 @@ ObClient* focus_cycle(gboolean forward, gboolean all_desktops,
                                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 @@ static ObClient *focus_find_directional(ObClient *c, ObDirection dir,
         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 @@ ObClient* focus_directional_cycle(ObDirection dir, gboolean dock_windows,
                                    focus_cycle_iconic_windows,
                                    focus_cycle_all_desktops,
                                    focus_cycle_dock_windows,
-                                   focus_cycle_desktop_windows))
+                                   focus_cycle_desktop_windows, FALSE))
                 ft = it->data;
     }
 
index a60534add5bfb0c798215fdc46aabf2e5c730723..2ad786c06eb0c1c671dda1a4c86f0b55447d7fba 100644 (file)
@@ -263,7 +263,8 @@ static void popup_setup(ObFocusCyclePopup *p, gboolean create_targets,
                                iconic_windows,
                                all_desktops,
                                dock_windows,
-                               desktop_windows))
+                               desktop_windows,
+                               FALSE))
         {
             gchar *text = popup_get_name(ft);
 
@@ -350,7 +351,7 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c)
     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 @@ void focus_cycle_popup_single_show(struct _ObClient *c,
         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);
index 72eab32bff10c1198d5d595f5a3afb560c20ee17..6387d7ef113528e44decc1ba1718fd1bb8c2b249 100644 (file)
@@ -21,6 +21,7 @@
 #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 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
 
         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_state(ObFrame *self)
 
 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);
index 410eb6e0aaa139bd66967afb6ffae8414a75dafa..ade18d04c6d52a8e72735155e36c811753dff233 100644 (file)
@@ -89,7 +89,7 @@ static void set_curpos(KeyBindingTree *newpos)
             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);
index e912c64c02c6f42e7553796ce3f6a49fdeac5664..29506c00b74b681b671a65b7502450e3781a6c1a 100644 (file)
@@ -546,8 +546,21 @@ static void remove_args(gint *argc, gchar **argv, gint index, gint num)
 
 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)
index aac40e8a099249c0620e7513269f556b766c56d8..ee8bf7ebc1d139241e51097b19c571297469cabe 100644 (file)
@@ -43,20 +43,7 @@ static void add_choice(guint *choice, guint mychoice)
 
 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. */
index b53671fabbaad8889c8f6cbf04e74c78963818c0..8012942beb65a09ebfe0c88d32cab8010995edce 100644 (file)
@@ -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 @@ gboolean screen_annex(void)
     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 @@ void screen_startup(gboolean reconfig)
     guint32 d;
     gboolean namesexist = FALSE;
 
-    if (reconfig) {
-        guint i;
-
-        /* 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);
-        }
+    desktop_popup = pager_popup_new();
+    pager_popup_height(desktop_popup, POPUP_HEIGHT);
 
+    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_startup(gboolean reconfig)
 
 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 @@ void screen_resize(void)
     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 @@ void screen_set_desktop(guint num, gboolean dofocus)
         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 guint translate_row_col(guint r, guint c)
 
 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);
-
-        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);
-    }
+    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,
+                              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 @@ void screen_update_desktop_names(void)
     }
 
     /* 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 @@ static void get_xinerama_screens(Rect **xin_areas, guint *nxin)
 
 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 @@ gboolean screen_physical_area_monitor_contains(guint head, Rect *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)
@@ -1776,6 +1753,17 @@ void screen_set_root_cursor(void)
                       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)
 {
     Window w;
index 11915f11a78e4cc7d420a0bee1c79211af432365..1479db16a38dee947174497a53317231e68b1149 100644 (file)
@@ -104,8 +104,17 @@ 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 */
 #define SCREEN_AREA_ALL_MONITORS ((unsigned)-1)
@@ -133,4 +142,7 @@ void screen_set_root_cursor(void);
   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
index 2a34f71dc4eea10305c1037a0ae24b64d9d4025b..cb710e5e0f8940a4be76fba10058be00623b4028 100644 (file)
@@ -218,6 +218,7 @@ static void restack_windows(ObClient *selected, gboolean raise)
     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 @@ static void restack_windows(ObClient *selected, gboolean raise)
 
                 /* 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 @@ static void restack_windows(ObClient *selected, gboolean raise)
                         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 @@ static void restack_windows(ObClient *selected, gboolean raise)
         }
     }
 
-    /* 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 */
index 9bd4f66a9cae0f8966ac725224bca4fc9c2c5a61..200e9ca31ef74786f8c22244af7628992c8b0b57 100644 (file)
@@ -2,7 +2,6 @@
 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
index fc30714e8f9a7fb13ab97f55c8bed6f4b9ab4ab8..79f47fe280829c6ad3a5d07f6f9846e38885f922 100644 (file)
@@ -221,7 +221,7 @@ static RrImagePic* ResizeImage(RrPixel32 *src,
     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 @@ void RrImageDrawImage(RrPixel32 *target, RrTextureImage *img,
     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 @@ void RrImageDrawImage(RrPixel32 *target, RrTextureImage *img,
 
     /* 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;
index 7c00c1462509496fde0b99969748605889f0c04d..20002e32773c3a25b19267724ff47372da64f33f 100644 (file)
@@ -135,12 +135,14 @@ Pixmap RrPaintPixmap(RrAppearance *a, gint w, gint h)
             {
                 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 @@ Pixmap RrPaintPixmap(RrAppearance *a, gint w, gint h)
             {
                 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,
index 1b2461603f61b3487420eae535c580e76e8683a3..bb585c6eafacef1cfa9f1bc6f3cd76d7f1e287a1 100644 (file)
@@ -26,6 +26,7 @@ int main () {
   Window     win;
   XEvent     report;
   Atom       state, skip;
+  XClassHint classhint;
   int        x=10,y=10,h=400,w=400;
 
   display = XOpenDisplay(NULL);
@@ -47,6 +48,10 @@ int main () {
   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);
 
index 64f26dc82a5d7f5c181f481d9c19d8291e361d1e..4a53382669443bd0dce7065899925e8c42f49a5b 100755 (executable)
@@ -80,7 +80,7 @@ class AutostartFile:
     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):
This page took 0.065227 seconds and 4 git commands to generate.