1 // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
2 // Slit.hh for Blackbox - an X11 Window manager
3 // Copyright (c) 2001 - 2005 Sean 'Shaleh' Perry <shaleh@debian.org>
4 // Copyright (c) 1997 - 2000, 2002 - 2005
5 //         Bradley T Hughes <bhughes at trolltech.com>
6 //
7 // Permission is hereby granted, free of charge, to any person obtaining a
8 // copy of this software and associated documentation files (the "Software"),
9 // to deal in the Software without restriction, including without limitation
10 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 // and/or sell copies of the Software, and to permit persons to whom the
12 // Software is furnished to do so, subject to the following conditions:
13 //
14 // The above copyright notice and this permission notice shall be included in
15 // all copies or substantial portions of the Software.
16 //
17 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 // DEALINGS IN THE SOFTWARE.
24 
25 #ifndef   __Slit_hh
26 #define   __Slit_hh
27 
28 #include <Util.hh>
29 
30 #include "BlackboxResource.hh"
31 #include "Screen.hh"
32 
33 class Slit : public StackEntity, public bt::TimeoutHandler,
34              public bt::EventHandler, public bt::NoCopy
35 {
36 public:
37   struct SlitClient {
38     Window window;
39     Window client_window;
40     Window icon_window;
41     bt::Rect rect;
42   };
43 
44 private:
45   typedef std::list<SlitClient*> SlitClientList;
46 
47   bool hidden;
48   Display *display;
49 
50   Blackbox *blackbox;
51   BScreen *screen;
52   bt::Timer *timer;
53   bt::EWMH::Strut strut;
54 
55   SlitClientList clientList;
56 
57   struct SlitFrame {
58     Pixmap pixmap;
59     Window window;
60 
61     int x_hidden, y_hidden;
62     bt::Rect rect;
63   } frame;
64 
65   void updateStrut(void);
66 
67 public:
68   Slit(BScreen *scr);
69   virtual ~Slit(void);
70 
isHidden(void) const71   bool isHidden(void) const { return hidden; }
72 
73   // StackEntity interface
windowID(void) const74   Window windowID(void) const { return frame.window; }
75 
76   unsigned int exposedWidth(void) const;
77   unsigned int exposedHeight(void) const;
78 
79   void addClient(Window w);
80   void removeClient(SlitClient *client, bool remap = True);
81   void removeClient(Window w, bool remap = True);
82   void reconfigure(void);
83   void updateSlit(void);
84   void reposition(void);
85   void shutdown(void);
86   void toggleAutoHide(void);
87 
88   // EventHandler interface
89   void buttonPressEvent(const XButtonEvent * const event);
90   void enterNotifyEvent(const XCrossingEvent * const /*unused*/);
91   void leaveNotifyEvent(const XCrossingEvent * const /*unused*/);
92   void configureRequestEvent(const XConfigureRequestEvent * const event);
93   void unmapNotifyEvent(const XUnmapEvent * const event);
94   void reparentNotifyEvent(const XReparentEvent * const event);
95   void exposeEvent(const XExposeEvent * const event);
96 
97   virtual void timeout(bt::Timer *);
98 
99   enum Direction { Vertical = 1, Horizontal };
100   enum Placement { TopLeft = 1, CenterLeft, BottomLeft,
101                    TopCenter, BottomCenter,
102                    TopRight, CenterRight, BottomRight };
103 
104   Direction direction(void) const;
105   Placement placement(void) const;
106 };
107 
108 #endif // __Slit_hh
109