]> git.decadent.org.uk Git - ion3.git/blobdiff - ioncore/frame-draw.c
[svn-upgrade] Integrating new upstream version, ion3 (20070506)
[ion3.git] / ioncore / frame-draw.c
index 116f10cff63759050ff4e1e55cdcd1d24c3f68ee..0b3411a85b1e4e44407f89efe0a74faf909e667b 100644 (file)
@@ -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 <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&REGION_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("<empty frame>"), 
+                                     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));
+    }
+}
+
+
+/*}}}*/
+