[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),