From 685ca30d8dad383f725316ccc42cbaee1674f829 Mon Sep 17 00:00:00 2001 From: phillbush Date: Fri, 12 Jun 2020 11:37:13 -0300 Subject: [PATCH] Configuring height directly by setting the height. Rather than setting the padding. --- config.h | 7 ++++++- xmenu.1 | 4 ++-- xmenu.c | 34 ++++++++++++++++++---------------- 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/config.h b/config.h index a3e4f95..db81ae6 100644 --- a/config.h +++ b/config.h @@ -11,10 +11,15 @@ static const char *border_color = "#E6E6E6"; /* 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 */ +/* 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; + +/* padding of the area around the icon */ +static const int iconpadding = 4; diff --git a/xmenu.1 b/xmenu.1 index b24a767..d8fc51e 100644 --- a/xmenu.1 +++ b/xmenu.1 @@ -99,8 +99,8 @@ The color of the separator between items in the menu. .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. diff --git a/xmenu.c b/xmenu.c index 2096e70..64dd46b 100644 --- a/xmenu.c +++ b/xmenu.c @@ -13,7 +13,6 @@ #define PROGNAME "xmenu" #define ITEMPREV 0 #define ITEMNEXT 1 -#define IMGPADDING 8 /* macros */ #define LEN(x) (sizeof (x) / sizeof (x[0])) @@ -79,6 +78,7 @@ static struct Item *allocitem(const char *label, const char *output, char *file) 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); @@ -207,9 +207,9 @@ getresources(void) 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) - padding_pixels = n; + height_pixels = n; if (XrmGetResource(xdb, "xmenu.width", "*", &type, &xval) == True) if ((n = strtol(xval.addr, NULL, 10)) > 0) width_pixels = n; @@ -270,7 +270,7 @@ calcgeom(struct Geometry *geom) 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; @@ -370,10 +370,10 @@ buildmenutree(unsigned level, const char *label, const char *output, char *file) /* 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; @@ -499,12 +499,14 @@ setupmenusize(struct Geometry *geom, struct Menu *menu) /* 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) - item->icon = loadicon(item->file, dc.font->height); + item->icon = loadicon(item->file, item->h - iconpadding * 2); } } @@ -734,16 +736,16 @@ drawitem(struct Menu *menu, struct Item *item, XftColor *color) { int x, y; - 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) { - 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}, @@ -758,8 +760,8 @@ drawitem(struct Menu *menu, struct Item *item, XftColor *color) /* 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);