--- rxvt-unicode/src/menubar.C 2004/02/09 07:11:49 1.7 +++ rxvt-unicode/src/menubar.C 2005/12/21 14:19:19 1.27 @@ -1,8 +1,9 @@ /*--------------------------------*-C-*---------------------------------* - * File: menubar.c + * File: menubar.C *----------------------------------------------------------------------* * * Copyright (c) 1997,1998 mj olesen + * Copyright (c) 2004 Marc Lehmann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,11 +24,13 @@ *----------------------------------------------------------------------*/ #include "../config.h" /* NECESSARY */ + +#include + #include "rxvt.h" /* NECESSARY */ #ifdef MENUBAR #include "version.h" #include "menubar.h" -#include "menubar.intpro" /* PROTOS for internal routines */ #define Menu_PixelWidth(menu) \ (2 * SHADOW + Width2Pixel ((menu)->width + 3 * HSPACE)) @@ -35,7 +38,7 @@ static const struct { const char name; /* (l)eft, (u)p, (d)own, (r)ight */ - const unsigned char str[5]; /* str[0] = STRLEN (str+1) */ + const unsigned char str[5]; /* str[0] = strlen (str+1) */ } Arrows[NARROWS] = { { 'l', "\003\033[D" }, @@ -46,17 +49,41 @@ /*}}} */ +static void +draw_string (rxvt_drawable &d, GC gc, rxvt_fontset *fs, int x, int y, char *str, int len) +{ + mbstate mbs; + + while (len) + { + wchar_t w; + int l = mbrtowc (&w, str, len, mbs); + + if (l <= 0) + break; + + len -= l; + str += l; + + rxvt_font *font = (*fs)[fs->find_font (w)]; + text_t ch = w; + font->draw (d, x, y, &ch, 1, Color_bg, Color_scroll); + + x += font->width * wcwidth (w); + } +} + /* * find an item called NAME in MENU */ menuitem_t * -rxvt_menuitem_find(const menu_t *menu, const char *name) +rxvt_menuitem_find (const menu_t *menu, const char *name) { menuitem_t *item; #ifdef DEBUG_STRICT - assert(name != NULL); - assert(menu != NULL); + assert (name != NULL); + assert (menu != NULL); #endif /* find the last item in the menu, this is good for separators */ @@ -64,11 +91,11 @@ { if (item->entry.type == MenuSubMenu) { - if (!STRCMP(name, (item->entry.submenu.menu)->name)) + if (!strcmp (name, (item->entry.submenu.menu)->name)) break; } - else if ((isSeparator(name) && isSeparator(item->name)) - || !STRCMP(name, item->name)) + else if ((isSeparator (name) && isSeparator (item->name)) + || !strcmp (name, item->name)) break; } return item; @@ -84,7 +111,7 @@ menuitem_t *prev, *next; #ifdef DEBUG_STRICT - assert(menu != NULL); + assert (menu != NULL); #endif prev = item->prev; @@ -104,17 +131,17 @@ { case MenuAction: case MenuTerminalAction: - free(item->entry.action.str); + free (item->entry.action.str); break; case MenuSubMenu: menu_delete (item->entry.submenu.menu); break; } if (item->name != NULL) - free(item->name); + free (item->name); if (item->name2 != NULL) - free(item->name2); - free(item); + free (item->name2); + free (item); } /* @@ -122,15 +149,15 @@ * remove the first character of STR if it's '\0' */ int -rxvt_action_type(action_t *action, unsigned char *str) +rxvt_action_type (action_t *action, unsigned char *str) { unsigned int len; #if defined (DEBUG_MENU) || defined (DEBUG_MENUARROWS) - len = STRLEN(str); - fprintf(stderr, "(len %d) = %s\n", len, str); + len = strlen (str); + fprintf (stderr, " (len %d) = %s\n", len, str); #else - len = rxvt_Str_escaped((char *)str); + len = rxvt_Str_escaped ((char *)str); #endif if (!len) @@ -180,7 +207,7 @@ /* return the arrow index corresponding to NAME */ int -rxvt_menuarrow_find(char name) +rxvt_menuarrow_find (char name) { int i; @@ -198,16 +225,16 @@ if (name) { - i = rxvt_menuarrow_find(name); + i = rxvt_menuarrow_find (name); if (i >= 0) { - action_t *act = &(CurrentBar->arrows[i]); + action_t *act = & (CurrentBar->arrows[i]); switch (act->type) { case MenuAction: case MenuTerminalAction: - free(act->str); + free (act->str); act->str = NULL; act->len = 0; break; @@ -238,13 +265,13 @@ *cur, parse[NARROWS]; - MEMSET(parse, 0, sizeof(parse)); + memset (parse, 0, sizeof (parse)); - /* fprintf(stderr, "add arrows = `%s'\n", string); */ + /* fprintf (stderr, "add arrows = `%s'\n", string); */ for (p = string; p != NULL && *p; string = p) { p = (string + 3); - /* fprintf(stderr, "parsing at %s\n", string); */ + /* fprintf (stderr, "parsing at %s\n", string); */ switch (string[1]) { case 'b': @@ -255,9 +282,9 @@ break; default: - i = rxvt_menuarrow_find(string[1]); + i = rxvt_menuarrow_find (string[1]); if (i >= 0) - cur = &(parse[i]); + cur = & (parse[i]); else continue; /* not found */ break; @@ -269,7 +296,7 @@ if (cur == &end) { - p = STRCHR(string, '\0'); + p = strchr (string, '\0'); } else { @@ -277,7 +304,7 @@ while (1) { - p = STRCHR(next, '<'); + p = strchr (next, '<'); if (p != NULL) { if (p[1] && p[2] == '>') @@ -287,7 +314,7 @@ else { if (beg.str == NULL) /* no end needed */ - p = STRCHR(next, '\0'); + p = strchr (next, '\0'); break; } next = (p + 1); @@ -301,17 +328,17 @@ #ifdef DEBUG_MENUARROWS cur = &beg; - fprintf(stderr, "(len %d) = %.*s\n", + fprintf (stderr, " (len %d) = %.*s\n", cur->len, cur->len, (cur->str ? cur->str : "")); for (i = 0; i < NARROWS; i++) { - cur = &(parse[i]); - fprintf(stderr, "<%c>(len %d) = %.*s\n", + cur = & (parse[i]); + fprintf (stderr, "<%c> (len %d) = %.*s\n", Arrows[i].name, cur->len, cur->len, (cur->str ? cur->str : "")); } cur = &end; - fprintf(stderr, "(len %d) = %.*s\n", + fprintf (stderr, " (len %d) = %.*s\n", cur->len, cur->len, (cur->str ? cur->str : "")); #endif @@ -330,47 +357,47 @@ if (!parse[i].len) continue; - str = rxvt_malloc(parse[i].len + xtra_len + 1); + str = (unsigned char *) rxvt_malloc (parse[i].len + xtra_len + 1); len = 0; if (beg.len) { - STRNCPY(str + len, beg.str, beg.len); + strncpy (str + len, beg.str, beg.len); len += beg.len; } - STRNCPY(str + len, parse[i].str, parse[i].len); + strncpy (str + len, parse[i].str, parse[i].len); len += parse[i].len; if (end.len) { - STRNCPY(str + len, end.str, end.len); + strncpy (str + len, end.str, end.len); len += end.len; } str[len] = '\0'; #ifdef DEBUG_MENUARROWS - fprintf(stderr, "<%c>(len %d) = %s\n", Arrows[i].name, len, str); + fprintf (stderr, "<%c> (len %d) = %s\n", Arrows[i].name, len, str); #endif - if (rxvt_action_type(&(CurrentBar->arrows[i]), str) < 0) - free(str); + if (rxvt_action_type (& (CurrentBar->arrows[i]), str) < 0) + free (str); } } menuitem_t * -rxvt_menuitem_add(menu_t *menu, const char *name, const char *name2, const char *action) +rxvt_menuitem_add (menu_t *menu, const char *name, const char *name2, const char *action) { menuitem_t *item; unsigned int len; #ifdef DEBUG_STRICT - assert(name != NULL); - assert(action != NULL); + assert (name != NULL); + assert (action != NULL); #endif if (menu == NULL) return NULL; - if (isSeparator(name)) + if (isSeparator (name)) { /* add separator, no action */ name = ""; @@ -381,12 +408,12 @@ /* * add/replace existing menu item */ - item = rxvt_menuitem_find(menu, name); + item = rxvt_menuitem_find (menu, name); if (item != NULL) { if (item->name2 != NULL && name2 != NULL) { - free(item->name2); + free (item->name2); item->len2 = 0; item->name2 = NULL; } @@ -394,7 +421,7 @@ { case MenuAction: case MenuTerminalAction: - free(item->entry.action.str); + free (item->entry.action.str); item->entry.action.str = NULL; break; } @@ -402,14 +429,14 @@ } } /* allocate a new itemect */ - item = (menuitem_t *) rxvt_malloc(sizeof(menuitem_t)); + item = (menuitem_t *) rxvt_malloc (sizeof (menuitem_t)); item->len2 = 0; item->name2 = NULL; - len = STRLEN(name); - item->name = rxvt_malloc(len + 1); - STRCPY(item->name, name); + len = strlen (name); + item->name = (char *)rxvt_malloc (len + 1); + strcpy (item->name, name); if (name[0] == '.' && name[1] != '.') len = 0; /* hidden menu name */ item->len = len; @@ -431,18 +458,18 @@ Item_Found: if (name2 != NULL && item->name2 == NULL) { - len = STRLEN(name2); + len = strlen (name2); if (len == 0) item->name2 = NULL; else { - item->name2 = rxvt_malloc(len + 1); - STRCPY(item->name2, name2); + item->name2 = (char *)rxvt_malloc (len + 1); + strcpy (item->name2, name2); } item->len2 = len; } item->entry.type = MenuLabel; - len = STRLEN(action); + len = strlen (action); if (len == 0 && item->name2 != NULL) { @@ -451,12 +478,12 @@ } if (len) { - unsigned char *str = rxvt_malloc(len + 1); + unsigned char *str = (unsigned char *)rxvt_malloc (len + 1); - STRCPY(str, action); + strcpy (str, action); - if (rxvt_action_type(&(item->entry.action), str) < 0) - free(str); + if (rxvt_action_type (& (item->entry.action), str) < 0) + free (str); } /* new item and a possible increase in width */ if (menu->width < (item->len + item->len2)) @@ -476,38 +503,41 @@ menuitem_t *item; #ifdef DEBUG_STRICT - assert(menu != NULL); - assert(CurrentBar != NULL); + assert (menu != NULL); + assert (CurrentBar != NULL); #endif if (path[0] == '\0') return path; - if (STRCHR(path, '/') != NULL) + if (strchr (path, '/') != NULL) { char *p = path; - while ((p = STRCHR(p, '/')) != NULL) + while ((p = strchr (p, '/')) != NULL) { p++; if (*p == '/') path = p; } + if (path[0] == '/') { path++; *menu = NULL; } - while ((p = STRCHR(path, '/')) != NULL) + + while ((p = strchr (path, '/')) != NULL) { p[0] = '\0'; if (path[0] == '\0') return NULL; - if (!STRCMP(path, DOT)) + + if (!strcmp (path, DOT)) { /* nothing to do */ } - else if (!STRCMP(path, DOTS)) + else if (!strcmp (path, DOTS)) { if (*menu != NULL) *menu = (*menu)->parent; @@ -525,21 +555,21 @@ path = (p + 1); } } - if (!STRCMP(path, DOTS)) + + if (!strcmp (path, DOTS)) { - path += STRLEN(DOTS); + path += strlen (DOTS); if (*menu != NULL) *menu = (*menu)->parent; return path; } + /* find this menu */ if (*menu == NULL) { for (m = CurrentBar->tail; m != NULL; m = m->prev) - { - if (!STRCMP(path, m->name)) - break; - } + if (!strcmp (path, m->name)) + break; } else { @@ -547,18 +577,20 @@ for (item = (*menu)->tail; item != NULL; item = item->prev) { if (item->entry.type == MenuSubMenu - && !STRCMP(path, (item->entry.submenu.menu)->name)) + && !strcmp (path, (item->entry.submenu.menu)->name)) { m = (item->entry.submenu.menu); break; } } } + if (m != NULL) { *menu = m; - path += STRLEN(path); + path += strlen (path); } + return path; } @@ -570,10 +602,9 @@ { menu_t *parent = NULL, *prev, *next; menuitem_t *item; - bar_t *CurrentBar = CurrentBar; #ifdef DEBUG_STRICT - assert(CurrentBar != NULL); + assert (CurrentBar != NULL); #endif /* delete the entire menu */ @@ -620,15 +651,14 @@ item = menu->tail; while (item != NULL) { - menuitem_t *p = item->prev; + menuitem_t *p = item->prev; menuitem_free (menu, item); item = p; } - if (menu->name != NULL) - free(menu->name); - free(menu); + free (menu->name); + free (menu); return parent; } @@ -636,16 +666,15 @@ menu_t * rxvt_term::menu_add (menu_t *parent, char *path) { - menu_t *menu; - bar_t *CurrentBar = CurrentBar; + menu_t *menu; #ifdef DEBUG_STRICT - assert(CurrentBar != NULL); + assert (CurrentBar != NULL); #endif - if (STRCHR(path, '/') != NULL) + if (strchr (path, '/') != NULL) { - char *p; + char *p; if (path[0] == '/') { @@ -653,7 +682,7 @@ path++; parent = NULL; } - while ((p = STRCHR(path, '/')) != NULL) + while ((p = strchr (path, '/')) != NULL) { p[0] = '\0'; if (path[0] == '\0') @@ -663,26 +692,27 @@ path = (p + 1); } } - if (!STRCMP(path, DOTS)) + if (!strcmp (path, DOTS)) return (parent != NULL ? parent->parent : parent); - if (!STRCMP(path, DOT) || path[0] == '\0') + if (!strcmp (path, DOT) || path[0] == '\0') return parent; /* allocate a new menu */ - menu = (menu_t *) rxvt_malloc(sizeof(menu_t)); + menu = (menu_t *) rxvt_malloc (sizeof (menu_t)); menu->width = 0; menu->parent = parent; - menu->len = STRLEN(path); - menu->name = rxvt_malloc((menu->len + 1)); - STRCPY(menu->name, path); + menu->len = strlen (path); + menu->name = (char *)rxvt_malloc ((menu->len + 1)); + strcpy (menu->name, path); /* initialize head/tail */ menu->head = menu->tail = NULL; menu->prev = menu->next = NULL; menu->win = None; + menu->drawable = 0; menu->x = menu->y = menu->w = menu->h = 0; menu->item = NULL; @@ -702,14 +732,14 @@ { menuitem_t *item; - item = rxvt_menuitem_add(parent, path, "", ""); + item = rxvt_menuitem_add (parent, path, "", ""); if (item == NULL) { - free(menu); + free (menu); return parent; } #ifdef DEBUG_STRICT - assert(item->entry.type == MenuLabel); + assert (item->entry.type == MenuLabel); #endif item->entry.type = MenuSubMenu; item->entry.submenu.menu = menu; @@ -723,12 +753,12 @@ { GC top, bot; - x = Width2Pixel(x); - len = Width2Pixel(len + HSPACE); - if (x >= TermWin.width) + x = Width2Pixel (x); + len = Width2Pixel (len + HSPACE); + if (x >= width) return; - else if (x + len >= TermWin.width) - len = (TermWin_TotalWidth() - x); + else if (x + len >= width) + len = (TermWin_TotalWidth () - x); #ifdef MENUBAR_SHADOW_IN state = -state; @@ -748,8 +778,8 @@ break; /* neutral */ } - rxvt_Draw_Shadow(display->display, menuBar.win, top, bot, - x, 0, len, menuBar_TotalHeight()); + rxvt_Draw_Shadow (display->display, menuBar.win, top, bot, + x, 0, len, menuBar_TotalHeight ()); } void @@ -776,13 +806,12 @@ break; /* neutral */ } - w = Height2Pixel(1) - 2 * SHADOW; + w = Height2Pixel (1) - 2 * SHADOW; x -= SHADOW + (3 * w / 2); y += SHADOW * 3; - rxvt_Draw_Triangle(display->display, ActiveMenu->win, top, bot, x, y, w, - 'r'); + rxvt_Draw_Triangle (display->display, ActiveMenu->win, top, bot, x, y, w, 'r'); } void @@ -808,23 +837,24 @@ break; /* neutral */ } - rxvt_Draw_Shadow(display->display, ActiveMenu->win, top, bot, + rxvt_Draw_Shadow (display->display, ActiveMenu->win, top, bot, SHADOW + 0, SHADOW + y, ActiveMenu->w - 2 * (SHADOW), HEIGHT_TEXT + 2 * SHADOW); - XFlush(display->display); + XFlush (display->display); } #ifdef DEBUG_MENU_LAYOUT void -rxvt_print_menu_ancestors(menu_t *menu) +rxvt_print_menu_ancestors (menu_t *menu) { if (menu == NULL) { - fprintf(stderr, "Top Level menu\n"); + fprintf (stderr, "Top Level menu\n"); return; } - fprintf(stderr, "menu %s ", menu->name); + + fprintf (stderr, "menu %s ", menu->name); if (menu->parent != NULL) { menuitem_t *item; @@ -837,18 +867,20 @@ break; } } + if (item == NULL) { - fprintf(stderr, "is an orphan!\n"); + fprintf (stderr, "is an orphan!\n"); return; } } - fprintf(stderr, "\n"); - rxvt_print_menu_ancestors(menu->parent); + + fprintf (stderr, "\n"); + rxvt_print_menu_ancestors (menu->parent); } void -rxvt_print_menu_descendants(menu_t *menu) +rxvt_print_menu_descendants (menu_t *menu) { menuitem_t *item; menu_t *parent; @@ -863,31 +895,31 @@ while (parent != NULL); for (i = 0; i < level; i++) - fprintf(stderr, ">"); - fprintf(stderr, "%s\n", menu->name); + fprintf (stderr, ">"); + fprintf (stderr, "%s\n", menu->name); for (item = menu->head; item != NULL; item = item->next) { if (item->entry.type == MenuSubMenu) { if (item->entry.submenu.menu == NULL) - fprintf(stderr, "> %s == NULL\n", item->name); + fprintf (stderr, "> %s == NULL\n", item->name); else - rxvt_print_menu_descendants(item->entry.submenu.menu); + rxvt_print_menu_descendants (item->entry.submenu.menu); } else { for (i = 0; i < level; i++) - fprintf(stderr, "+"); + fprintf (stderr, "+"); if (item->entry.type == MenuLabel) - fprintf(stderr, "label: "); - fprintf(stderr, "%s\n", item->name); + fprintf (stderr, "label: "); + fprintf (stderr, "%s\n", item->name); } } for (i = 0; i < level; i++) - fprintf(stderr, "<"); - fprintf(stderr, "\n"); + fprintf (stderr, "<"); + fprintf (stderr, "\n"); } #endif @@ -895,9 +927,8 @@ void rxvt_term::menu_show () { - int x, y, xright; - menu_t *ActiveMenu = ActiveMenu; - menuitem_t *item; + int x, y, xright; + menuitem_t *item; if (ActiveMenu == NULL) return; @@ -908,31 +939,34 @@ register int h; drawbox_menubar (x, ActiveMenu->len, -1); - x = Width2Pixel(x); + x = Width2Pixel (x); ActiveMenu->y = 1; - ActiveMenu->w = Menu_PixelWidth(ActiveMenu); + ActiveMenu->w = Menu_PixelWidth (ActiveMenu); - if ((x + ActiveMenu->w) >= TermWin.width) - x = (TermWin_TotalWidth() - ActiveMenu->w); + if ((x + ActiveMenu->w) >= width) + x = (TermWin_TotalWidth () - ActiveMenu->w); /* find the height */ for (h = 0, item = ActiveMenu->head; item != NULL; item = item->next) - h += isSeparator(item->name) ? HEIGHT_SEPARATOR + h += isSeparator (item->name) ? HEIGHT_SEPARATOR : HEIGHT_TEXT + 2 * SHADOW; ActiveMenu->h = h + 2 * SHADOW; } + if (ActiveMenu->win == None) { - ActiveMenu->win = XCreateSimpleWindow(display->display, TermWin.vt, - x, ActiveMenu->y, - ActiveMenu->w, ActiveMenu->h, - 0, - PixColors[Color_fg], - PixColors[Color_scroll]); - XMapWindow(display->display, ActiveMenu->win); + ActiveMenu->win = XCreateSimpleWindow (display->display, vt, + x, ActiveMenu->y, + ActiveMenu->w, ActiveMenu->h, + 0, + pix_colors[Color_fg], + pix_colors[Color_scroll]); + ActiveMenu->drawable = new rxvt_drawable (display, ActiveMenu->win); + XMapWindow (display->display, ActiveMenu->win); } - rxvt_Draw_Shadow(display->display, ActiveMenu->win, + + rxvt_Draw_Shadow (display->display, ActiveMenu->win, topShadowGC, botShadowGC, 0, 0, ActiveMenu->w, ActiveMenu->h); @@ -943,16 +977,16 @@ for (y = 0, item = ActiveMenu->head; item != NULL; item = item->next) { - const int xoff = (SHADOW + Width2Pixel(HSPACE) / 2); - register int h; - GC gc = menubarGC; - - if (isSeparator(item->name)) - { - rxvt_Draw_Shadow(display->display, ActiveMenu->win, - topShadowGC, botShadowGC, - SHADOW, y + SHADOW + 1, - ActiveMenu->w - 2 * SHADOW, 0); + const int xoff = (SHADOW + Width2Pixel (HSPACE) / 2); + register int h; + GC gc = menubarGC; + + if (isSeparator (item->name)) + { + rxvt_Draw_Shadow (display->display, ActiveMenu->win, + topShadowGC, botShadowGC, + SHADOW, y + SHADOW + 1, + ActiveMenu->w - 2 * SHADOW, 0); h = HEIGHT_SEPARATOR; } else @@ -961,9 +995,7 @@ int len = item->len; if (item->entry.type == MenuLabel) - { - gc = botShadowGC; - } + gc = botShadowGC; else if (item->entry.type == MenuSubMenu) { int x1, y1; @@ -977,7 +1009,7 @@ y1 = ActiveMenu->y + y; - menu->w = Menu_PixelWidth(menu); + menu->w = Menu_PixelWidth (menu); /* place sub-menu at midpoint of parent menu */ x1 = ActiveMenu->w / 2; @@ -987,58 +1019,34 @@ /* find the height of this submenu */ for (h = 0, it = menu->head; it != NULL; it = it->next) - h += isSeparator(it->name) ? HEIGHT_SEPARATOR + h += isSeparator (it->name) ? HEIGHT_SEPARATOR : HEIGHT_TEXT + 2 * SHADOW; menu->h = h + 2 * SHADOW; /* ensure menu is in window limits */ - if ((x1 + menu->w) >= TermWin.width) - x1 = (TermWin_TotalWidth() - menu->w); + if ((x1 + menu->w) >= width) + x1 = (TermWin_TotalWidth () - menu->w); - if ((y1 + menu->h) >= TermWin.height) - y1 = (TermWin_TotalHeight() - menu->h); + if ((y1 + menu->h) >= height) + y1 = (TermWin_TotalHeight () - menu->h); menu->x = (x1 < 0 ? 0 : x1); menu->y = (y1 < 0 ? 0 : y1); } - else if (item->name2 && !STRCMP(name, item->name2)) + else if (item->name2 && !strcmp (name, item->name2)) name = NULL; if (len && name) - { -#ifdef USE_XIM - if (TermWin.fontset) - XmbDrawString(display->display, - ActiveMenu->win, TermWin.fontset, - gc, xoff, - 2 * SHADOW + y + TermWin.font->ascent + 1, - name, len); - else -#endif - XDrawString(display->display, ActiveMenu->win, gc, xoff, - 2 * SHADOW + y + TermWin.font->ascent + 1, - name, len); - } + draw_string (*ActiveMenu->drawable, gc, fontset[0], + xoff, 2 * SHADOW + y, name, len); len = item->len2; name = item->name2; + if (len && name) - { -#ifdef USE_XIM - if (TermWin.fontset) - XmbDrawString(display->display, - ActiveMenu->win, TermWin.fontset, - gc, - ActiveMenu->w - (xoff + Width2Pixel(xright)), - 2 * SHADOW + y + TermWin.font->ascent + 1, - name, len); - else -#endif - XDrawString(display->display, ActiveMenu->win, gc, - ActiveMenu->w - (xoff + Width2Pixel(xright)), - 2 * SHADOW + y + TermWin.font->ascent + 1, - name, len); - } + draw_string (*ActiveMenu->drawable, gc, fontset[0], + ActiveMenu->w - (xoff + Width2Pixel (xright)), 2 * SHADOW + y, name, len); + h = HEIGHT_TEXT + 2 * SHADOW; } y += h; @@ -1046,33 +1054,34 @@ } void -rxvt_term::menu_display (void (*update)(rxvt_t *)) +rxvt_term::menu_display (void (rxvt_term::*update) ()) { - menu_t *ActiveMenu = ActiveMenu; - if (ActiveMenu == NULL) return; + + delete ActiveMenu->drawable; if (ActiveMenu->win != None) - XDestroyWindow(display->display, ActiveMenu->win); + XDestroyWindow (display->display, ActiveMenu->win); ActiveMenu->win = None; ActiveMenu->item = NULL; if (ActiveMenu->parent == NULL) drawbox_menubar (ActiveMenu->x, ActiveMenu->len, +1); + ActiveMenu = ActiveMenu->parent; - update(r); + (this->*update) (); } void rxvt_term::menu_hide_all () { - menu_display (rxvt_menu_hide_all); + menu_display (&rxvt_term::menu_hide_all); } void rxvt_term::menu_hide () { - menu_display (rxvt_menu_show); + menu_display (&rxvt_term::menu_show); } void @@ -1080,7 +1089,7 @@ { if (menu != NULL) { - menuitem_t *item = menu->tail; + menuitem_t *item = menu->tail; while (item != NULL) { @@ -1097,15 +1106,13 @@ void rxvt_term::menubar_clear () { - bar_t *CurrentBar = CurrentBar; - if (CurrentBar != NULL) { - menu_t *menu = CurrentBar->tail; + menu_t *menu = CurrentBar->tail; while (menu != NULL) { - menu_t *prev = menu->prev; + menu_t *prev = menu->prev; menu_delete (menu); menu = prev; @@ -1114,11 +1121,13 @@ if (CurrentBar->title) { - free(CurrentBar->title); + free (CurrentBar->title); CurrentBar->title = NULL; } + menuarrow_free (0); /* remove all arrow functions */ } + ActiveMenu = NULL; } @@ -1127,22 +1136,22 @@ bar_t * rxvt_term::menubar_find (const char *name) { - bar_t *bar = CurrentBar; + bar_t *bar = CurrentBar; #ifdef DEBUG_MENUBAR_STACKING - fprintf(stderr, "looking for [menu:%s] ...", name ? name : "(nil)"); + fprintf (stderr, "looking for [menu:%s] ...", name ? name : " (nil)"); #endif if (bar == NULL || name == NULL) return NULL; - if (STRLEN(name) && STRCMP(name, "*")) + if (strlen (name) && strcmp (name, "*")) { do { - if (!STRCMP(bar->name, name)) + if (!strcmp (bar->name, name)) { #ifdef DEBUG_MENUBAR_STACKING - fprintf(stderr, " found!\n"); + fprintf (stderr, " found!\n"); #endif return bar; } @@ -1152,7 +1161,7 @@ bar = NULL; } #ifdef DEBUG_MENUBAR_STACKING - fprintf(stderr, "%s found!\n", (bar ? "" : " NOT")); + fprintf (stderr, "%s found!\n", (bar ? "" : " NOT")); #endif return bar; @@ -1161,15 +1170,15 @@ int rxvt_term::menubar_push (const char *name) { - int ret = 1; - bar_t *bar; + int ret = 1; + bar_t *bar; if (CurrentBar == NULL) { /* allocate first one */ - bar = (bar_t *) rxvt_malloc(sizeof(bar_t)); + bar = (bar_t *) rxvt_malloc (sizeof (bar_t)); - MEMSET(bar, 0, sizeof(bar_t)); + memset (bar, 0, sizeof (bar_t)); /* circular linked-list */ bar->next = bar->prev = bar; bar->head = bar->tail = NULL; @@ -1195,7 +1204,7 @@ { /* need to malloc another one */ if (Nbars < MENUBAR_MAX) - bar = (bar_t *) rxvt_malloc(sizeof(bar_t)); + bar = (bar_t *) rxvt_malloc (sizeof (bar_t)); else bar = NULL; @@ -1220,12 +1229,13 @@ CurrentBar = bar; } + menubar_clear (); } } /* give menubar this name */ - STRNCPY(CurrentBar->name, name, MAXNAME); + strncpy (CurrentBar->name, name, MAXNAME); CurrentBar->name[MAXNAME - 1] = '\0'; return ret; @@ -1264,25 +1274,25 @@ Nbars--; } - free(CurrentBar); + free (CurrentBar); CurrentBar = prev; } } - while (CurrentBar && !STRCMP(name, "*")); + while (CurrentBar && !strcmp (name, "*")); } void -rxvt_action_decode(FILE *fp, action_t *act) +rxvt_action_decode (FILE *fp, action_t *act) { - unsigned char *str; - short len; + unsigned char *str; + short len; if (act == NULL || (len = act->len) == 0 || (str = act->str) == NULL) return; if (act->type == MenuTerminalAction) { - fprintf(fp, "^@"); + fprintf (fp, "^@"); /* can strip trailing ^G from XTerm sequence */ if (str[0] == C0_ESC && str[1] == ']' && str[len - 1] == C0_BEL) len--; @@ -1302,12 +1312,13 @@ /* FALLTHROUGH */ default: - fprintf(fp, "M-"); /* meta prefix */ + fprintf (fp, "M-"); /* meta prefix */ str++; len--; break; } } + /* * control character form is preferred, since backslash-escaping * can be really ugly looking when the backslashes themselves also @@ -1321,40 +1332,42 @@ switch (ch) { case C0_ESC: - fprintf(fp, "\\E"); + fprintf (fp, "\\E"); break; /* escape */ case '\r': - fprintf(fp, "\\r"); + fprintf (fp, "\\r"); break; /* carriage-return */ case '\\': - fprintf(fp, "\\\\"); + fprintf (fp, "\\\\"); break; /* backslash */ case '^': - fprintf(fp, "\\^"); + fprintf (fp, "\\^"); break; /* caret */ case 127: - fprintf(fp, "^?"); + fprintf (fp, "^?"); default: if (ch <= 31) - fprintf(fp, "^%c", ('@' + ch)); + fprintf (fp, "^%c", ('@' + ch)); else if (ch > 127) - fprintf(fp, "\\%o", ch); + fprintf (fp, "\\%o", ch); else - fprintf(fp, "%c", ch); + fprintf (fp, "%c", ch); break; } + len--; } - fprintf(fp, "\n"); + + fprintf (fp, "\n"); } void -rxvt_menu_dump(FILE *fp, menu_t *menu) +rxvt_menu_dump (FILE *fp, menu_t *menu) { menuitem_t *item; /* create a new menu and clear it */ - fprintf(fp, (menu->parent ? "./%s/*\n" : "/%s/*\n"), menu->name); + fprintf (fp, (menu->parent ? "./%s/*\n" : "/%s/*\n"), menu->name); for (item = menu->head; item != NULL; item = item->next) { @@ -1362,27 +1375,27 @@ { case MenuSubMenu: if (item->entry.submenu.menu == NULL) - fprintf(fp, "> %s == NULL\n", item->name); + fprintf (fp, "> %s == NULL\n", item->name); else - rxvt_menu_dump(fp, item->entry.submenu.menu); + rxvt_menu_dump (fp, item->entry.submenu.menu); break; case MenuLabel: - fprintf(fp, "{%s}\n", (STRLEN(item->name) ? item->name : "-")); + fprintf (fp, "{%s}\n", (strlen (item->name) ? item->name : "-")); break; case MenuTerminalAction: case MenuAction: - fprintf(fp, "{%s}", item->name); - if (item->name2 != NULL && STRLEN(item->name2)) - fprintf(fp, "{%s}", item->name2); - fprintf(fp, "\t"); - rxvt_action_decode(fp, &(item->entry.action)); + fprintf (fp, "{%s}", item->name); + if (item->name2 != NULL && strlen (item->name2)) + fprintf (fp, "{%s}", item->name2); + fprintf (fp, "\t"); + rxvt_action_decode (fp, & (item->entry.action)); break; } } - fprintf(fp, (menu->parent ? "../\n" : "/\n\n")); + fprintf (fp, (menu->parent ? "../\n" : "/\n\n")); } void @@ -1393,11 +1406,11 @@ if (bar == NULL || fp == NULL) return; - time(&t); + time (&t); - fprintf(fp, - "# " APL_SUBCLASS " (%s) Pid: %u\n# Date: %s\n\n", - rs[Rs_name], (unsigned int)getpid(), ctime(&t)); + fprintf (fp, + "# " RESCLASS " (%s) Pid: %u\n# Date: %s\n\n", + rs[Rs_name], (unsigned int)getpid (), ctime (&t)); /* dump in reverse order */ bar = CurrentBar->prev; @@ -1406,10 +1419,10 @@ menu_t *menu; int i; - fprintf(fp, "[menu:%s]\n", bar->name); + fprintf (fp, "[menu:%s]\n", bar->name); if (bar->title != NULL) - fprintf(fp, "[title:%s]\n", bar->title); + fprintf (fp, "[title:%s]\n", bar->title); for (i = 0; i < NARROWS; i++) { @@ -1417,17 +1430,17 @@ { case MenuTerminalAction: case MenuAction: - fprintf(fp, "<%c>", Arrows[i].name); - rxvt_action_decode(fp, &(bar->arrows[i])); + fprintf (fp, "<%c>", Arrows[i].name); + rxvt_action_decode (fp, & (bar->arrows[i])); break; } } - fprintf(fp, "\n"); + fprintf (fp, "\n"); for (menu = bar->head; menu != NULL; menu = menu->next) - rxvt_menu_dump(fp, menu); + rxvt_menu_dump (fp, menu); - fprintf(fp, "\n[done:%s]\n\n", bar->name); + fprintf (fp, "\n[done:%s]\n\n", bar->name); bar = bar->prev; } while (bar != CurrentBar->prev); @@ -1457,17 +1470,18 @@ char buffer[256]; char *p, *file, *tag = NULL; - file = (char *)rxvt_File_find(filename, ".menu", rs[Rs_path]); + file = (char *)rxvt_File_find (filename, ".menu", rs[Rs_path]); if (file == NULL) return; - fp = fopen(file, "rb"); - free(file); + + fp = fopen (file, "rb"); + free (file); if (fp == NULL) return; #if (MENUBAR_MAX > 1) /* semi-colon delimited */ - if ((tag = STRCHR(filename, ';')) != NULL) + if ((tag = strchr (filename, ';')) != NULL) { tag++; if (*tag == '\0') @@ -1475,16 +1489,16 @@ } #endif /* (MENUBAR_MAX > 1) */ #ifdef DEBUG_MENU - fprintf(stderr, "[read:%s]\n", p); + fprintf (stderr, "[read:%s]\n", p); if (tag) - fprintf(stderr, "looking for [menu:%s]\n", tag); + fprintf (stderr, "looking for [menu:%s]\n", tag); #endif - while ((p = fgets(buffer, sizeof(buffer), fp)) != NULL) + while ((p = fgets (buffer, sizeof (buffer), fp)) != NULL) { int n; - if ((n = rxvt_Str_match(p, "[menu")) != 0) + if ((n = rxvt_Str_match (p, "[menu")) != 0) { if (tag) { @@ -1492,11 +1506,11 @@ if (p[n] == ':' && p[n + 1] != ']') { n++; - n += rxvt_Str_match(p + n, tag); + n += rxvt_Str_match (p + n, tag); if (p[n] == ']') { #ifdef DEBUG_MENU - fprintf(stderr, "[menu:%s]\n", tag); + fprintf (stderr, "[menu:%s]\n", tag); #endif break; } @@ -1513,11 +1527,11 @@ int n; #ifdef DEBUG_MENU - fprintf(stderr, "read line = %s\n", p); + fprintf (stderr, "read line = %s\n", p); #endif /* looking for [done:tag] or [done:] */ - if ((n = rxvt_Str_match(p, "[done")) != 0) + if ((n = rxvt_Str_match (p, "[done")) != 0) { if (p[n] == ']') { @@ -1534,11 +1548,11 @@ } else if (tag) { - n += rxvt_Str_match(p + n, tag); + n += rxvt_Str_match (p + n, tag); if (p[n] == ']') { #ifdef DEBUG_MENU - fprintf(stderr, "[done:%s]\n", tag); + fprintf (stderr, "[done:%s]\n", tag); #endif menu_readonly = 1; break; @@ -1551,22 +1565,22 @@ } } } + /* * remove leading/trailing space - * and strip-off leading/trailing quotes * skip blank or comment lines */ - rxvt_Str_trim(p); + rxvt_Str_trim (p); if (*p && *p != '#') { menu_readonly = 0; /* if case we read another file */ menubar_dispatch (p); } /* get another line */ - p = fgets(buffer, sizeof(buffer), fp); + p = fgets (buffer, sizeof (buffer), fp); } - fclose(fp); + fclose (fp); } /* @@ -1575,10 +1589,10 @@ void rxvt_term::menubar_dispatch (char *str) { - int n, cmd; - char *path, *name, *name2; + int n, cmd; + char *path, *name, *name2; - if (menubar_visible(r) && ActiveMenu != NULL) + if (menubar_visible () && ActiveMenu != NULL) menubar_expose (); else ActiveMenu = NULL; @@ -1617,7 +1631,7 @@ do { next++; - if ((next = STRCHR(next, ':')) == NULL) + if ((next = strchr (next, ':')) == NULL) return; /* parse error */ } while (next[1] != ']'); @@ -1627,7 +1641,7 @@ } else { - if ((next = STRCHR(next, ']')) == NULL) + if ((next = strchr (next, ']')) == NULL) return; /* parse error */ /* remove and skip ']' */ *next = '\0'; @@ -1645,60 +1659,59 @@ menu_readonly = saved; } /* these ones don't require menu stacking */ - else if (!STRCMP(str, "clear")) + else if (!strcmp (str, "clear")) { menubar_clear (); } - else if (!STRCMP(str, "done") || rxvt_Str_match(str, "done:")) + else if (!strcmp (str, "done") || rxvt_Str_match (str, "done:")) { menu_readonly = 1; } - else if (!STRCMP(str, "show")) + else if (!strcmp (str, "show")) { map_menuBar (1); menu_readonly = 1; } - else if (!STRCMP(str, "hide")) + else if (!strcmp (str, "hide")) { map_menuBar (0); menu_readonly = 1; } - else if ((n = rxvt_Str_match(str, "read:")) != 0) + else if ((n = rxvt_Str_match (str, "read:")) != 0) { /* read in a menu from a file */ str += n; menubar_read (str); } - else if ((n = rxvt_Str_match(str, "title:")) != 0) + else if ((n = rxvt_Str_match (str, "title:")) != 0) { str += n; if (CurrentBar != NULL && !menu_readonly) { if (*str) { - name = rxvt_realloc(CurrentBar->title, - STRLEN(str) + 1); + name = (char *)rxvt_realloc (CurrentBar->title, strlen (str) + 1); if (name != NULL) { - STRCPY(name, str); + strcpy (name, str); CurrentBar->title = name; } menubar_expose (); } else { - free(CurrentBar->title); + free (CurrentBar->title); CurrentBar->title = NULL; } } } - else if ((n = rxvt_Str_match(str, "pixmap:")) != 0) + else if ((n = rxvt_Str_match (str, "pixmap:")) != 0) { str += n; - xterm_seq (XTerm_Pixmap, str, CHAR_ST); + process_xterm_seq (XTerm_Pixmap, str, CHAR_ST); } #if (MENUBAR_MAX > 1) - else if ((n = rxvt_Str_match(str, "rm")) != 0) + else if ((n = rxvt_Str_match (str, "rm")) != 0) { str += n; switch (str[0]) @@ -1714,7 +1727,7 @@ } menu_readonly = 1; } - else if ((n = rxvt_Str_match(str, "menu")) != 0) + else if ((n = rxvt_Str_match (str, "menu")) != 0) { str += n; switch (str[0]) @@ -1735,7 +1748,7 @@ if (CurrentBar != NULL) menu_readonly = 0; /* allow menu build commands */ } - else if (!STRCMP(str, "dump")) + else if (!strcmp (str, "dump")) { /* dump current menubars to a file */ FILE *fp; @@ -1743,17 +1756,17 @@ /* enough space to hold the results */ char buffer[32]; - sprintf(buffer, "/tmp/" APL_SUBCLASS "-%u", - (unsigned int)getpid()); + sprintf (buffer, "/tmp/" RESCLASS "-%u", + (unsigned int)getpid ()); - if ((fp = fopen(buffer, "wb")) != NULL) + if ((fp = fopen (buffer, "wb")) != NULL) { - xterm_seq (XTerm_title, buffer, CHAR_ST); + process_xterm_seq (XTerm_title, buffer, CHAR_ST); menubar_dump (fp); - fclose(fp); + fclose (fp); } } - else if (!STRCMP(str, "next")) + else if (!strcmp (str, "next")) { if (CurrentBar) { @@ -1761,7 +1774,7 @@ menu_readonly = 1; } } - else if (!STRCMP(str, "prev")) + else if (!strcmp (str, "prev")) { if (CurrentBar) { @@ -1769,7 +1782,7 @@ menu_readonly = 1; } } - else if (!STRCMP(str, "swap")) + else if (!strcmp (str, "swap")) { /* swap the top 2 menus */ if (CurrentBar) @@ -1796,7 +1809,7 @@ BuildMenu = ActiveMenu = NULL; menubar_expose (); #ifdef DEBUG_MENUBAR_STACKING - fprintf(stderr, "menus are read%s\n", + fprintf (stderr, "menus are read%s\n", menu_readonly ? "only" : "/write"); #endif @@ -1811,7 +1824,7 @@ if (menu_readonly) { #ifdef DEBUG_MENUBAR_STACKING - fprintf(stderr, "menus are read%s\n", + fprintf (stderr, "menus are read%s\n", menu_readonly ? "only" : "/write"); #endif return; @@ -1828,24 +1841,24 @@ /* parse STR, allow spaces inside (name) */ if (path[0] != '\0') { - name = STRCHR(path, MENUITEM_BEG); - str = STRCHR(path, MENUITEM_END); + name = strchr (path, MENUITEM_BEG); + str = strchr (path, MENUITEM_END); if (name != NULL || str != NULL) { if (name == NULL || str == NULL || str <= (name + 1) || (name > path && name[-1] != '/')) { - rxvt_print_error("menu error <%s>\n", path); + rxvt_warn ("menu error A<%s>, continuing.\n", path); break; } if (str[1] == MENUITEM_BEG) { name2 = (str + 2); - str = STRCHR(name2, MENUITEM_END); + str = strchr (name2, MENUITEM_END); if (str == NULL) { - rxvt_print_error("menu error <%s>\n", path); + rxvt_warn ("menu error B<%s>, continuing.\n", path); break; } name2[-2] = '\0'; /* remove prev MENUITEM_END */ @@ -1856,14 +1869,14 @@ *name++ = '\0'; /* delimit */ *str++ = '\0'; /* delimit */ - while (isspace(*str)) + while (isspace (*str)) str++; /* skip space */ } #ifdef DEBUG_MENU - fprintf(stderr, + fprintf (stderr, "`%c' path = <%s>, name = <%s>, name2 = <%s>, action = <%s>\n", - cmd, (path ? path : "(nil)"), (name ? name : "(nil)"), - (name2 ? name2 : "(nil)"), (str ? str : "(nil)") + cmd, (path ? path : " (nil)"), (name ? name : " (nil)"), + (name2 ? name2 : " (nil)"), (str ? str : " (nil)") ); #endif @@ -1876,8 +1889,8 @@ { int len; - path = menu_find_base (&(BuildMenu), path); - len = STRLEN(path); + path = menu_find_base (& (BuildMenu), path); + len = strlen (path); /* don't allow menus called `*' */ if (path[0] == '*') @@ -1885,7 +1898,7 @@ menu_clear (BuildMenu); break; } - else if (len >= 2 && !STRCMP((path + len - 2), "/*")) + else if (len >= 2 && !strcmp ((path + len - 2), "/*")) { path[len - 2] = '\0'; } @@ -1893,13 +1906,13 @@ BuildMenu = menu_add (BuildMenu, path); } if (name != NULL && name[0] != '\0') - rxvt_menuitem_add(BuildMenu, - (STRCMP(name, SEPARATOR_NAME) ? name : ""), + rxvt_menuitem_add (BuildMenu, + (strcmp (name, SEPARATOR_NAME) ? name : ""), name2, str); break; case '-': /* delete menu entry */ - if (!STRCMP(path, "/*") && (name == NULL || name[0] == '\0')) + if (!strcmp (path, "/*") && (name == NULL || name[0] == '\0')) { menubar_clear (); BuildMenu = NULL; @@ -1912,7 +1925,7 @@ menu_t *menu = BuildMenu; path = menu_find_base (&menu, path); - len = STRLEN(path); + len = strlen (path); /* submenu called `*' clears all menu items */ if (path[0] == '*') @@ -1920,7 +1933,7 @@ menu_clear (menu); break; /* done */ } - else if (len >= 2 && !STRCMP(&path[len - 2], "/*")) + else if (len >= 2 && !strcmp (&path[len - 2], "/*")) { /* done */ break; @@ -1933,6 +1946,7 @@ else BuildMenu = menu; } + if (BuildMenu != NULL) { if (name == NULL || name[0] == '\0') @@ -1941,10 +1955,9 @@ { const char *n1; menuitem_t *item; - menu_t *BuildMenu = BuildMenu; - n1 = STRCMP(name, SEPARATOR_NAME) ? name : ""; - item = rxvt_menuitem_find(BuildMenu, n1); + n1 = strcmp (name, SEPARATOR_NAME) ? name : ""; + item = rxvt_menuitem_find (BuildMenu, n1); if (item != NULL && item->entry.type != MenuSubMenu) { menuitem_free (BuildMenu, item); @@ -1956,10 +1969,11 @@ { short l = item->len + item->len2; - MAX_IT(BuildMenu->width, l); + max_it (BuildMenu->width, l); } } } + menubar_expose (); } break; @@ -1998,24 +2012,24 @@ for (i = 0; i < NARROWS; i++) { - const int w = Width2Pixel(1); - const int y = (menuBar_TotalHeight() - w) / 2; - int x = Arrows_x + (5 * Width2Pixel(i)) / 4; + const int w = Width2Pixel (1); + const int y = (menuBar_TotalHeight () - w) / 2; + int x = Arrows_x + (5 * Width2Pixel (i)) / 4; if (!name || name == Arrows[i].name) - rxvt_Draw_Triangle(display->display, menuBar.win, top, bot, x, y, w, - Arrows[i].name); + rxvt_Draw_Triangle (display->display, menuBar.win, top, bot, x, y, w, + Arrows[i].name); } - XFlush(display->display); + XFlush (display->display); } void rxvt_term::menubar_expose () { - menu_t *menu; - int x; + menu_t *menu; + int x; - if (!menubar_visible(r) || menuBar.win == 0) + if (!menubar_visible () || menuBar.win == 0) return; if (menubarGC == None) @@ -2023,18 +2037,14 @@ /* Create the graphics context */ XGCValues gcvalue; - gcvalue.font = TermWin.font->fid; - - gcvalue.foreground = (XDEPTH <= 2 ? PixColors[Color_fg] - : PixColors[Color_Black]); - menubarGC = XCreateGC(display->display, menuBar.win, - GCForeground | GCFont, &gcvalue); + gcvalue.foreground = (display->depth <= 2 ? pix_colors[Color_fg] + : pix_colors[Color_Black]); + menubarGC = XCreateGC (display->display, menuBar.win, + GCForeground, &gcvalue); } /* make sure the font is correct */ - XSetFont(display->display, menubarGC, TermWin.font->fid); - XSetFont(display->display, botShadowGC, TermWin.font->fid); - XClearWindow(display->display, menuBar.win); + XClearWindow (display->display, menuBar.win); menu_hide_all (); @@ -2048,52 +2058,43 @@ x = (menu->x + menu->len + HSPACE); #ifdef DEBUG_MENU_LAYOUT - rxvt_print_menu_descendants(menu); + rxvt_print_menu_descendants (menu); #endif - if (x >= TermWin.ncol) - len = (TermWin.ncol - (menu->x + HSPACE)); + if (x >= ncol) + len = (ncol - (menu->x + HSPACE)); drawbox_menubar (menu->x, len, +1); -#ifdef USE_XIM - if (TermWin.fontset) - XmbDrawString(display->display, - menuBar.win, TermWin.fontset, - menubarGC, - (Width2Pixel(menu->x) + Width2Pixel(HSPACE) / 2), - menuBar_height() - SHADOW, menu->name, len); - else -#endif - XDrawString(display->display, menuBar.win, menubarGC, - (Width2Pixel(menu->x) + Width2Pixel(HSPACE) / 2), - menuBar_height() - SHADOW, menu->name, len); + draw_string (*menuBar.drawable, menubarGC, fontset[0], + (Width2Pixel (menu->x) + Width2Pixel (HSPACE) / 2), + SHADOW, menu->name, len); - if (x >= TermWin.ncol) + if (x >= ncol) break; } } - drawbox_menubar (x, TermWin.ncol, (CurrentBar ? +1 : -1)); + drawbox_menubar (x, ncol, (CurrentBar ? +1 : -1)); /* add the menuBar title, if it exists and there's plenty of room */ Arrows_x = 0; - if (x < TermWin.ncol) + if (x < ncol) { const char *str; int ncol; unsigned int len; char title[256]; - ncol = (int)TermWin.ncol; + ncol = (int)ncol; if (x < (ncol - (NARROWS + 1))) { ncol -= (NARROWS + 1); - Arrows_x = Width2Pixel(ncol); + Arrows_x = Width2Pixel (ncol); } draw_Arrows (0, +1); str = (CurrentBar && CurrentBar->title) ? CurrentBar->title : "%n-%v"; - for (len = 0; str[0] && len < sizeof(title) - 1; str++) + for (len = 0; str[0] && len < sizeof (title) - 1; str++) { const char *s = NULL; @@ -2114,7 +2115,7 @@ break; /* literal '%' */ } if (s != NULL) - while (*s && len < sizeof(title) - 1) + while (*s && len < sizeof (title) - 1) title[len++] = *s++; break; @@ -2127,20 +2128,9 @@ ncol -= (x + len + HSPACE); if (len > 0 && ncol >= 0) - { -#ifdef USE_XIM - if (TermWin.fontset) - XmbDrawString(display->display, - menuBar.win, TermWin.fontset, - menubarGC, - Width2Pixel(x) + Width2Pixel(ncol + HSPACE) / 2, - menuBar_height() - SHADOW, title, len); - else -#endif - XDrawString(display->display, menuBar.win, menubarGC, - Width2Pixel(x) + Width2Pixel(ncol + HSPACE) / 2, - menuBar_height() - SHADOW, title, len); - } + draw_string (*menuBar.drawable, menubarGC, fontset[0], + Width2Pixel (x) + Width2Pixel (ncol + HSPACE) / 2, + SHADOW, title, len); } } @@ -2149,19 +2139,19 @@ { int change = 0; - if (map && !menubar_visible(r)) + if (map && !menubar_visible ()) { menuBar.state = 1; if (menuBar.win == 0) return 0; - XMapWindow(display->display, menuBar.win); + XMapWindow (display->display, menuBar.win); change = 1; } - else if (!map && menubar_visible(r)) + else if (!map && menubar_visible ()) { menubar_expose (); menuBar.state = 0; - XUnmapWindow(display->display, menuBar.win); + XUnmapWindow (display->display, menuBar.win); change = 1; } else @@ -2171,49 +2161,52 @@ } int -rxvt_term::menu_select (XButtonEvent *ev) +rxvt_term::menu_select (XButtonEvent &ev) { - menuitem_t *thisitem, *item = NULL; - int this_y, y; - menu_t *ActiveMenu = ActiveMenu; - - Window unused_root, unused_child; - int unused_root_x, unused_root_y; - unsigned int unused_mask; + menuitem_t *thisitem, *item = NULL; + int this_y, y; + + Window unused_root, unused_child; + int unused_root_x, unused_root_y; + unsigned int unused_mask; if (ActiveMenu == NULL) return 0; - XQueryPointer(display->display, ActiveMenu->win, - &unused_root, &unused_child, - &unused_root_x, &unused_root_y, - &(ev->x), &(ev->y), &unused_mask); + XQueryPointer (display->display, ActiveMenu->win, + &unused_root, &unused_child, + &unused_root_x, &unused_root_y, + &ev.x, &ev.y, &unused_mask); - if (ActiveMenu->parent != NULL && (ev->x < 0 || ev->y < 0)) + if (ActiveMenu->parent != NULL && (ev.x < 0 || ev.y < 0)) { menu_hide (); return 1; } + /* determine the menu item corresponding to the Y index */ y = SHADOW; - if (ev->x >= 0 && ev->x <= (ActiveMenu->w - SHADOW)) + if (ev.x >= 0 && ev.x <= (ActiveMenu->w - SHADOW)) { for (item = ActiveMenu->head; item != NULL; item = item->next) { - int h = HEIGHT_TEXT + 2 * SHADOW; + int h = HEIGHT_TEXT + 2 * SHADOW; - if (isSeparator(item->name)) + if (isSeparator (item->name)) h = HEIGHT_SEPARATOR; - else if (ev->y >= y && ev->y < (y + h)) + else if (ev.y >= y && ev.y < (y + h)) break; + y += h; } } - if (item == NULL && ev->type == ButtonRelease) + + if (item == NULL && ev.type == ButtonRelease) { menu_hide_all (); return 0; } + thisitem = item; this_y = y - SHADOW; @@ -2222,12 +2215,11 @@ { if (ActiveMenu->item != thisitem) { - for (y = 0, item = ActiveMenu->head; item != NULL; - item = item->next) + for (y = 0, item = ActiveMenu->head; item != NULL; item = item->next) { - int h; + int h; - if (isSeparator(item->name)) + if (isSeparator (item->name)) h = HEIGHT_SEPARATOR; else if (item == ActiveMenu->item) { @@ -2235,16 +2227,18 @@ drawbox_menuitem (y, 0); /* No Shadow */ if (item->entry.type == MenuSubMenu) drawtriangle (ActiveMenu->w, y, +1); + break; } else h = HEIGHT_TEXT + 2 * SHADOW; + y += h; } } else { - switch (ev->type) + switch (ev.type) { case ButtonRelease: switch (item->entry.type) @@ -2256,30 +2250,14 @@ case MenuAction: case MenuTerminalAction: - drawbox_menuitem (_y, -1); - { -#ifdef HAVE_NANOSLEEP - struct timespec rqt; - - rqt.tv_sec = 0; - rqt.tv_nsec = MENU_DELAY_USEC * 1000; - nanosleep(&rqt, NULL); -#else - /* use select for timing */ - struct timeval tv; - - tv.tv_sec = 0; - tv.tv_usec = MENU_DELAY_USEC; - select(0, NULL, NULL, NULL, &tv); -#endif - - } + drawbox_menuitem (this_y, -1); + rxvt_usleep (MENU_DELAY_USEC); /* remove menu before sending keys to the application */ menu_hide_all (); #ifndef DEBUG_MENU - action_dispatch (&(item->entry.action)); + action_dispatch (& (item->entry.action)); #else /* DEBUG_MENU */ - fprintf(stderr, "%s: %s\n", item->name, + fprintf (stderr, "%s: %s\n", item->name, item->entry.action.str); #endif /* DEBUG_MENU */ break; @@ -2294,23 +2272,26 @@ return 0; } } + DoMenu: ActiveMenu->item = thisitem; y = this_y; - if (item != NULL) + + if (thisitem != NULL) { item = ActiveMenu->item; if (item->entry.type != MenuLabel) drawbox_menuitem (y, +1); + if (item->entry.type == MenuSubMenu) { - int x; + int x; drawtriangle (ActiveMenu->w, y, -1); - x = ev->x + (ActiveMenu->parent + x = ev.x + (ActiveMenu->parent ? ActiveMenu->x - : Width2Pixel(ActiveMenu->x)); + : Width2Pixel (ActiveMenu->x)); if (x >= item->entry.submenu.menu->x) { @@ -2324,60 +2305,44 @@ } void -rxvt_term::menubar_select (XButtonEvent *ev) +rxvt_term::menubar_select (XButtonEvent &ev) { - menu_t *menu = NULL; + menu_t *menu = NULL; /* determine the pulldown menu corresponding to the X index */ - if (ev->y >= 0 && ev->y <= menuBar_height() && CurrentBar != NULL) + if (ev.y >= 0 && ev.y <= menuBar_height () && CurrentBar != NULL) { for (menu = CurrentBar->head; menu != NULL; menu = menu->next) { - int x = Width2Pixel(menu->x); - int w = Width2Pixel(menu->len + HSPACE); + int x = Width2Pixel (menu->x); + int w = Width2Pixel (menu->len + HSPACE); - if ((ev->x >= x && ev->x < x + w)) + if ((ev.x >= x && ev.x < x + w)) break; } } - switch (ev->type) + switch (ev.type) { case ButtonRelease: menu_hide_all (); break; case ButtonPress: - if (menu == NULL && Arrows_x && ev->x >= Arrows_x) + if (menu == NULL && Arrows_x && ev.x >= Arrows_x) { int i; for (i = 0; i < NARROWS; i++) { - if (ev->x >= (Arrows_x + (Width2Pixel(4 * i + i)) / 4) - && ev->x < (Arrows_x - + (Width2Pixel(4 * i + i + 4)) / 4)) + if (ev.x >= (Arrows_x + (Width2Pixel (4 * i + i)) / 4) + && ev.x < (Arrows_x + + (Width2Pixel (4 * i + i + 4)) / 4)) { draw_Arrows (Arrows[i].name, -1); - { -#ifdef HAVE_NANOSLEEP - struct timespec rqt; - - rqt.tv_sec = 0; - rqt.tv_nsec = MENU_DELAY_USEC * 1000; - nanosleep(&rqt, NULL); -#else - /* use select for timing */ - struct timeval tv; - - tv.tv_sec = 0; - tv.tv_usec = MENU_DELAY_USEC; - select(0, NULL, NULL, NULL, &tv); -#endif - - } + rxvt_usleep (MENU_DELAY_USEC); draw_Arrows (Arrows[i].name, +1); #ifdef DEBUG_MENUARROWS - fprintf(stderr, "'%c': ", Arrows[i].name); + fprintf (stderr, "'%c': ", Arrows[i].name); if (CurrentBar == NULL || (CurrentBar->arrows[i].type != MenuAction @@ -2385,19 +2350,16 @@ MenuTerminalAction)) { if (Arrows[i].str != NULL && Arrows[i].str[0]) - fprintf(stderr, "(default) \\033%s\n", - &(Arrows[i].str[2])); + fprintf (stderr, " (default) \\033%s\n", + & (Arrows[i].str[2])); } else { - fprintf(stderr, "%s\n", + fprintf (stderr, "%s\n", CurrentBar->arrows[i].str); } #else /* DEBUG_MENUARROWS */ - if (CurrentBar == NULL - || rxvt_action_dispatch(r, - &(CurrentBar->arrows[i])) - ) + if (CurrentBar == NULL || action_dispatch (&CurrentBar->arrows[i])) { if (Arrows[i].str != NULL && Arrows[i].str[0] != 0) tt_write ((Arrows[i].str + 1), @@ -2429,38 +2391,38 @@ * it would be nice to have `sticky' menus */ void -rxvt_term::menubar_control (XButtonEvent *ev) +rxvt_term::menubar_control (XButtonEvent &ev) { - switch (ev->type) + switch (ev.type) { case ButtonPress: - if (ev->button == Button1) + if (ev.button == Button1) menubar_select (ev); break; case ButtonRelease: - if (ev->button == Button1) + if (ev.button == Button1) menu_select (ev); break; case MotionNotify: - while (XCheckTypedWindowEvent(display->display, TermWin.parent[0], - MotionNotify, (XEvent *) ev)) ; + while (XCheckTypedWindowEvent (display->display, parent[0], + MotionNotify, (XEvent *)&ev)); if (ActiveMenu) while (menu_select (ev)) ; else - ev->y = -1; - if (ev->y < 0) + ev.y = -1; + if (ev.y < 0) { Window unused_root, unused_child; int unused_root_x, unused_root_y; unsigned int unused_mask; - XQueryPointer(display->display, menuBar.win, + XQueryPointer (display->display, menuBar.win, &unused_root, &unused_child, &unused_root_x, &unused_root_y, - &(ev->x), &(ev->y), &unused_mask); + &ev.x, &ev.y, &unused_mask); menubar_select (ev); } break;