/*
* ion/mod_statusbar/statusbar.c
*
- * Copyright (c) Tuomo Valkonen 1999-2006.
+ * Copyright (c) Tuomo Valkonen 1999-2008.
*
- * 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>
#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>
static void do_calc_systray_w(WStatusBar *p, WSBElem *el);
static void statusbar_calc_systray_w(WStatusBar *p);
-
static WStatusBar *statusbars=NULL;
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;
/*{{{ 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;
}
+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);
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;
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);
}
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;
}
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];
}
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,
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);
if(mgr!=NULL)
return region_prepare_manage(mgr, cwin, param,
- MANAGE_REDIR_PREFER_NO);
+ MANAGE_PRIORITY_NONE);
else
return NULL;
}
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);
return;
for(i=0; i<sb->nelems; i++){
+ const char *meter;
+
el=&(sb->elems[i]);
if(el->type!=WSBELEM_METER)
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;
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);
}
}
/*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)
/*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;