/*
* 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 <string.h>
#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) \
#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 */
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;
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;
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){
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("<empty frame>"),
+ textw);
frame->titles[i].text=title;
}
return;
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++;
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)
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);
}
+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));
+ }
+}
+
+
+/*}}}*/
+