diff -ubNr --exclude-from=/home/lukas/diffrc/ion.conf ion-devel-20021104-pristine/src/frame.c ion-devel-20021104/src/frame.c --- ion-devel-20021104-pristine/src/frame.c 2002-11-03 05:33:02.000000000 +0100 +++ ion-devel-20021104/src/frame.c 2002-12-01 23:50:01.000000000 +0100 @@ -18,12 +18,15 @@ #include #include #include +#include #include "framep.h" #include "frame-pointer.h" #include "bindmaps.h" #include "splitframe.h" #include "funtabs.h" +#define FRAME_SHORTCUT_W 23 + static void deinit_frame(WFrame *frame); static void frame_remove_sub(WFrame *frame, WRegion *sub); @@ -272,12 +275,17 @@ void frame_recalc_bar(WFrame *frame) { WScreen *scr=SCREEN_OF(frame); + WRegion *reg=(WRegion*)frame; int bar_w=BAR_W(frame, &(scr->grdata)); int spc=scr->grdata.frame_border.ipad; int tab_w; int textw; WRegion *sub; + if(shortcut_is_valid(reg->shortcut)){ + bar_w-=FRAME_SHORTCUT_W+scr->grdata.spacing; + } + if(frame->sub_count==0){ frame->tab_w=bar_w; }else{ @@ -300,6 +308,7 @@ { DrawInfo _dinfo, *dinfo=&_dinfo; WGRData *grdata=GRDATA_OF(frame); + WRegion *reg=(WRegion*)frame; dinfo->win=FRAME_WIN(frame); dinfo->grdata=grdata; @@ -332,15 +341,41 @@ draw_frame_bar(frame, !complete || !grdata->bar_inside_frame); } +static char *get_shortcut_label(int s) +{ + static char l[3]; + if (!shortcut_is_valid(s)) /*this, of course, shouldn't happen*/ + s='?'; + snprintf(l, sizeof(l), "%c", (unsigned char)s); + return l; +} + +static void draw_shortcut_tab(const WFrame *frame, DrawInfo *dinfo, WGRData *grdata) +{ + WRegion *reg=(WRegion*)frame; + int w; + if (shortcut_is_valid(reg->shortcut)){ + if(REGION_IS_ACTIVE(frame)) + COLORS=&(grdata->act_tab_shortcut_colors); + else + COLORS=&(grdata->tab_shortcut_colors); + w=dinfo->geom.w; + dinfo->geom.w=FRAME_SHORTCUT_W; + draw_textbox(dinfo, get_shortcut_label(reg->shortcut), CF_TAB_TEXT_ALIGN, TRUE); + X+=FRAME_SHORTCUT_W+grdata->spacing; + dinfo->geom.w=w; + } +} void draw_frame_bar(const WFrame *frame, bool complete) { DrawInfo _dinfo, *dinfo=&_dinfo; - WRegion *sub, *next; + WRegion *sub, *next, *reg; WScreen *scr=SCREEN_OF(frame); WGRData *grdata=&(scr->grdata); WRectangle bg; + reg=(WRegion*)frame; frame_bar_geom(frame, &bg); dinfo->win=FRAME_WIN(frame); @@ -364,12 +399,24 @@ } } + /* draw shortcut tab in top-left corner? */ + if (!grdata->shortcut_corner) + draw_shortcut_tab(frame, dinfo, grdata); + if(frame->sub_count==0){ + if(shortcut_is_valid(reg->shortcut)) + W=bg.w-FRAME_SHORTCUT_W; + if(REGION_IS_ACTIVE(frame)) COLORS=&(grdata->act_tab_sel_colors); else COLORS=&(grdata->tab_sel_colors); draw_textbox(dinfo, "", CF_TAB_TEXT_ALIGN, TRUE); + + X+=W+grdata->spacing; + /* draw shortcut tab in top-right corner? */ + if(grdata->shortcut_corner) + draw_shortcut_tab(frame, dinfo, grdata); return; } @@ -378,8 +425,12 @@ for(sub=firstreg_ni(frame); sub!=NULL; sub=next){ next=nextreg_ni(frame, sub); - if(next==NULL) - dinfo->geom.w=bg.w-(X-bg.x); + if(next==NULL){ + int d=0; + if(shortcut_is_valid(reg->shortcut) && grdata->shortcut_corner) + d=FRAME_SHORTCUT_W+grdata->spacing; + dinfo->geom.w=bg.w-(X-bg.x)-d; + } if(REGION_IS_ACTIVE(frame)){ if(sub==frame->current_sub) @@ -420,8 +471,12 @@ XFillRectangle(wglobal.dpy, WIN, grdata->stipple_gc, X, Y, W, H); } - X+=frame->tab_w+grdata->tab_spacing; + X+=W+grdata->tab_spacing; } + + /* draw shortcut tab in top-right corner? */ + if(grdata->shortcut_corner) + draw_shortcut_tab(frame, dinfo, grdata); } diff -ubNr --exclude-from=/home/lukas/diffrc/ion.conf ion-devel-20021104-pristine/src/frame.h ion-devel-20021104/src/frame.h --- ion-devel-20021104-pristine/src/frame.h 2002-09-25 13:53:34.000000000 +0200 +++ ion-devel-20021104/src/frame.h 2002-12-01 15:35:07.000000000 +0100 @@ -74,4 +74,6 @@ extern void frame_move_current_tab_right(WFrame *frame); extern void frame_move_current_tab_left(WFrame *frame); +extern void frame_set_shortcut(WFrame *frame, int shortcut); + #endif /* ION_FRAME_H */ diff -ubNr --exclude-from=/home/lukas/diffrc/ion.conf ion-devel-20021104-pristine/src/funtabs.c ion-devel-20021104/src/funtabs.c --- ion-devel-20021104-pristine/src/funtabs.c 2002-09-25 13:53:34.000000000 +0200 +++ ion-devel-20021104/src/funtabs.c 2002-12-01 18:36:19.000000000 +0100 @@ -16,6 +16,7 @@ #include #include #include +#include #include "frame.h" #include "frame-pointer.h" #include "workspace.h" @@ -127,6 +128,8 @@ FN_VOID(generic, WFrame, "destroy_frame", region_request_close), /* FN_VOID(generic, WFrame, "closedestroy", close_propagate),*/ FN_VOID(generic, WFrame, "close_main", close_sub), + FN_VOID(generic, WFrame, "set_shortcut", set_shortcut), + FN_VOID(generic, WFrame, "goto_shortcut", goto_shortcut), FN_VOID(generic, WRegion, "switch_tab", frame_switch_tab), FN_VOID(generic, WRegion, "resize_vert", resize_vert), diff -ubNr --exclude-from=/home/lukas/diffrc/ion.conf ion-devel-20021104-pristine/wmcore/Makefile ion-devel-20021104/wmcore/Makefile --- ion-devel-20021104-pristine/wmcore/Makefile 2002-11-04 14:38:29.000000000 +0100 +++ ion-devel-20021104/wmcore/Makefile 2002-12-01 18:36:35.000000000 +0100 @@ -21,7 +21,7 @@ completehelp.o symlist.o clientwin.o colormap.o region.o \ eventh.o winprops.o targetid.o attach.o resize.o close.o \ defer.o grab.o wsreg.o commandsq.o readfds.o regbind.o \ - funtabs.o viewport.o tags.o + funtabs.o viewport.o tags.o shortcut.o TARGETS=wmcore.a diff -ubNr --exclude-from=/home/lukas/diffrc/ion.conf ion-devel-20021104-pristine/wmcore/conf-draw.c ion-devel-20021104/wmcore/conf-draw.c --- ion-devel-20021104-pristine/wmcore/conf-draw.c 2002-11-03 03:44:55.000000000 +0100 +++ ion-devel-20021104/wmcore/conf-draw.c 2002-12-01 22:09:29.000000000 +0100 @@ -5,6 +5,7 @@ * See the included file LICENSE for details. */ +#include #include #include "common.h" @@ -156,6 +157,8 @@ CGHAND(act_tab_colors) CGHAND(act_tab_sel_colors) CGHAND(input_colors) +CGHAND(tab_shortcut_colors) +CGHAND(act_tab_shortcut_colors) #undef CGHAND @@ -281,6 +284,28 @@ return TRUE; } +static bool opt_screen_shortcut_corner(Tokenizer *tokz, int n, Token *toks) +{ + WScreen *scr; + char *data=TOK_STRING_VAL(&(toks[1])); + int val=0; + + if(!strncasecmp(data, "right", 5)) + val=1; + else if(!strncasecmp(data, "left", 4)) + val=0; + else{ + tokz_warn(tokz, toks[1].line, "Invalid value `%s' given to shortcut_corner.", data); + } + + FOR_ALL_SELECTED_SCREENS(scr){ + scr->grdata.shortcut_corner=val; + } + + return TRUE; +} + + /*}}}*/ @@ -299,6 +324,8 @@ {"act_frame_colors", "ssss", opt_screen_act_frame_colors, NULL}, {"tab_colors", "ssss", opt_screen_tab_colors, NULL}, {"tab_sel_colors", "ssss", opt_screen_tab_sel_colors, NULL}, + {"tab_shortcut_colors", "ssss", opt_screen_tab_shortcut_colors, NULL}, + {"act_tab_shortcut_colors", "ssss", opt_screen_act_tab_shortcut_colors, NULL}, {"frame_colors", "ssss", opt_screen_frame_colors, NULL}, {"input_colors", "ssss", opt_screen_input_colors, NULL}, {"background_color", "s", opt_screen_frame_bgcolor, NULL}, @@ -310,6 +337,7 @@ {"pwm_bar_widths", "ldl", opt_screen_bar_widths, NULL}, + {"shortcut_corner", "s", opt_screen_shortcut_corner, NULL}, /*{"#end", NULL, end_screen, NULL}, {"#cancel", NULL, end_screen, NULL},*/ diff -ubNr --exclude-from=/home/lukas/diffrc/ion.conf ion-devel-20021104-pristine/wmcore/draw.c ion-devel-20021104/wmcore/draw.c --- ion-devel-20021104-pristine/wmcore/draw.c 2002-11-03 03:44:55.000000000 +0100 +++ ion-devel-20021104/wmcore/draw.c 2002-12-01 22:56:10.000000000 +0100 @@ -14,7 +14,6 @@ #include "drawp.h" #include "imports.h" - /*{{{ Primitives */ @@ -202,6 +201,8 @@ grdata->selection_bgcolor=white; grdata->selection_fgcolor=black; + grdata->shortcutc_set=FALSE; + #define INIT_BD(BD, TL, BR, IPAD) BD.tl=TL; BD.br=BR; BD.ipad=IPAD; INIT_BD(grdata->frame_border, 1, 1, 0); @@ -319,6 +320,11 @@ if(grdata->tab_font==NULL) grdata->tab_font=load_font(dpy, CF_FALLBACK_FONT_NAME); + if(!grdata->shortcutc_set){ + grdata->act_tab_shortcut_colors=grdata->act_tab_colors; + grdata->tab_shortcut_colors=grdata->tab_colors; + } + /* Create normal gc */ gcv.line_style=LineSolid; gcv.line_width=1; diff -ubNr --exclude-from=/home/lukas/diffrc/ion.conf ion-devel-20021104-pristine/wmcore/global.h ion-devel-20021104/wmcore/global.h --- ion-devel-20021104-pristine/wmcore/global.h 2002-06-04 00:39:31.000000000 +0200 +++ ion-devel-20021104/wmcore/global.h 2002-12-01 15:31:34.000000000 +0100 @@ -80,6 +80,8 @@ Time dblclick_delay; int opaque_resize; bool warp_enabled; + + WRegion *shortcuts[127]; }; extern WGlobal wglobal; diff -ubNr --exclude-from=/home/lukas/diffrc/ion.conf ion-devel-20021104-pristine/wmcore/grdata.h ion-devel-20021104/wmcore/grdata.h --- ion-devel-20021104-pristine/wmcore/grdata.h 2002-11-03 03:44:55.000000000 +0100 +++ ion-devel-20021104/wmcore/grdata.h 2002-12-01 22:57:03.000000000 +0100 @@ -39,6 +39,7 @@ WColorGroup input_colors; Pixel frame_bgcolor, selection_bgcolor, selection_fgcolor; bool transparent_background; + bool shortcutc_set; WBorder frame_border; WBorder tab_border; @@ -49,6 +50,8 @@ /* Ion-specific */ bool bar_inside_frame; int spacing; + int shortcut_corner; /* 0=left; 1=right; */ + WColorGroup act_tab_shortcut_colors, tab_shortcut_colors; /* PWM-specific */ int bar_min_width, tab_min_width; diff -ubNr --exclude-from=/home/lukas/diffrc/ion.conf ion-devel-20021104-pristine/wmcore/modules.c ion-devel-20021104/wmcore/modules.c --- ion-devel-20021104-pristine/wmcore/modules.c 2002-04-11 17:06:32.000000000 +0200 +++ ion-devel-20021104/wmcore/modules.c 2002-12-01 22:28:40.000000000 +0100 @@ -197,6 +197,10 @@ { } +void have_module(const char *n) +{ + return FALSE; +} /*}}}*/ diff -ubNr --exclude-from=/home/lukas/diffrc/ion.conf ion-devel-20021104-pristine/wmcore/region.c ion-devel-20021104/wmcore/region.c --- ion-devel-20021104-pristine/wmcore/region.c 2002-09-25 23:15:38.000000000 +0200 +++ ion-devel-20021104/wmcore/region.c 2002-12-01 18:41:34.000000000 +0100 @@ -19,6 +19,7 @@ #include "close.h" #include "regbind.h" #include "tags.h" +#include "shortcut.h" #if 0 @@ -94,6 +95,8 @@ void deinit_region(WRegion *reg) { + if (shortcut_is_valid(reg->shortcut)) + shortcut_remove(reg->shortcut); detach_region(reg); region_unuse_name(reg); untag_region(reg); diff -ubNr --exclude-from=/home/lukas/diffrc/ion.conf ion-devel-20021104-pristine/wmcore/region.h ion-devel-20021104/wmcore/region.h --- ion-devel-20021104-pristine/wmcore/region.h 2002-09-25 23:15:38.000000000 +0200 +++ ion-devel-20021104/wmcore/region.h 2002-12-01 15:35:55.000000000 +0100 @@ -44,6 +44,8 @@ void *funclist; WRegion *tag_next, *tag_prev; + + int shortcut; /* valid values: '0'-'9', 'A'-'z' */ }; diff -ubNr --exclude-from=/home/lukas/diffrc/ion.conf ion-devel-20021104-pristine/wmcore/shortcut.c ion-devel-20021104/wmcore/shortcut.c --- ion-devel-20021104-pristine/wmcore/shortcut.c 1970-01-01 01:00:00.000000000 +0100 +++ ion-devel-20021104/wmcore/shortcut.c 2002-12-01 23:48:44.000000000 +0100 @@ -0,0 +1,129 @@ +/* + * ion/shortcut.c + * + * Copyright (c) Lukas Schroeder 2002 + * See the included file LICENSE for details. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include "shortcut.h" + +bool shortcut_is_valid(int cut) +{ + return ((cut>='0' && cut<='9') || (cut>='A' && cut<='z')); +} + +void shortcut_remove(int cut) +{ + WRegion *region; + + if(!shortcut_is_valid(cut)) + return; + + region=wglobal.shortcuts[cut]; + if(!region) + return; + + region->shortcut=0; + wglobal.shortcuts[cut]=NULL; +} + +static void shortcut_remove_from_region(WRegion *region) +{ + shortcut_remove(region->shortcut); + assert(region->shortcut==0); + if (WTHING_IS(region, WWindow)) + draw_window((WWindow *)region, FALSE); +} + +void shortcut_set(WRegion *region, int cut) +{ + bool valid=shortcut_is_valid(cut); + + if(valid){ + WRegion *oldregion=wglobal.shortcuts[cut]; + if (oldregion) + shortcut_remove_from_region(oldregion); + } + + shortcut_remove_from_region(region); + + if(!valid) + return; + + shortcut_remove(cut); + + wglobal.shortcuts[cut]=region; + region->shortcut=cut; + if (WTHING_IS(region, WWindow)) + draw_window((WWindow *)region, FALSE); +} + +static char *decode_keysym(XKeyEvent *ev) +{ + static char buffer[10]; + int len; + + len=XLookupString(ev, buffer, 10, NULL, NULL); + if(!len || !shortcut_is_valid((int)buffer[0])) + buffer[0]=0; + buffer[1]=0; + return buffer; +} + +static bool setshortcut_handler(WRegion *region, XEvent *ev) +{ + KeySym sym; + char *sc; + + if(ismod(ev->xkey.keycode)) + return FALSE; + + sc=decode_keysym(&ev->xkey); + + shortcut_set(region, (int)sc[0]); + if (WTHING_IS(region, WWindow)) + draw_window((WWindow *)region, FALSE); + return TRUE; +} + +static bool gotoshortcut_handler(WRegion *region, XEvent *ev) +{ + WRegion *target; + char *sc; + + if(ismod(ev->xkey.keycode)) + return FALSE; + + sc=decode_keysym(&ev->xkey); + if(sc[0] && shortcut_is_valid((int)sc[0])){ + + target=wglobal.shortcuts[(int)sc[0]]; + if(!target) + return TRUE; + + goto_region(target); + } + /*skip_focusenter(); */ + return TRUE; +} + +void set_shortcut(WRegion *frame) +{ + grab_establish((WRegion*)frame, setshortcut_handler, FocusChangeMask|KeyReleaseMask); +} + +void goto_shortcut(WRegion *frame) +{ + grab_establish((WRegion*)frame, gotoshortcut_handler, FocusChangeMask|KeyReleaseMask); +} + diff -ubNr --exclude-from=/home/lukas/diffrc/ion.conf ion-devel-20021104-pristine/wmcore/shortcut.h ion-devel-20021104/wmcore/shortcut.h --- ion-devel-20021104-pristine/wmcore/shortcut.h 1970-01-01 01:00:00.000000000 +0100 +++ ion-devel-20021104/wmcore/shortcut.h 2002-12-01 18:37:04.000000000 +0100 @@ -0,0 +1,22 @@ +/* + * ion/shortcut.h + * + * Copyright (c) Lukas Schroeder 2002 + * See the included file LICENSE for details. + */ + +#ifndef INCLUDED_SHORTCUT_H +#define INCLUDED_SHORTCUT_H + +#include + + +extern bool shortcut_is_valid(int cut); +extern void shortcut_remove(int cut); +extern void shortcut_set(WRegion *region, int cut); + +extern void set_shortcut(WRegion *region); +extern void goto_shortcut(WRegion *region); + + +#endif /* INCLUDED_SHORTCUT_H */