mon.y = info[selmon].y_org;
mon.w = info[selmon].width;
mon.h = info[selmon].height;
+
+ XFree(info);
}
if (!pflag) {
static void
initresources(void)
{
- char *xrm;
long n;
char *type;
+ char *xrm;
XrmDatabase xdb;
XrmValue xval;
loadicon(const char *file)
{
Imlib_Image icon;
+ Imlib_Load_Error errcode;
+ const char *errstr;
int width;
int height;
int imgsize;
- icon = imlib_load_image(file);
- if (icon == NULL)
- errx(1, "could not load icon %s", file);
+ icon = imlib_load_image_with_error_return(file, &errcode);
+ if (*file == '\0') {
+ warnx("could not load icon (file name is blank)");
+ return NULL;
+ } else if (icon == NULL) {
+ switch (errcode) {
+ case IMLIB_LOAD_ERROR_FILE_DOES_NOT_EXIST:
+ errstr = "file does not exist";
+ break;
+ case IMLIB_LOAD_ERROR_FILE_IS_DIRECTORY:
+ errstr = "file is directory";
+ break;
+ case IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_READ:
+ case IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_WRITE:
+ errstr = "permission denied";
+ break;
+ case IMLIB_LOAD_ERROR_NO_LOADER_FOR_FILE_FORMAT:
+ errstr = "unknown file format";
+ break;
+ case IMLIB_LOAD_ERROR_PATH_TOO_LONG:
+ errstr = "path too long";
+ break;
+ case IMLIB_LOAD_ERROR_PATH_COMPONENT_NON_EXISTANT:
+ case IMLIB_LOAD_ERROR_PATH_COMPONENT_NOT_DIRECTORY:
+ case IMLIB_LOAD_ERROR_PATH_POINTS_OUTSIDE_ADDRESS_SPACE:
+ errstr = "improper path";
+ break;
+ case IMLIB_LOAD_ERROR_TOO_MANY_SYMBOLIC_LINKS:
+ errstr = "too many symbolic links";
+ break;
+ case IMLIB_LOAD_ERROR_OUT_OF_MEMORY:
+ errstr = "out of memory";
+ break;
+ case IMLIB_LOAD_ERROR_OUT_OF_FILE_DESCRIPTORS:
+ errstr = "out of file descriptors";
+ break;
+ default:
+ errstr = "unknown error";
+ break;
+ }
+ warnx("could not load icon (%s): %s", errstr, file);
+ return NULL;
+ }
imlib_context_set_image(icon);
Convex, CoordModeOrigin);
}
- /* draw icon */
- if (item->file != NULL && !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);
}