/*EXTL_DOC * Modify a window property. The \var{mode} is one of * \codestr{replace}, \codestr{prepend} or \codestr{append}, and format * is either 8, 16 or 32. Also see \fnref{ioncore.x_get_window_property} * and the \code{XChangeProperty}(3) manual page. */ EXTL_EXPORT void ioncore_x_change_property(int win, int atom, int atom_type, int format, const char *mode, ExtlTab tab) { int tmp, m, i, n=extl_table_get_n(tab); uchar *p; if(n<0 || !get_mode(mode, &m)){ warn(TR("Invalid arguments.")); return; } switch(format){ case 8: GET(char); break; case 16: GET(short); break; case 32: GET(long); break; default: warn(TR("Invalid arguments.")); return; } XChangeProperty(ioncore_g.dpy, win, atom, atom_type, format, m, p, n); free(p); }
static void calc_entry_dimens(WMenu *menu) { int i, n=extl_table_get_n(menu->tab); GrFontExtents fnte; GrBorderWidths bdw; int maxw=0; char *str; #if 0 if(extl_table_gets_s(menu->tab, title, &str)){ maxw=grbrush_get_text_width(title_brush, str, strlen(str)); free(str); } #endif for(i=1; i<=n; i++){ if(extl_table_getis(menu->tab, i, "name", 's', &str)){ int w=grbrush_get_text_width(menu->entry_brush, str, strlen(str)); if(w>maxw) maxw=w; free(str); } } grbrush_get_border_widths(menu->entry_brush, &bdw); grbrush_get_font_extents(menu->entry_brush, &fnte); menu->max_entry_w=maxw+bdw.left+bdw.right; menu->entry_h=fnte.max_height+bdw.top+bdw.bottom; menu->entry_spacing=bdw.spacing; }
static WMenuEntry *preprocess_menu(ExtlTab tab, int *n_entries) { WMenuEntry *entries; ExtlTab entry; int i, n; n=extl_table_get_n(tab); *n_entries=n; if(n<=0) return NULL; entries=ALLOC_N(WMenuEntry, n); if(entries==NULL) return NULL; init_attr(); /* Initialise entries and check submenus */ for(i=1; i<=n; i++){ WMenuEntry *ent=&entries[i-1]; ent->title=NULL; ent->flags=0; gr_stylespec_init(&ent->attr); if(extl_table_geti_t(tab, i, &entry)){ char *attr; ExtlTab sub; ExtlFn fn; if(extl_table_gets_s(entry, "attr", &attr)){ gr_stylespec_load_(&ent->attr, attr, TRUE); free(attr); } if(extl_table_gets_f(entry, "submenu_fn", &fn)){ ent->flags|=WMENUENTRY_SUBMENU; extl_unref_fn(fn); }else if(extl_table_gets_t(entry, "submenu", &sub)){ ent->flags|=WMENUENTRY_SUBMENU; extl_unref_table(sub); } if(ent->flags&WMENUENTRY_SUBMENU) gr_stylespec_set(&ent->attr, GR_ATTR(submenu)); extl_unref_table(entry); } } return entries; }
void de_get_extra_cgrps(WRootWin *rootwin, DEStyle *style, ExtlTab tab) { uint i=0, nfailed=0, n=extl_table_get_n(tab); char *name; ExtlTab sub; if(n==0) return; style->extra_cgrps=ALLOC_N(DEColourGroup, n); if(style->extra_cgrps==NULL) return; for(i=0; i<n-nfailed; i++){ GrStyleSpec spec; if(!extl_table_geti_t(tab, i+1, &sub)) goto err; if(!get_spec(sub, "substyle_pattern", &spec, NULL)){ extl_unref_table(sub); goto err; } style->extra_cgrps[i-nfailed].spec=spec; de_get_colour_group(rootwin, style->extra_cgrps+i-nfailed, sub, style); extl_unref_table(sub); continue; err: warn(TR("Corrupt substyle table %d."), i); nfailed++; } if(n-nfailed==0){ free(style->extra_cgrps); style->extra_cgrps=NULL; } style->n_extra_cgrps=n-nfailed; }
static void load_history() { ExtlTab tab; int i, n; if(!extl_read_savefile("saved_queryhist", &tab)) return; n=extl_table_get_n(tab); for(i=n; i>=1; i--){ char *s=NULL; if(extl_table_geti_s(tab, i, &s)){ mod_query_history_push(s); free(s); } } extl_unref_table(tab); }
/*EXTL_DOC * Set a text property for a window. The fields of \var{tab} starting from * 1 should be the different null-separated parts of the property. * See the \code{XSetTextProperty}(3) manual page for more information. */ EXTL_EXPORT void ioncore_x_set_text_property(int win, int atom, ExtlTab tab) { char **list; int i, n=extl_table_get_n(tab); list=ALLOC_N(char*, n); if(list==NULL) return; for(i=0; i<n; i++){ list[i]=NULL; extl_table_geti_s(tab, i+1, &(list[i])); } xwindow_set_text_property(win, atom, (const char **)list, n); XFreeStringList(list); }