aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/IconButton.cc39
1 files changed, 36 insertions, 3 deletions
diff --git a/src/IconButton.cc b/src/IconButton.cc
index a1e8cf0..1ca20b7 100644
--- a/src/IconButton.cc
+++ b/src/IconButton.cc
@@ -20,13 +20,15 @@
20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21// DEALINGS IN THE SOFTWARE. 21// DEALINGS IN THE SOFTWARE.
22 22
23// $Id: IconButton.cc,v 1.6 2003/08/19 16:13:25 fluxgen Exp $ 23// $Id: IconButton.cc,v 1.7 2003/08/24 16:24:19 fluxgen Exp $
24 24
25#include "IconButton.hh" 25#include "IconButton.hh"
26 26
27#include "FbTk/App.hh" 27#include "FbTk/App.hh"
28#include "FbTk/EventManager.hh" 28#include "FbTk/EventManager.hh"
29 29
30#include "fluxbox.hh"
31#include "Screen.hh"
30#include "Window.hh" 32#include "Window.hh"
31#include "WinClient.hh" 33#include "WinClient.hh"
32#include "SimpleCommand.hh" 34#include "SimpleCommand.hh"
@@ -40,6 +42,36 @@
40#include <X11/extensions/shape.h> 42#include <X11/extensions/shape.h>
41#endif // SHAPE 43#endif // SHAPE
42 44
45namespace {
46
47class ShowMenu: public FbTk::Command {
48public:
49 explicit ShowMenu(FluxboxWindow &win):m_win(win) { }
50 void execute() {
51 // get last button pos
52 const XEvent &event = Fluxbox::instance()->lastEvent();
53 int x = event.xbutton.x_root - (m_win.menu().width() / 2);
54 int y = event.xbutton.y_root - (m_win.menu().height() / 2);
55
56 if (x < 0)
57 x = 0;
58 else if (x + m_win.menu().width() > m_win.screen().width())
59 x = m_win.screen().width() - m_win.menu().width();
60
61 if (y < 0)
62 y = 0;
63 else if (y + m_win.menu().height() > m_win.screen().height())
64 y = m_win.screen().height() - m_win.menu().height();
65
66 m_win.menu().move(x, y);
67 m_win.menu().show();
68 }
69private:
70 FluxboxWindow &m_win;
71};
72
73} // end anonymous namespace
74
43IconButton::IconButton(const FbTk::FbWindow &parent, const FbTk::Font &font, 75IconButton::IconButton(const FbTk::FbWindow &parent, const FbTk::Font &font,
44 FluxboxWindow &win): 76 FluxboxWindow &win):
45 FbTk::TextButton(parent, font, win.winClient().title()), 77 FbTk::TextButton(parent, font, win.winClient().title()),
@@ -48,8 +80,9 @@ IconButton::IconButton(const FbTk::FbWindow &parent, const FbTk::Font &font,
48 ExposureMask | ButtonPressMask | ButtonReleaseMask) { 80 ExposureMask | ButtonPressMask | ButtonReleaseMask) {
49 81
50 FbTk::RefCount<FbTk::Command> focus(new FbTk::SimpleCommand<FluxboxWindow>(m_win, &FluxboxWindow::raiseAndFocus)); 82 FbTk::RefCount<FbTk::Command> focus(new FbTk::SimpleCommand<FluxboxWindow>(m_win, &FluxboxWindow::raiseAndFocus));
51 setOnClick(focus); 83 FbTk::RefCount<FbTk::Command> menu(new ::ShowMenu(m_win));
52 84 setOnClick(focus, 1);
85 setOnClick(menu, 3);
53 m_win.hintSig().attach(this); 86 m_win.hintSig().attach(this);
54 87
55 FbTk::EventManager::instance()->add(*this, m_icon_window); 88 FbTk::EventManager::instance()->add(*this, m_icon_window);