X-Git-Url: https://git.decadent.org.uk/gitweb/?p=ion3.git;a=blobdiff_plain;f=ioncore%2Fframe-draw.c;h=fbe58061bafed48a608e1407bbaf4a1aeeda6e52;hp=6c43fc60b3c2df9acb8ba231a0b39484e65a26a6;hb=e3aec18706513a87eaa7839dfdaf7e0fcd0d8d2a;hpb=803afbc1cd633f6c025bcd9537e9b7e9aedadd0d diff --git a/ioncore/frame-draw.c b/ioncore/frame-draw.c index 6c43fc6..fbe5806 100644 --- a/ioncore/frame-draw.c +++ b/ioncore/frame-draw.c @@ -1,12 +1,9 @@ /* * ion/ioncore/frame-draw.c * - * Copyright (c) Tuomo Valkonen 1999-2007. + * Copyright (c) Tuomo Valkonen 1999-2009. * - * Ion is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation; either version 2.1 of the License, or - * (at your option) any later version. + * See the included file LICENSE for details. */ #include @@ -45,8 +42,6 @@ GR_DEFATTR(dragged); GR_DEFATTR(not_dragged); GR_DEFATTR(activity); GR_DEFATTR(no_activity); -GR_DEFATTR(quasiactive); -GR_DEFATTR(not_quasiactive); static void ensure_create_attrs() @@ -62,8 +57,6 @@ static void ensure_create_attrs() GR_ALLOCATTR(not_dragged); GR_ALLOCATTR(no_activity); GR_ALLOCATTR(activity); - GR_ALLOCATTR(quasiactive); - GR_ALLOCATTR(not_quasiactive); GR_ALLOCATTR_END; } @@ -190,6 +183,22 @@ void frame_managed_geom(const WFrame *frame, WRectangle *geom) } +int frame_shaded_height(const WFrame *frame) +{ + if(frame->barmode==FRAME_BAR_NONE){ + return 0; + }else if(!BAR_INSIDE_BORDER(frame)){ + return frame->bar_h; + }else { + GrBorderWidths bdw; + + grbrush_get_border_widths(frame->brush, &bdw); + + return frame->bar_h+bdw.top+bdw.bottom; + } +} + + void frame_set_shape(WFrame *frame) { WRectangle gs[2]; @@ -217,7 +226,7 @@ void frame_clear_shape(WFrame *frame) #define CF_TAB_MAX_TEXT_X_OFF 10 -static void frame_shaped_recalc_bar_size(WFrame *frame) +static void frame_shaped_recalc_bar_size(WFrame *frame, bool complete) { int bar_w=0, textw=0, tmaxw=frame->tab_min_w, tmp=0; WLListIterTmp itmp; @@ -235,7 +244,7 @@ static void frame_shaped_recalc_bar_size(WFrame *frame) if(m>0){ grbrush_get_border_widths(frame->bar_brush, &bdw); - bdtotal=((m-1)*(bdw.tb_ileft+bdw.tb_iright) + bdtotal=((m-1)*(bdw.tb_ileft+bdw.tb_iright+bdw.spacing) +bdw.right+bdw.left); FRAME_MX_FOR_ALL(sub, frame, itmp){ @@ -271,7 +280,7 @@ static void frame_shaped_recalc_bar_size(WFrame *frame) bar_w=frame->bar_max_width_q*REGION_GEOM(frame).w; } - if(frame->bar_w!=bar_w){ + if(complete || frame->bar_w!=bar_w){ frame->bar_w=bar_w; frame_set_shape(frame); } @@ -293,7 +302,7 @@ static int init_title(WFrame *frame, int i) } -void frame_recalc_bar(WFrame *frame) +void frame_recalc_bar(WFrame *frame, bool complete) { int textw, i; WLListIterTmp tmp; @@ -304,7 +313,9 @@ void frame_recalc_bar(WFrame *frame) return; if(frame->barmode==FRAME_BAR_SHAPED) - frame_shaped_recalc_bar_size(frame); + frame_shaped_recalc_bar_size(frame, complete); + else if(complete) + frame_clear_shape(frame); i=0; @@ -321,18 +332,7 @@ void frame_recalc_bar(WFrame *frame) FRAME_MX_FOR_ALL(sub, frame, tmp){ textw=init_title(frame, i); if(textw>0){ - if(frame->flags&FRAME_SHOW_NUMBERS){ - char *s=NULL; - libtu_asprintf(&s, "[%d]", i+1); - if(s!=NULL){ - title=grbrush_make_label(frame->bar_brush, s, textw); - free(s); - }else{ - title=NULL; - } - }else{ - title=region_make_label(sub, textw, frame->bar_brush); - } + title=region_make_label(sub, textw, frame->bar_brush); frame->titles[i].text=title; } i++; @@ -340,19 +340,6 @@ void frame_recalc_bar(WFrame *frame) } -static void set_common_attrs(const WFrame *frame, GrBrush *brush) -{ - ensure_create_attrs(); - - grbrush_set_attr(brush, REGION_IS_ACTIVE(frame) - ? GR_ATTR(active) - : GR_ATTR(inactive)); - grbrush_set_attr(brush, frame->quasiactive_count>0 - ? GR_ATTR(quasiactive) - : GR_ATTR(not_quasiactive)); -} - - void frame_draw_bar(const WFrame *frame, bool complete) { WRectangle geom; @@ -367,7 +354,7 @@ void frame_draw_bar(const WFrame *frame, bool complete) grbrush_begin(frame->bar_brush, &geom, GRBRUSH_AMEND); - set_common_attrs(frame, frame->bar_brush); + grbrush_init_attr(frame->bar_brush, &frame->baseattr); grbrush_draw_textboxes(frame->bar_brush, &geom, frame->titles_n, frame->titles, complete); @@ -386,7 +373,7 @@ void frame_draw(const WFrame *frame, bool complete) grbrush_begin(frame->brush, &geom, (complete ? 0 : GRBRUSH_NO_CLEAR_OK)); - set_common_attrs(frame, frame->brush); + grbrush_init_attr(frame->brush, &frame->baseattr); grbrush_draw_border(frame->brush, &geom); @@ -398,19 +385,21 @@ void frame_draw(const WFrame *frame, bool complete) void frame_brushes_updated(WFrame *frame) { - WFrameBarMode barmode=FRAME_BAR_INSIDE; + WFrameBarMode barmode; ExtlTab tab; char *s; if(frame->brush==NULL) return; - if(frame->mode==FRAME_MODE_FLOATING) + if(frame->mode==FRAME_MODE_FLOATING){ barmode=FRAME_BAR_SHAPED; - else if(frame->mode==FRAME_MODE_TRANSIENT) - barmode=FRAME_BAR_NONE; - else if(frame->mode==FRAME_MODE_TILED_ALT) + }else if(frame->mode==FRAME_MODE_TILED || frame->mode==FRAME_MODE_UNKNOWN || + frame->mode==FRAME_MODE_TRANSIENT_ALT){ + barmode=FRAME_BAR_INSIDE; + }else{ barmode=FRAME_BAR_NONE; + } if(grbrush_get_extra(frame->brush, "bar", 's', &s)){ if(strcmp(s, "inside")==0) @@ -472,16 +461,20 @@ void frame_updategr(WFrame *frame) region_updategr_default((WRegion*)frame); mplex_fit_managed(&frame->mplex); - frame_recalc_bar(frame); + frame_recalc_bar(frame, TRUE); frame_set_background(frame, TRUE); } -StringIntMap frame_tab_styles[]={ +static StringIntMap frame_tab_styles[]={ + {"tab-frame-unknown", FRAME_MODE_UNKNOWN}, + {"tab-frame-unknown-alt", FRAME_MODE_UNKNOWN_ALT}, {"tab-frame-tiled", FRAME_MODE_TILED}, {"tab-frame-tiled-alt", FRAME_MODE_TILED_ALT}, {"tab-frame-floating", FRAME_MODE_FLOATING}, + {"tab-frame-floating-alt", FRAME_MODE_FLOATING_ALT}, {"tab-frame-transient", FRAME_MODE_TRANSIENT}, + {"tab-frame-transient-alt", FRAME_MODE_TRANSIENT_ALT}, END_STRINGINTMAP }; @@ -564,14 +557,36 @@ bool frame_set_background(WFrame *frame, bool set_always) void frame_setup_dragwin_style(WFrame *frame, GrStyleSpec *spec, int tab) { + gr_stylespec_append(spec, &frame->baseattr); gr_stylespec_append(spec, &frame->titles[tab].attr); +} + + +/*}}}*/ + + +/*{{{ Activated/inactivated */ + + +void frame_inactivated(WFrame *frame) +{ + ensure_create_attrs(); + + gr_stylespec_set(&frame->baseattr, GR_ATTR(inactive)); + gr_stylespec_unset(&frame->baseattr, GR_ATTR(active)); + + window_draw((WWindow*)frame, FALSE); +} + + +void frame_activated(WFrame *frame) +{ + ensure_create_attrs(); + + gr_stylespec_set(&frame->baseattr, GR_ATTR(active)); + gr_stylespec_unset(&frame->baseattr, GR_ATTR(inactive)); - gr_stylespec_set(spec, REGION_IS_ACTIVE(frame) - ? GR_ATTR(active) - : GR_ATTR(inactive)); - gr_stylespec_set(spec, frame->quasiactive_count>0 - ? GR_ATTR(quasiactive) - : GR_ATTR(not_quasiactive)); + window_draw((WWindow*)frame, FALSE); }