aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--nls/fluxbox-nls.hh3
-rw-r--r--src/CurrentWindowCmd.cc2
-rw-r--r--src/Ewmh.cc10
-rw-r--r--src/Remember.cc99
-rw-r--r--src/Remember.hh23
-rw-r--r--src/Screen.cc14
-rw-r--r--src/Screen.hh3
-rw-r--r--src/Window.cc135
-rw-r--r--src/Window.hh6
10 files changed, 222 insertions, 80 deletions
diff --git a/ChangeLog b/ChangeLog
index 2b9d305..c1c6a20 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,13 @@
1 (Format: Year/Month/Day) 1 (Format: Year/Month/Day)
2Changes for 1.0.1: 2Changes 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
59void SetHeadCmd::real_execute() { 59void SetHeadCmd::real_execute() {
60 fbwindow().screen().setOnHead(fbwindow(), m_head); 60 fbwindow().setOnHead(m_head);
61} 61}
62 62
63void SendToWorkspaceCmd::real_execute() { 63void 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) {
250Application::Application(bool grouped, ClientPattern *pat) 256Application::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
262void 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
1117void Remember::setupClient(WinClient &winclient) { 1212void 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;
47class Application { 47class Application {
48public: 48public:
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
2333template<>
2334void 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
355void FluxboxWindow::init() { 356void 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
1187void FluxboxWindow::resize(unsigned int width, unsigned int height) { 1187void 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,
1236void FluxboxWindow::moveResizeForClient(int new_x, int new_y, 1229void 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*/
1518void FluxboxWindow::setFullscreen(bool flag) { 1509void 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
1619void 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
1715void FluxboxWindow::setWorkspace(int n) { 1734void 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
4103void 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