summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/FbTk/Menu.cc105
1 files changed, 59 insertions, 46 deletions
diff --git a/src/FbTk/Menu.cc b/src/FbTk/Menu.cc
index f4e9340..67656ae 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.32 2003/07/21 02:45:27 rathnor Exp $ 25// $Id: Menu.cc,v 1.33 2003/08/04 12:45:42 fluxgen Exp $
26 26
27//use GNU extensions 27//use GNU extensions
28#ifndef _GNU_SOURCE 28#ifndef _GNU_SOURCE
@@ -90,8 +90,8 @@ Menu::Menu(MenuTheme &tm, int screen_num, ImageControl &imgctrl):
90 m_alignment(ALIGNDONTCARE), 90 m_alignment(ALIGNDONTCARE),
91 m_border_width(0), 91 m_border_width(0),
92 m_themeobserver(*this), 92 m_themeobserver(*this),
93 m_trans(new Transparent(getRootPixmap(screen_num), 0, 93 /* m_trans(new Transparent(getRootPixmap(screen_num), 0,
94 tm.alpha(), screen_num)), 94 tm.alpha(), screen_num)),*/
95 m_need_update(true) { 95 m_need_update(true) {
96 96
97 // make sure we get updated when the theme is reloaded 97 // make sure we get updated when the theme is reloaded
@@ -136,44 +136,37 @@ Menu::Menu(MenuTheme &tm, int screen_num, ImageControl &imgctrl):
136 136
137 menu.height = menu.title_h + 2 + menu.frame_h; 137 menu.height = menu.title_h + 2 + menu.frame_h;
138 138
139 m_root_pm = getRootPixmap(screen_num); 139 // m_root_pm = getRootPixmap(screen_num);
140 m_trans->setSource(m_root_pm, screen_num); 140 // m_trans->setSource(m_root_pm, screen_num);
141 m_trans->setAlpha(alpha()); 141 // m_trans->setAlpha(alpha());
142 142 long event_mask = ButtonPressMask | ButtonReleaseMask |
143 //set attributes for menu window
144 unsigned long attrib_mask = CWOverrideRedirect | CWEventMask;
145 XSetWindowAttributes attrib;
146 attrib.override_redirect = True;
147 attrib.event_mask = ButtonPressMask | ButtonReleaseMask |
148 ButtonMotionMask | KeyPressMask | ExposureMask | FocusChangeMask; 143 ButtonMotionMask | KeyPressMask | ExposureMask | FocusChangeMask;
149
150 //create menu window 144 //create menu window
151 menu.window = XCreateWindow(m_display, RootWindow(m_display, screen_num), 145 menu.window = FbTk::FbWindow(screen_num,
152 menu.x, menu.y, menu.width, menu.height, 146 menu.x, menu.y, menu.width, menu.height,
153 0, CopyFromParent, 147 event_mask,
154 InputOutput, CopyFromParent, attrib_mask, &attrib); 148 true); // override redirect
149
155 // strip focus change mask from attrib, since we should only use it with main window 150 // strip focus change mask from attrib, since we should only use it with main window
156 attrib.event_mask ^= FocusChangeMask; 151 event_mask ^= FocusChangeMask;
157 152
158 FbTk::EventManager &evm = *FbTk::EventManager::instance(); 153 FbTk::EventManager &evm = *FbTk::EventManager::instance();
159 evm.add(*this, menu.window); 154 evm.add(*this, menu.window);
160 155
161 //attibutes for title to menuwindow 156
162 attrib_mask = CWEventMask; 157 event_mask |= EnterWindowMask | LeaveWindowMask;
163 attrib.event_mask |= EnterWindowMask | LeaveWindowMask;
164 //create menu title 158 //create menu title
165 menu.title = 159 menu.title = FbTk::FbWindow(menu.window,
166 XCreateWindow(m_display, menu.window.window(), 0, 0, menu.width, menu.height, 0, 160 0, 0, menu.width, menu.height,
167 CopyFromParent, InputOutput, CopyFromParent, 161 event_mask);
168 attrib_mask, &attrib); 162
169 evm.add(*this, menu.title); 163 evm.add(*this, menu.title);
170 164
171 attrib.event_mask |= PointerMotionMask; 165 event_mask |= PointerMotionMask;
172 menu.frame = XCreateWindow(m_display, menu.window.window(), 0, 166 menu.frame = FbTk::FbWindow(menu.window,
173 menu.title_h, 167 0, menu.title_h,
174 menu.width, menu.frame_h, 0, 168 menu.width, menu.frame_h,
175 CopyFromParent, InputOutput, 169 event_mask);
176 CopyFromParent, attrib_mask, &attrib);
177 evm.add(*this, menu.frame); 170 evm.add(*this, menu.frame);
178 // update style 171 // update style
179 reconfigure(); 172 reconfigure();
@@ -392,10 +385,10 @@ void Menu::update(int active_index) {
392 m_border_width = 20; 385 m_border_width = 20;
393 386
394 menu.item_h = m_theme.frameFont().height() + menu.bevel_w; 387 menu.item_h = m_theme.frameFont().height() + menu.bevel_w;
395 menu.title_h = m_theme.frameFont().height() + menu.bevel_w*2; 388 menu.title_h = m_theme.titleFont().height() + menu.bevel_w*2;
396 389
397 if (title_vis) { 390 if (title_vis) {
398 menu.item_w = m_theme.titleFont().textWidth(menu.label.c_str(), menu.label.size()); 391 menu.item_w = m_theme.frameFont().textWidth(menu.label.c_str(), menu.label.size());
399 392
400 menu.item_w += (menu.bevel_w * 2); 393 menu.item_w += (menu.bevel_w * 2);
401 } else 394 } else
@@ -440,10 +433,14 @@ void Menu::update(int active_index) {
440 if (! menu.width) menu.width = menu.item_w; 433 if (! menu.width) menu.width = menu.item_w;
441 434
442 menu.frame_h = (menu.item_h * menu.persub); 435 menu.frame_h = (menu.item_h * menu.persub);
443 menu.height = ((title_vis) ? menu.title_h + menu.title.borderWidth() : 0) + 436 if (menu.frame_h < 1)
437 menu.frame_h = 1;
438
439 menu.height = (title_vis ? menu.title_h + menu.title.borderWidth() : 0) +
444 menu.frame_h; 440 menu.frame_h;
445 if (! menu.frame_h) menu.frame_h = 1; 441
446 if (menu.height < 1) menu.height = 1; 442 if (menu.height < 1)
443 menu.height = 1;
447 444
448 Pixmap tmp; 445 Pixmap tmp;
449 if (title_vis) { 446 if (title_vis) {
@@ -657,13 +654,12 @@ void Menu::redrawTitle() {
657 break; 654 break;
658 } 655 }
659 menu.title.clear(); 656 menu.title.clear();
660 font.drawText( 657 font.drawText(menu.title.window(), // drawable
661 menu.title.window(), // drawable
662 screenNumber(), 658 screenNumber(),
663 m_theme.titleTextGC(), // graphic context 659 m_theme.titleTextGC(), // graphic context
664 text, len, // text string with lenght 660 text, len, // text string with lenght
665 dx, font.ascent() + menu.bevel_w); // position 661 dx, font.ascent() + menu.bevel_w); // position
666 if (m_trans.get()) { 662 /* if (m_trans.get()) {
667 663
668 if (m_trans->alpha() != 255) { 664 if (m_trans->alpha() != 255) {
669 Pixmap root_pm = getRootPixmap(menu.window.screenNumber()); 665 Pixmap root_pm = getRootPixmap(menu.window.screenNumber());
@@ -678,7 +674,9 @@ void Menu::redrawTitle() {
678 0, 0, 674 0, 0,
679 menu.title.width(), menu.title.height()); 675 menu.title.width(), menu.title.height());
680 } 676 }
681 } 677 }*/
678 menu.title.updateTransparent();
679
682} 680}
683 681
684 682
@@ -953,8 +951,17 @@ void Menu::drawItem(unsigned int index, bool highlight, bool clear, bool render_
953 item_x, item_y, 951 item_x, item_y,
954 menu.item_w, menu.item_h, False); 952 menu.item_w, menu.item_h, False);
955 953
956 if (m_trans->alpha() != alpha()) 954 // if (m_trans->alpha() != alpha())
957 m_trans->setAlpha(alpha()); 955 // m_trans->setAlpha(alpha());
956 menu.title.setAlpha(alpha());
957 menu.frame.setAlpha(alpha());
958 menu.window.setAlpha(alpha());
959
960 menu.frame.updateTransparent(item_x, item_y,
961 menu.item_w, menu.item_h);
962
963
964 /*
958 if (m_trans.get() && render_trans) { 965 if (m_trans.get() && render_trans) {
959 966
960 if (m_trans->alpha() != 255) { 967 if (m_trans->alpha() != 255) {
@@ -975,7 +982,7 @@ void Menu::drawItem(unsigned int index, bool highlight, bool clear, bool render_
975 } 982 }
976 } 983 }
977 XSync(m_display, False); 984 XSync(m_display, False);
978 985 */
979} 986}
980 987
981void Menu::setLabel(const char *labelstr) { 988void Menu::setLabel(const char *labelstr) {
@@ -1342,15 +1349,19 @@ void Menu::reconfigure() {
1342 1349
1343 menu.window.setBorderWidth(m_border_width); 1350 menu.window.setBorderWidth(m_border_width);
1344 menu.title.setBorderWidth(m_border_width); 1351 menu.title.setBorderWidth(m_border_width);
1345 1352
1353 menu.frame.setAlpha(alpha());
1354 menu.title.setAlpha(alpha());
1355 menu.window.setAlpha(alpha());
1356 /*
1346 if (m_trans.get() && m_trans->alpha() != alpha()) 1357 if (m_trans.get() && m_trans->alpha() != alpha())
1347 m_trans->setAlpha(alpha()); 1358 m_trans->setAlpha(alpha());
1348 1359 */
1349 update(); 1360 update();
1350} 1361}
1351 1362
1352void Menu::renderTransFrame() { 1363void Menu::renderTransFrame() {
1353 if (m_trans.get() == 0 || moving) 1364 /* if (m_trans.get() == 0 || moving)
1354 return; 1365 return;
1355 1366
1356 if (m_trans->alpha() != alpha()) 1367 if (m_trans->alpha() != alpha())
@@ -1372,6 +1383,8 @@ void Menu::renderTransFrame() {
1372 menu.frame.width(), menu.frame.height()); 1383 menu.frame.width(), menu.frame.height());
1373 1384
1374 } 1385 }
1386 */
1387 menu.frame.updateTransparent();
1375} 1388}
1376 1389
1377}; // end namespace FbTk 1390}; // end namespace FbTk