From 179c94f26f11de063601c736b3e96ddbf4bedc0c Mon Sep 17 00:00:00 2001 From: Martin Duquesnoy Date: Fri, 13 Aug 2010 03:11:44 +0200 Subject: [PATCH] Menu: Apply PeVe/mseed path: Menu optimisation/improvment and some fixation --- src/barwin.c | 20 ++++++++++++++++++++ src/draw.c | 10 ++++++++-- src/menu.c | 37 +++++++++++++++++++++++++++---------- src/wmfs.h | 5 ++++- 4 files changed, 59 insertions(+), 13 deletions(-) diff --git a/src/barwin.c b/src/barwin.c index 2b0fad9..7cdd641 100644 --- a/src/barwin.c +++ b/src/barwin.c @@ -123,6 +123,26 @@ barwin_draw_text(BarWindow *bw, int x, int y, char *text) return; } +/** Draw text in a Barwindow +*/ +void +barwin_draw_image_ofset_text(BarWindow *bw, int x, int y, char *text, int x_image_ofset, int y_image_ofset) +{ + if(!text) + return; + + /* Background color of the text if there is stipple */ + if(bw->stipple) + draw_rectangle(bw->dr, x - 4, 0, textw(text) + 8, bw->geo.height, bw->bg); + + /* Draw text */ + draw_image_ofset_text(bw->dr, x, y, bw->fg, 0, text, x_image_ofset, y_image_ofset); + + barwin_refresh(bw); + + return; +} + /** Delete a BarWindow * \param bw BarWindow pointer */ diff --git a/src/draw.c b/src/draw.c index 872a278..9ee9680 100644 --- a/src/draw.c +++ b/src/draw.c @@ -32,6 +32,12 @@ #include "wmfs.h" +void +draw_text(Drawable d, int x, int y, char* fg, int pad, char *str) +{ + draw_image_ofset_text(d, x, y, fg, pad, str, 0, 0); +} + /** Draw a string in a Drawable * \param d Drawable * \param x X position @@ -41,7 +47,7 @@ * \param str String that will be draw */ void -draw_text(Drawable d, int x, int y, char* fg, int pad, char *str) +draw_image_ofset_text(Drawable d, int x, int y, char* fg, int pad, char *str, int x_image_ofset, int y_image_ofset) { XftColor xftcolor; XftDraw *xftd; @@ -65,7 +71,7 @@ draw_text(Drawable d, int x, int y, char* fg, int pad, char *str) sw = systray_get_width(); for(i = 0; i < ni; ++i) - draw_image(d, im[i].x - sw, im[i].y, im[i].w, im[i].h, im[i].name); + draw_image(d, x_image_ofset + im[i].x - sw, y_image_ofset + im[i].y, im[i].w, im[i].h, im[i].name); } #endif /* HAVE_IMLIB */ diff --git a/src/menu.c b/src/menu.c index a2b289a..ece0138 100644 --- a/src/menu.c +++ b/src/menu.c @@ -68,7 +68,11 @@ menu_draw(Menu menu, int x, int y) BarWindow *item[menu.nitem]; BarWindow *frame; - width = menu_get_longer_string(menu.item, menu.nitem) + PAD * 3; + 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 */ @@ -99,7 +103,7 @@ menu_draw(Menu menu, int x, int y) barwin_map(item[i]); barwin_refresh_color(item[i]); - menu_draw_item_name(&menu, i, item); + menu_draw_item_name(&menu, i, item, chcklen); barwin_refresh(item[i]); } @@ -209,6 +213,9 @@ Bool menu_activate_item(Menu *menu, int i) { int j, x, y; + int chcklen = 0; + if(menu_get_checkstring_needed(menu->item, menu->nitem)) + chcklen = textw(conf.selected_layout_symbol) + PAD / 3; if(menu->item[i].submenu) { @@ -216,7 +223,7 @@ menu_activate_item(Menu *menu, int i) if(!strcmp(menu->item[i].submenu, conf.menu[j].name)) { y = menu->y + ((i - 1) * INFOBARH + PAD) - SHADH * 2; - x = menu->x + menu_get_longer_string(menu->item, menu->nitem) + PAD * 3; + x = menu->x + menu_get_longer_string(menu->item, menu->nitem) + chcklen + textw(">") + PAD * 3; menu_draw(conf.menu[j], x, y); @@ -238,6 +245,10 @@ 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) @@ -251,7 +262,7 @@ menu_focus_item(Menu *menu, int item, BarWindow *winitem[]) 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); + menu_draw_item_name(menu, i, winitem, chcklen); barwin_refresh(winitem[i]); } @@ -259,29 +270,29 @@ menu_focus_item(Menu *menu, int item, BarWindow *winitem[]) } void -menu_draw_item_name(Menu *menu, int item, BarWindow *winitem[]) +menu_draw_item_name(Menu *menu, int item, BarWindow *winitem[], int chcklen) { int x; - int width = menu_get_longer_string(menu->item, menu->nitem); + int width = menu_get_longer_string(menu->item, menu->nitem) + chcklen + PAD / 3; switch(menu->align) { case MA_Left: - x = PAD * 3 / 2; + x = chcklen + PAD / 2; break; case MA_Right: x = width - textw(menu->item[item].name) + PAD * 3 / 2; break; default: case MA_Center: - x = width / 2 - textw(menu->item[item].name) / 2 + PAD * 3 / 2; + x = (width - (chcklen + PAD / 3)) / 2 - textw(menu->item[item].name) / 2 + chcklen + PAD / 3; break; } - barwin_draw_text(winitem[item], x, FHINFOBAR, menu->item[item].name); + barwin_draw_image_ofset_text(winitem[item], x, FHINFOBAR, menu->item[item].name, chcklen + PAD / 2, 0); if(menu->item[item].check) if(menu->item[item].check(menu->item[item].cmd)) - barwin_draw_text(winitem[item], PAD / 3, FHINFOBAR, conf.selected_layout_symbol); + barwin_draw_image_ofset_text(winitem[item], PAD / 3, FHINFOBAR, conf.selected_layout_symbol, PAD / 3, 0); if(menu->item[item].submenu) barwin_draw_text(winitem[item], width + PAD * 2, FHINFOBAR, ">"); @@ -340,3 +351,9 @@ menu_clear(Menu *menu) return; } +Bool +menu_get_checkstring_needed(MenuItem *mi, int nitem) +{ + return True; +} + diff --git a/src/wmfs.h b/src/wmfs.h index f3c0033..f0a1a98 100644 --- a/src/wmfs.h +++ b/src/wmfs.h @@ -122,6 +122,7 @@ BarWindow *barwin_create(Window parent, Bool stipple, Bool border); void barwin_draw_text(BarWindow *bw, int x, int y, char *text); +void barwin_draw_image_ofset_text(BarWindow *bw, int x, int y, char *text, int x_image_ofset, int y_image_ofset); void barwin_delete(BarWindow *bw); void barwin_delete_subwin(BarWindow *bw); void barwin_map(BarWindow *bw); @@ -135,6 +136,7 @@ void barwin_refresh(BarWindow *bw); /* draw.c */ void draw_text(Drawable d, int x, int y, char* fg, int pad, char *str); +void draw_image_ofset_text(Drawable d, int x, int y, char* fg, int pad, char *str, int x_image_ofset, int y_image_ofset); void draw_rectangle(Drawable dr, int x, int y, uint w, uint h, uint color); void draw_graph(Drawable dr, int x, int y, uint w, uint h, uint color, char *data); @@ -258,10 +260,11 @@ void menu_draw(Menu menu, int x, int y); Bool menu_manage_event(XEvent *ev, Menu *menu, BarWindow *winitem[]); Bool menu_activate_item(Menu *menu, int i); void menu_focus_item(Menu *menu, int item, BarWindow *winitem[]); -void menu_draw_item_name(Menu *menu, int item, BarWindow *winitem[]); +void menu_draw_item_name(Menu *menu, int item, BarWindow *winitem[], int chcklen); int menu_get_longer_string(MenuItem *mi, int nitem); void uicb_menu(uicb_t cmd); void menu_clear(Menu *menu); +Bool menu_get_checkstring_needed(MenuItem *mi, int nitem); /* launcher.c */ void launcher_execute(Launcher *launcher);