Ejemplo n.º 1
0
Archivo: event.c Proyecto: n4cht/kwm
/** 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;
}
Ejemplo n.º 2
0
Archivo: menu.c Proyecto: wavebeem/wmfs
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;
}
Ejemplo n.º 3
0
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;
          }
}
Ejemplo n.º 4
0
/** 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;
}
Ejemplo n.º 5
0
Archivo: infobar.c Proyecto: n4cht/nnwm
/** 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;
}
Ejemplo n.º 6
0
Archivo: menu.c Proyecto: wavebeem/wmfs
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;
}
Ejemplo n.º 7
0
Archivo: infobar.c Proyecto: n4cht/nnwm
/** 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;
}