Rather than setting the padding.
/* sizes in pixels */
static int width_pixels = 130; /* minimum width of a menu */
/* sizes in pixels */
static int width_pixels = 130; /* minimum width of a menu */
-static int padding_pixels = 4; /* padding around label in a item */
+static int height_pixels = 25; /* height of a single menu item */
static int border_pixels = 1; /* menu border */
static int separator_pixels = 3; /* space around separator */
static int border_pixels = 1; /* menu border */
static int separator_pixels = 3; /* space around separator */
+/* the variables below cannot be set by X resources */
+
/* geometry of the right-pointing isoceles triangle for submenus */
static const int triangle_width = 3;
static const int triangle_height = 7;
/* geometry of the right-pointing isoceles triangle for submenus */
static const int triangle_width = 3;
static const int triangle_height = 7;
+
+/* padding of the area around the icon */
+static const int iconpadding = 4;
.B xmenu.width
The minimum width, in pixels, of the items in the menu.
.TP
.B xmenu.width
The minimum width, in pixels, of the items in the menu.
.TP
-.B xmenu.padding
-The size in pixels of the padding around the label text in items in the menu.
+.B xmenu.height
+The size in pixels of the height of a single menu item.
.TP
.B xmenu.borderWidth
The size in pixels of the border around the menu.
.TP
.B xmenu.borderWidth
The size in pixels of the border around the menu.
#define PROGNAME "xmenu"
#define ITEMPREV 0
#define ITEMNEXT 1
#define PROGNAME "xmenu"
#define ITEMPREV 0
#define ITEMNEXT 1
/* macros */
#define LEN(x) (sizeof (x) / sizeof (x[0]))
/* macros */
#define LEN(x) (sizeof (x) / sizeof (x[0]))
static struct Menu *allocmenu(struct Menu *parent, struct Item *list, unsigned level);
static struct Menu *buildmenutree(unsigned level, const char *label, const char *output, char *file);
static struct Menu *parsestdin(void);
static struct Menu *allocmenu(struct Menu *parent, struct Item *list, unsigned level);
static struct Menu *buildmenutree(unsigned level, const char *label, const char *output, char *file);
static struct Menu *parsestdin(void);
+static Imlib_Image loadicon(const char *file, int size);
static void setupmenusize(struct Geometry *geom, struct Menu *menu);
static void setupmenupos(struct Geometry *geom, struct Menu *menu);
static void setupmenu(struct Geometry *geom, struct Menu *menu, XClassHint *classh);
static void setupmenusize(struct Geometry *geom, struct Menu *menu);
static void setupmenupos(struct Geometry *geom, struct Menu *menu);
static void setupmenu(struct Geometry *geom, struct Menu *menu, XClassHint *classh);
if (XrmGetResource(xdb, "xmenu.separatorWidth", "*", &type, &xval) == True)
if ((n = strtol(xval.addr, NULL, 10)) > 0)
separator_pixels = n;
if (XrmGetResource(xdb, "xmenu.separatorWidth", "*", &type, &xval) == True)
if ((n = strtol(xval.addr, NULL, 10)) > 0)
separator_pixels = n;
- if (XrmGetResource(xdb, "xmenu.padding", "*", &type, &xval) == True)
+ if (XrmGetResource(xdb, "xmenu.height", "*", &type, &xval) == True)
if ((n = strtol(xval.addr, NULL, 10)) > 0)
if ((n = strtol(xval.addr, NULL, 10)) > 0)
if (XrmGetResource(xdb, "xmenu.width", "*", &type, &xval) == True)
if ((n = strtol(xval.addr, NULL, 10)) > 0)
width_pixels = n;
if (XrmGetResource(xdb, "xmenu.width", "*", &type, &xval) == True)
if ((n = strtol(xval.addr, NULL, 10)) > 0)
width_pixels = n;
XQueryPointer(dpy, rootwin, &w1, &w2, &geom->cursx, &geom->cursy, &a, &b, &mask);
geom->screenw = DisplayWidth(dpy, screen);
geom->screenh = DisplayHeight(dpy, screen);
XQueryPointer(dpy, rootwin, &w1, &w2, &geom->cursx, &geom->cursy, &a, &b, &mask);
geom->screenw = DisplayWidth(dpy, screen);
geom->screenh = DisplayHeight(dpy, screen);
- geom->itemh = dc.font->height + padding_pixels * 2;
+ geom->itemh = height_pixels;
geom->itemw = width_pixels;
geom->border = border_pixels;
geom->separator = separator_pixels;
geom->itemw = width_pixels;
geom->border = border_pixels;
geom->separator = separator_pixels;
/* put the item in the menu tree */
if (prevmenu == NULL) { /* there is no menu yet */
/* put the item in the menu tree */
if (prevmenu == NULL) { /* there is no menu yet */
- menu = allocmenu(NULL, curritem, level);
- rootmenu = menu;
- prevmenu = menu;
- curritem->prev = NULL;
+ menu = allocmenu(NULL, curritem, level);
+ rootmenu = menu;
+ prevmenu = menu;
+ curritem->prev = NULL;
} else if (level < prevmenu->level) { /* item is continuation of a parent menu */
/* go up the menu tree until find the menu this item continues */
for (menu = prevmenu, i = level;
} else if (level < prevmenu->level) { /* item is continuation of a parent menu */
/* go up the menu tree until find the menu this item continues */
for (menu = prevmenu, i = level;
/* get length of item->label rendered in the font */
XftTextExtentsUtf8(dpy, dc.font, (XftChar8 *)item->label,
item->labellen, &ext);
/* get length of item->label rendered in the font */
XftTextExtentsUtf8(dpy, dc.font, (XftChar8 *)item->label,
item->labellen, &ext);
- labelwidth = ext.xOff + dc.font->height * 2 + IMGPADDING * 2;
+
+ /* set menu width */
+ labelwidth = ext.xOff + item->h * 2;
menu->w = MAX(menu->w, labelwidth);
/* create icon */
if (item->file != NULL)
menu->w = MAX(menu->w, labelwidth);
/* create icon */
if (item->file != NULL)
- item->icon = loadicon(item->file, dc.font->height);
+ item->icon = loadicon(item->file, item->h - iconpadding * 2);
- x = dc.font->height + IMGPADDING;
- y = item->y + item->h/2 + dc.font->ascent/2 - 1;
+ x = item->h;
+ y = item->y + (item->h + dc.font->ascent) / 2;
XSetForeground(dpy, dc.gc, color[ColorFG].pixel);
XftDrawStringUtf8(menu->draw, &color[ColorFG], dc.font,
x, y, item->label, item->labellen);
/* draw triangle, if item contains a submenu */
if (item->submenu != NULL) {
XSetForeground(dpy, dc.gc, color[ColorFG].pixel);
XftDrawStringUtf8(menu->draw, &color[ColorFG], dc.font,
x, y, item->label, item->labellen);
/* draw triangle, if item contains a submenu */
if (item->submenu != NULL) {
- x = menu->w - dc.font->height/2 - IMGPADDING/2 - triangle_width/2 - 1;
- y = item->y + item->h/2 - triangle_height/2 - 1;
+ x = menu->w - (item->h + triangle_width + 1) / 2;
+ y = item->y + (item->h - triangle_height + 1) / 2;
XPoint triangle[] = {
{x, y},
XPoint triangle[] = {
{x, y},
/* draw icon */
if (item->file != NULL) {
/* draw icon */
if (item->file != NULL) {
- x = IMGPADDING / 2;
- y = item->y + (item->h - dc.font->height) / 2;
+ x = iconpadding;
+ y = item->y + iconpadding;
imlib_context_set_drawable(menu->pixmap);
imlib_context_set_image(item->icon);
imlib_render_image_on_drawable(x, y);
imlib_context_set_drawable(menu->pixmap);
imlib_context_set_image(item->icon);
imlib_render_image_on_drawable(x, y);