Ejemplo n.º 1
0
bool region_enter_fullscreen(WRegion *reg, bool switchto)
{
    WScreen *scr=region_screen_of(reg);
    
    if(scr==NULL){
        scr=rootwin_current_scr(region_rootwin_of(reg));
        if(scr==NULL)
            return FALSE;
    }
    
    return region_fullscreen_scr(reg, scr, switchto);
}
Ejemplo n.º 2
0
WScreen *netwm_check_initial_fullscreen(WClientWin *cwin)
{

    int i, n;
    int ret=0;
    long *data;
    
    n=xwindow_get_property(cwin->win, atom_net_wm_state, XA_ATOM,
                   1, TRUE, (uchar**)&data);
    
    if(n<0)
        return NULL;
    
    for(i=0; i<n; i++){
        if(data[i]==(long)atom_net_wm_state_fullscreen)
            return region_screen_of((WRegion*)cwin);
    }
    
    XFree((void*)data);

    return NULL;
}
Ejemplo n.º 3
0
bool clientwin_fullscreen_may_switchto(WClientWin *cwin)
{
    return (region_may_control_focus((WRegion*)cwin)
            || !REGION_IS_ACTIVE(region_screen_of((WRegion*)cwin)));
}
Ejemplo n.º 4
0
Archivo: dock.c Proyecto: dkogan/notion
EXTL_EXPORT
WDock *mod_dock_create(ExtlTab tab)
{
    char *mode=NULL;
    bool floating=FALSE;
    int screenid=0;
    WScreen *screen=NULL;
    WDock *dock=NULL;
    WRegion *stdisp=NULL;
    WMPlexSTDispInfo din;
    WFitParams fp;

    if(extl_table_gets_s(tab, "mode", &mode)){
        if(strcmp(mode, "floating")==0){
            floating=TRUE;
        }else if(strcmp(mode, "embedded")!=0){
            warn("Invalid dock mode.");
            free(mode);
            return NULL;
        }
        free(mode);
    }

    extl_table_gets_i(tab, "screen", &screenid);
    screen=ioncore_find_screen_id(screenid);
    if(screen==NULL){
        warn("Screen %d does not exist.", screenid);
        return NULL;
    }

    for(dock=docks; dock; dock=dock->dock_next){
        if(region_screen_of((WRegion*)dock)==screen){
            warn("Screen %d already has a dock. Refusing to create another.",
                 screenid);
            return NULL;
        }
    }

    if(!floating){
        mplex_get_stdisp((WMPlex*)screen, &stdisp, &din);
        if(stdisp!=NULL && !extl_table_is_bool_set(tab, "force")){
            warn("Screen %d already has an stdisp. Refusing to add embedded "
                 "dock.", screenid);
            return NULL;
        }
    }

    /* Create the dock */
    fp.mode=REGION_FIT_BOUNDS|REGION_FIT_WHATEVER;
    fp.g.x=0;
    fp.g.y=0;
    fp.g.w=1;
    fp.g.h=1;

    dock=create_dock((WWindow*)screen, &fp);

    if(dock==NULL){
        warn("Failed to create dock.");
        return NULL;
    }


    /* Get parameters */
    dock->save=FALSE;
    dock_do_set(dock, tab, FALSE);

    /* Calculate min/max size */
    dock_managed_rqgeom_(dock, NULL, 0, NULL, NULL, TRUE);

    /* Final setup */
    if(floating){
        WMPlexAttachParams par=MPLEXATTACHPARAMS_INIT;
        WRegionAttachData data;

        par.flags=(MPLEX_ATTACH_UNNUMBERED
                   |MPLEX_ATTACH_SIZEPOLICY
                   |MPLEX_ATTACH_GEOM
                   |MPLEX_ATTACH_PASSIVE);

        par.geom.w=dock->min_w;
        par.geom.h=dock->min_h;
        par.geom.x=0;
        par.geom.y=0;

        mplexszplcy(dock->pos, &par.szplcy);

        if(extl_table_is_bool_set(tab, "floating_hidden"))
            par.flags|=MPLEX_ATTACH_HIDDEN;

        data.type=REGION_ATTACH_REPARENT;
        data.u.reg=(WRegion*)dock;

        if(mplex_do_attach((WMPlex*)screen, &par, &data))
            return dock;
    }else{
        mplexpos(dock->pos, &din.pos);
        din.fullsize=FALSE; /* not supported */
        if(mplex_set_stdisp((WMPlex*)screen, (WRegion*)dock, &din))
            return dock;
    }

    /* Failed to attach. */
    warn("Failed to attach dock to screen.");
    destroy_obj((Obj*)dock);
    return NULL;
}
Ejemplo n.º 5
0
bool clientwin_do_manage_default(WClientWin *cwin,
                                 const WManageParams *param)
{
    WScreen *scr=NULL;
    WPHolder *ph=NULL;
    int swf=(param->switchto ? PHOLDER_ATTACH_SWITCHTO : 0);
    bool uq=FALSE;
    WRegion *createroot=NULL;

    /* Find a suitable screen */
    scr=clientwin_find_suitable_screen(cwin, param);
    if(scr==NULL){
        warn(TR("Unable to find a screen for a new client window."));
        return FALSE;
    }

    if(handle_target_winprops(cwin, param, scr, &ph))
        return TRUE;

    /* Check if param->tfor or any of its managers want to manage cwin. */
    if(ph==NULL && param->tfor!=NULL){
        assert(param->tfor!=cwin);
        ph=region_prepare_manage_transient((WRegion*)param->tfor, cwin,
                                           param, 0);
        uq=TRUE;
    }

    if(ph==NULL){
        /* Find a placeholder for non-fullscreen state */
        ph=region_prepare_manage((WRegion*)scr, cwin, param,
                                 MANAGE_PRIORITY_NONE);

        if(try_fullscreen(cwin, scr, param)){
            if(pholder_target(ph)!=(WRegion*)region_screen_of((WRegion*)cwin)){
                WRegion *grp=region_groupleader_of((WRegion*)cwin);
                if(region_do_set_return(grp, ph))
                    return TRUE;
            }
            destroy_obj((Obj*)ph);
            return TRUE;
        }

    }

    if(ph==NULL)
        return FALSE;

    /* Not in full-screen mode; use the placeholder to attach. */
    {
        WRegionAttachData data;
        data.type=REGION_ATTACH_REPARENT;
        data.u.reg=(WRegion*)cwin;

        createroot=pholder_do_attach(ph,
                                     swf|PHOLDER_ATTACH_RETURN_CREATEROOT,
                                     &data);
    }

    destroy_obj((Obj*)ph);

    if(uq && createroot!=NULL)
        ioncore_unsqueeze(createroot, FALSE);

    return (createroot!=NULL);
}