projects
/
xmenu
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
tags
|
clone url
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
2b6968f
)
width is now calculated from the font
author
phillbush
<phillbush@cock.li>
Sat, 16 May 2020 04:24:43 +0000
(
01:24
-0300)
committer
phillbush
<phillbush@cock.li>
Sat, 16 May 2020 04:24:43 +0000
(
01:24
-0300)
xmenu.c
patch
|
blob
|
blame
|
history
diff --git
a/xmenu.c
b/xmenu.c
index
9e9d17b
..
a56091b
100644
(file)
--- a/
xmenu.c
+++ b/
xmenu.c
@@
-8,6
+8,7
@@
/* macros */
#define LEN(x) (sizeof (x) / sizeof (x[0]))
/* macros */
#define LEN(x) (sizeof (x) / sizeof (x[0]))
+#define MAX(x,y) ((x)>(y)?(x):(y))
/* color enum */
enum {ColorFG, ColorBG, ColorLast};
/* color enum */
enum {ColorFG, ColorBG, ColorLast};
@@
-45,6
+46,7
@@
struct Item {
char *output;
int y;
int h;
char *output;
int y;
int h;
+ size_t labellen;
struct Item *next;
struct Menu *submenu;
};
struct Item *next;
struct Menu *submenu;
};
@@
-212,6
+214,10
@@
allocitem(const char *label, const char *output)
}
item->y = 0;
item->h = item->label ? geom.itemh : geom.separator;
}
item->y = 0;
item->h = item->label ? geom.itemh : geom.separator;
+ if (item->label == NULL)
+ item->labellen = 0;
+ else
+ item->labellen = strlen(item->label);
item->next = NULL;
item->submenu = NULL;
item->next = NULL;
item->submenu = NULL;
@@
-348,14
+354,19
@@
calcmenu(struct Menu *menu)
XWindowChanges changes;
XSizeHints sizeh;
struct Item *item;
XWindowChanges changes;
XSizeHints sizeh;
struct Item *item;
+ int labelwidth;
- /* calculate items positions and menu height */
+ /* calculate items positions and menu width and height */
+ menu->w = geom.itemw;
for (item = menu->list; item != NULL; item = item->next) {
item->y = menu->h;
if (item->label == NULL) /* height for separator item */
menu->h += geom.separator;
else
menu->h += geom.itemh;
for (item = menu->list; item != NULL; item = item->next) {
item->y = menu->h;
if (item->label == NULL) /* height for separator item */
menu->h += geom.separator;
else
menu->h += geom.itemh;
+
+ labelwidth = XTextWidth(dc.font, item->label, item->labellen) + dc.fonth * 2;
+ menu->w = MAX(menu->w, labelwidth);
}
/* calculate menu's x and y positions */
}
/* calculate menu's x and y positions */
@@
-390,9
+401,10
@@
calcmenu(struct Menu *menu)
/* update menu geometry */
changes.height = menu->h;
/* update menu geometry */
changes.height = menu->h;
+ changes.width = menu->w;
changes.x = menu->x;
changes.y = menu->y;
changes.x = menu->x;
changes.y = menu->y;
- XConfigureWindow(dpy, menu->win, CWHeight | CWX | CWY, &changes);
+ XConfigureWindow(dpy, menu->win, CW
Width | CW
Height | CWX | CWY, &changes);
/* set window manager size hints */
sizeh.flags = PMaxSize | PMinSize;
/* set window manager size hints */
sizeh.flags = PMaxSize | PMinSize;
@@
-464,7
+476,6
@@
drawmenu(void)
for (menu = currmenu; menu != NULL; menu = menu->parent) {
for (item = menu->list; item != NULL; item = item->next) {
unsigned long *color;
for (menu = currmenu; menu != NULL; menu = menu->parent) {
for (item = menu->list; item != NULL; item = item->next) {
unsigned long *color;
- size_t labellen;
int labelx, labely;
/* determine item color */
int labelx, labely;
/* determine item color */
@@
-478,22
+489,22
@@
drawmenu(void)
/* draw item box */
XSetForeground(dpy, dc.gc, color[ColorBG]);
XFillRectangle(dpy, menu->pixmap, dc.gc, 0, item->y,
/* draw item box */
XSetForeground(dpy, dc.gc, color[ColorBG]);
XFillRectangle(dpy, menu->pixmap, dc.gc, 0, item->y,
-
geom.item
w, item->h);
+
menu->
w, item->h);
/* continue if item is a separator */
if (item->label == NULL)
continue;
/* draw item label */
/* continue if item is a separator */
if (item->label == NULL)
continue;
/* draw item label */
- labellen = strlen(item->label);
labelx = 0 + dc.fonth;
labely = item->y + dc.fonth + geom.itemb;
XSetForeground(dpy, dc.gc, color[ColorFG]);
labelx = 0 + dc.fonth;
labely = item->y + dc.fonth + geom.itemb;
XSetForeground(dpy, dc.gc, color[ColorFG]);
- XDrawString(dpy, menu->pixmap, dc.gc, labelx, labely, item->label, labellen);
+ XDrawString(dpy, menu->pixmap, dc.gc, labelx, labely,
+ item->label, item->labellen);
/* draw triangle, if item contains a submenu */
if (item->submenu != NULL) {
/* draw triangle, if item contains a submenu */
if (item->submenu != NULL) {
- int trianglex =
geom.item
w - dc.fonth + geom.itemb - 1;
+ int trianglex =
menu->
w - dc.fonth + geom.itemb - 1;
int triangley = item->y + (3 * item->h)/8 -1;
XPoint triangle[] = {
int triangley = item->y + (3 * item->h)/8 -1;
XPoint triangle[] = {