static void
initresources(void)
{
- char *xrm;
long n;
char *type;
+ char *xrm;
XrmDatabase xdb;
XrmValue xval;
Convex, CoordModeOrigin);
}
- /* draw icon */
- if (item->file && !iflag)
+ /* try to load icon */
+ if (item->file && !iflag) {
item->icon = loadicon(item->file);
+ free(item->file);
+ }
+ /* draw icon if properly loaded */
if (item->icon) {
imlib_context_set_image(item->icon);
imlib_context_set_drawable(item->sel);
imlib_render_image_on_drawable(config.horzpadding, config.iconpadding);
imlib_context_set_drawable(item->unsel);
imlib_render_image_on_drawable(config.horzpadding, config.iconpadding);
+ imlib_context_set_image(item->icon);
+ imlib_free_image();
}
}
}
static struct Item *
itemcycle(struct Menu *currmenu, int direction)
{
- struct Item *item;
+ struct Item *item = NULL;
struct Item *lastitem;
- item = NULL;
+ for (lastitem = currmenu->list; lastitem && lastitem->next; lastitem = lastitem->next)
+ ;
- if (direction == ITEMNEXT) {
+ /* select item (either separator or labeled item) in given direction */
+ switch (direction) {
+ case ITEMNEXT:
if (currmenu->selected == NULL)
item = currmenu->list;
else if (currmenu->selected->next != NULL)
item = currmenu->selected->next;
-
- while (item != NULL && item->label == NULL)
- item = item->next;
-
- if (item == NULL)
- item = currmenu->list;
- } else {
- for (lastitem = currmenu->list;
- lastitem != NULL && lastitem->next != NULL;
- lastitem = lastitem->next)
- ;
-
+ break;
+ case ITEMPREV:
if (currmenu->selected == NULL)
item = lastitem;
else if (currmenu->selected->prev != NULL)
item = currmenu->selected->prev;
+ break;
+ case ITEMFIRST:
+ item = currmenu->list;
+ break;
+ case ITEMLAST:
+ item = lastitem;
+ break;
+ }
+ /*
+ * the selected item can be a separator
+ * let's select the closest labeled item (ie., one that isn't a separator)
+ */
+ switch (direction) {
+ case ITEMNEXT:
+ case ITEMFIRST:
+ while (item != NULL && item->label == NULL)
+ item = item->next;
+ if (item == NULL)
+ item = currmenu->list;
+ break;
+ case ITEMPREV:
+ case ITEMLAST:
while (item != NULL && item->label == NULL)
item = item->prev;
-
if (item == NULL)
item = lastitem;
+ break;
}
return item;
/* cycle through menu */
item = NULL;
- if (ksym == XK_ISO_Left_Tab || ksym == XK_Up) {
+ if (ksym == XK_Home || ksym == KSYMFIRST) {
+ item = itemcycle(currmenu, ITEMFIRST);
+ } else if (ksym == XK_End || ksym == KSYMLAST) {
+ item = itemcycle(currmenu, ITEMLAST);
+ } else if (ksym == XK_ISO_Left_Tab || ksym == XK_Up || ksym == KSYMUP) {
item = itemcycle(currmenu, ITEMPREV);
- } else if (ksym == XK_Tab || ksym == XK_Down) {
+ } else if (ksym == XK_Tab || ksym == XK_Down || ksym == KSYMDOWN) {
item = itemcycle(currmenu, ITEMNEXT);
- } else if ((ksym == XK_Return || ksym == XK_Right) &&
- currmenu->selected != NULL) {
+ } else if (ksym >= XK_1 && ksym <= XK_9){
+ item = itemcycle(currmenu, ITEMFIRST);
+ for(int i = ksym-XK_1; i > 0; i-=1){
+ currmenu->selected = item;
+ item = itemcycle(currmenu, ITEMNEXT);
+ if (item == itemcycle(currmenu, ITEMLAST))
+ break;
+ }
+ } else if ((ksym == XK_Return || ksym == XK_Right || ksym == KSYMRIGHT) &&
+ currmenu->selected != NULL) {
item = currmenu->selected;
goto selectitem;
- } else if ((ksym == XK_Escape || ksym == XK_Left) &&
+ } else if ((ksym == XK_Escape || ksym == XK_Left || ksym == KSYMLEFT) &&
currmenu->parent != NULL) {
item = currmenu->parent->selected;
currmenu = currmenu->parent;
if (tmp->label != tmp->output)
free(tmp->label);
free(tmp->output);
- if (tmp->file != NULL) {
- free(tmp->file);
- if (tmp->icon != NULL) {
- imlib_context_set_image(tmp->icon);
- imlib_free_image();
- }
- }
item = item->next;
free(tmp);
}