From c234ed9ecd9d5228744aae018768ff0c04f2d217 Mon Sep 17 00:00:00 2001
From: Mikael Magnusson <mikachu@comhem.se>
Date: Mon, 21 Aug 2006 20:39:42 +0000
Subject: [PATCH] maybe fix transients placed offscreen under certain
 conditions

---
 openbox/client.c | 12 +++++++-----
 openbox/place.c  | 19 +++++++++++--------
 openbox/place.h  |  3 ++-
 3 files changed, 20 insertions(+), 14 deletions(-)

diff --git a/openbox/client.c b/openbox/client.c
index e80b84f1..7efc0e94 100644
--- a/openbox/client.c
+++ b/openbox/client.c
@@ -415,8 +415,9 @@ void client_manage(Window window)
     if (ob_state() == OB_STATE_RUNNING) {
         gint x = self->area.x, ox = x;
         gint y = self->area.y, oy = y;
+        gboolean transient;
 
-        place_client(self, &x, &y, settings);
+        transient = place_client(self, &x, &y, settings);
 
         /* make sure the window is visible. */
         client_find_onscreen(self, &x, &y,
@@ -432,10 +433,11 @@ void client_manage(Window window)
                                 off-screen and on xinerama divides (ie,
                                 it is up to the placement routines to avoid
                                 the xinerama divides) */
-                             ((self->positioned & PPosition) &&
-                              !(self->positioned & USPosition)) &&
-                             client_normal(self) &&
-                             !self->session);
+                             transient ||
+                             (((self->positioned & PPosition) &&
+                               !(self->positioned & USPosition)) &&
+                              client_normal(self) &&
+                              !self->session));
         if (x != ox || y != oy) 	 
             client_move(self, x, y);
     }
diff --git a/openbox/place.c b/openbox/place.c
index 95763d06..a76086e0 100644
--- a/openbox/place.c
+++ b/openbox/place.c
@@ -412,21 +412,24 @@ static gboolean place_transient(ObClient *client, gint *x, gint *y)
     return FALSE;
 }
 
-void place_client(ObClient *client, gint *x, gint *y, ObAppSettings *settings)
+/* Return TRUE if we want client.c to enforce on-screen-keeping */
+gboolean place_client(ObClient *client, gint *x, gint *y, ObAppSettings *settings)
 {
+    gboolean ret = FALSE;
     if (client->positioned)
-        return;
-    if (place_transient(client, x, y)             ||
+        return FALSE;
+    if (place_transient(client, x, y))
+        ret = TRUE;;
+    else if (!(
         place_per_app_setting(client, x, y, settings) ||
         ((config_place_policy == OB_PLACE_POLICY_MOUSE) ?
          place_under_mouse(client, x, y) :
          place_smart(client, x, y, SMART_FULL)    ||
          place_smart(client, x, y, SMART_GROUP)   ||
          place_smart(client, x, y, SMART_FOCUSED) ||
-         place_random(client, x, y)))
-    {
-        /* get where the client should be */
-        frame_frame_gravity(client->frame, x, y);
-    } else
+         place_random(client, x, y))))
         g_assert_not_reached(); /* the last one better succeed */
+    /* get where the client should be */
+    frame_frame_gravity(client->frame, x, y);
+    return ret;
 }
diff --git a/openbox/place.h b/openbox/place.h
index e4ac2deb..dd8831b7 100644
--- a/openbox/place.h
+++ b/openbox/place.h
@@ -30,6 +30,7 @@ typedef enum
     OB_PLACE_POLICY_MOUSE
 } ObPlacePolicy;
 
-void place_client(struct _ObClient *client, gint *x, gint *y, struct _ObAppSettings *settings);
+gboolean place_client(struct _ObClient *client, gint *x, gint *y,
+                      struct _ObAppSettings *settings);
 
 #endif