diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | nls/fluxbox-nls.hh | 3 | ||||
-rw-r--r-- | src/CurrentWindowCmd.cc | 2 | ||||
-rw-r--r-- | src/Ewmh.cc | 10 | ||||
-rw-r--r-- | src/Remember.cc | 99 | ||||
-rw-r--r-- | src/Remember.hh | 23 | ||||
-rw-r--r-- | src/Screen.cc | 14 | ||||
-rw-r--r-- | src/Screen.hh | 3 | ||||
-rw-r--r-- | src/Window.cc | 135 | ||||
-rw-r--r-- | src/Window.hh | 6 |
10 files changed, 222 insertions, 80 deletions
@@ -1,6 +1,13 @@ | |||
1 | (Format: Year/Month/Day) | 1 | (Format: Year/Month/Day) |
2 | Changes for 1.0.1: | 2 | Changes for 1.0.1: |
3 | *07/10/23: | 3 | *07/10/23: |
4 | * Support remembering maximized, minimized, and fullscreen state (Mark) | ||
5 | - [Maximized] {yes|no|horz|vert} | ||
6 | - [Minimized] {yes|no} | ||
7 | - [Fullscreen] {yes|no} | ||
8 | - also fixed window placement when remembering head but not position | ||
9 | Window.cc/hh Remember.cc/hh Screen.cc/hh Ewmh.cc fluxbox-nls.hh | ||
10 | CurrentWindowCmd.cc | ||
4 | * Allow negated patterns, e.g. (name!=xterm) (Mark) | 11 | * Allow negated patterns, e.g. (name!=xterm) (Mark) |
5 | ClientPattern.cc/hh | 12 | ClientPattern.cc/hh |
6 | *07/10/22: | 13 | *07/10/22: |
diff --git a/nls/fluxbox-nls.hh b/nls/fluxbox-nls.hh index 3aa4480..e337125 100644 --- a/nls/fluxbox-nls.hh +++ b/nls/fluxbox-nls.hh | |||
@@ -153,6 +153,9 @@ enum { | |||
153 | RememberWorkspace = 11, | 153 | RememberWorkspace = 11, |
154 | RememberHead = 12, | 154 | RememberHead = 12, |
155 | RememberAlpha = 13, | 155 | RememberAlpha = 13, |
156 | RememberMinimized = 14, | ||
157 | RememberMaximized = 15, | ||
158 | RememberFullscreen = 16, | ||
156 | 159 | ||
157 | ScreenSet = 12, | 160 | ScreenSet = 12, |
158 | ScreenAnotherWMRunning = 1, | 161 | ScreenAnotherWMRunning = 1, |
diff --git a/src/CurrentWindowCmd.cc b/src/CurrentWindowCmd.cc index 885f4b0..929be5d 100644 --- a/src/CurrentWindowCmd.cc +++ b/src/CurrentWindowCmd.cc | |||
@@ -57,7 +57,7 @@ void CurrentWindowCmd::real_execute() { | |||
57 | } | 57 | } |
58 | 58 | ||
59 | void SetHeadCmd::real_execute() { | 59 | void SetHeadCmd::real_execute() { |
60 | fbwindow().screen().setOnHead(fbwindow(), m_head); | 60 | fbwindow().setOnHead(m_head); |
61 | } | 61 | } |
62 | 62 | ||
63 | void SendToWorkspaceCmd::real_execute() { | 63 | void SendToWorkspaceCmd::real_execute() { |
diff --git a/src/Ewmh.cc b/src/Ewmh.cc index 7266496..11da267 100644 --- a/src/Ewmh.cc +++ b/src/Ewmh.cc | |||
@@ -1044,13 +1044,11 @@ void Ewmh::setState(FluxboxWindow &win, Atom state, bool value, | |||
1044 | (!value && win.isShaded())) | 1044 | (!value && win.isShaded())) |
1045 | win.shade(); | 1045 | win.shade(); |
1046 | } else if (state == m_net_wm_state_maximized_horz ) { // maximized Horizontal | 1046 | } else if (state == m_net_wm_state_maximized_horz ) { // maximized Horizontal |
1047 | if ((value && !win.isMaximized()) || | 1047 | if (value ^ win.isMaximizedHorz()) |
1048 | (!value && win.isMaximized())) | 1048 | win.maximizeHorizontal(); |
1049 | win.maximizeHorizontal(); | ||
1050 | } else if (state == m_net_wm_state_maximized_vert) { // maximized Vertical | 1049 | } else if (state == m_net_wm_state_maximized_vert) { // maximized Vertical |
1051 | if ((value && !win.isMaximized()) || | 1050 | if (value ^ win.isMaximizedVert()) |
1052 | (!value && win.isMaximized())) | 1051 | win.maximizeVertical(); |
1053 | win.maximizeVertical(); | ||
1054 | } else if (state == m_net_wm_state_fullscreen) { // fullscreen | 1052 | } else if (state == m_net_wm_state_fullscreen) { // fullscreen |
1055 | if ((value && !win.isFullscreen()) || | 1053 | if ((value && !win.isFullscreen()) || |
1056 | (!value && win.isFullscreen())) | 1054 | (!value && win.isFullscreen())) |
diff --git a/src/Remember.cc b/src/Remember.cc index d8f1d83..41f91c4 100644 --- a/src/Remember.cc +++ b/src/Remember.cc | |||
@@ -173,6 +173,12 @@ FbTk::Menu *createRememberMenu(BScreen &screen) { | |||
173 | Remember::REM_DECOSTATE)); | 173 | Remember::REM_DECOSTATE)); |
174 | menu->insert(new RememberMenuItem(_FB_XTEXT(Remember, Shaded, "Shaded", "Remember shaded"), | 174 | menu->insert(new RememberMenuItem(_FB_XTEXT(Remember, Shaded, "Shaded", "Remember shaded"), |
175 | Remember::REM_SHADEDSTATE)); | 175 | Remember::REM_SHADEDSTATE)); |
176 | menu->insert(new RememberMenuItem(_FB_XTEXT(Remember, Minimized, "Minimized", "Remember minimized"), | ||
177 | Remember::REM_MINIMIZEDSTATE)); | ||
178 | menu->insert(new RememberMenuItem(_FB_XTEXT(Remember, Maximized, "Maximized", "Remember maximized"), | ||
179 | Remember::REM_MAXIMIZEDSTATE)); | ||
180 | menu->insert(new RememberMenuItem(_FB_XTEXT(Remember, Fullscreen, "Fullscreen", "Remember fullscreen"), | ||
181 | Remember::REM_FULLSCREENSTATE)); | ||
176 | if (FbTk::Transparent::haveComposite() | 182 | if (FbTk::Transparent::haveComposite() |
177 | || FbTk::Transparent::haveRender()) | 183 | || FbTk::Transparent::haveRender()) |
178 | menu->insert(new RememberMenuItem(_FB_XTEXT(Remember, Alpha, "Transparency", "Remember window tranparency settings"), | 184 | menu->insert(new RememberMenuItem(_FB_XTEXT(Remember, Alpha, "Transparency", "Remember window tranparency settings"), |
@@ -250,6 +256,10 @@ bool handleStartupItem(const string &line, int offset) { | |||
250 | Application::Application(bool grouped, ClientPattern *pat) | 256 | Application::Application(bool grouped, ClientPattern *pat) |
251 | : is_grouped(grouped), group_pattern(pat) | 257 | : is_grouped(grouped), group_pattern(pat) |
252 | { | 258 | { |
259 | reset(); | ||
260 | } | ||
261 | |||
262 | void Application::reset() { | ||
253 | decostate_remember = | 263 | decostate_remember = |
254 | dimensions_remember = | 264 | dimensions_remember = |
255 | focushiddenstate_remember = | 265 | focushiddenstate_remember = |
@@ -263,6 +273,9 @@ Application::Application(bool grouped, ClientPattern *pat) | |||
263 | workspace_remember = | 273 | workspace_remember = |
264 | head_remember = | 274 | head_remember = |
265 | alpha_remember = | 275 | alpha_remember = |
276 | minimizedstate_remember = | ||
277 | maximizedstate_remember = | ||
278 | fullscreenstate_remember = | ||
266 | save_on_close_remember = false; | 279 | save_on_close_remember = false; |
267 | } | 280 | } |
268 | 281 | ||
@@ -496,6 +509,19 @@ int Remember::parseApp(ifstream &file, Application &app, string *first_line) { | |||
496 | had_error = 1; | 509 | had_error = 1; |
497 | } else if (strcasecmp(str_key.c_str(), "Sticky") == 0) { | 510 | } else if (strcasecmp(str_key.c_str(), "Sticky") == 0) { |
498 | app.rememberStuckstate((strcasecmp(str_label.c_str(), "yes") == 0)); | 511 | app.rememberStuckstate((strcasecmp(str_label.c_str(), "yes") == 0)); |
512 | } else if (strcasecmp(str_key.c_str(), "Minimized") == 0) { | ||
513 | app.rememberMinimizedstate((strcasecmp(str_label.c_str(), "yes") == 0)); | ||
514 | } else if (strcasecmp(str_key.c_str(), "Maximized") == 0) { | ||
515 | if (strcasecmp(str_label.c_str(), "yes") == 0) | ||
516 | app.rememberMaximizedstate(FluxboxWindow::MAX_FULL); | ||
517 | else if (strcasecmp(str_label.c_str(), "horz") == 0) | ||
518 | app.rememberMaximizedstate(FluxboxWindow::MAX_HORZ); | ||
519 | else if (strcasecmp(str_label.c_str(), "vert") == 0) | ||
520 | app.rememberMaximizedstate(FluxboxWindow::MAX_VERT); | ||
521 | else | ||
522 | app.rememberMaximizedstate(FluxboxWindow::MAX_NONE); | ||
523 | } else if (strcasecmp(str_key.c_str(), "Fullscreen") == 0) { | ||
524 | app.rememberFullscreenstate((strcasecmp(str_label.c_str(), "yes") == 0)); | ||
499 | } else if (strcasecmp(str_key.c_str(), "Jump") == 0) { | 525 | } else if (strcasecmp(str_key.c_str(), "Jump") == 0) { |
500 | app.rememberJumpworkspace((strcasecmp(str_label.c_str(), "yes") == 0)); | 526 | app.rememberJumpworkspace((strcasecmp(str_label.c_str(), "yes") == 0)); |
501 | } else if (strcasecmp(str_key.c_str(), "Close") == 0) { | 527 | } else if (strcasecmp(str_key.c_str(), "Close") == 0) { |
@@ -599,7 +625,9 @@ void Remember::reconfigure() { | |||
599 | if (!in_group) { | 625 | if (!in_group) { |
600 | if ((err = pat->error()) == 0) { | 626 | if ((err = pat->error()) == 0) { |
601 | Application *app = findMatchingPatterns(pat, old_pats, false); | 627 | Application *app = findMatchingPatterns(pat, old_pats, false); |
602 | if (!app) | 628 | if (app) |
629 | app->reset(); | ||
630 | else | ||
603 | app = new Application(false); | 631 | app = new Application(false); |
604 | 632 | ||
605 | m_pats->push_back(make_pair(pat, app)); | 633 | m_pats->push_back(make_pair(pat, app)); |
@@ -824,6 +852,30 @@ void Remember::save() { | |||
824 | if (a.stuckstate_remember) { | 852 | if (a.stuckstate_remember) { |
825 | apps_file << " [Sticky]\t{" << ((a.stuckstate)?"yes":"no") << "}" << endl; | 853 | apps_file << " [Sticky]\t{" << ((a.stuckstate)?"yes":"no") << "}" << endl; |
826 | } | 854 | } |
855 | if (a.minimizedstate_remember) { | ||
856 | apps_file << " [Minimized]\t{" << ((a.minimizedstate)?"yes":"no") << "}" << endl; | ||
857 | } | ||
858 | if (a.maximizedstate_remember) { | ||
859 | apps_file << " [Maximized]\t{"; | ||
860 | switch (a.maximizedstate) { | ||
861 | case FluxboxWindow::MAX_FULL: | ||
862 | apps_file << "yes" << "}" << endl; | ||
863 | break; | ||
864 | case FluxboxWindow::MAX_HORZ: | ||
865 | apps_file << "horz" << "}" << endl; | ||
866 | break; | ||
867 | case FluxboxWindow::MAX_VERT: | ||
868 | apps_file << "vert" << "}" << endl; | ||
869 | break; | ||
870 | case FluxboxWindow::MAX_NONE: | ||
871 | default: | ||
872 | apps_file << "no" << "}" << endl; | ||
873 | break; | ||
874 | } | ||
875 | } | ||
876 | if (a.fullscreenstate_remember) { | ||
877 | apps_file << " [Fullscreen]\t{" << ((a.fullscreenstate)?"yes":"no") << "}" << endl; | ||
878 | } | ||
827 | if (a.jumpworkspace_remember) { | 879 | if (a.jumpworkspace_remember) { |
828 | apps_file << " [Jump]\t{" << ((a.jumpworkspace)?"yes":"no") << "}" << endl; | 880 | apps_file << " [Jump]\t{" << ((a.jumpworkspace)?"yes":"no") << "}" << endl; |
829 | } | 881 | } |
@@ -874,6 +926,15 @@ bool Remember::isRemembered(WinClient &winclient, Attribute attrib) { | |||
874 | case REM_STUCKSTATE: | 926 | case REM_STUCKSTATE: |
875 | return app->stuckstate_remember; | 927 | return app->stuckstate_remember; |
876 | break; | 928 | break; |
929 | case REM_MINIMIZEDSTATE: | ||
930 | return app->minimizedstate_remember; | ||
931 | break; | ||
932 | case REM_MAXIMIZEDSTATE: | ||
933 | return app->maximizedstate_remember; | ||
934 | break; | ||
935 | case REM_FULLSCREENSTATE: | ||
936 | return app->fullscreenstate_remember; | ||
937 | break; | ||
877 | case REM_DECOSTATE: | 938 | case REM_DECOSTATE: |
878 | return app->decostate_remember; | 939 | return app->decostate_remember; |
879 | break; | 940 | break; |
@@ -941,6 +1002,15 @@ void Remember::rememberAttrib(WinClient &winclient, Attribute attrib) { | |||
941 | case REM_STUCKSTATE: | 1002 | case REM_STUCKSTATE: |
942 | app->rememberStuckstate(win->isStuck()); | 1003 | app->rememberStuckstate(win->isStuck()); |
943 | break; | 1004 | break; |
1005 | case REM_MINIMIZEDSTATE: | ||
1006 | app->rememberMinimizedstate(win->isIconic()); | ||
1007 | break; | ||
1008 | case REM_MAXIMIZEDSTATE: | ||
1009 | app->rememberMaximizedstate(win->maximizedState()); | ||
1010 | break; | ||
1011 | case REM_FULLSCREENSTATE: | ||
1012 | app->rememberFullscreenstate(win->isFullscreen()); | ||
1013 | break; | ||
944 | case REM_ALPHA: | 1014 | case REM_ALPHA: |
945 | app->rememberAlpha(win->frame().getAlpha(true), win->frame().getAlpha(false)); | 1015 | app->rememberAlpha(win->frame().getAlpha(true), win->frame().getAlpha(false)); |
946 | break; | 1016 | break; |
@@ -992,6 +1062,15 @@ void Remember::forgetAttrib(WinClient &winclient, Attribute attrib) { | |||
992 | case REM_STUCKSTATE: | 1062 | case REM_STUCKSTATE: |
993 | app->forgetStuckstate(); | 1063 | app->forgetStuckstate(); |
994 | break; | 1064 | break; |
1065 | case REM_MINIMIZEDSTATE: | ||
1066 | app->forgetMinimizedstate(); | ||
1067 | break; | ||
1068 | case REM_MAXIMIZEDSTATE: | ||
1069 | app->forgetMaximizedstate(); | ||
1070 | break; | ||
1071 | case REM_FULLSCREENSTATE: | ||
1072 | app->forgetFullscreenstate(); | ||
1073 | break; | ||
995 | case REM_DECOSTATE: | 1074 | case REM_DECOSTATE: |
996 | app->forgetDecostate(); | 1075 | app->forgetDecostate(); |
997 | break; | 1076 | break; |
@@ -1058,7 +1137,7 @@ void Remember::setupFrame(FluxboxWindow &win) { | |||
1058 | } | 1137 | } |
1059 | 1138 | ||
1060 | if (app->head_remember) { | 1139 | if (app->head_remember) { |
1061 | win.screen().setOnHead<FluxboxWindow>(win, app->head); | 1140 | win.setOnHead(app->head); |
1062 | } | 1141 | } |
1063 | 1142 | ||
1064 | if (app->dimensions_remember) | 1143 | if (app->dimensions_remember) |
@@ -1112,6 +1191,22 @@ void Remember::setupFrame(FluxboxWindow &win) { | |||
1112 | !win.isStuck() && app->stuckstate) | 1191 | !win.isStuck() && app->stuckstate) |
1113 | win.stick(); // toggles | 1192 | win.stick(); // toggles |
1114 | 1193 | ||
1194 | if (app->minimizedstate_remember) { | ||
1195 | // if inconsistent... | ||
1196 | // this one doesn't actually work, but I can't imagine needing it | ||
1197 | if (win.isIconic() && !app->minimizedstate) | ||
1198 | win.deiconify(); | ||
1199 | else if (!win.isIconic() && app->minimizedstate) | ||
1200 | win.iconify(); | ||
1201 | } | ||
1202 | |||
1203 | // I can't really test the "no" case of this | ||
1204 | if (app->maximizedstate_remember) | ||
1205 | win.setMaximizedState(app->maximizedstate); | ||
1206 | |||
1207 | // I can't really test the "no" case of this | ||
1208 | if (app->fullscreenstate_remember) | ||
1209 | win.setFullscreen(app->fullscreenstate); | ||
1115 | } | 1210 | } |
1116 | 1211 | ||
1117 | void Remember::setupClient(WinClient &winclient) { | 1212 | void Remember::setupClient(WinClient &winclient) { |
diff --git a/src/Remember.hh b/src/Remember.hh index 7ecf8c2..f34c551 100644 --- a/src/Remember.hh +++ b/src/Remember.hh | |||
@@ -47,6 +47,7 @@ class WinClient; | |||
47 | class Application { | 47 | class Application { |
48 | public: | 48 | public: |
49 | Application(bool grouped, ClientPattern *pat = 0); | 49 | Application(bool grouped, ClientPattern *pat = 0); |
50 | void reset(); | ||
50 | inline void forgetWorkspace() { workspace_remember = false; } | 51 | inline void forgetWorkspace() { workspace_remember = false; } |
51 | inline void forgetHead() { head_remember = false; } | 52 | inline void forgetHead() { head_remember = false; } |
52 | inline void forgetDimensions() { dimensions_remember = false; } | 53 | inline void forgetDimensions() { dimensions_remember = false; } |
@@ -61,6 +62,9 @@ public: | |||
61 | inline void forgetLayer() { layer_remember = false; } | 62 | inline void forgetLayer() { layer_remember = false; } |
62 | inline void forgetSaveOnClose() { save_on_close_remember = false; } | 63 | inline void forgetSaveOnClose() { save_on_close_remember = false; } |
63 | inline void forgetAlpha() { alpha_remember = false; } | 64 | inline void forgetAlpha() { alpha_remember = false; } |
65 | inline void forgetMinimizedstate() { minimizedstate_remember = false; } | ||
66 | inline void forgetMaximizedstate() { maximizedstate_remember = false; } | ||
67 | inline void forgetFullscreenstate() { fullscreenstate_remember = false; } | ||
64 | 68 | ||
65 | inline void rememberWorkspace(int ws) | 69 | inline void rememberWorkspace(int ws) |
66 | { workspace = ws; workspace_remember = true; } | 70 | { workspace = ws; workspace_remember = true; } |
@@ -90,7 +94,12 @@ public: | |||
90 | { save_on_close = state; save_on_close_remember = true; } | 94 | { save_on_close = state; save_on_close_remember = true; } |
91 | inline void rememberAlpha(int focused_a, int unfocused_a) | 95 | inline void rememberAlpha(int focused_a, int unfocused_a) |
92 | { focused_alpha = focused_a; unfocused_alpha = unfocused_a; alpha_remember = true; } | 96 | { focused_alpha = focused_a; unfocused_alpha = unfocused_a; alpha_remember = true; } |
93 | 97 | inline void rememberMinimizedstate(bool state) | |
98 | { minimizedstate = state; minimizedstate_remember = true; } | ||
99 | inline void rememberMaximizedstate(int state) | ||
100 | { maximizedstate = state; maximizedstate_remember = true; } | ||
101 | inline void rememberFullscreenstate(bool state) | ||
102 | { fullscreenstate = state; fullscreenstate_remember = true; } | ||
94 | 103 | ||
95 | bool workspace_remember; | 104 | bool workspace_remember; |
96 | unsigned int workspace; | 105 | unsigned int workspace; |
@@ -139,6 +148,15 @@ public: | |||
139 | bool save_on_close_remember; | 148 | bool save_on_close_remember; |
140 | bool save_on_close; | 149 | bool save_on_close; |
141 | 150 | ||
151 | bool minimizedstate_remember; | ||
152 | bool minimizedstate; | ||
153 | |||
154 | bool maximizedstate_remember; | ||
155 | int maximizedstate; | ||
156 | |||
157 | bool fullscreenstate_remember; | ||
158 | bool fullscreenstate; | ||
159 | |||
142 | bool is_grouped; | 160 | bool is_grouped; |
143 | FbTk::RefCount<ClientPattern> group_pattern; | 161 | FbTk::RefCount<ClientPattern> group_pattern; |
144 | 162 | ||
@@ -171,6 +189,9 @@ public: | |||
171 | REM_WORKSPACE, | 189 | REM_WORKSPACE, |
172 | REM_HEAD, | 190 | REM_HEAD, |
173 | REM_ALPHA, | 191 | REM_ALPHA, |
192 | REM_MINIMIZEDSTATE, | ||
193 | REM_MAXIMIZEDSTATE, | ||
194 | REM_FULLSCREENSTATE, | ||
174 | REM_LASTATTRIB // not actually used | 195 | REM_LASTATTRIB // not actually used |
175 | }; | 196 | }; |
176 | 197 | ||
diff --git a/src/Screen.cc b/src/Screen.cc index e6681e6..0589d2f 100644 --- a/src/Screen.cc +++ b/src/Screen.cc | |||
@@ -2325,17 +2325,3 @@ pair<int,int> BScreen::clampToHead(int head, int x, int y, int w, int h) const { | |||
2325 | 2325 | ||
2326 | return make_pair(x,y); | 2326 | return make_pair(x,y); |
2327 | } | 2327 | } |
2328 | |||
2329 | // TODO: when toolbar gets its resources moved into Toolbar.hh/cc, then | ||
2330 | // this can be gone and a consistent interface for the two used | ||
2331 | // on the actual objects | ||
2332 | |||
2333 | template<> | ||
2334 | void BScreen::setOnHead<FluxboxWindow>(FluxboxWindow& win, int head) { | ||
2335 | if (head > 0 && head <= numHeads()) { | ||
2336 | int current_head = getHead(win.fbWindow()); | ||
2337 | win.move(getHeadX(head) + win.frame().x() - getHeadX(current_head), | ||
2338 | getHeadY(head) + win.frame().y() - getHeadY(current_head)); | ||
2339 | } | ||
2340 | } | ||
2341 | |||
diff --git a/src/Screen.hh b/src/Screen.hh index 09865e6..37edaa7 100644 --- a/src/Screen.hh +++ b/src/Screen.hh | |||
@@ -441,9 +441,6 @@ public: | |||
441 | template <typename OnHeadObject> | 441 | template <typename OnHeadObject> |
442 | int getOnHead(OnHeadObject &obj) const; | 442 | int getOnHead(OnHeadObject &obj) const; |
443 | 443 | ||
444 | template <typename OnHeadObject> | ||
445 | void setOnHead(OnHeadObject &obj, int head); | ||
446 | |||
447 | // grouping - we want ordering, so we can either search for a | 444 | // grouping - we want ordering, so we can either search for a |
448 | // group to the left, or to the right (they'll be different if | 445 | // group to the left, or to the right (they'll be different if |
449 | // they exist). | 446 | // they exist). |
diff --git a/src/Window.cc b/src/Window.cc index 133ccd2..767aff5 100644 --- a/src/Window.cc +++ b/src/Window.cc | |||
@@ -267,6 +267,7 @@ FluxboxWindow::FluxboxWindow(WinClient &client, FbWinFrameTheme &tm, | |||
267 | m_old_width(1), m_old_height(1), | 267 | m_old_width(1), m_old_height(1), |
268 | m_last_button_x(0), m_last_button_y(0), | 268 | m_last_button_x(0), m_last_button_y(0), |
269 | m_frame(client.screen(), tm, client.screen().imageControl(), layer, 0, 0, 100, 100), | 269 | m_frame(client.screen(), tm, client.screen().imageControl(), layer, 0, 0, 100, 100), |
270 | m_placed(false), | ||
270 | m_layernum(layer.getLayerNum()), | 271 | m_layernum(layer.getLayerNum()), |
271 | m_old_layernum(0), | 272 | m_old_layernum(0), |
272 | m_parent(client.screen().rootWindow()), | 273 | m_parent(client.screen().rootWindow()), |
@@ -354,10 +355,6 @@ FluxboxWindow::~FluxboxWindow() { | |||
354 | 355 | ||
355 | void FluxboxWindow::init() { | 356 | void FluxboxWindow::init() { |
356 | m_attaching_tab = 0; | 357 | m_attaching_tab = 0; |
357 | // magic to detect if moved by hints | ||
358 | // don't use 0, since setting maximized or fullscreen on the window will set | ||
359 | // this to 0 | ||
360 | m_old_pos_x = m_screen.width(); | ||
361 | 358 | ||
362 | assert(m_client); | 359 | assert(m_client); |
363 | m_client->setFluxboxWindow(this); | 360 | m_client->setFluxboxWindow(this); |
@@ -469,10 +466,8 @@ void FluxboxWindow::init() { | |||
469 | if (m_workspace_number >= screen().numberOfWorkspaces()) | 466 | if (m_workspace_number >= screen().numberOfWorkspaces()) |
470 | m_workspace_number = screen().currentWorkspaceID(); | 467 | m_workspace_number = screen().currentWorkspaceID(); |
471 | 468 | ||
472 | bool place_window = (m_old_pos_x == static_cast<signed>(m_screen.width())); | ||
473 | |||
474 | if (fluxbox.isStartup()) | 469 | if (fluxbox.isStartup()) |
475 | place_window = false; | 470 | m_placed = true; |
476 | else if (m_client->isTransient() || | 471 | else if (m_client->isTransient() || |
477 | m_client->normal_hint_flags & (PPosition|USPosition)) { | 472 | m_client->normal_hint_flags & (PPosition|USPosition)) { |
478 | 473 | ||
@@ -483,7 +478,7 @@ void FluxboxWindow::init() { | |||
483 | real_y >= 0 && | 478 | real_y >= 0 && |
484 | real_x <= (signed) screen().width() && | 479 | real_x <= (signed) screen().width() && |
485 | real_y <= (signed) screen().height()) | 480 | real_y <= (signed) screen().height()) |
486 | place_window = false; | 481 | m_placed = true; |
487 | 482 | ||
488 | } | 483 | } |
489 | /* | 484 | /* |
@@ -514,18 +509,10 @@ void FluxboxWindow::init() { | |||
514 | m_client->applySizeHints(real_width, real_height); | 509 | m_client->applySizeHints(real_width, real_height); |
515 | real_height += frame().titlebarHeight() + frame().handleHeight(); | 510 | real_height += frame().titlebarHeight() + frame().handleHeight(); |
516 | 511 | ||
517 | if (!place_window) | 512 | if (m_placed) |
518 | moveResize(frame().x(), frame().y(), real_width, real_height); | 513 | moveResize(frame().x(), frame().y(), real_width, real_height); |
519 | 514 | ||
520 | screen().getWorkspace(m_workspace_number)->addWindow(*this, place_window); | 515 | screen().getWorkspace(m_workspace_number)->addWindow(*this, !m_placed); |
521 | |||
522 | if (maximized && functions.maximize) { // start maximized | ||
523 | // This will set it to the appropriate style of maximisation | ||
524 | int req_maximized = maximized; | ||
525 | // NOTE: don't manually change maximized ANYWHERE else, it isn't safe | ||
526 | maximized = MAX_NONE; // it is not maximized now | ||
527 | maximize(req_maximized); | ||
528 | } | ||
529 | 516 | ||
530 | setFocusFlag(false); // update graphics before mapping | 517 | setFocusFlag(false); // update graphics before mapping |
531 | 518 | ||
@@ -550,6 +537,19 @@ void FluxboxWindow::init() { | |||
550 | m_focused = false; | 537 | m_focused = false; |
551 | } | 538 | } |
552 | 539 | ||
540 | // maximization won't work if we think the window is fullscreen | ||
541 | bool tmp_fullscreen = fullscreen; | ||
542 | fullscreen = false; | ||
543 | if (maximized) { | ||
544 | int tmp = maximized; | ||
545 | maximized = MAX_NONE; | ||
546 | setMaximizedState(tmp); | ||
547 | } | ||
548 | |||
549 | if (tmp_fullscreen) | ||
550 | setFullscreen(true); | ||
551 | |||
552 | |||
553 | struct timeval now; | 553 | struct timeval now; |
554 | gettimeofday(&now, NULL); | 554 | gettimeofday(&now, NULL); |
555 | m_creation_time = now.tv_sec; | 555 | m_creation_time = now.tv_sec; |
@@ -1185,14 +1185,10 @@ void FluxboxWindow::move(int x, int y) { | |||
1185 | } | 1185 | } |
1186 | 1186 | ||
1187 | void FluxboxWindow::resize(unsigned int width, unsigned int height) { | 1187 | void FluxboxWindow::resize(unsigned int width, unsigned int height) { |
1188 | int old_x = m_old_pos_x; | 1188 | // don't set window as placed, since we're only resizing |
1189 | 1189 | bool placed = m_placed; | |
1190 | moveResize(frame().x(), frame().y(), width, height); | 1190 | moveResize(frame().x(), frame().y(), width, height); |
1191 | 1191 | m_placed = placed; | |
1192 | // magic to detect if moved during initialisation | ||
1193 | // we restore the old state, because we were a resize, not a moveResize! | ||
1194 | if (!m_initialized) | ||
1195 | m_old_pos_x = old_x; | ||
1196 | } | 1192 | } |
1197 | 1193 | ||
1198 | // send_event is just an override | 1194 | // send_event is just an override |
@@ -1200,10 +1196,7 @@ void FluxboxWindow::moveResize(int new_x, int new_y, | |||
1200 | unsigned int new_width, unsigned int new_height, | 1196 | unsigned int new_width, unsigned int new_height, |
1201 | bool send_event) { | 1197 | bool send_event) { |
1202 | 1198 | ||
1203 | // magic to detect if moved during initialisation | 1199 | m_placed = true; |
1204 | if (!m_initialized) | ||
1205 | m_old_pos_x = 1; | ||
1206 | |||
1207 | send_event = send_event || frame().x() != new_x || frame().y() != new_y; | 1200 | send_event = send_event || frame().x() != new_x || frame().y() != new_y; |
1208 | 1201 | ||
1209 | if ((new_width != frame().width() || new_height != frame().height()) && | 1202 | if ((new_width != frame().width() || new_height != frame().height()) && |
@@ -1236,9 +1229,7 @@ void FluxboxWindow::moveResize(int new_x, int new_y, | |||
1236 | void FluxboxWindow::moveResizeForClient(int new_x, int new_y, | 1229 | void FluxboxWindow::moveResizeForClient(int new_x, int new_y, |
1237 | unsigned int new_width, unsigned int new_height, int gravity, unsigned int client_bw) { | 1230 | unsigned int new_width, unsigned int new_height, int gravity, unsigned int client_bw) { |
1238 | 1231 | ||
1239 | // magic to detect if moved during initialisation | 1232 | m_placed = true; |
1240 | if (!m_initialized) | ||
1241 | m_old_pos_x = 1; | ||
1242 | frame().moveResizeForClient(new_x, new_y, new_width, new_height, gravity, client_bw); | 1233 | frame().moveResizeForClient(new_x, new_y, new_width, new_height, gravity, client_bw); |
1243 | setFocusFlag(m_focused); | 1234 | setFocusFlag(m_focused); |
1244 | shaded = false; | 1235 | shaded = false; |
@@ -1517,13 +1508,16 @@ void FluxboxWindow::deiconify(bool reassoc, bool do_raise) { | |||
1517 | */ | 1508 | */ |
1518 | void FluxboxWindow::setFullscreen(bool flag) { | 1509 | void FluxboxWindow::setFullscreen(bool flag) { |
1519 | 1510 | ||
1511 | if (!m_initialized) { | ||
1512 | // this will interfere with window placement, so we delay it | ||
1513 | fullscreen = flag; | ||
1514 | return; | ||
1515 | } | ||
1516 | |||
1520 | const int head = screen().getHead(fbWindow()); | 1517 | const int head = screen().getHead(fbWindow()); |
1521 | 1518 | ||
1522 | if (flag && !isFullscreen()) { | 1519 | if (flag && !isFullscreen()) { |
1523 | 1520 | ||
1524 | if (isIconic()) | ||
1525 | deiconify(); | ||
1526 | |||
1527 | if (isShaded()) | 1521 | if (isShaded()) |
1528 | shade(); | 1522 | shade(); |
1529 | 1523 | ||
@@ -1533,10 +1527,12 @@ void FluxboxWindow::setFullscreen(bool flag) { | |||
1533 | m_old_decoration_mask = decorationMask(); | 1527 | m_old_decoration_mask = decorationMask(); |
1534 | 1528 | ||
1535 | m_old_layernum = layerNum(); | 1529 | m_old_layernum = layerNum(); |
1536 | m_old_pos_x = frame().x(); | 1530 | if (!maximized) { |
1537 | m_old_pos_y = frame().y(); | 1531 | m_old_pos_x = frame().x(); |
1538 | m_old_width = frame().width(); | 1532 | m_old_pos_y = frame().y(); |
1539 | m_old_height = frame().height(); | 1533 | m_old_width = frame().width(); |
1534 | m_old_height = frame().height(); | ||
1535 | } | ||
1540 | 1536 | ||
1541 | // clear decorations | 1537 | // clear decorations |
1542 | setDecorationMask(0); | 1538 | setDecorationMask(0); |
@@ -1586,7 +1582,12 @@ void FluxboxWindow::setFullscreen(bool flag) { | |||
1586 | 1582 | ||
1587 | m_old_layernum = ::Layer::NORMAL; | 1583 | m_old_layernum = ::Layer::NORMAL; |
1588 | 1584 | ||
1589 | stateSig().notify(); | 1585 | if (maximized) { |
1586 | int tmp = maximized; | ||
1587 | maximized = MAX_NONE; | ||
1588 | setMaximizedState(tmp); | ||
1589 | } else | ||
1590 | stateSig().notify(); | ||
1590 | } | 1591 | } |
1591 | } | 1592 | } |
1592 | 1593 | ||
@@ -1599,8 +1600,32 @@ void FluxboxWindow::maximize(int type) { | |||
1599 | if (isFullscreen() || type == MAX_NONE) | 1600 | if (isFullscreen() || type == MAX_NONE) |
1600 | return; | 1601 | return; |
1601 | 1602 | ||
1602 | if (isIconic()) | 1603 | int new_max = maximized; |
1603 | deiconify(); | 1604 | |
1605 | // toggle maximize vertically? | ||
1606 | // when _don't_ we want to toggle? | ||
1607 | // - type is horizontal maximise, or | ||
1608 | // - type is full and we are not maximised horz but already vertically | ||
1609 | if (type != MAX_HORZ && !(type == MAX_FULL && maximized == MAX_VERT)) | ||
1610 | new_max ^= MAX_VERT; | ||
1611 | |||
1612 | // maximize horizontally? | ||
1613 | if (type != MAX_VERT && !(type == MAX_FULL && maximized == MAX_HORZ)) | ||
1614 | new_max ^= MAX_HORZ; | ||
1615 | |||
1616 | setMaximizedState(new_max); | ||
1617 | } | ||
1618 | |||
1619 | void FluxboxWindow::setMaximizedState(int type) { | ||
1620 | |||
1621 | if (!m_initialized) { | ||
1622 | // this will interfere with the window getting placed, so we delay it | ||
1623 | maximized = type; | ||
1624 | return; | ||
1625 | } | ||
1626 | |||
1627 | if (isFullscreen() || type == maximized) | ||
1628 | return; | ||
1604 | 1629 | ||
1605 | if (isShaded()) | 1630 | if (isShaded()) |
1606 | shade(); | 1631 | shade(); |
@@ -1614,8 +1639,6 @@ void FluxboxWindow::maximize(int type) { | |||
1614 | new_w = frame().width(), | 1639 | new_w = frame().width(), |
1615 | new_h = frame().height(); | 1640 | new_h = frame().height(); |
1616 | 1641 | ||
1617 | int orig_max = maximized; | ||
1618 | |||
1619 | // These evaluate whether we need to TOGGLE the value for that field | 1642 | // These evaluate whether we need to TOGGLE the value for that field |
1620 | // Why? If maximize is only set to zero outside this, | 1643 | // Why? If maximize is only set to zero outside this, |
1621 | // and we only EVER toggle them, then: | 1644 | // and we only EVER toggle them, then: |
@@ -1626,12 +1649,9 @@ void FluxboxWindow::maximize(int type) { | |||
1626 | // we still won't lose the state in that case. | 1649 | // we still won't lose the state in that case. |
1627 | 1650 | ||
1628 | // toggle maximize vertically? | 1651 | // toggle maximize vertically? |
1629 | // when _don't_ we want to toggle? | 1652 | if ((maximized ^ type) & MAX_VERT) { |
1630 | // - type is horizontal maximise, or | ||
1631 | // - type is full and we are not maximised horz but already vertically | ||
1632 | if (type != MAX_HORZ && !(type == MAX_FULL && orig_max == MAX_VERT)) { | ||
1633 | // already maximized in that direction? | 1653 | // already maximized in that direction? |
1634 | if (orig_max & MAX_VERT) { | 1654 | if (maximized & MAX_VERT) { |
1635 | new_y = m_old_pos_y; | 1655 | new_y = m_old_pos_y; |
1636 | new_h = m_old_height; | 1656 | new_h = m_old_height; |
1637 | } else { | 1657 | } else { |
@@ -1647,10 +1667,10 @@ void FluxboxWindow::maximize(int type) { | |||
1647 | maximized ^= MAX_VERT; | 1667 | maximized ^= MAX_VERT; |
1648 | } | 1668 | } |
1649 | 1669 | ||
1650 | // maximize horizontally? | 1670 | // toggle maximize horizontally? |
1651 | if (type != MAX_VERT && !(type == MAX_FULL && orig_max == MAX_HORZ)) { | 1671 | if ((maximized ^ type) & MAX_HORZ) { |
1652 | // already maximized in that direction? | 1672 | // already maximized in that direction? |
1653 | if (orig_max & MAX_HORZ) { | 1673 | if (maximized & MAX_HORZ) { |
1654 | new_x = m_old_pos_x; | 1674 | new_x = m_old_pos_x; |
1655 | new_w = m_old_width; | 1675 | new_w = m_old_width; |
1656 | } else { | 1676 | } else { |
@@ -1711,7 +1731,6 @@ void FluxboxWindow::maximizeFull() { | |||
1711 | maximize(MAX_FULL); | 1731 | maximize(MAX_FULL); |
1712 | } | 1732 | } |
1713 | 1733 | ||
1714 | |||
1715 | void FluxboxWindow::setWorkspace(int n) { | 1734 | void FluxboxWindow::setWorkspace(int n) { |
1716 | unsigned int old_wkspc = m_workspace_number; | 1735 | unsigned int old_wkspc = m_workspace_number; |
1717 | 1736 | ||
@@ -4080,3 +4099,13 @@ int FluxboxWindow::getDecoMaskFromString(const string &str_label) { | |||
4080 | mask = strtol(str_label.c_str(), NULL, 0); | 4099 | mask = strtol(str_label.c_str(), NULL, 0); |
4081 | return mask; | 4100 | return mask; |
4082 | } | 4101 | } |
4102 | |||
4103 | void FluxboxWindow::setOnHead(int head) { | ||
4104 | if (head > 0 && head <= screen().numHeads()) { | ||
4105 | int cur = screen().getHead(fbWindow()); | ||
4106 | bool placed = m_placed; | ||
4107 | move(screen().getHeadX(head) + frame().x() - screen().getHeadX(cur), | ||
4108 | screen().getHeadY(head) + frame().y() - screen().getHeadY(cur)); | ||
4109 | m_placed = placed; | ||
4110 | } | ||
4111 | } | ||
diff --git a/src/Window.hh b/src/Window.hh index 6fb258a..cf0077e 100644 --- a/src/Window.hh +++ b/src/Window.hh | |||
@@ -281,6 +281,8 @@ public: | |||
281 | void setFullscreen(bool flag); | 281 | void setFullscreen(bool flag); |
282 | /// toggle maximize | 282 | /// toggle maximize |
283 | void maximize(int type = MAX_FULL); | 283 | void maximize(int type = MAX_FULL); |
284 | /// sets the maximized state | ||
285 | void setMaximizedState(int type); | ||
284 | /// maximizes the window horizontal | 286 | /// maximizes the window horizontal |
285 | void maximizeHorizontal(); | 287 | void maximizeHorizontal(); |
286 | /// maximizes the window vertical | 288 | /// maximizes the window vertical |
@@ -304,6 +306,7 @@ public: | |||
304 | void lowerLayer(); | 306 | void lowerLayer(); |
305 | /// moves the window to a new layer | 307 | /// moves the window to a new layer |
306 | void moveToLayer(int layernum, bool force = false); | 308 | void moveToLayer(int layernum, bool force = false); |
309 | void setOnHead(int head); | ||
307 | /// sets the window focus hidden state | 310 | /// sets the window focus hidden state |
308 | void setFocusHidden(bool value); | 311 | void setFocusHidden(bool value); |
309 | /// sets the window icon hidden state | 312 | /// sets the window icon hidden state |
@@ -414,6 +417,7 @@ public: | |||
414 | inline bool isMaximized() const { return maximized == MAX_FULL; } | 417 | inline bool isMaximized() const { return maximized == MAX_FULL; } |
415 | inline bool isMaximizedVert() const { return (bool)(maximized & MAX_VERT); } | 418 | inline bool isMaximizedVert() const { return (bool)(maximized & MAX_VERT); } |
416 | inline bool isMaximizedHorz() const { return (bool)(maximized & MAX_HORZ); } | 419 | inline bool isMaximizedHorz() const { return (bool)(maximized & MAX_HORZ); } |
420 | inline int maximizedState() const { return maximized; } | ||
417 | inline bool isIconifiable() const { return functions.iconify; } | 421 | inline bool isIconifiable() const { return functions.iconify; } |
418 | inline bool isMaximizable() const { return functions.maximize; } | 422 | inline bool isMaximizable() const { return functions.maximize; } |
419 | inline bool isResizable() const { return functions.resize; } | 423 | inline bool isResizable() const { return functions.resize; } |
@@ -627,6 +631,8 @@ private: | |||
627 | m_last_button_y; ///< last known y position of the mouse button | 631 | m_last_button_y; ///< last known y position of the mouse button |
628 | FbWinFrame m_frame; ///< the actuall window frame | 632 | FbWinFrame m_frame; ///< the actuall window frame |
629 | 633 | ||
634 | bool m_placed; ///< determine whether or not we should place the window | ||
635 | |||
630 | int m_layernum; | 636 | int m_layernum; |
631 | int m_old_layernum; | 637 | int m_old_layernum; |
632 | 638 | ||