[sorry, first email wasn't addressed to [EMAIL PROTECTED]

this patch adds a "frame_toggle_tab" function to enable the dynamic
enabling/disabling of frame tabs.

it can be applied to ion-devel-20030225, as well as to
ion-devel-20030223.

Changes:
 * converted to the new configuration file interface
 * renamed "toggle_tab" to "frame_toggle_tab"

please apply,
Andreas
diff -urN ion-devel-20030223/src/frame.c ion-devel-20030223-toggle/src/frame.c
--- ion-devel-20030223/src/frame.c      2003-02-23 14:16:57.000000000 +0100
+++ ion-devel-20030223-toggle/src/frame.c       2003-02-25 21:50:43.000000000 +0100
@@ -93,17 +93,21 @@
 #define BAR_X(FRAME, GRDATA) ((GRDATA)->bar_off.x)
 #define BAR_Y(FRAME, GRDATA) ((GRDATA)->bar_off.y)
 #define BAR_W(FRAME, GRDATA) (REGION_GEOM(FRAME).w+(GRDATA)->bar_off.w)
-#define BAR_H(FRAME, GRDATA) ((GRDATA)->bar_h)
+#define BAR_H(FRAME, GRDATA) ((DRAW_TAB(FRAME))?((GRDATA)->bar_h):0)
 
 #define FRAME_TO_CLIENT_W(W, GRDATA) ((W)+(GRDATA)->client_off.w)
-#define FRAME_TO_CLIENT_H(H, GRDATA) ((H)+(GRDATA)->client_off.h)
+#define FRAME_TO_CLIENT_H(H, GRDATA, FRAME) \
+                                               
((DRAW_TAB(FRAME))?((H)+(GRDATA)->client_off.h): \
+                                               
((H)+(GRDATA)->client_off.h+(GRDATA)->bar_h+1))
 #define CLIENT_TO_FRAME_W(W, GRDATA) ((W)-(GRDATA)->client_off.w)
-#define CLIENT_TO_FRAME_H(H, GRDATA) ((H)-(GRDATA)->client_off.h)
+#define CLIENT_TO_FRAME_H(H, GRDATA,FRAME) \
+                                               
((DRAW_TAB(FRAME))?((H)-(GRDATA)->client_off.h):(H))
 
 #define CLIENT_X(FRAME, GRDATA) ((GRDATA)->client_off.x)
-#define CLIENT_Y(FRAME, GRDATA) ((GRDATA)->client_off.y)
+#define CLIENT_Y(FRAME, GRDATA) ((DRAW_TAB(FRAME))?((GRDATA)->client_off.y): \
+                                                                                      
            ((GRDATA)->bar_off.y))
 #define CLIENT_W(FRAME, GRDATA) FRAME_TO_CLIENT_W(FRAME_W(FRAME), GRDATA)
-#define CLIENT_H(FRAME, GRDATA) FRAME_TO_CLIENT_H(FRAME_H(FRAME), GRDATA)
+#define CLIENT_H(FRAME, GRDATA) FRAME_TO_CLIENT_H(FRAME_H(FRAME), GRDATA, FRAME)
 
 
 /*}}}*/
@@ -316,8 +320,9 @@
         XSetForeground(wglobal.dpy, XGC, grdata->frame_bgcolor);
         XFillRectangle(wglobal.dpy, WIN, XGC, C_X, C_Y, C_W, C_H);
         */
-       
-       draw_frame_bar(frame, !complete || !grdata->bar_inside_frame);
+
+       if(DRAW_TAB(frame))     
+               draw_frame_bar(frame, !complete || !grdata->bar_inside_frame);
 }
 
 
@@ -329,6 +334,9 @@
        WGRData *grdata=&(scr->grdata);
        WRectangle bg;
        int n;
+
+       if(frame->flags&FRAME_TAB_HIDE)
+               return;
        
        frame_bar_geom(frame, &bg);
        
@@ -850,6 +858,16 @@
        return frame->current_sub;
 }
 
+void frame_toggle_tab(WFrame *frame)
+{
+       if(DRAW_TAB(frame))
+               frame->flags|=FRAME_TAB_HIDE;
+       else
+               frame->flags&=!FRAME_TAB_HIDE;
+       XClearWindow(wglobal.dpy, FRAME_WIN(frame));
+       frame_fit_managed(frame);
+       draw_frame(frame,TRUE);
+}
 
 /*}}}*/
 
@@ -893,18 +911,22 @@
 
 /*{{{ Save/load */
 
+#define WRITE_INTEGER_OPTION(NAME, VALUE) {save_indent_line(file,lvl);fprintf(file, 
"%s %d\n", (NAME), (VALUE));}
 
 static bool frame_save_to_file(WFrame *frame, FILE *file, int lvl)
 {
        begin_saved_region((WRegion*)frame, file, lvl);
-       save_indent_line(file, lvl);
-       fprintf(file, "target_id %d\n", frame->target_id);
+       WRITE_INTEGER_OPTION("target_id", frame->target_id);
+       WRITE_INTEGER_OPTION("flags", frame->flags);
        end_saved_region((WRegion*)frame, file, lvl);
        return TRUE;
 }
 
+#undef WRITE_INTEGER_OPTION
+
 
 static int load_target_id;
+static int load_frame_flags;
 
 
 static bool opt_target_id(Tokenizer *tokz, int n, Token *toks)
@@ -913,9 +935,18 @@
        return TRUE;
 }
 
+static bool opt_frame_flags(Tokenizer *tokz, int n, Token *toks)
+{
+       load_frame_flags=TOK_LONG_VAL(&(toks[1]));
+       /* remove unneeded bits from flags
+          example: load_frame_flags &= (FRAME_TAB_HIDE | FRAME_TAB_DRAGGED); */
+       load_frame_flags &= (FRAME_TAB_HIDE);
+       return TRUE;
+}
 
 static ConfOpt frame_opts[]={
-       {"target_id", "l", opt_target_id, NULL},
+       {"target_id",   "l",    opt_target_id,          NULL},
+       {"flags",               "l",    opt_frame_flags,        NULL},
        END_CONFOPTS
 };
 
@@ -923,11 +954,12 @@
 WRegion *frame_load(WRegion *par, WRectangle geom, Tokenizer *tokz)
 {
        load_target_id=0;
+       load_frame_flags=0;
        
        if(!parse_config_tokz(tokz, frame_opts))
                return NULL;
        
-       return (WRegion*)create_frame(par, geom, load_target_id, 0);
+       return (WRegion*)create_frame(par, geom, load_target_id, load_frame_flags);
 }
 
 
diff -urN ion-devel-20030223/src/frame.h ion-devel-20030223-toggle/src/frame.h
--- ion-devel-20030223/src/frame.h      2003-02-22 22:48:10.000000000 +0100
+++ ion-devel-20030223-toggle/src/frame.h       2003-02-25 20:12:37.000000000 +0100
@@ -28,7 +28,10 @@
 #define FRAME_NO_SAVED_WH -1
 
 #define FRAME_TAB_DRAGGED 0x0001
+#define FRAME_TAB_HIDE    0x0002
 
+#define DRAW_TAB(FRAME) (!((FRAME)->flags&FRAME_TAB_HIDE))
+       
 DECLOBJ(WFrame){
        WWindow win;
        int flags;
@@ -63,6 +66,8 @@
 extern void frame_switch_next(WFrame *frame);
 extern void frame_switch_prev(WFrame *frame);
 
+extern void frame_toggle_tab(WFrame *frame);
+
 extern void frame_attach_sub(WFrame *frame, WRegion *sub, int flags);
 /*extern void frame_detach_sub(WFrame *frame, WRegion *sub);*/
 extern void frame_move_managed(WFrame *dest, WFrame *src);
diff -urN ion-devel-20030223/src/funtabs.c ion-devel-20030223-toggle/src/funtabs.c
--- ion-devel-20030223/src/funtabs.c    2003-02-22 18:40:18.000000000 +0100
+++ ion-devel-20030223-toggle/src/funtabs.c     2003-02-25 21:10:25.000000000 +0100
@@ -133,6 +133,7 @@
        FN(l,   generic, WRegion,       "frame_set_height",             set_height),
        FN(d,   generic, WRegion,       "frame_set_widthq",             set_widthq),
        FN(d,   generic, WRegion,       "frame_set_heightq",    set_heightq),
+       FN_VOID(generic, WRegion,       "frame_toggle_tab",             
frame_toggle_tab),
 
        /* mouse move/resize and tab drag */
        FN_VOID(generic, WFrame,        "frame_p_resize",               
p_resize_setup),

Reply via email to