summaryrefslogtreecommitdiff
path: root/src/FbTk/Menu.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/FbTk/Menu.cc')
-rw-r--r--src/FbTk/Menu.cc113
1 files changed, 45 insertions, 68 deletions
diff --git a/src/FbTk/Menu.cc b/src/FbTk/Menu.cc
index e2aa3c5..59cc310 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.43 2003/11/28 23:26:27 fluxgen Exp $ 25// $Id: Menu.cc,v 1.44 2003/12/10 23:08:06 fluxgen Exp $
26 26
27//use GNU extensions 27//use GNU extensions
28#ifndef _GNU_SOURCE 28#ifndef _GNU_SOURCE
@@ -48,45 +48,18 @@
48 48
49using namespace std; 49using namespace std;
50 50
51namespace {
52Pixmap getRootPixmap(int screen_num) {
53 Pixmap root_pm = 0;
54 // get root pixmap for transparency
55 Display *disp = FbTk::App::instance()->display();
56 Atom real_type;
57 int real_format;
58 unsigned long items_read, items_left;
59 unsigned int *data;
60 if (XGetWindowProperty(disp, RootWindow(disp, screen_num),
61 XInternAtom(disp, "_XROOTPMAP_ID", false),
62 0L, 1L,
63 false, XA_PIXMAP, &real_type,
64 &real_format, &items_read, &items_left,
65 (unsigned char **) &data) == Success &&
66 items_read) {
67 root_pm = (Pixmap) (*data);
68 XFree(data);
69 }
70
71 return root_pm;
72}
73
74}; // end anonymous namespace
75
76namespace FbTk { 51namespace FbTk {
77 52
78static Menu *shown = 0; 53static Menu *shown = 0;
79 54
80Menu *Menu::s_focused = 0; 55Menu *Menu::s_focused = 0;
81 56
82Menu::Menu(MenuTheme &tm, int screen_num, ImageControl &imgctrl): 57Menu::Menu(MenuTheme &tm, ImageControl &imgctrl):
83 m_theme(tm), 58 m_theme(tm),
84 m_screen_num(screen_num),
85 m_image_ctrl(imgctrl), 59 m_image_ctrl(imgctrl),
86 m_display(FbTk::App::instance()->display()),
87 m_parent(0), 60 m_parent(0),
88 m_screen_width(DisplayWidth(m_display, screen_num)), 61 m_screen_width(DisplayWidth(FbTk::App::instance()->display(), tm.screenNum())),
89 m_screen_height(DisplayHeight(m_display, screen_num)), 62 m_screen_height(DisplayHeight(FbTk::App::instance()->display(), tm.screenNum())),
90 m_alignment(ALIGNDONTCARE), 63 m_alignment(ALIGNDONTCARE),
91 m_border_width(0), 64 m_border_width(0),
92 m_themeobserver(*this), 65 m_themeobserver(*this),
@@ -123,7 +96,7 @@ Menu::Menu(MenuTheme &tm, int screen_num, ImageControl &imgctrl):
123 96
124 menu.bevel_w = 2; 97 menu.bevel_w = 2;
125 98
126 menu.width = menu.title_h = menu.item_w = menu.frame_h = 99 menu.title_h = menu.item_w = menu.frame_h =
127 m_theme.titleFont().height() + menu.bevel_w * 2; 100 m_theme.titleFont().height() + menu.bevel_w * 2;
128 101
129 menu.sublevels = 102 menu.sublevels =
@@ -132,13 +105,11 @@ Menu::Menu(MenuTheme &tm, int screen_num, ImageControl &imgctrl):
132 105
133 menu.item_h = m_theme.frameFont().height() + menu.bevel_w; 106 menu.item_h = m_theme.frameFont().height() + menu.bevel_w;
134 107
135 menu.height = menu.title_h + 2 + menu.frame_h;
136
137 long event_mask = ButtonPressMask | ButtonReleaseMask | 108 long event_mask = ButtonPressMask | ButtonReleaseMask |
138 ButtonMotionMask | KeyPressMask | ExposureMask | FocusChangeMask; 109 ButtonMotionMask | KeyPressMask | ExposureMask | FocusChangeMask;
139 //create menu window 110 // create menu window
140 menu.window = FbTk::FbWindow(screen_num, 111 menu.window = FbTk::FbWindow(tm.screenNum(),
141 menu.x, menu.y, menu.width, menu.height, 112 0, 0, 10, 10,
142 event_mask, 113 event_mask,
143 true); // override redirect 114 true); // override redirect
144 115
@@ -152,7 +123,7 @@ Menu::Menu(MenuTheme &tm, int screen_num, ImageControl &imgctrl):
152 event_mask |= EnterWindowMask | LeaveWindowMask; 123 event_mask |= EnterWindowMask | LeaveWindowMask;
153 //create menu title 124 //create menu title
154 menu.title = FbTk::FbWindow(menu.window, 125 menu.title = FbTk::FbWindow(menu.window,
155 0, 0, menu.width, menu.height, 126 0, 0, width(), menu.title_h,
156 event_mask); 127 event_mask);
157 128
158 evm.add(*this, menu.title); 129 evm.add(*this, menu.title);
@@ -160,7 +131,7 @@ Menu::Menu(MenuTheme &tm, int screen_num, ImageControl &imgctrl):
160 event_mask |= PointerMotionMask; 131 event_mask |= PointerMotionMask;
161 menu.frame = FbTk::FbWindow(menu.window, 132 menu.frame = FbTk::FbWindow(menu.window,
162 0, menu.title_h, 133 0, menu.title_h,
163 menu.width, menu.frame_h, 134 width(), menu.frame_h ? menu.frame_h : 1,
164 event_mask); 135 event_mask);
165 evm.add(*this, menu.frame); 136 evm.add(*this, menu.frame);
166 // update style 137 // update style
@@ -421,30 +392,36 @@ void Menu::update(int active_index) {
421 menu.persub = 0; 392 menu.persub = 0;
422 } 393 }
423 394
424 menu.width = (menu.sublevels * (menu.item_w));
425 if (! menu.width) menu.width = menu.item_w;
426
427 menu.frame_h = (menu.item_h * menu.persub); 395 menu.frame_h = (menu.item_h * menu.persub);
428 if (menu.frame_h < 0) 396 if (menu.frame_h < 0)
429 menu.frame_h = 0; 397 menu.frame_h = 0;
430 398
431 menu.height = menu.frame_h; 399
400 int new_width = (menu.sublevels * menu.item_w);
401 int new_height = menu.frame_h;
402
432 if (title_vis) 403 if (title_vis)
433 menu.height += menu.title_h + ((menu.frame_h>0)?menu.title.borderWidth():0); 404 new_height += menu.title_h + ((menu.frame_h>0)?menu.title.borderWidth():0);
405
406
407 if (new_width < 1)
408 new_width = menu.item_w;
409
410 if (new_height < 1)
411 new_height = 1;
434 412
435 if (menu.height < 1) 413 menu.window.resize(new_width, new_height);
436 menu.height = 1;
437 414
438 Pixmap tmp; 415 Pixmap tmp;
439 if (title_vis) { 416 if (title_vis) {
440 tmp = menu.title_pixmap; 417 tmp = menu.title_pixmap;
441 const FbTk::Texture &tex = m_theme.titleTexture(); 418 const FbTk::Texture &tex = m_theme.titleTexture();
442 if (tex.type() == (FbTk::Texture::FLAT | FbTk::Texture::SOLID)) { 419 if (!tex.usePixmap()) {
443 menu.title_pixmap = None; 420 menu.title_pixmap = None;
444 menu.title.setBackgroundColor(tex.color()); 421 menu.title.setBackgroundColor(tex.color());
445 } else { 422 } else {
446 menu.title_pixmap = 423 menu.title_pixmap =
447 m_image_ctrl.renderImage(menu.width, menu.title_h, tex); 424 m_image_ctrl.renderImage(width(), menu.title_h, tex);
448 menu.title.setBackgroundPixmap(menu.title_pixmap); 425 menu.title.setBackgroundPixmap(menu.title_pixmap);
449 } 426 }
450 427
@@ -455,11 +432,11 @@ void Menu::update(int active_index) {
455 432
456 tmp = menu.frame_pixmap; 433 tmp = menu.frame_pixmap;
457 const FbTk::Texture &frame_tex = m_theme.frameTexture(); 434 const FbTk::Texture &frame_tex = m_theme.frameTexture();
458 if (frame_tex.type() == (FbTk::Texture::FLAT | FbTk::Texture::SOLID)) { 435 if (!frame_tex.usePixmap()) {
459 menu.frame_pixmap = None; 436 menu.frame_pixmap = None;
460 } else { 437 } else {
461 menu.frame_pixmap = 438 menu.frame_pixmap =
462 m_image_ctrl.renderImage(menu.width, menu.frame_h, frame_tex); 439 m_image_ctrl.renderImage(width(), menu.frame_h, frame_tex);
463 } 440 }
464 441
465 if (tmp) 442 if (tmp)
@@ -467,18 +444,18 @@ void Menu::update(int active_index) {
467 444
468 tmp = menu.hilite_pixmap; 445 tmp = menu.hilite_pixmap;
469 const FbTk::Texture &hilite_tex = m_theme.hiliteTexture(); 446 const FbTk::Texture &hilite_tex = m_theme.hiliteTexture();
470 if (hilite_tex.type() == (FbTk::Texture::FLAT | FbTk::Texture::SOLID)) 447 if (!hilite_tex.usePixmap()) {
471 menu.hilite_pixmap = None; 448 menu.hilite_pixmap = None;
472 else 449 } else
473 menu.hilite_pixmap = 450 menu.hilite_pixmap =
474 m_image_ctrl.renderImage(menu.item_w, menu.item_h, hilite_tex); 451 m_image_ctrl.renderImage(menu.item_w, menu.item_h, hilite_tex);
475 if (tmp) 452 if (tmp)
476 m_image_ctrl.removeImage(tmp); 453 m_image_ctrl.removeImage(tmp);
477 454
478 tmp = menu.sel_pixmap; 455 tmp = menu.sel_pixmap;
479 if (hilite_tex.type() == (FbTk::Texture::FLAT | FbTk::Texture::SOLID)) 456 if (!hilite_tex.usePixmap()) {
480 menu.sel_pixmap = None; 457 menu.sel_pixmap = None;
481 else { 458 } else {
482 int hw = menu.item_h / 2; 459 int hw = menu.item_h / 2;
483 menu.sel_pixmap = 460 menu.sel_pixmap =
484 m_image_ctrl.renderImage(hw, hw, hilite_tex); 461 m_image_ctrl.renderImage(hw, hw, hilite_tex);
@@ -486,11 +463,11 @@ void Menu::update(int active_index) {
486 if (tmp) 463 if (tmp)
487 m_image_ctrl.removeImage(tmp); 464 m_image_ctrl.removeImage(tmp);
488 465
489 menu.window.resize(menu.width, menu.height); 466
490 467
491 if (title_vis) { 468 if (title_vis) {
492 menu.title.moveResize(-menu.title.borderWidth(), -menu.title.borderWidth(), 469 menu.title.moveResize(-menu.title.borderWidth(), -menu.title.borderWidth(),
493 menu.width + menu.title.borderWidth(), menu.title_h); 470 width() + menu.title.borderWidth(), menu.title_h);
494 } 471 }
495 472
496 menu.frame.moveResize(0, ((title_vis) ? menu.title.y() + menu.title.height() + 473 menu.frame.moveResize(0, ((title_vis) ? menu.title.y() + menu.title.height() +
@@ -637,11 +614,11 @@ void Menu::redrawTitle() {
637 614
638 switch (m_theme.titleFontJustify()) { 615 switch (m_theme.titleFontJustify()) {
639 case FbTk::RIGHT: 616 case FbTk::RIGHT:
640 dx += menu.width - l; 617 dx += width() - l;
641 break; 618 break;
642 619
643 case FbTk::CENTER: 620 case FbTk::CENTER:
644 dx += (menu.width - l) / 2; 621 dx += (width() - l) / 2;
645 break; 622 break;
646 default: 623 default:
647 break; 624 break;
@@ -695,10 +672,10 @@ void Menu::drawSubmenu(unsigned int index) {
695 } 672 }
696 673
697 if (m_alignment == ALIGNBOTTOM && 674 if (m_alignment == ALIGNBOTTOM &&
698 (y + item->submenu()->menu.height) > ((shifted) ? menu.y_shift : 675 (y + item->submenu()->height()) > ((shifted) ? menu.y_shift :
699 menu.y) + menu.height) { 676 menu.y) + height()) {
700 y = (((shifted) ? menu.y_shift : menu.y) + 677 y = (((shifted) ? menu.y_shift : menu.y) +
701 menu.height - item->submenu()->menu.height); 678 height() - item->submenu()->height());
702 } 679 }
703 680
704 if ((x + item->submenu()->width()) > m_screen_width) { 681 if ((x + item->submenu()->width()) > m_screen_width) {
@@ -1090,13 +1067,13 @@ void Menu::buttonReleaseEvent(XButtonEvent &re) {
1090 update(); 1067 update();
1091 } 1068 }
1092 1069
1093 if (re.x >= 0 && re.x <= (signed) menu.width && 1070 if (re.x >= 0 && re.x <= (signed) width() &&
1094 re.y >= 0 && re.y <= (signed) menu.title_h && 1071 re.y >= 0 && re.y <= (signed) menu.title_h &&
1095 re.button == 3) 1072 re.button == 3)
1096 hide(); 1073 hide();
1097 1074
1098 } else if (re.window == menu.frame && 1075 } else if (re.window == menu.frame &&
1099 re.x >= 0 && re.x < (signed) menu.width && 1076 re.x >= 0 && re.x < (signed) width() &&
1100 re.y >= 0 && re.y < (signed) menu.frame_h) { 1077 re.y >= 0 && re.y < (signed) menu.frame_h) {
1101 1078
1102 int sbl = (re.x / menu.item_w), i = (re.y / menu.item_h), 1079 int sbl = (re.x / menu.item_w), i = (re.y / menu.item_h),
@@ -1147,7 +1124,7 @@ void Menu::motionNotifyEvent(XMotionEvent &me) {
1147 } 1124 }
1148 } 1125 }
1149 } else if ((! (me.state & Button1Mask)) && me.window == menu.frame && 1126 } else if ((! (me.state & Button1Mask)) && me.window == menu.frame &&
1150 me.x >= 0 && me.x < (signed) menu.width && 1127 me.x >= 0 && me.x < (signed) width() &&
1151 me.y >= 0 && me.y < (signed) menu.frame_h) { 1128 me.y >= 0 && me.y < (signed) menu.frame_h) {
1152 int sbl = (me.x / menu.item_w), i = (me.y / menu.item_h), 1129 int sbl = (me.x / menu.item_w), i = (me.y / menu.item_h),
1153 w = (sbl * menu.persub) + i; 1130 w = (sbl * menu.persub) + i;
@@ -1230,16 +1207,16 @@ void Menu::enterNotifyEvent(XCrossingEvent &ce) {
1230 return; 1207 return;
1231 1208
1232 menu.x_shift = menu.x, menu.y_shift = menu.y; 1209 menu.x_shift = menu.x, menu.y_shift = menu.y;
1233 if (menu.x + menu.width > m_screen_width) { 1210 if (menu.x + width() > m_screen_width) {
1234 menu.x_shift = m_screen_width - menu.width - 2*m_border_width; 1211 menu.x_shift = m_screen_width - width() - 2*m_border_width;
1235 shifted = true; 1212 shifted = true;
1236 } else if (menu.x < 0) { 1213 } else if (menu.x < 0) {
1237 menu.x_shift = 0; //-m_border_width; 1214 menu.x_shift = 0; //-m_border_width;
1238 shifted = true; 1215 shifted = true;
1239 } 1216 }
1240 1217
1241 if (menu.y + menu.height + 2*m_border_width > m_screen_height) { 1218 if (menu.y + height() + 2*m_border_width > m_screen_height) {
1242 menu.y_shift = m_screen_height - menu.height - 2*m_border_width; 1219 menu.y_shift = m_screen_height - height() - 2*m_border_width;
1243 shifted = true; 1220 shifted = true;
1244 } else if (menu.y + (signed) menu.title_h < 0) { 1221 } else if (menu.y + (signed) menu.title_h < 0) {
1245 menu.y_shift = 0; // -m_border_width;; 1222 menu.y_shift = 0; // -m_border_width;;