Skip to content
Browse files

make undecorated windows place according to their undecorated state (…

…bug #5179)

splits client_setup_decor_and_functions() into 3 functions.

1. add client_setup_default_decor_and_functions()
- called from client_get_all() to get the maximum decor/functions that will
  be available for use by the client.
2. add client_setup_decor_undecorated()
- sets up the client's undecorarted decor if the flag is set by the per-app
  settings or session state.
- we do this before setting up the frame so the frame reflects the window as it
  should be when getting placed.
3. client_setup_decor_and_functions()
- calls the above 2 to perform the same functions as before.
- added to client_apply_startup_state() so that we can ensure it was run fully
  at least once in the mapping process, since it is not called in
  client_get_all() anymore.
  • Loading branch information...
1 parent 332280d commit a0d14c7d4468b6348d906a68bb5dfe3acce0ad64 @danakj danakj committed Oct 14, 2011
Showing with 37 additions and 15 deletions.
  1. +37 −15 openbox/client.c
View
52 openbox/client.c
@@ -112,6 +112,8 @@ static gboolean client_can_steal_focus(ObClient *self,
gboolean allow_other_desktop,
gboolean request_from_user,
Time steal_time, Time launch_time);
+static void client_setup_default_decor_and_functions(ObClient *self);
+static void client_setup_decor_undecorated(ObClient *self);
void client_startup(gboolean reconfig)
{
@@ -238,6 +240,18 @@ void client_manage(Window window, ObPrompt *prompt)
that needs to be freed with g_free(). */
settings = client_get_settings_state(self);
+ /* the session should get the last say though */
+ client_restore_session_state(self);
+
+ /* the per-app settings/session may have changed the decorations for
+ the window, so we setup decorations for that here. this is a special
+ case because we want to place the window according to these decoration
+ changes.
+ we do this before setting up the frame so that it will reflect the
+ decorations of the window as it will be placed on screen.
+ */
+ client_setup_decor_undecorated(self);
+
/* specify that if we exit, the window should not be destroyed and
should be reparented back to root automatically, unless we are managing
an internal ObPrompt window */
@@ -253,9 +267,6 @@ void client_manage(Window window, ObPrompt *prompt)
time now */
grab_server(FALSE);
- /* the session should get the last say though */
- client_restore_session_state(self);
-
/* this needs to occur once we have a frame, since it sets a property on
the frame */
client_update_opacity(self);
@@ -1177,11 +1188,8 @@ static void client_get_all(ObClient *self, gboolean real)
client_get_type_and_transientness(self);
client_update_normal_hints(self);
- /* set up the decor/functions before getting the state. the states may
- affect which functions are available, but we want to know the maximum
- decor/functions are available to this window, so we can then apply them
- in client_apply_startup_state() */
- client_setup_decor_and_functions(self, FALSE);
+ /* set up the maximum possible decor/functions */
+ client_setup_default_decor_and_functions(self);
client_get_state(self);
@@ -1735,7 +1743,7 @@ void client_update_normal_hints(ObClient *self)
ob_debug("Normal hints: not set");
}
-void client_setup_decor_and_functions(ObClient *self, gboolean reconfig)
+static void client_setup_default_decor_and_functions(ObClient *self)
{
/* start with everything (cept fullscreen) */
self->decorations =
@@ -1868,6 +1876,23 @@ void client_setup_decor_and_functions(ObClient *self, gboolean reconfig)
self->functions &= ~OB_CLIENT_FUNC_MAXIMIZE;
self->decorations &= ~OB_FRAME_DECOR_MAXIMIZE;
}
+}
+
+/*! Set up decor for a client based on its undecorated state. */
+static void client_setup_decor_undecorated(ObClient *self)
+{
+ /* If the user requested no decorations, then remove all the decorations,
+ except the border. But don't add a border if there wasn't one. */
+ if (self->undecorated)
+ self->decorations &= (config_theme_keepborder ?
+ OB_FRAME_DECOR_BORDER : 0);
+}
+
+void client_setup_decor_and_functions(ObClient *self, gboolean reconfig)
+{
+ client_setup_default_decor_and_functions(self);
+
+ client_setup_decor_undecorated(self);
if (self->max_horz && self->max_vert) {
/* once upon a time you couldn't resize maximized windows, that is not
@@ -1877,12 +1902,6 @@ void client_setup_decor_and_functions(ObClient *self, gboolean reconfig)
self->decorations &= ~(OB_FRAME_DECOR_HANDLE | OB_FRAME_DECOR_GRIPS);
}
- /* finally, the user can have requested no decorations, which overrides
- everything (but doesnt give it a border if it doesnt have one) */
- if (self->undecorated)
- self->decorations &= (config_theme_keepborder ?
- OB_FRAME_DECOR_BORDER : 0);
-
/* if we don't have a titlebar, then we cannot shade! */
if (!(self->decorations & OB_FRAME_DECOR_TITLEBAR))
self->functions &= ~OB_CLIENT_FUNC_SHADE;
@@ -2814,6 +2833,9 @@ static void client_apply_startup_state(ObClient *self,
if (fullscreen)
client_fullscreen(self, TRUE);
+ /* make sure client_setup_decor_and_functions() is called at least once */
+ client_setup_decor_and_functions(self, FALSE);
+
/* if the window hasn't been configured yet, then do so now, in fact the
x,y,w,h may _not_ be the same as the area rect, which can end up
meaning that the client isn't properly moved/resized by the fullscreen

0 comments on commit a0d14c7

Please sign in to comment.
Something went wrong with that request. Please try again.