aboutsummaryrefslogtreecommitdiff
path: root/src/MinOverlapPlacement.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/MinOverlapPlacement.hh')
-rw-r--r--src/MinOverlapPlacement.hh83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/MinOverlapPlacement.hh b/src/MinOverlapPlacement.hh
new file mode 100644
index 0000000..20b5c95
--- /dev/null
+++ b/src/MinOverlapPlacement.hh
@@ -0,0 +1,83 @@
1// MinOverlapPlacement.hh
2// Copyright (c) 2007 Fluxbox Team (fluxgen at fluxbox dot org)
3//
4// Permission is hereby granted, free of charge, to any person obtaining a
5// copy of this software and associated documentation files (the "Software"),
6// to deal in the Software without restriction, including without limitation
7// the rights to use, copy, modify, merge, publish, distribute, sublicense,
8// and/or sell copies of the Software, and to permit persons to whom the
9// Software is furnished to do so, subject to the following conditions:
10//
11// The above copyright notice and this permission notice shall be included in
12// all copies or substantial portions of the Software.
13//
14// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20// DEALINGS IN THE SOFTWARE.
21
22// $Id$
23
24#ifndef MINOVERLAPPLACEMENT_HH
25#define MINOVERLAPPLACEMENT_HH
26
27#include "ScreenPlacement.hh"
28
29class MinOverlapPlacement: public PlacementStrategy {
30public:
31 MinOverlapPlacement(ScreenPlacement::PlacementPolicy policy);
32
33 bool placeWindow(const std::list<FluxboxWindow *> &windowlist,
34 const FluxboxWindow &win,
35 int &place_x, int &place_y);
36
37private:
38 class Region {
39 public:
40
41 enum Corner {
42 TOPLEFT,
43 TOPRIGHT,
44 BOTTOMLEFT,
45 BOTTOMRIGHT
46 } corner; // indicates the corner of the window that will be placed
47
48 Region(Corner _corner, int _x, int _y):
49 corner(_corner), x(_x), y(_y) { };
50
51 // do all STL set implementations use this for sorting?
52 bool operator <(const Region &o) const {
53 // for now, I'm assuming RowSmartPlacement, so y is more important
54 switch (MinOverlapPlacement::s_policy) {
55 case ScreenPlacement::ROWMINOVERLAPPLACEMENT:
56 // if we're making rows, y-value is most important
57 if (y != o.y)
58 return ((y < o.y) ^ (s_col_dir == ScreenPlacement::BOTTOMTOP));
59 if (x != o.x)
60 return ((x < o.x) ^ (s_row_dir == ScreenPlacement::RIGHTLEFT));
61 return (corner < o.corner);
62 case ScreenPlacement::COLMINOVERLAPPLACEMENT:
63 // if we're making columns, x-value is most important
64 if (x != o.x)
65 return ((x < o.x) ^ (s_row_dir == ScreenPlacement::RIGHTLEFT));
66 if (y != o.y)
67 return ((y < o.y) ^ (s_col_dir == ScreenPlacement::BOTTOMTOP));
68 return (corner < o.corner);
69 default:
70 return false;
71 }
72 }
73
74 // position where the top left corner of the window will be placed
75 int x, y;
76 };
77
78 static ScreenPlacement::PlacementPolicy s_policy;
79 static ScreenPlacement::RowDirection s_row_dir;
80 static ScreenPlacement::ColumnDirection s_col_dir;
81};
82
83#endif // MINOVERLAPPLACEMENT_HH