aboutsummaryrefslogtreecommitdiff
path: root/src/FbTk
diff options
context:
space:
mode:
Diffstat (limited to 'src/FbTk')
-rw-r--r--src/FbTk/Menu.cc19
-rw-r--r--src/FbTk/Menu.hh16
2 files changed, 29 insertions, 6 deletions
diff --git a/src/FbTk/Menu.cc b/src/FbTk/Menu.cc
index b727588..d0267cb 100644
--- a/src/FbTk/Menu.cc
+++ b/src/FbTk/Menu.cc
@@ -22,7 +22,7 @@
22// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23// DEALINGS IN THE SOFTWARE. 23// DEALINGS IN THE SOFTWARE.
24 24
25// $Id: Menu.cc,v 1.8 2003/02/03 13:41:19 fluxgen Exp $ 25// $Id: Menu.cc,v 1.9 2003/02/15 01:48:16 fluxgen Exp $
26 26
27//use GNU extensions 27//use GNU extensions
28#ifndef _GNU_SOURCE 28#ifndef _GNU_SOURCE
@@ -60,7 +60,11 @@ Menu::Menu(MenuTheme &tm, int screen_num, ImageControl &imgctrl):
60 m_screen_width(DisplayWidth(m_display, screen_num)), 60 m_screen_width(DisplayWidth(m_display, screen_num)),
61 m_screen_height(DisplayHeight(m_display, screen_num)), 61 m_screen_height(DisplayHeight(m_display, screen_num)),
62 m_alignment(ALIGNDONTCARE), 62 m_alignment(ALIGNDONTCARE),
63 m_border_width(0) { 63 m_border_width(0),
64 m_themeobserver(*this) {
65
66 // make sure we get updated when the theme is reloaded
67 tm.addListener(m_themeobserver);
64 68
65 title_vis = 69 title_vis =
66 movable = 70 movable =
@@ -105,7 +109,8 @@ Menu::Menu(MenuTheme &tm, int screen_num, ImageControl &imgctrl):
105 unsigned long attrib_mask = CWOverrideRedirect | CWEventMask; 109 unsigned long attrib_mask = CWOverrideRedirect | CWEventMask;
106 XSetWindowAttributes attrib; 110 XSetWindowAttributes attrib;
107 attrib.override_redirect = True; 111 attrib.override_redirect = True;
108 attrib.event_mask = ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | KeyPressMask | ExposureMask; 112 attrib.event_mask = ButtonPressMask | ButtonReleaseMask |
113 ButtonMotionMask | KeyPressMask | ExposureMask;
109 114
110 //create menu window 115 //create menu window
111 menu.window = XCreateWindow(m_display, RootWindow(m_display, screen_num), 116 menu.window = XCreateWindow(m_display, RootWindow(m_display, screen_num),
@@ -917,10 +922,16 @@ void Menu::exposeEvent(XExposeEvent &ee) {
917 if (ee.window == menu.title) { 922 if (ee.window == menu.title) {
918 redrawTitle(); 923 redrawTitle();
919 } else if (ee.window == menu.frame) { 924 } else if (ee.window == menu.frame) {
925 if (menuitems.size() == 0)
926 return;
927
920 // this is a compilicated algorithm... lets do it step by step... 928 // this is a compilicated algorithm... lets do it step by step...
921 // first... we see in which sub level the expose starts... and how many 929 // first... we see in which sub level the expose starts... and how many
922 // items down in that sublevel 930 // items down in that sublevel
923 931 if (menu.item_w == 0)
932 menu.item_w = 1;
933 if (menu.item_h == 0)
934 menu.item_h = 1;
924 unsigned int sbl = (ee.x / menu.item_w), id = (ee.y / menu.item_h), 935 unsigned int sbl = (ee.x / menu.item_w), id = (ee.y / menu.item_h),
925 // next... figure out how many sublevels over the redraw spans 936 // next... figure out how many sublevels over the redraw spans
926 sbl_d = ((ee.x + ee.width) / menu.item_w), 937 sbl_d = ((ee.x + ee.width) / menu.item_w),
diff --git a/src/FbTk/Menu.hh b/src/FbTk/Menu.hh
index 1360528..1ae9b8f 100644
--- a/src/FbTk/Menu.hh
+++ b/src/FbTk/Menu.hh
@@ -22,7 +22,7 @@
22// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23// DEALINGS IN THE SOFTWARE. 23// DEALINGS IN THE SOFTWARE.
24 24
25// $Id: Menu.hh,v 1.7 2003/02/03 13:40:52 fluxgen Exp $ 25// $Id: Menu.hh,v 1.8 2003/02/15 01:47:43 fluxgen Exp $
26 26
27#ifndef FBTK_MENU_HH 27#ifndef FBTK_MENU_HH
28#define FBTK_MENU_HH 28#define FBTK_MENU_HH
@@ -35,6 +35,7 @@
35#include "EventHandler.hh" 35#include "EventHandler.hh"
36#include "RefCount.hh" 36#include "RefCount.hh"
37#include "Command.hh" 37#include "Command.hh"
38#include "Observer.hh"
38#include "XLayerItem.hh" 39#include "XLayerItem.hh"
39 40
40namespace FbTk { 41namespace FbTk {
@@ -151,7 +152,7 @@ protected:
151 inline Menu *parent() { return m_parent; } 152 inline Menu *parent() { return m_parent; }
152 inline const Menu *parent() const { return m_parent; } 153 inline const Menu *parent() const { return m_parent; }
153 154
154private: 155private:
155 typedef std::vector<MenuItem *> Menuitems; 156 typedef std::vector<MenuItem *> Menuitems;
156 const MenuTheme &m_theme; 157 const MenuTheme &m_theme;
157 Display *m_display; 158 Display *m_display;
@@ -178,6 +179,17 @@ private:
178 bevel_h; 179 bevel_h;
179 } menu; 180 } menu;
180 181
182 class ThemeObserver:public Observer {
183 public:
184 ThemeObserver(FbTk::Menu &menu):m_menu(menu) { }
185 void update(FbTk::Subject *subj) {
186 m_menu.reconfigure();
187 }
188 private:
189 Menu &m_menu;
190 };
191
192 ThemeObserver m_themeobserver;
181}; 193};
182 194
183}; // end namespace FbTk 195}; // end namespace FbTk