1 /* Functions for default rendering of menus. Might become pluginnable */
6 #include "render/theme.h"
8 void menu_render(ObMenu
*self
) {
11 int nitems
= 0; /* each item, only one is used */
17 if (self
->a_title
== NULL
) {
18 XSetWindowBorderWidth(ob_display
, self
->frame
, ob_rr_theme
->bwidth
);
19 XSetWindowBackground(ob_display
, self
->frame
,
20 RrColorPixel(ob_rr_theme
->b_color
));
21 XSetWindowBorderWidth(ob_display
, self
->title
, ob_rr_theme
->bwidth
);
22 XSetWindowBorder(ob_display
, self
->frame
,
23 RrColorPixel(ob_rr_theme
->b_color
));
24 XSetWindowBorder(ob_display
, self
->title
,
25 RrColorPixel(ob_rr_theme
->b_color
));
27 self
->a_title
= RrAppearanceCopy(ob_rr_theme
->a_menu_title
);
28 self
->a_items
= RrAppearanceCopy(ob_rr_theme
->a_menu
);
31 /* set texture data and size them mofos out */
32 if (self
->label
&& !(self
->parent
&& self
->parent
->shown
)) {
33 self
->a_title
->texture
[0].data
.text
.string
= self
->label
;
34 RrMinsize(self
->a_title
, &self
->title_min_w
, &self
->title_h
);
35 self
->title_min_w
+= ob_rr_theme
->bevel
* 2;
36 self
->title_h
+= ob_rr_theme
->bevel
* 2;
37 self
->size
.width
= MAX(self
->size
.width
, self
->title_min_w
);
39 self
->title_h
= -ob_rr_theme
->bwidth
;
41 for (it
= self
->entries
; it
; it
= it
->next
) {
42 ObMenuEntry
*e
= it
->data
;
45 if (e
->a_item
== NULL
) {
46 e
->a_item
= RrAppearanceCopy(ob_rr_theme
->a_menu_item
);
47 e
->a_disabled
= RrAppearanceCopy(ob_rr_theme
->a_menu_disabled
);
48 e
->a_hilite
= RrAppearanceCopy(ob_rr_theme
->a_menu_hilite
);
49 e
->a_submenu
= RrAppearanceCopy(ob_rr_theme
->a_menu_bullet
);
52 e
->a_item
->texture
[0].data
.text
.string
= e
->label
;
53 RrMinsize(e
->a_item
, &e
->min_w
, &self
->item_h
);
54 self
->size
.width
= MAX(self
->size
.width
, e
->min_w
);
56 e
->a_disabled
->texture
[0].data
.text
.string
= e
->label
;
57 RrMinsize(e
->a_disabled
, &e
->min_w
, &h
);
58 self
->item_h
= MAX(self
->item_h
, h
);
59 self
->size
.width
= MAX(self
->size
.width
, e
->min_w
);
61 e
->a_hilite
->texture
[0].data
.text
.string
= e
->label
;
62 RrMinsize(e
->a_hilite
, &e
->min_w
, &h
);
63 self
->item_h
= MAX(self
->item_h
, h
);
64 self
->size
.width
= MAX(self
->size
.width
, e
->min_w
);
66 e
->min_w
+= ob_rr_theme
->bevel
* 2;
69 self
->bullet_w
= self
->item_h
+ ob_rr_theme
->bevel
;
70 self
->size
.width
+= 2 * self
->bullet_w
+ 2 * ob_rr_theme
->bevel
;
71 self
->item_h
+= ob_rr_theme
->bevel
* 2;
72 items_h
= self
->item_h
* MAX(nitems
, 1);
74 self
->size
.height
= MAX(self
->title_h
+ items_h
+ ob_rr_theme
->bwidth
, 1);
75 XResizeWindow(ob_display
, self
->frame
, self
->size
.width
,self
->size
.height
);
76 if (self
->label
&& !(self
->parent
&& self
->parent
->shown
)) {
77 XMoveResizeWindow(ob_display
, self
->title
, -ob_rr_theme
->bwidth
,
79 self
->size
.width
, self
->title_h
);
80 XMapWindow(ob_display
, self
->title
);
82 XUnmapWindow(ob_display
, self
->title
);
84 XMoveResizeWindow(ob_display
, self
->items
, 0,
85 self
->title_h
+ ob_rr_theme
->bwidth
, self
->size
.width
,
88 if (self
->label
&& !(self
->parent
&& self
->parent
->shown
))
89 RrPaint(self
->a_title
, self
->title
, self
->size
.width
, self
->title_h
);
90 RrPaint(self
->a_items
, self
->items
, self
->size
.width
, items_h
);
93 for (it
= self
->entries
; it
; it
= it
->next
) {
94 ((ObMenuEntry
*)it
->data
)->y
= item_y
;
95 menu_entry_render(it
->data
);
96 item_y
+= self
->item_h
;
99 self
->invalid
= FALSE
;
102 void menu_entry_render(ObMenuEntry
*self
)
104 ObMenu
*menu
= self
->parent
;
105 RrAppearance
*a
, *s
= NULL
;
107 switch (self
->render_type
) {
108 case OB_MENU_ENTRY_RENDER_TYPE_SUBMENU
:
109 a
= self
->enabled
? (self
->hilite
? self
->a_hilite
: self
->a_item
)
113 case OB_MENU_ENTRY_RENDER_TYPE_BOOLEAN
:
114 /* TODO: boolean check */
115 a
= self
->enabled
? (self
->hilite
? self
->a_hilite
: self
->a_item
)
118 case OB_MENU_ENTRY_RENDER_TYPE_NONE
:
119 a
= self
->enabled
? (self
->hilite
? self
->a_hilite
: self
->a_item
)
122 case OB_MENU_ENTRY_RENDER_TYPE_SEPARATOR
:
127 g_assert_not_reached(); /* unhandled rendering type */
131 XMoveResizeWindow(ob_display
, self
->item
, 0, self
->y
,
132 menu
->size
.width
, menu
->item_h
);
134 XMoveResizeWindow(ob_display
, self
->submenu_pic
,
136 menu
->bullet_w
+ (menu
->bullet_w
- 8) / 2,
137 self
->y
+ (menu
->item_h
- 8) / 2,
139 XMapWindow(ob_display
, self
->submenu_pic
);
141 XUnmapWindow(ob_display
, self
->submenu_pic
);
143 a
->surface
.parent
= menu
->a_items
;
144 a
->surface
.parentx
= 0;
145 a
->surface
.parenty
= self
->y
;
148 s
->surface
.parent
= a
;
149 s
->surface
.parentx
= menu
->size
.width
-
150 menu
->bullet_w
+ (menu
->bullet_w
- 8) / 2,
151 s
->surface
.parenty
= (menu
->item_h
- 8) / 2;
154 RrPaint(a
, self
->item
, menu
->size
.width
, menu
->item_h
);
157 RrPaint(s
, self
->submenu_pic
, 8, 8);