diff options
Diffstat (limited to 'src/FbTk/Button.cc')
-rw-r--r-- | src/FbTk/Button.cc | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/src/FbTk/Button.cc b/src/FbTk/Button.cc index e2ba7b5..8dba936 100644 --- a/src/FbTk/Button.cc +++ b/src/FbTk/Button.cc | |||
@@ -37,7 +37,8 @@ Button::Button(int screen_num, int x, int y, | |||
37 | m_pressed_pm(0), | 37 | m_pressed_pm(0), |
38 | m_pressed_color(), | 38 | m_pressed_color(), |
39 | m_gc(DefaultGC(FbTk::App::instance()->display(), screen_num)), | 39 | m_gc(DefaultGC(FbTk::App::instance()->display(), screen_num)), |
40 | m_pressed(false) { | 40 | m_pressed(false), |
41 | mark_if_deleted(0) { | ||
41 | 42 | ||
42 | // add this to eventmanager | 43 | // add this to eventmanager |
43 | FbTk::EventManager::instance()->add(*this, *this); | 44 | FbTk::EventManager::instance()->add(*this, *this); |
@@ -51,13 +52,16 @@ Button::Button(const FbWindow &parent, int x, int y, | |||
51 | m_pressed_pm(0), | 52 | m_pressed_pm(0), |
52 | m_pressed_color(), | 53 | m_pressed_color(), |
53 | m_gc(DefaultGC(FbTk::App::instance()->display(), screenNumber())), | 54 | m_gc(DefaultGC(FbTk::App::instance()->display(), screenNumber())), |
54 | m_pressed(false) { | 55 | m_pressed(false), |
56 | mark_if_deleted(0) { | ||
55 | // add this to eventmanager | 57 | // add this to eventmanager |
56 | FbTk::EventManager::instance()->add(*this, *this); | 58 | FbTk::EventManager::instance()->add(*this, *this); |
57 | } | 59 | } |
58 | 60 | ||
59 | Button::~Button() { | 61 | Button::~Button() { |
60 | 62 | if (mark_if_deleted) { | |
63 | *mark_if_deleted = true; | ||
64 | } | ||
61 | } | 65 | } |
62 | 66 | ||
63 | void Button::setOnClick(RefCount<Command> &cmd, int button) { | 67 | void Button::setOnClick(RefCount<Command> &cmd, int button) { |
@@ -107,26 +111,33 @@ void Button::buttonPressEvent(XButtonEvent &event) { | |||
107 | void Button::buttonReleaseEvent(XButtonEvent &event) { | 111 | void Button::buttonReleaseEvent(XButtonEvent &event) { |
108 | m_pressed = false; | 112 | m_pressed = false; |
109 | bool update = false; | 113 | bool update = false; |
110 | if (m_background_pm) { | 114 | bool been_deleted = false; |
111 | if (m_pressed_pm != 0) { | 115 | mark_if_deleted = &been_deleted; |
112 | update = true; | ||
113 | setBackgroundPixmap(m_background_pm); | ||
114 | } | ||
115 | } else if (m_pressed_color.isAllocated()) { | ||
116 | update = true; | ||
117 | setBackgroundColor(m_background_color); | ||
118 | } | ||
119 | |||
120 | if (update) | ||
121 | clear(); // clear background | ||
122 | 116 | ||
123 | // finaly, execute command (this must be done last since this object might be deleted by the command) | 117 | // This command may result in this object being deleted |
118 | // hence the mark_if_deleted mechanism so that we can | ||
119 | // update our state after the command | ||
124 | if (event.button > 0 && event.button <= 5 && | 120 | if (event.button > 0 && event.button <= 5 && |
125 | event.x > 0 && event.x < static_cast<signed>(width()) && | 121 | event.x > 0 && event.x < static_cast<signed>(width()) && |
126 | event.y > 0 && event.y < static_cast<signed>(height()) && | 122 | event.y > 0 && event.y < static_cast<signed>(height()) && |
127 | m_onclick[event.button -1].get() != 0) | 123 | m_onclick[event.button -1].get() != 0) |
128 | m_onclick[event.button - 1]->execute(); | 124 | m_onclick[event.button - 1]->execute(); |
129 | 125 | ||
126 | if (!been_deleted) { | ||
127 | mark_if_deleted = 0; | ||
128 | if (m_background_pm) { | ||
129 | if (m_pressed_pm != 0) { | ||
130 | update = true; | ||
131 | setBackgroundPixmap(m_background_pm); | ||
132 | } | ||
133 | } else if (m_pressed_color.isAllocated()) { | ||
134 | update = true; | ||
135 | setBackgroundColor(m_background_color); | ||
136 | } | ||
137 | |||
138 | if (update) | ||
139 | clear(); // clear background | ||
140 | } | ||
130 | 141 | ||
131 | } | 142 | } |
132 | 143 | ||