X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=ioncore%2Fframe-draw.c;h=0b3411a85b1e4e44407f89efe0a74faf909e667b;hb=ae4260bb64817c11f9a7140324cd3e3ba113e297;hp=116f10cff63759050ff4e1e55cdcd1d24c3f68ee;hpb=8366314611bf30a0f31d25bf5f5023186fa87692;p=ion3.git diff --git a/ioncore/frame-draw.c b/ioncore/frame-draw.c index 116f10c..0b3411a 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-2006. + * Copyright (c) Tuomo Valkonen 1999-2007. * - * 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 @@ -20,8 +17,10 @@ #include "framep.h" #include "frame-draw.h" #include "strings.h" +#include "activity.h" #include "names.h" #include "gr.h" +#include "gr-util.h" #define BAR_INSIDE_BORDER(FRAME) \ @@ -30,6 +29,72 @@ #define BAR_H(FRAME) (FRAME)->bar_h +/*{{{ Attributes */ + + +GR_DEFATTR(active); +GR_DEFATTR(inactive); +GR_DEFATTR(selected); +GR_DEFATTR(unselected); +GR_DEFATTR(tagged); +GR_DEFATTR(not_tagged); +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() +{ + GR_ALLOCATTR_BEGIN; + GR_ALLOCATTR(active); + GR_ALLOCATTR(inactive); + GR_ALLOCATTR(selected); + GR_ALLOCATTR(unselected); + GR_ALLOCATTR(tagged); + GR_ALLOCATTR(not_tagged); + GR_ALLOCATTR(dragged); + GR_ALLOCATTR(not_dragged); + GR_ALLOCATTR(no_activity); + GR_ALLOCATTR(activity); + GR_ALLOCATTR(quasiactive); + GR_ALLOCATTR(not_quasiactive); + GR_ALLOCATTR_END; +} + + +void frame_update_attr(WFrame *frame, int i, WRegion *reg) +{ + GrStyleSpec *spec; + bool selected, tagged, dragged, activity; + + if(i>=frame->titles_n){ + /* Might happen when deinitialising */ + return; + } + + ensure_create_attrs(); + + spec=&frame->titles[i].attr; + + selected=(reg==FRAME_CURRENT(frame)); + tagged=(reg!=NULL && reg->flags®ION_TAGGED); + dragged=(i==frame->tab_dragged_idx); + activity=(reg!=NULL && region_is_activity_r(reg)); + + gr_stylespec_unalloc(spec); + gr_stylespec_set(spec, selected ? GR_ATTR(selected) : GR_ATTR(unselected)); + gr_stylespec_set(spec, tagged ? GR_ATTR(tagged) : GR_ATTR(not_tagged)); + gr_stylespec_set(spec, dragged ? GR_ATTR(dragged) : GR_ATTR(not_dragged)); + gr_stylespec_set(spec, activity ? GR_ATTR(activity) : GR_ATTR(no_activity)); +} + + +/*}}}*/ + + /*{{{ (WFrame) dynfun default implementations */ @@ -82,7 +147,7 @@ void frame_bar_geom(const WFrame *frame, WRectangle *geom) uint off; if(BAR_INSIDE_BORDER(frame)){ - off=get_spacing(frame); + off=0; /*get_spacing(frame);*/ frame_border_inner_geom(frame, geom); }else{ off=0; @@ -105,10 +170,12 @@ void frame_managed_geom(const WFrame *frame, WRectangle *geom) frame_border_inner_geom(frame, geom); + /* geom->x+=spacing; geom->y+=spacing; geom->w-=2*spacing; geom->h-=2*spacing; + */ if(BAR_INSIDE_BORDER(frame) && BAR_EXISTS(frame)){ geom->y+=frame->bar_h+spacing; @@ -165,7 +232,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){ @@ -241,7 +308,8 @@ void frame_recalc_bar(WFrame *frame) if(FRAME_MCOUNT(frame)==0){ textw=init_title(frame, i); if(textw>0){ - title=grbrush_make_label(frame->bar_brush, CF_STR_EMPTY, textw); + title=grbrush_make_label(frame->bar_brush, TR(""), + textw); frame->titles[i].text=title; } return; @@ -250,18 +318,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++; @@ -272,8 +329,6 @@ void frame_recalc_bar(WFrame *frame) void frame_draw_bar(const WFrame *frame, bool complete) { WRectangle geom; - const char *cattr=(REGION_IS_ACTIVE(frame) - ? "active" : "inactive"); if(frame->bar_brush==NULL || !BAR_EXISTS(frame) @@ -285,27 +340,29 @@ void frame_draw_bar(const WFrame *frame, bool complete) grbrush_begin(frame->bar_brush, &geom, GRBRUSH_AMEND); + grbrush_init_attr(frame->bar_brush, &frame->baseattr); + grbrush_draw_textboxes(frame->bar_brush, &geom, frame->titles_n, - frame->titles, complete, cattr); + frame->titles, complete); grbrush_end(frame->bar_brush); } - void frame_draw(const WFrame *frame, bool complete) { WRectangle geom; - const char *attr=(REGION_IS_ACTIVE(frame) - ? "active" : "inactive"); if(frame->brush==NULL) return; - + frame_border_geom(frame, &geom); grbrush_begin(frame->brush, &geom, (complete ? 0 : GRBRUSH_NO_CLEAR_OK)); - grbrush_draw_border(frame->brush, &geom, attr); + grbrush_init_attr(frame->brush, &frame->baseattr); + + grbrush_draw_border(frame->brush, &geom); + frame_draw_bar(frame, TRUE); grbrush_end(frame->brush); @@ -478,4 +535,56 @@ 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)); + + window_draw((WWindow*)frame, FALSE); +} + + +void frame_quasiactivity_change(WFrame *frame) +{ + bool is=(frame->quasiact_source!=NULL); + + ensure_create_attrs(); + + if(is){ + gr_stylespec_set(&frame->baseattr, GR_ATTR(quasiactive)); + gr_stylespec_unset(&frame->baseattr, GR_ATTR(not_quasiactive)); + }else{ + gr_stylespec_set(&frame->baseattr, GR_ATTR(not_quasiactive)); + gr_stylespec_unset(&frame->baseattr, GR_ATTR(quasiactive)); + } +} + + +/*}}}*/ +