/** ExposeEvent handle event * \param ev XExposeEvent pointer */ static void expose(XExposeEvent *ev) { Client *c; int i, sc; /* InfoBar member */ for(sc = 0; sc < screen_count(); ++sc) { if(ev->window == infobar[sc].bar->win) barwin_refresh(infobar[sc].bar); if(ev->window == infobar[sc].layout_button->win) barwin_refresh(infobar[sc].layout_button); if(conf.bars.selbar && ev->window == infobar[sc].selbar->win) barwin_refresh(infobar[sc].selbar); for(i = 1; i < conf.ntag[sc] + 1; ++i) if(ev->window == infobar[sc].tags[i]->win) barwin_refresh(infobar[sc].tags[i]); } /* Client frame */ if((c = client_gb_titlebar(ev->window))) frame_update(c); return; }
static void menu_focus_item(Menu *menu, int item, BarWindow *winitem[]) { int i; int chcklen = 0; if(menu_get_checkstring_needed(menu->item, menu->nitem)) chcklen = textw(conf.selected_layout_symbol) + PAD / 3; menu->focus_item = item; if(menu->focus_item > menu->nitem - 1) menu->focus_item = 0; else if(menu->focus_item < 0) menu->focus_item = menu->nitem - 1; for(i = 0; i < menu->nitem; ++i) { winitem[i]->fg = ((i == menu->focus_item) ? menu->colors.focus.fg : menu->colors.normal.fg); winitem[i]->bg = ((i == menu->focus_item) ? menu->colors.focus.bg : menu->colors.normal.bg); barwin_refresh_color(winitem[i]); menu_draw_item_name(menu, i, winitem, chcklen); barwin_refresh(winitem[i]); } return; }
static void event_expose(XEvent *e) { XExposeEvent *ev = &e->xexpose; struct barwin *b; SLIST_FOREACH(b, &W->h.barwin, next) if(b->win == ev->window) { barwin_refresh(b); return; } }
/** Handle statustext and draw all things in infobar of specified screen *\param sc Screen number *\param str String */ void statustext_handle(int sc, char *str) { char *lastst; int i, nr, ng, ns, sw = 0; StatusRec r[128]; StatusGraph g[128]; StatusText s[128]; /* If the str == the current statustext, return (not needed) */ if(!str) return; if(sc == conf.systray.screen) sw = systray_get_width(); barwin_refresh_color(infobar[sc].bar); /* save last status text address (for free at the end) */ lastst = infobar[sc].statustext; infobar[sc].statustext = xstrdup(str); /* Store rectangles, located text & images properties. */ nr = statustext_rectangle(r, str); ng = statustext_graph(g, str); ns = statustext_text(s, str); /* Draw normal text (and possibly colored with \#color\ blocks) */ statustext_normal(sc, str); /* Draw rectangles with stored properties. */ for(i = 0; i < nr; ++i) draw_rectangle(infobar[sc].bar->dr, r[i].x - sw, r[i].y, r[i].w, r[i].h, r[i].color); /* Draw graphs with stored properties. */ for(i = 0; i < ng; ++i) draw_graph(infobar[sc].bar->dr, g[i].x - sw, g[i].y, g[i].w, g[i].h, g[i].color, g[i].data); /* Draw located text with stored properties. */ for(i = 0; i < ns; ++i) draw_text(infobar[sc].bar->dr, s[i].x - sw, s[i].y, s[i].color, s[i].text); barwin_refresh(infobar[sc].bar); free(lastst); return; }
/** Draw Selbar (selected client title bar in infobar *\param sc Screen Number */ void infobar_draw_selbar(int sc) { char *str = NULL; if(!conf.bars.selbar) return; if(!sel || (sel && sel->screen != sc)) { barwin_unmap(infobar[sc].selbar); return; } else if(sel && !infobar[sc].selbar->mapped) barwin_map(infobar[sc].selbar); if(conf.selbar.maxlength >= 0 && sel) { str = xcalloc(conf.selbar.maxlength + 4, sizeof(char)); strncpy(str, sel->title, conf.selbar.maxlength); if(strlen(sel->title) > (size_t)conf.selbar.maxlength) strcat(str, "..."); } barwin_resize(infobar[sc].selbar, textw(str ? str : sel->title) + PAD, infobar[sc].geo.height - 2); barwin_move(infobar[sc].selbar, ((conf.layout_placement) ? (infobar[sc].tags_board->geo.x + infobar[sc].tags_board->geo.width + PAD / 2) : (infobar[sc].layout_button->geo.x + infobar[sc].layout_button->geo.width + PAD / 2)), 1); barwin_refresh_color(infobar[sc].selbar); barwin_draw_text(infobar[sc].selbar, PAD / 2, FHINFOBAR - 1, ((str) ? str : sel->title)); barwin_refresh(infobar[sc].selbar); free(str); return; }
void menu_draw(Menu menu, int x, int y) { int i, width, height, out; XEvent ev; BarWindow *item[menu.nitem]; BarWindow *frame; int chcklen = 0; if(menu_get_checkstring_needed(menu.item, menu.nitem)) chcklen = textw(conf.selected_layout_symbol) + PAD / 3; width = menu_get_longer_string(menu.item, menu.nitem) + chcklen + textw(">") + PAD * 3; height = menu.nitem * (INFOBARH - SHADH); /* Frame barwin */ screen_get_sel(); if((out = x + width - MAXW) > 0) x -= out; if((out = y + height - MAXH) > 0) y -= out; frame = barwin_create(ROOT, x, y, width + SHADH, height + SHADH * 3, menu.colors.normal.bg, menu.colors.normal.fg, False, False, True); barwin_map(frame); barwin_map_subwin(frame); barwin_refresh_color(frame); for(i = 0; i < menu.nitem; ++i) { item[i] = barwin_create(frame->win, SHADH, (i * (INFOBARH - SHADH) + SHADH), width - SHADH, INFOBARH, menu.colors.normal.bg, menu.colors.normal.fg, True, False, False); barwin_map(item[i]); barwin_refresh_color(item[i]); menu_draw_item_name(&menu, i, item, chcklen); barwin_refresh(item[i]); } /* Select the first item */ menu_focus_item(&menu, 0, item); XGrabKeyboard(dpy, ROOT, True, GrabModeAsync, GrabModeAsync, CurrentTime); while(!menu_manage_event(&ev, &menu, item)); XUngrabKeyboard(dpy, CurrentTime); for(i = 0; i < menu.nitem; ++i) barwin_delete(item[i]); barwin_delete(frame); return; }
/** Init the Infobar */ void infobar_init(void) { int s, sc, i, j = 0; s = screen_count(); if(!infobar) infobar = xcalloc(s, sizeof(InfoBar)); for(sc = 0; sc < s; ++sc) { j = 0; infobar[sc].geo.height = INFOBARH; switch(tags[sc][seltag[sc]].barpos) { case IB_Hide: sgeo[sc].y = spgeo[sc].y + TBARH; sgeo[sc].height += INFOBARH; infobar[sc].geo.y = -(infobar[sc].geo.height) * 2; break; case IB_Bottom: sgeo[sc].y = TBARH; infobar[sc].geo.y = spgeo[sc].y + sgeo[sc].height + TBARH; break; default: case IB_Top: sgeo[sc].y = spgeo[sc].y + INFOBARH + TBARH; infobar[sc].geo.y = spgeo[sc].y; break; } /* Create infobar barwindow */ infobar[sc].bar = barwin_create(ROOT, sgeo[sc].x - BORDH, infobar[sc].geo.y, sgeo[sc].width, infobar[sc].geo.height, conf.colors.bar, conf.colors.text, False, False, conf.border.bar); infobar[sc].tags_board = barwin_create(infobar[sc].bar->win, ((conf.layout_placement) ? textw(tags[sc][seltag[sc]].layout.symbol) + PAD * 1.5: 0), 0, textw(tags[sc][0].name) + PAD, /* Base size, will change */ infobar[sc].geo.height, conf.colors.bar, conf.colors.text, False, False, False); /* Create tags window */ for(i = 1; i < conf.ntag[sc] + 1; ++i) { infobar[sc].tags[i] = barwin_create(infobar[sc].tags_board->win, j, 0, textw(tags[sc][i].name) + PAD, infobar[sc].geo.height, conf.colors.bar, conf.colors.text, False, False, conf.border.tag); j += textw(tags[sc][i].name) + PAD; barwin_resize(infobar[sc].tags_board, j, infobar[sc].geo.height); barwin_map_subwin(infobar[sc].tags[i]); } /* Create layout switch barwindow */ infobar[sc].layout_button = barwin_create(infobar[sc].bar->win, ((conf.layout_placement) ? 0 : (j + PAD / 2)), 0, ((conf.layout_button_width > 0) ? (uint)conf.layout_button_width : (textw(tags[sc][seltag[sc]].layout.symbol) + PAD)), infobar[sc].geo.height, conf.colors.layout_bg, conf.colors.layout_fg, False, False, conf.border.layout); /* Selbar */ if(conf.bars.selbar) infobar[sc].selbar = barwin_create(infobar[sc].bar->win, ((conf.layout_placement) ? (j + PAD / 2) : infobar[sc].layout_button->geo.x + infobar[sc].layout_button->geo.width + PAD / 2), 1, (sel) ? textw(sel->title) + PAD : 1, infobar[sc].geo.height - 2, conf.selbar.bg, conf.selbar.fg, False, False, False); /* Map/Refresh all */ barwin_map(infobar[sc].bar); barwin_map_subwin(infobar[sc].bar); barwin_map(infobar[sc].tags_board); barwin_map_subwin(infobar[sc].tags_board); if(conf.border.layout) barwin_map_subwin(infobar[sc].layout_button); if(conf.bars.selbar) barwin_map(infobar[sc].selbar); barwin_refresh_color(infobar[sc].bar); barwin_refresh(infobar[sc].bar); /* Default statustext is set here */ infobar[sc].statustext = xstrdup(WMFS_VERSION); infobar_draw(sc); } return; }