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;
