Adding debian version 3.5.0-4.
[debian/openbox.git] / debian / patches / 666676_wrong_undecorated_window_placement.patch
1 From: Dana Jansens <danakj@orodu.net>
2 Date: Fri, 14 Oct 2011 22:54:32 +0000 (-0400)
3 Subject: make undecorated windows place according to their undecorated state (bug #5179)
4 X-Git-Url: http://git.openbox.org/?p=dana%2Fopenbox.git;a=commitdiff_plain;h=a0d14c7d4468b6348d906a68bb5dfe3acce0ad64;hp=332280daf9a4bc410544ae7d267092a11ab8c945
5
6 make undecorated windows place according to their undecorated state (bug #5179)
7
8 splits client_setup_decor_and_functions() into 3 functions.
9
10 1. add client_setup_default_decor_and_functions()
11 - called from client_get_all() to get the maximum decor/functions that will
12   be available for use by the client.
13 2. add client_setup_decor_undecorated()
14 - sets up the client's undecorarted decor if the flag is set by the per-app
15   settings or session state.
16 - we do this before setting up the frame so the frame reflects the window as it
17   should be when getting placed.
18 3. client_setup_decor_and_functions()
19 - calls the above 2 to perform the same functions as before.
20 - added to client_apply_startup_state() so that we can ensure it was run fully
21   at least once in the mapping process, since it is not called in
22   client_get_all() anymore.
23
24 --- openbox-3.5.0.orig/openbox/client.c
25 +++ openbox-3.5.0/openbox/client.c
26 @@ -112,6 +112,8 @@ static gboolean client_can_steal_focus(O
27                                         gboolean allow_other_desktop,
28                                         gboolean request_from_user,
29                                         Time steal_time, Time launch_time);
30 +static void client_setup_default_decor_and_functions(ObClient *self);
31 +static void client_setup_decor_undecorated(ObClient *self);
32  
33  void client_startup(gboolean reconfig)
34  {
35 @@ -238,6 +240,18 @@ void client_manage(Window window, ObProm
36         that needs to be freed with g_free(). */
37      settings = client_get_settings_state(self);
38  
39 +    /* the session should get the last say though */
40 +    client_restore_session_state(self);
41 +
42 +    /* the per-app settings/session may have changed the decorations for
43 +       the window, so we setup decorations for that here.  this is a special
44 +       case because we want to place the window according to these decoration
45 +       changes.
46 +       we do this before setting up the frame so that it will reflect the
47 +       decorations of the window as it will be placed on screen.
48 +    */
49 +    client_setup_decor_undecorated(self);
50 +
51      /* specify that if we exit, the window should not be destroyed and
52         should be reparented back to root automatically, unless we are managing
53         an internal ObPrompt window  */
54 @@ -253,9 +267,6 @@ void client_manage(Window window, ObProm
55         time now */
56      grab_server(FALSE);
57  
58 -    /* the session should get the last say though */
59 -    client_restore_session_state(self);
60 -
61      /* tell startup notification that this app started */
62      launch_time = sn_app_started(self->startup_id, self->class, self->name);
63  
64 @@ -1156,11 +1167,8 @@ static void client_get_all(ObClient *sel
65      client_get_type_and_transientness(self);
66      client_update_normal_hints(self);
67  
68 -    /* set up the decor/functions before getting the state.  the states may
69 -       affect which functions are available, but we want to know the maximum
70 -       decor/functions are available to this window, so we can then apply them
71 -       in client_apply_startup_state() */
72 -    client_setup_decor_and_functions(self, FALSE);
73 +    /* set up the maximum possible decor/functions */
74 +    client_setup_default_decor_and_functions(self);
75  
76      client_get_state(self);
77  
78 @@ -1704,7 +1712,7 @@ void client_update_normal_hints(ObClient
79          ob_debug("Normal hints: not set");
80  }
81  
82 -void client_setup_decor_and_functions(ObClient *self, gboolean reconfig)
83 +static void client_setup_default_decor_and_functions(ObClient *self)
84  {
85      /* start with everything (cept fullscreen) */
86      self->decorations =
87 @@ -1837,6 +1845,23 @@ void client_setup_decor_and_functions(Ob
88          self->functions &= ~OB_CLIENT_FUNC_MAXIMIZE;
89          self->decorations &= ~OB_FRAME_DECOR_MAXIMIZE;
90      }
91 +}
92 +
93 +/*! Set up decor for a client based on its undecorated state. */
94 +static void client_setup_decor_undecorated(ObClient *self)
95 +{
96 +    /* If the user requested no decorations, then remove all the decorations,
97 +       except the border.  But don't add a border if there wasn't one. */
98 +    if (self->undecorated)
99 +        self->decorations &= (config_theme_keepborder ?
100 +                              OB_FRAME_DECOR_BORDER : 0);
101 +}
102 +
103 +void client_setup_decor_and_functions(ObClient *self, gboolean reconfig)
104 +{
105 +    client_setup_default_decor_and_functions(self);
106 +
107 +    client_setup_decor_undecorated(self);
108  
109      if (self->max_horz && self->max_vert) {
110          /* once upon a time you couldn't resize maximized windows, that is not
111 @@ -1846,12 +1871,6 @@ void client_setup_decor_and_functions(Ob
112          self->decorations &= ~(OB_FRAME_DECOR_HANDLE | OB_FRAME_DECOR_GRIPS);
113      }
114  
115 -    /* finally, the user can have requested no decorations, which overrides
116 -       everything (but doesnt give it a border if it doesnt have one) */
117 -    if (self->undecorated)
118 -        self->decorations &= (config_theme_keepborder ?
119 -                              OB_FRAME_DECOR_BORDER : 0);
120 -
121      /* if we don't have a titlebar, then we cannot shade! */
122      if (!(self->decorations & OB_FRAME_DECOR_TITLEBAR))
123          self->functions &= ~OB_CLIENT_FUNC_SHADE;
124 @@ -2783,6 +2802,9 @@ static void client_apply_startup_state(O
125      if (fullscreen)
126          client_fullscreen(self, TRUE);
127  
128 +    /* make sure client_setup_decor_and_functions() is called at least once */
129 +    client_setup_decor_and_functions(self, FALSE);
130 +
131      /* if the window hasn't been configured yet, then do so now, in fact the
132         x,y,w,h may _not_ be the same as the area rect, which can end up
133         meaning that the client isn't properly moved/resized by the fullscreen