WStacking *stacking_unweave(WStacking **stacking, WStackingFilter *filt, void *filt_data) { WStacking *np=NULL; WStacking *st, *next; for(st=*stacking; st!=NULL; st=st->next){ st->to_unweave=2; if(st->above==NULL && cf(filt, filt_data, st)) st->to_unweave=1; } for(st=*stacking; st!=NULL; st=st->next) check_unweave(st); for(st=*stacking; st!=NULL; st=next){ next=st->next; if(st->to_unweave==1){ UNLINK_ITEM(*stacking, st, next, prev); LINK_ITEM(np, st, next, prev); } } return np; }
bool gr_register_engine(const char *engine, GrGetBrushFn *fn) { GrEngine *eng; if(engine==NULL || fn==NULL) return FALSE; eng=ALLOC(GrEngine); if(eng==NULL) return FALSE; eng->name=scopy(engine); if(eng->name==NULL){ free(eng); return FALSE; } eng->fn=fn; LINK_ITEM(engines, eng, next, prev); return TRUE; }
static bool dock_init(WDock *dock, WWindow *parent, const WFitParams *fp) { WFitParams fp2=*fp; dock->pos=dock_param_pos.dflt; dock->grow=dock_param_grow.dflt; dock->is_auto=dock_param_is_auto.dflt; dock->brush=NULL; dock->dockapps=NULL; dock->min_w=1; dock->min_h=1; dock->max_w=1; dock->max_h=1; dock->arrange_called=FALSE; dock->save=TRUE; if(!window_init((WWindow*)dock, parent, &fp2, "WDock")) return FALSE; region_add_bindmap((WRegion*)dock, dock_bindmap); window_select_input(&(dock->win), IONCORE_EVENTMASK_CWINMGR); dock_brush_get(dock); LINK_ITEM(docks, dock, dock_next, dock_prev); return TRUE; }
DEFont *de_load_font(const char *fontname) { DEFont *fnt; XFontSet fontset=NULL; XFontStruct *fontstruct=NULL; assert(fontname!=NULL); /* There shouldn't be that many fonts... */ for(fnt=fonts; fnt!=NULL; fnt=fnt->next){ if(strcmp(fnt->pattern, fontname)==0){ fnt->refcount++; return fnt; } } if(ioncore_g.use_mb && !(ioncore_g.enc_utf8 && iso10646_font(fontname))){ fontset=de_create_font_set(fontname); if(fontset!=NULL){ if(XContextDependentDrawing(fontset)){ warn(TR("Fontset for font pattern '%s' implements context " "dependent drawing, which is unsupported. Expect " "clutter."), fontname); } } }else{ fontstruct=XLoadQueryFont(ioncore_g.dpy, fontname); } if(fontstruct==NULL && fontset==NULL){ if(strcmp(fontname, CF_FALLBACK_FONT_NAME)!=0){ DEFont *fnt; warn(TR("Could not load font \"%s\", trying \"%s\""), fontname, CF_FALLBACK_FONT_NAME); fnt=de_load_font(CF_FALLBACK_FONT_NAME); if(fnt==NULL) warn(TR("Failed to load fallback font.")); return fnt; } return NULL; } fnt=ALLOC(DEFont); if(fnt==NULL) return NULL; fnt->fontset=fontset; fnt->fontstruct=fontstruct; fnt->pattern=scopy(fontname); fnt->next=NULL; fnt->prev=NULL; fnt->refcount=1; LINK_ITEM(fonts, fnt, next, prev); return fnt; }
bool register_menudata(WMenuData *menudata) { LINK_ITEM(menudata_list, menudata, menudata_next, menudata_prev); if(menudata->flags&WMENUDATA_USER) menudata->exec_func=user_menudata_exec_func; return TRUE; }
static bool dock_do_attach_final(WDock *dock, WRegion *reg, void *UNUSED(unused)) { WDockApp *dockapp, *before_dockapp; WRectangle geom; bool draw_border=TRUE; int pos=INT_MAX; /* Create and initialise a new WDockApp struct */ dockapp=ALLOC(WDockApp); if(dockapp==NULL) return FALSE; if(OBJ_IS(reg, WClientWin)){ ExtlTab proptab=((WClientWin*)reg)->proptab; extl_table_gets_b(proptab, CLIENTWIN_WINPROP_BORDER, &draw_border); extl_table_gets_i(proptab, CLIENTWIN_WINPROP_POSITION, &pos); } dockapp->reg=reg; dockapp->draw_border=draw_border; dockapp->pos=pos; dockapp->tile=FALSE; /* Insert the dockapp at the correct relative position */ before_dockapp=dock->dockapps; for(before_dockapp=dock->dockapps; before_dockapp!=NULL && dockapp->pos>=before_dockapp->pos; before_dockapp=before_dockapp->next){ } if(before_dockapp!=NULL){ LINK_ITEM_BEFORE(dock->dockapps, before_dockapp, dockapp, next, prev); }else{ LINK_ITEM(dock->dockapps, dockapp, next, prev); } region_set_manager(reg, (WRegion*)dock); geom=REGION_GEOM(reg); dock_managed_rqgeom_(dock, reg, REGION_RQGEOM_WEAK_X|REGION_RQGEOM_WEAK_Y, &geom, NULL, FALSE); region_map(reg); return TRUE; }
bool ioncore_register_regclass(ClassDescr *descr, WRegionLoadCreateFn *lc_fn) { WRegClassInfo *info; if(descr==NULL) return FALSE; info=ALLOC(WRegClassInfo); if(info==NULL) return FALSE; info->descr=descr; info->lc_fn=lc_fn; LINK_ITEM(reg_class_infos, info, next, prev); return TRUE; }
/*EXTL_DOC * Add a rule describing how too long titles should be shortened to fit in tabs. * The regular expression \var{rx} (POSIX, not Lua!) is used to match titles * and when \var{rx} matches, \var{rule} is attempted to use as a replacement * for title. If \var{always} is set, the rule is used even if no shortening * is necessary. * * Similarly to sed's 's' command, \var{rule} may contain characters that are * inserted in the resulting string and specials as follows: * * \begin{tabularx}{\linewidth}{lX} * \tabhead{Special & Description} * \$0 & Place the original string here. \\ * \$1 to \$9 & Insert n:th capture here (as usual,captures are surrounded * by parentheses in the regex). \\ * \$| & Alternative shortening separator. The shortening described * before the first this kind of separator is tried first and * if it fails to make the string short enough, the next is * tried, and so on. \\ * \$< & Remove characters on the left of this marker to shorten the * string. \\ * \$> & Remove characters on the right of this marker to shorten the * string. Only the first \$< or \$> within an alternative * shortening is used. \\ * \end{tabularx} */ EXTL_EXPORT bool ioncore_defshortening(const char *rx, const char *rule, bool always) { SR *si; int ret; #define ERRBUF_SIZE 256 static char errbuf[ERRBUF_SIZE]; if(rx==NULL || rule==NULL) return FALSE; si=ALLOC(SR); if(si==NULL) return FALSE; ret=regcomp(&(si->re), rx, REG_EXTENDED); if(ret!=0){ errbuf[0]='\0'; regerror(ret, &(si->re), errbuf, ERRBUF_SIZE); warn(TR("Error compiling regular expression: %s"), errbuf); goto fail2; } si->rule=scopy(rule); si->always=always; if(si->rule==NULL) goto fail; LINK_ITEM(shortenrules, si, next, prev); return TRUE; fail: regfree(&(si->re)); fail2: free(si); return FALSE; }
void link_thing(WThing *parent, WThing *thing) { LINK_ITEM(parent->t_children, thing, t_next, t_prev); thing->t_parent=parent; }
DEFont *de_load_font(const char *fontname) { DEFont *fnt; const char *default_fontname=de_default_fontname(); #ifdef HAVE_X11_XFT XftFont *font=NULL; #endif #ifdef HAVE_X11_BMF XFontSet fontset=NULL; XFontStruct *fontstruct=NULL; #endif assert(fontname!=NULL); /* There shouldn't be that many fonts... */ for(fnt=fonts; fnt!=NULL; fnt=fnt->next){ if(strcmp(fnt->pattern, fontname)==0){ fnt->refcount++; return fnt; } } #ifdef HAVE_X11_XFT LOG(DEBUG, FONT, "Loading font %s via XFT", fontname); if(strncmp(fontname, "xft:", 4)==0){ font=XftFontOpenName(ioncore_g.dpy, DefaultScreen(ioncore_g.dpy), fontname+4); }else{ #ifdef HAVE_X11_BMF goto bitmap_font; #else font=XftFontOpenXlfd(ioncore_g.dpy, DefaultScreen(ioncore_g.dpy), fontname); #endif } if(font==NULL){ if(strcmp(fontname, default_fontname)!=0){ warn(TR("Could not load font \"%s\", trying \"%s\""), fontname, default_fontname); fnt=de_load_font(default_fontname); if(fnt==NULL) LOG(WARN, FONT, TR("Failed to load fallback font.")); return fnt; } return NULL; }else{ FcPatternPrint(font->pattern); } #endif /* HAVE_X11_XFT */ #ifdef HAVE_X11_BMF #ifdef HAVE_X11_XFT bitmap_font: #endif if(ioncore_g.use_mb && !(ioncore_g.enc_utf8 && iso10646_font(fontname))){ LOG(DEBUG, FONT, "Loading fontset %s", fontname); fontset=de_create_font_set(fontname); if(fontset!=NULL){ if(XContextDependentDrawing(fontset)){ warn(TR("Fontset for font pattern '%s' implements context " "dependent drawing, which is unsupported. Expect " "clutter."), fontname); } } }else{ LOG(DEBUG, FONT, "Loading fontstruct %s", fontname); fontstruct=XLoadQueryFont(ioncore_g.dpy, fontname); } if(fontstruct==NULL && fontset==NULL){ if(strcmp(fontname, default_fontname)!=0){ DEFont *fnt; LOG(WARN, FONT, TR("Could not load font \"%s\", trying \"%s\""), fontname, default_fontname); fnt=de_load_font(default_fontname); if(fnt==NULL) LOG(WARN, FONT, TR("Failed to load fallback font.")); return fnt; } return NULL; } #endif /* HAVE_X11_BMF */ fnt=ALLOC(DEFont); if(fnt==NULL) return NULL; #ifdef HAVE_X11_XFT fnt->font=font; #endif #ifdef HAVE_X11_BMF fnt->fontset=fontset; fnt->fontstruct=fontstruct; #endif fnt->pattern=scopy(fontname); fnt->next=NULL; fnt->prev=NULL; fnt->refcount=1; LINK_ITEM(fonts, fnt, next, prev); return fnt; }
static bool rootwin_init(WRootWin *rootwin, int xscr) { Display *dpy=ioncore_g.dpy; WFitParams fp; Window root; WScreen *scr; /* Try to select input on the root window */ root=RootWindow(dpy, xscr); redirect_error=FALSE; XSetErrorHandler(my_redirect_error_handler); XSelectInput(dpy, root, IONCORE_EVENTMASK_ROOT); XSync(dpy, 0); XSetErrorHandler(my_error_handler); if(redirect_error){ warn(TR("Unable to redirect root window events for screen %d." "Maybe another window manager is running?"), xscr); return FALSE; } rootwin->xscr=xscr; rootwin->default_cmap=DefaultColormap(dpy, xscr); rootwin->tmpwins=NULL; rootwin->tmpnwins=0; rootwin->dummy_win=None; rootwin->xor_gc=None; fp.mode=REGION_FIT_EXACT; fp.g.x=0; fp.g.y=0; fp.g.w=DisplayWidth(dpy, xscr); fp.g.h=DisplayHeight(dpy, xscr); if(!window_do_init((WWindow*)rootwin, NULL, &fp, root, "WRootWin")){ return FALSE; } ((WWindow*)rootwin)->event_mask=IONCORE_EVENTMASK_ROOT; ((WRegion*)rootwin)->flags|=REGION_BINDINGS_ARE_GRABBED|REGION_PLEASE_WARP; ((WRegion*)rootwin)->rootwin=rootwin; REGION_MARK_MAPPED(rootwin); scan_initial_windows(rootwin); create_wm_windows(rootwin); preinit_gr(rootwin); netwm_init_rootwin(rootwin); region_add_bindmap((WRegion*)rootwin, ioncore_screen_bindmap); scr=create_screen(rootwin, &fp, xscr); if(scr==NULL){ return FALSE; } region_set_manager((WRegion*)scr, (WRegion*)rootwin); region_map((WRegion*)scr); LINK_ITEM(*(WRegion**)&ioncore_g.rootwins, (WRegion*)rootwin, p_next, p_prev); ioncore_screens_updated(rootwin); xwindow_set_cursor(root, IONCORE_CURSOR_DEFAULT); return TRUE; }