コード例 #1
0
ファイル: stacking.c プロジェクト: JoeNotCharles/notion
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;
}
コード例 #2
0
ファイル: gr.c プロジェクト: JoeNotCharles/notion
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;
}
コード例 #3
0
ファイル: dock.c プロジェクト: dkogan/notion
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;
}
コード例 #4
0
ファイル: font.c プロジェクト: fargies/notion
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;
}
コード例 #5
0
ファイル: menudata.c プロジェクト: Cougar/pwm
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;
}
コード例 #6
0
ファイル: dock.c プロジェクト: dkogan/notion
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;
}
コード例 #7
0
ファイル: reginfo.c プロジェクト: dkogan/notion
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;
}
コード例 #8
0
ファイル: strings.c プロジェクト: dkogan/notion
/*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;
}
コード例 #9
0
ファイル: thing.c プロジェクト: apenwarr/ion1
void link_thing(WThing *parent, WThing *thing)
{
	LINK_ITEM(parent->t_children, thing, t_next, t_prev);
	thing->t_parent=parent;
}
コード例 #10
0
ファイル: font.c プロジェクト: raboof/notion
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;
}
コード例 #11
0
ファイル: rootwin.c プロジェクト: JoeNotCharles/notion
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;
}