]> git.decadent.org.uk Git - ion3.git/blobdiff - mod_statusbar/statusbar.c
Imported Upstream version 20090110
[ion3.git] / mod_statusbar / statusbar.c
index 1568b9fcf5c354b7316c2bd8ab023008da288c27..06fa6973bc3a889df6f1c2c4ff61e0c62c7cf67c 100644 (file)
@@ -1,15 +1,13 @@
 /*
  * ion/mod_statusbar/statusbar.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2006
+ * 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 <string.h>
+#include <limits.h>
 
 #include <libtu/objp.h>
 #include <libtu/minmax.h>
@@ -23,6 +21,7 @@
 #include <ioncore/event.h>
 #include <ioncore/resize.h>
 #include <ioncore/gr.h>
+#include <ioncore/gr-util.h>
 #include <ioncore/names.h>
 #include <ioncore/strings.h>
 #include <ioncore/basicpholder.h>
@@ -42,7 +41,6 @@ static void statusbar_rearrange(WStatusBar *sb, bool rs);
 static void do_calc_systray_w(WStatusBar *p, WSBElem *el);
 static void statusbar_calc_systray_w(WStatusBar *p);
 
-
 static WStatusBar *statusbars=NULL;
 
 
@@ -78,8 +76,6 @@ bool statusbar_init(WStatusBar *p, WWindow *parent, const WFitParams *fp)
 
     region_add_bindmap((WRegion*)p, mod_statusbar_statusbar_bindmap);
     
-    ((WRegion*)p)->flags|=REGION_SKIP_FOCUS;
-
     LINK_ITEM(statusbars, p, sb_next, sb_prev);
     
     return TRUE;
@@ -113,15 +109,16 @@ void statusbar_deinit(WStatusBar *p)
 
 /*{{{ Content stuff */
 
+
 static void init_sbelem(WSBElem *el)
 {
     el->type=WSBELEM_NONE;
-    el->meter=NULL;
     el->text_w=0;
     el->text=NULL;
     el->max_w=0;
     el->tmpl=NULL;
-    el->attr=NULL;
+    el->meter=STRINGID_NONE;
+    el->attr=STRINGID_NONE;
     el->stretch=0;
     el->align=WSBELEM_ALIGN_CENTER;
     el->zeropad=0;
@@ -130,6 +127,20 @@ static void init_sbelem(WSBElem *el)
 }
 
 
+static bool gets_stringstore(ExtlTab t, const char *str, StringId *id)
+{
+    char *s;
+    
+    if(extl_table_gets_s(t, str, &s)){
+        *id=stringstore_alloc(s);
+        free(s);
+        return (*id!=STRINGID_NONE);
+    }
+    
+    return FALSE;
+}
+
+    
 static WSBElem *get_sbelems(ExtlTab t, int *nret, int *filleridxret)
 {
     int i, n=extl_table_get_n(t);
@@ -157,15 +168,20 @@ static WSBElem *get_sbelems(ExtlTab t, int *nret, int *filleridxret)
                 if(el[i].type==WSBELEM_TEXT || el[i].type==WSBELEM_STRETCH){
                     extl_table_gets_s(tt, "text", &(el[i].text));
                 }else if(el[i].type==WSBELEM_METER){
-                    extl_table_gets_s(tt, "meter", &(el[i].meter));
+                    gets_stringstore(tt, "meter", &(el[i].meter));
                     extl_table_gets_s(tt, "tmpl", &(el[i].tmpl));
                     extl_table_gets_i(tt, "align", &(el[i].align));
                     extl_table_gets_i(tt, "zeropad", &(el[i].zeropad));
                     el[i].zeropad=maxof(el[i].zeropad, 0);
                 }else if(el[i].type==WSBELEM_SYSTRAY){
-                    extl_table_gets_s(tt, "meter", &(el[i].meter));
+                    const char *tmp;
+                    
+                    gets_stringstore(tt, "meter", &(el[i].meter));
                     extl_table_gets_i(tt, "align", &(el[i].align));
-                    if(el[i].meter==NULL || strcmp(el[i].meter, "systray")==0)
+                    
+                    tmp=stringstore_get(el[i].meter);
+                    
+                    if(tmp==NULL || strcmp(tmp, "systray")==0)
                         systrayidx=i;
                 }else if(el[i].type==WSBELEM_FILLER){
                     *filleridxret=i;
@@ -198,12 +214,12 @@ static void free_sbelems(WSBElem *el, int n)
     for(i=0; i<n; i++){
         if(el[i].text!=NULL)
             free(el[i].text);
-        if(el[i].meter!=NULL)
-            free(el[i].meter);
         if(el[i].tmpl!=NULL)
             free(el[i].tmpl);
-        if(el[i].attr!=NULL)
-            free(el[i].attr);
+        if(el[i].meter!=STRINGID_NONE)
+            stringstore_free(el[i].meter);
+        if(el[i].attr!=STRINGID_NONE)
+            stringstore_free(el[i].attr);
         if(el[i].traywins!=NULL)
             ptrlist_clear(&el[i].traywins);
     }
@@ -332,7 +348,7 @@ void statusbar_size_hints(WStatusBar *p, WSizeHints *h)
     h->min_height=p->natural_h;
     
     h->max_set=TRUE;
-    h->max_width=p->natural_w;
+    h->max_width=INT_MAX;/*p->natural_w;*/
     h->max_height=p->natural_h;
 }
 
@@ -354,17 +370,22 @@ static WSBElem *statusbar_associate_systray(WStatusBar *sb, WRegion *reg)
         extl_table_gets_s(cwin->proptab, "statusbar", &name);
     
     for(i=0; i<sb->nelems; i++){
+        const char *meter;
+        
         if(sb->elems[i].type!=WSBELEM_SYSTRAY)
             continue;
-        if(sb->elems[i].meter==NULL){
+        
+        meter=stringstore_get(sb->elems[i].meter);
+        
+        if(meter==NULL){
             fbel=&sb->elems[i];
             continue;
         }
-        if(name!=NULL && strcmp(sb->elems[i].meter, name)==0){
+        if(name!=NULL && strcmp(meter, name)==0){
             el=&sb->elems[i];
             break;
         }
-        if(strcmp(sb->elems[i].meter, "systray")==0)
+        if(strcmp(meter, "systray")==0)
             fbel=&sb->elems[i];
     }
     
@@ -527,9 +548,9 @@ static WRegion *statusbar_attach_ph(WStatusBar *sb, int flags,
 static WPHolder *statusbar_prepare_manage(WStatusBar *sb, 
                                           const WClientWin *cwin,
                                           const WManageParams *param,
-                                          int redir)
+                                          int priority)
 {
-    if(redir==MANAGE_REDIR_STRICT_YES)
+    if(!MANAGE_PRIORITY_OK(priority, MANAGE_PRIORITY_LOW))
         return NULL;
     
     return (WPHolder*)create_basicpholder((WRegion*)sb, 
@@ -614,7 +635,8 @@ bool statusbar_fitrep(WStatusBar *sb, WWindow *par, const WFitParams *fp)
     bool wchg=(REGION_GEOM(sb).w!=fp->g.w);
     bool hchg=(REGION_GEOM(sb).h!=fp->g.h);
     
-    window_do_fitrep(&(sb->wwin), par, &(fp->g));
+    if(!window_fitrep(&(sb->wwin), par, fp))
+        return FALSE;
     
     if(wchg || hchg){
         statusbar_calculate_xs(sb);
@@ -638,7 +660,7 @@ WPHolder *statusbar_prepare_manage_transient(WStatusBar *sb,
     
     if(mgr!=NULL)
         return region_prepare_manage(mgr, cwin, param, 
-                                     MANAGE_REDIR_PREFER_NO);
+                                     MANAGE_PRIORITY_NONE);
     else
         return NULL;
 }
@@ -721,7 +743,7 @@ ExtlTab statusbar_get_template_table(WStatusBar *sb)
         
         extl_table_sets_i(tt, "type", sb->elems[i].type);
         extl_table_sets_s(tt, "text", sb->elems[i].text);
-        extl_table_sets_s(tt, "meter", sb->elems[i].meter);
+        extl_table_sets_s(tt, "meter", stringstore_get(sb->elems[i].meter));
         extl_table_sets_s(tt, "tmpl", sb->elems[i].tmpl);
         extl_table_sets_i(tt, "align", sb->elems[i].align);
         extl_table_sets_i(tt, "zeropad", sb->elems[i].zeropad);
@@ -844,6 +866,8 @@ void statusbar_update(WStatusBar *sb, ExtlTab t)
         return;
     
     for(i=0; i<sb->nelems; i++){
+        const char *meter;
+        
         el=&(sb->elems[i]);
         
         if(el->type!=WSBELEM_METER)
@@ -854,16 +878,18 @@ void statusbar_update(WStatusBar *sb, ExtlTab t)
             el->text=NULL;
         }
 
-        if(el->attr!=NULL){
-            free(el->attr);
-            el->attr=NULL;
+        if(el->attr!=GRATTR_NONE){
+            stringstore_free(el->attr);
+            el->attr=GRATTR_NONE;
         }
         
-        if(el->meter!=NULL){
+        meter=stringstore_get(el->meter);
+        
+        if(meter!=NULL){
             const char *str;
             char *attrnm;
             
-            extl_table_gets_s(t, el->meter, &(el->text));
+            extl_table_gets_s(t, meter, &(el->text));
             
             if(el->text==NULL){
                 str=STATUSBAR_NX_STR;
@@ -900,9 +926,13 @@ void statusbar_update(WStatusBar *sb, ExtlTab t)
                 grow=TRUE;
             }
             
-            attrnm=scat(el->meter, "_hint");
+            attrnm=scat(meter, "_hint");
             if(attrnm!=NULL){
-                extl_table_gets_s(t, attrnm, &(el->attr));
+                char *s;
+                if(extl_table_gets_s(t, attrnm, &s)){
+                    el->attr=stringstore_alloc(s);
+                    free(s);
+                }
                 free(attrnm);
             }
         }
@@ -1004,7 +1034,8 @@ bool statusbar_set_systray(WStatusBar *sb, int sp)
 
 /*EXTL_DOC
  * Enable or disable use of \var{sb} as systray.
- * The parameter \var{how} can be one of (set/unset/toggle). 
+ * The parameter \var{how} can be one of 
+ * \codestr{set}, \codestr{unset}, or \codestr{toggle}.
  * Resulting state is returned.
  */
 EXTL_EXPORT_AS(WStatusBar, set_systray)
@@ -1017,7 +1048,7 @@ bool statusbar_set_systray_extl(WStatusBar *sb, const char *how)
 /*EXTL_DOC
  * Is \var{sb} used as a systray?
  */
-EXTL_EXPORT_MEMBER
+EXTL_EXPORT_AS(WStatusBar, is_systray)
 bool statusbar_is_systray_extl(WStatusBar *sb)
 {
     return sb->systray_enabled;