On Wed, Mar 12, 2003 at 12:57:19AM +0200, Tuomo Valkonen wrote:

It would be nice if the code would just shrink the tab to zero height instead of adding checks everywhere around the code.

ad zero height) I've temporary changed grdata->bar_h in ionframe_bar_geom. After making all calculations the old value is restored. I think that should keep the code change minimal ad "adding checks everywhere") I think I've added two checks, one in ionframe_draw, and one in ionframe_draw_tab... I can replace them with printfs in the future and check for the occurances of function calls.

I haven't tried
your code, but how does it behave when the bar isn't inside the frame?

damit! good point, I've redone my patch... it behaves good in both cases (bar_inside_frame (shouldn't that be a flag?)) ;).

Andreas
diff -uNr ion-devel-20030311/ioncore/funtabs.c io/ioncore/funtabs.c
--- ion-devel-20030311/ioncore/funtabs.c        2003-03-09 12:17:40.000000000 +0100
+++ io/ioncore/funtabs.c        2003-03-11 23:38:23.000000000 +0100
@@ -86,6 +86,7 @@
        FN_VOID(generic, WGenFrame,     "genframe_p_resize",            
genframe_p_resize_setup),
        FN_VOID(generic, WGenFrame,     "genframe_p_tabdrag",           
genframe_p_tabdrag_setup),
        FN_VOID(generic, WGenFrame,     "genframe_p_switch_tab",        
genframe_switch_tab),
+       FN_VOID(generic, WGenFrame, "genframe_toggle_tab",              
genframe_toggle_tab),
 
        FN_VOID(generic, WGenFrame,     "genframe_move_current_tab_left", 
genframe_move_current_tab_left),
        FN_VOID(generic, WGenFrame,     "genframe_move_current_tab_right", 
genframe_move_current_tab_right),
diff -uNr ion-devel-20030311/ioncore/genframe.c io/ioncore/genframe.c
--- ion-devel-20030311/ioncore/genframe.c       2003-03-10 23:01:36.000000000 +0100
+++ io/ioncore/genframe.c       2003-03-11 23:38:23.000000000 +0100
@@ -638,6 +638,16 @@
        return FALSE;
 }
 
+void genframe_toggle_tab(WGenFrame *genframe)
+{
+       if(genframe->flags&WGENFRAME_TAB_HIDE)
+               genframe->flags&=!WGENFRAME_TAB_HIDE;
+       else
+               genframe->flags|=WGENFRAME_TAB_HIDE;
+       genframe_fit_managed(genframe);
+       genframe_draw(genframe,TRUE);
+}
+
 
 void genframe_draw_config_updated(WGenFrame *genframe)
 {
diff -uNr ion-devel-20030311/ioncore/genframe.h io/ioncore/genframe.h
--- ion-devel-20030311/ioncore/genframe.h       2003-03-09 12:34:14.000000000 +0100
+++ io/ioncore/genframe.h       2003-03-11 23:38:23.000000000 +0100
@@ -22,6 +22,7 @@
 
 #define WGENFRAME_TAB_DRAGGED 0x0001
 #define WGENFRAME_TRANSPARENT 0x0002
+#define WGENFRAME_TAB_HIDE    0x0004
 
 
 DECLOBJ(WGenFrame){
@@ -78,6 +79,7 @@
 extern int genframe_tab_at_x(const WGenFrame *genframe, int x);
 extern void genframe_move_current_tab_right(WGenFrame *genframe);
 extern void genframe_move_current_tab_left(WGenFrame *genframe);
+extern void genframe_toggle_tab(WGenFrame *genframe);
 
 /* Misc */
 extern WRegion *genframe_nth_managed(WGenFrame *genframe, uint n);
diff -uNr ion-devel-20030311/ionws/ionframe.c io/ionws/ionframe.c
--- ion-devel-20030311/ionws/ionframe.c 2003-03-09 12:20:37.000000000 +0100
+++ io/ionws/ionframe.c 2003-03-12 00:13:45.000000000 +0100
@@ -67,11 +67,12 @@
 
 
 static bool init_ionframe(WIonFrame *frame, WWindow *parent, WRectangle geom,
-                                                 int id)
+                                                 int id, int flags)
 {
        if(!init_genframe((WGenFrame*)frame, parent, geom, id))
                return FALSE;
        
+       frame->genframe.flags=flags;
        set_tab_spacing(frame);
        
        region_add_bindmap((WRegion*)frame, &(ionframe_bindmap), TRUE);
@@ -80,15 +81,15 @@
 }
 
 
-WIonFrame *create_ionframe(WWindow *parent, WRectangle geom, int id)
+WIonFrame *create_ionframe(WWindow *parent, WRectangle geom, int id, int flags)
 {
-       CREATETHING_IMPL(WIonFrame, ionframe, (p, parent, geom, id));
+       CREATETHING_IMPL(WIonFrame, ionframe, (p, parent, geom, id, flags));
 }
 
 
 WIonFrame* create_ionframe_simple(WWindow *parent, WRectangle geom)
 {
-       return create_ionframe(parent, geom, 0);
+       return create_ionframe(parent, geom, 0, 0);
 }
 
 
@@ -121,7 +122,7 @@
        geom->w=REGION_GEOM(frame).w;
        geom->h=REGION_GEOM(frame).h;
        
-       if(!grdata->bar_inside_frame){
+       if(!grdata->bar_inside_frame && !(frame->genframe.flags&WGENFRAME_TAB_HIDE)){
                WBorder bd=frame_border(grdata);
                geom->y+=grdata->bar_h+bd.ipad;
                geom->h-=grdata->bar_h+bd.ipad;
@@ -133,6 +134,10 @@
 {
        WGRData *grdata=GRDATA_OF(frame);
        WBorder bd=frame_border(grdata);
+       int temp_h=grdata->bar_h;
+
+       if(frame->genframe.flags&WGENFRAME_TAB_HIDE)
+               grdata->bar_h=0;
        
        if(grdata->bar_inside_frame){
                ionframe_border_geom(frame, geom);
@@ -146,6 +151,7 @@
        }
 
        geom->h=grdata->bar_h;
+       grdata->bar_h=temp_h;
 }
 
 
@@ -159,7 +165,7 @@
        geom->w-=2*grdata->spacing;
        geom->h-=2*grdata->spacing;
        
-       if(grdata->bar_inside_frame){
+       if(grdata->bar_inside_frame && !(frame->genframe.flags&WGENFRAME_TAB_HIDE)){
                geom->y+=grdata->bar_h+grdata->spacing;
                geom->h-=grdata->bar_h+grdata->spacing;
        }
@@ -222,7 +228,7 @@
        WScreen *scr=SCREEN_OF(frame);
        int bar_w, tab_w, textw, n;
        WRegion *sub;
-       
+
        {
                WRectangle geom;
                genframe_bar_geom((WGenFrame*)frame, &geom);
@@ -239,7 +245,7 @@
                }
        }
        
-       if(draw)
+       if(draw && !(frame->genframe.flags&WGENFRAME_TAB_HIDE))
                genframe_draw_bar((WGenFrame*)frame, TRUE);
 }
 
@@ -268,15 +274,19 @@
                XClearWindow(wglobal.dpy, WGENFRAME_WIN(frame));
        
        draw_border_inverted(dinfo, TRUE);
-       
-       genframe_draw_bar((WGenFrame*)frame,
-                                         !complete || !grdata->bar_inside_frame);
+
+       if(!(frame->genframe.flags&WGENFRAME_TAB_HIDE))
+               genframe_draw_bar((WGenFrame*)frame,
+                                               !complete || 
!grdata->bar_inside_frame);
 }
 
 
 void ionframe_draw_bar(const WIonFrame *frame, bool complete)
 {
        WGRData *grdata=GRDATA_OF(frame);
+
+       if(frame->genframe.flags&WGENFRAME_TAB_HIDE)
+               return;
        
        if(complete && !grdata->bar_inside_frame){
                WBorder bd=frame_border(grdata);
@@ -311,17 +321,20 @@
 /*{{{ Save/load */
 
 
+#define WRITE_INTEGER_OPTION(NAME, VALUE) 
{save_indent_line(file,lvl);fprintf(file,"%s %d\n", (NAME), (VALUE));}
 static bool ionframe_save_to_file(WIonFrame *ionframe, FILE *file, int lvl)
 {
        begin_saved_region((WRegion*)ionframe, file, lvl);
-       save_indent_line(file, lvl);
-       fprintf(file, "target_id %d\n", ionframe->genframe.target_id);
+       WRITE_INTEGER_OPTION("target_id", ionframe->genframe.target_id);
+       WRITE_INTEGER_OPTION("flags", ionframe->genframe.flags);
        end_saved_region((WRegion*)ionframe, 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)
@@ -330,9 +343,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 &= (WGENFRAME_TAB_HIDE | WGENFRAME_*); */
+       load_frame_flags &= (WGENFRAME_TAB_HIDE);
+       return TRUE;
+}
 
 static ConfOpt ionframe_opts[]={
-       {"target_id", "l", opt_target_id, NULL},
+       {"target_id",   "l", opt_target_id,     NULL},
+       {"flags",               "l", opt_frame_flags,   NULL},
        END_CONFOPTS
 };
 
@@ -340,11 +362,12 @@
 WRegion *ionframe_load(WWindow *par, WRectangle geom, Tokenizer *tokz)
 {
        load_target_id=0;
+       load_frame_flags=0;
        
        if(!parse_config_tokz(tokz, ionframe_opts))
                return NULL;
        
-       return (WRegion*)create_ionframe(par, geom, load_target_id);
+       return (WRegion*)create_ionframe(par, geom, load_target_id, load_frame_flags);
 }
 
 
diff -uNr ion-devel-20030311/ionws/ionframe.h io/ionws/ionframe.h
--- ion-devel-20030311/ionws/ionframe.h 2003-03-09 12:20:37.000000000 +0100
+++ io/ionws/ionframe.h 2003-03-11 23:38:23.000000000 +0100
@@ -19,7 +19,7 @@
 };
 
 
-extern WIonFrame *create_ionframe(WWindow *parent, WRectangle geom, int id);
+extern WIonFrame *create_ionframe(WWindow *parent, WRectangle geom, int id, int 
flags);
 extern WIonFrame* create_ionframe_simple(WWindow *parent, WRectangle geom);
 extern void ionframe_draw_config_updated(WIonFrame *frame);
 extern void ionframe_draw_bar(const WIonFrame *frame, bool complete);
diff -uNr ion-devel-20030311/ionws/ionws.c io/ionws/ionws.c
--- ion-devel-20030311/ionws/ionws.c    2003-03-11 19:52:06.000000000 +0100
+++ io/ionws/ionws.c    2003-03-11 23:38:23.000000000 +0100
@@ -165,7 +165,7 @@
 {
        WIonFrame *frame;
        
-       frame=create_ionframe(parent, geom, 0);
+       frame=create_ionframe(parent, geom, 0,0);
 
        if(frame==NULL)
                return NULL;

Reply via email to