示例#1
0
bool region_fullscreen_scr(WRegion *reg, WScreen *scr, bool switchto)
{
    int swf=(switchto ? MPLEX_ATTACH_SWITCHTO : 0);
    WPHolder *ph=NULL;
    bool newph=FALSE, ret;

    ph=region_unset_get_return(reg);
    
    if(ph==NULL){
        ph=region_make_return_pholder(reg);
        newph=TRUE;
    }
    
    ret=(mplex_attach_simple((WMPlex*)scr, reg, swf)!=NULL);
    
    if(!ret)
        warn(TR("Failed to enter full screen mode."));
    
    if(!ret && newph)
        destroy_obj((Obj*)ph);
    else if(!region_do_set_return(reg, ph))
        destroy_obj((Obj*)ph);
    
    return TRUE;
}
int stored_obj(struct mem_obj *obj)
{
//	printf("stored obj now\n");
    struct mem_obj *tmp_obj=NULL;
    int found=0;
    if(obj==NULL)
        return 0;
    if(obj->flags & (FLAG_DEAD)) {
        destroy_obj(obj,0);
        //	printf("obj have set dead \n");
        //	obj=NULL;
        return -1;
    }
//	obj->last_access=time(NULL);
//	printf("obj->times.last_modified=%d %s:%d\n",obj->times.last_modified,__FILE__,__LINE__);

    obj->m_list.obj=(void *)obj;
    obj->prev=NULL;
    obj->resident_size =obj->content_length;//calculate_resident_size(obj);
    u_short url_hash=T_hash(&obj->url);
    LOCK_OBJ_LIST
    pthread_mutex_lock(&hash_table[url_hash].lock);
    tmp_obj=hash_table[url_hash].next;
    while(tmp_obj) {
        if ( (tmp_obj->url.port==obj->url.port) &&
                !strcmp(tmp_obj->url.path, obj->url.path) &&
                !strcasecmp(tmp_obj->url.host, obj->url.host) &&
                !strcasecmp(tmp_obj->url.proto, obj->url.proto) &&
                !(tmp_obj->flags & FLAG_DEAD) ) {
            found=1;
            break;
        }
        tmp_obj=tmp_obj->next;
    }
    if(found) {
        pthread_mutex_unlock(&hash_table[url_hash].lock);
        UNLOCK_OBJ_LIST
        destroy_obj(obj,0);
        //	printf("have another obj in\n");
        return 0;
    }

    obj->next=hash_table[url_hash].next;
    if (obj->next) obj->next->prev = obj;
    hash_table[url_hash].next=obj;
    obj->hash_back = &hash_table[url_hash];
    if(TEST(obj->flags,FLAG_IN_MEM)) {
        increase_hash_size(obj->hash_back, obj->resident_size);
    }
    if(TEST(obj->flags,FLAG_IN_DISK)) {
        increase_hash_size(obj->hash_back, obj->resident_size,false);
    }
    add_list(&obj->m_list);
    pthread_mutex_unlock(&hash_table[url_hash].lock);
    UNLOCK_OBJ_LIST
    return 1;
};
示例#3
0
int
main(int argc, char *argv[])
{
    char 	*progname = argv[0];
    char 	*fname;
    shrc 	rc;

    if(argc != 1){
	usage(cerr, progname);
    }

    // Establish a connection with the vas and initialize 
    // the object  cache.
    SH_DO(Shore::init(argc, argv));

    SH_BEGIN_TRANSACTION(rc);

    // If that failed, or if a transaction aborted...
    if(rc){
	// after longjmp
	cerr << rc << endl;
	return 1;
    } else {
	// The main body of the transaction goes here.

	SH_DO(Shore::chdir("/"));

	//////////////////////////////////
	// GUTS HERE
	//////////////////////////////////
	fname = "XXX";
	{
	    bool ok = true;

	    SH_DO( REF(my_obj)::new_persistent (fname, 0644, o_ref) ) ;
	    if(!o_ref ) {
		cerr << "Cannot create new objects " << fname << endl;
		ok = false;
	    } else {
		SH_DO( REF(a)::new_persistent ("a_ref_junk", 0644, a_ref) ) ;
		if(!a_ref ) {
		    cerr << "Cannot create new objects " << "a_ref_junk" << endl;
		    ok = false;
		} 
	    }
	    dotest();

	}
	SH_DO(SH_COMMIT_TRANSACTION);
    }

    destroy_obj(fname);
    destroy_obj("a_ref_junk");
    return 0;
}
示例#4
0
/* If hk==NULL to register, new is attempted to be created. */
WHook *mainloop_register_hook(const char *name, WHook *hk)
{
    char *nnm;
    
    if(hk==NULL)
        return NULL;
    
    if(named_hooks==NULL){
        named_hooks=make_rb();
        if(named_hooks==NULL)
            return NULL;
    }
    
    nnm=scopy(name);
    
    if(nnm==NULL)
        return NULL;
    
    if(!rb_insert(named_hooks, nnm, hk)){
        free(nnm);
        destroy_obj((Obj*)hk);
    }
    
    return hk;
}
示例#5
0
static void reset_scroll_timer()
{
    if(scroll_timer!=NULL){
        destroy_obj((Obj*)scroll_timer);
        scroll_timer=NULL;
    }
}
示例#6
0
文件: resize.c 项目: dkogan/notion
bool moveresmode_do_end(WMoveresMode *mode, bool apply)
{
    WRegion *reg=mode->reg;

    assert(reg!=NULL);
    assert(tmpmode==mode);

    tmpmode=NULL;

    if(XOR_RESIZE){
        moveres_draw_rubberband(mode);
        if(apply){
            WRQGeomParams rq=RQGEOMPARAMS_INIT;

            rq.geom=mode->geom;
            rq.flags=mode->rqflags&~REGION_RQGEOM_TRYONLY;

            region_rqgeom(reg, &rq, &mode->geom);
        }
        XUngrabServer(ioncore_g.dpy);
    }
    if(apply)
        set_saved(mode, reg);

    if(mode->infowin!=NULL){
        mainloop_defer_destroy((Obj*)mode->infowin);
        mode->infowin=NULL;
    }
    destroy_obj((Obj*)mode);

    return TRUE;
}
示例#7
0
static WRegion *recreate_handler(WWindow *par, 
                                 const WFitParams *fp, 
                                 void *rp_)
{
    WGroupPHolder *phtmp;
    RP *rp=(RP*)rp_;
    WGroup *grp;
    
    grp=(WGroup*)create_groupcw(par, fp);
    
    if(grp==NULL)
        return NULL;
        
    rp->ph->param.whatever=(fp->mode&REGION_FIT_WHATEVER ? 1 : 0);
    
    rp->reg_ret=group_do_attach(grp, &rp->ph->param, rp->data);
    
    rp->ph->param.whatever=0;
    
    if(rp->reg_ret==NULL){
        destroy_obj((Obj*)grp);
        return NULL;
    }else{
        grp->phs=rp->ph_head;
        
        for(phtmp=grp->phs; phtmp!=NULL; phtmp=phtmp->next)
            phtmp->group=grp;
    }
    
    if(fp->mode&REGION_FIT_WHATEVER)
        REGION_GEOM(grp)=REGION_GEOM(rp->reg_ret);
    
    return (WRegion*)grp;
}
示例#8
0
文件: kbresize.c 项目: dkogan/notion
static void reset_resize_timer()
{
    if(resize_timer!=NULL){
        timer_reset(resize_timer);
        destroy_obj((Obj*)resize_timer);
        resize_timer=NULL;
    }
}
示例#9
0
void splitfloat_deinit(WSplitFloat *split)
{
    if(split->tlpwin!=NULL){
        WPaneHandle *tmp=split->tlpwin;
        split->tlpwin=NULL;
        tmp->splitfloat=NULL;
        destroy_obj((Obj*)tmp);
    }

    if(split->brpwin!=NULL){
        WPaneHandle *tmp=split->brpwin;
        split->brpwin=NULL;
        tmp->splitfloat=NULL;
        destroy_obj((Obj*)tmp);
    }

    splitsplit_deinit(&(split->ssplit));
}
示例#10
0
void CHSInterface::DestroyObject(HS_DBREF dbObject)
{
#ifdef PENNMUSH
    free_object(dbObject); 
#else
    destroy_obj(dbObject);
#endif

}
示例#11
0
bool splitfloat_init(WSplitFloat *split, const WRectangle *geom,
                     WTiling *ws, int dir)
{
    WFitParams fp;
    WWindow *par=REGION_PARENT(ws);

    assert(par!=NULL);

    fp.g=*geom;
    fp.mode=REGION_FIT_EXACT;
    split->tlpwin=create_panehandle(par, &fp);
    if(split->tlpwin==NULL)
        return FALSE;

    fp.g=*geom;
    fp.mode=REGION_FIT_EXACT;
    split->brpwin=create_panehandle(par, &fp);
    if(split->brpwin==NULL){
        destroy_obj((Obj*)split->tlpwin);
        return FALSE;
    }

    ((WRegion*)split->brpwin)->flags|=REGION_SKIP_FOCUS;
    ((WRegion*)split->tlpwin)->flags|=REGION_SKIP_FOCUS;

    if(!splitsplit_init(&(split->ssplit), geom, dir)){
        destroy_obj((Obj*)split->brpwin);
        destroy_obj((Obj*)split->tlpwin);
        return FALSE;
    }

    split->tlpwin->splitfloat=split;
    split->brpwin->splitfloat=split;

    splitfloat_set_borderlines(split);

    if(REGION_IS_MAPPED(ws)){
        region_map((WRegion*)(split->tlpwin));
        region_map((WRegion*)(split->brpwin));
    }

    return TRUE;
}
示例#12
0
文件: manage.c 项目: dkogan/notion
static bool handle_target_winprops(WClientWin *cwin, const WManageParams *param,
                                   WScreen *scr, WPHolder **ph_ret)
{
    char *layout=NULL, *target=NULL;
    WPHolder *ph=NULL;
    bool mgd=FALSE;

    if(extl_table_gets_s(cwin->proptab, "target", &target))
        ph=try_target(cwin, param, target);

    if(ph==NULL && extl_table_gets_s(cwin->proptab, "new_group", &layout)){
        ExtlTab lo=ioncore_get_layout(layout);

        free(layout);

        if(lo!=extl_table_none()){
            WMPlexAttachParams par=MPLEXATTACHPARAMS_INIT;
            int mask=MPLEX_ATTACH_SWITCHTO;
            WRegion *reg;

            if(param->switchto)
                par.flags|=MPLEX_ATTACH_SWITCHTO;

            /*ioncore_newly_created=(WRegion*)cwin;*/

            reg=mplex_attach_new_(&scr->mplex, &par, mask, lo);

            extl_unref_table(lo);

            /*ioncore_newly_created=NULL;*/

            mgd=(region_manager((WRegion*)cwin)!=NULL);

            if(reg!=NULL && !mgd){
                if(target!=NULL)
                    ph=try_target(cwin, param, target);

                if(ph==NULL){
                    ph=region_prepare_manage(reg, cwin, param,
                                             MANAGE_PRIORITY_NONE);

                    if(ph==NULL)
                        destroy_obj((Obj*)reg);
                }
            }
        }
    }

    if(target!=NULL)
        free(target);

    *ph_ret=ph;

    return mgd;
}
示例#13
0
文件: dock.c 项目: dkogan/notion
static void dock_deinit(WDock *dock)
{
    while(dock->dockapps!=NULL)
        destroy_obj((Obj*)dock->dockapps->reg);

    UNLINK_ITEM(docks, dock, dock_next, dock_prev);

    dock_brush_release(dock);

    window_deinit((WWindow*) dock);
}
示例#14
0
文件: tiling.c 项目: gwash/ion-3plus
void tiling_deinit(WTiling *ws)
{
    WRegion *reg;
    WTilingIterTmp tmp;
    WMPlex *remanage_mplex=NULL;
    
    tiling_unmanage_stdisp(ws, FALSE, TRUE);

    FOR_ALL_MANAGED_BY_TILING(reg, ws, tmp){
        destroy_obj((Obj*)reg);
    }
示例#15
0
文件: mguests.c 项目: chazu/btmux
void destroy_guest(dbref guest)
{
	if(!Wizard(mudconf.guest_nuker) || !Good_obj(mudconf.guest_nuker))
		mudconf.guest_nuker = 1;

	if(!Guest(guest))
		return;

	toast_player(guest);
	atr_add_raw(guest, A_DESTROYER, tprintf("%d", mudconf.guest_nuker));
	destroy_player(guest);
	destroy_obj(mudconf.guest_nuker, guest);
}
示例#16
0
void mod_tiling_deinit()
{
    mod_tiling_unregister_exports();
    ioncore_unregister_regclass(&CLASSDESCR(WTiling));
    
    if(mod_tiling_tiling_bindmap!=NULL){
        ioncore_free_bindmap("WTiling", mod_tiling_tiling_bindmap);
        mod_tiling_tiling_bindmap=NULL;
    }
    
    if(tiling_placement_alt!=NULL){
        destroy_obj((Obj*)tiling_placement_alt);
        tiling_placement_alt=NULL;
    }
}
示例#17
0
文件: manage.c 项目: dkogan/notion
bool region_manage_clientwin(WRegion *reg, WClientWin *cwin,
                             const WManageParams *par, int priority)
{
    bool ret;
    WPHolder *ph=region_prepare_manage(reg, cwin, par, priority);
    int swf=(par->switchto ? PHOLDER_ATTACH_SWITCHTO : 0);

    if(ph==NULL)
        return FALSE;

    ret=pholder_attach(ph, swf, (WRegion*)cwin);

    destroy_obj((Obj*)ph);

    return ret;
}
示例#18
0
void rootwin_deinit(WRootWin *rw)
{
    WScreen *scr, *next;

    FOR_ALL_SCREENS_W_NEXT(scr, next){
        if(REGION_MANAGER(scr)==(WRegion*)rw)
            destroy_obj((Obj*)scr);
    }
    
    UNLINK_ITEM(*(WRegion**)&ioncore_g.rootwins, (WRegion*)rw, p_next, p_prev);
    
    XSelectInput(ioncore_g.dpy, WROOTWIN_ROOT(rw), 0);
    
    XFreeGC(ioncore_g.dpy, rw->xor_gc);
    
    window_deinit((WWindow*)rw);
}
示例#19
0
文件: tiling.c 项目: gwash/ion-3plus
bool tiling_do_attach_initial(WTiling *ws, WRegion *reg)
{
    assert(ws->split_tree==NULL);
    
    ws->split_tree=(WSplit*)create_splitregion(&REGION_GEOM(reg), reg);
    if(ws->split_tree==NULL)
        return FALSE;
    
    ws->split_tree->ws_if_root=ws;
    
    if(!tiling_managed_add(ws, reg)){
        destroy_obj((Obj*)ws->split_tree);
        ws->split_tree=NULL;
        return FALSE;
    }
    
    return TRUE;
}
示例#20
0
bool region_leave_fullscreen(WRegion *reg, bool switchto)
{
    int swf=(switchto ? PHOLDER_ATTACH_SWITCHTO : 0);
    WPHolder *ph=region_unset_get_return(reg);
    
    if(ph==NULL)
        return FALSE;
    
    if(!pholder_attach_mcfgoto(ph, swf, reg)){
        warn(TR("Failed to return from full screen mode; remaining manager "
                "or parent from previous location refused to manage us."));
        return FALSE;
    }
    
    destroy_obj((Obj*)ph);
    
    return TRUE;
}
示例#21
0
文件: manage.c 项目: dkogan/notion
bool region_rescue(WRegion *reg, WPHolder *ph, int flags)
{
    WRescueInfo info;
    bool ret;

    info.ph=ph;
    info.flags=flags;
    info.test=FALSE;
    info.get_rescue=reg;
    info.failed_get=FALSE;

    ret=region_rescue_clientwins(reg, &info);

    if(info.ph!=ph)
        destroy_obj((Obj*)info.ph);

    return ret;
}
示例#22
0
static void menu_do_select_nth(WMenu *menu, int n)
{
    int oldn=menu->selected_entry;
    bool drawfull=FALSE;
    
    if(oldn==n)
        return;
    
    if(menu->submenu!=NULL)
        destroy_obj((Obj*)menu->submenu);
    
    assert(menu->submenu==NULL);

    menu->selected_entry=n;

    if(n>=0){
        if(n<menu->first_entry){
            menu->first_entry=n;
            drawfull=TRUE;
        }else if(n>=menu->first_entry+menu->vis_entries){
            menu->first_entry=n-menu->vis_entries+1;
            drawfull=TRUE;
        }
        
        if(menu->entries[n].flags&WMENUENTRY_SUBMENU &&
           menu->pmenu_mode){
            show_sub(menu, n);
        }
    }
    
    if(drawfull){
        menu_draw_entries(menu, TRUE);
    }else{
        /* redraw new and old selected entry */ 
        WRectangle igeom;
        get_inner_geom(menu, &igeom);

        /* !!!BEGIN!!! */
        if(oldn!=-1)
            menu_draw_entry(menu, oldn, &igeom, TRUE);
        if(n!=-1)
            menu_draw_entry(menu, n, &igeom, TRUE);
    }
}
示例#23
0
void menu_deinit(WMenu *menu)
{
    menu_typeahead_clear(menu);
    
    if(menu->submenu!=NULL)
        destroy_obj((Obj*)menu->submenu);
    
    /*if(menu->cycle_bindmap!=NULL)
        bindmap_destroy(menu->cycle_bindmap);*/

    extl_unref_table(menu->tab);
    extl_unref_fn(menu->handler);
    
    deinit_entries(menu);
    
    menu_release_gr(menu);
    
    window_deinit((WWindow*)menu);
}
示例#24
0
文件: sm.c 项目: fargies/notion
static bool sm_do_manage(WClientWin *cwin, const WManageParams *param)
{
    int transient_mode=TRANSIENT_MODE_OFF;
    WPHolder *ph;
    bool ret;
    
    if(param->tfor!=NULL)
        return FALSE;
    
    ph=mod_sm_match_cwin_to_saved(cwin);
    if(ph==NULL)
        return FALSE;
    
    ret=pholder_attach(ph, 0, (WRegion*)cwin);
    
    destroy_obj((Obj*)ph);
    
    return ret;
}
示例#25
0
文件: manage.c 项目: dkogan/notion
static bool try_fullscreen(WClientWin *cwin, WScreen *dflt,
                           const WManageParams *param)
{
    WScreen *fs_scr=NULL;
    bool fs=FALSE, tmp;

    /* Check fullscreen mode. (This is intentionally not done
     * for transients and windows with target winprops.)
     */
    if(extl_table_gets_b(cwin->proptab, "fullscreen", &tmp)){
        if(!tmp)
            return FALSE;
        fs_scr=dflt;
    }

    if(fs_scr==NULL && netwm_check_initial_fullscreen(cwin))
        fs_scr=dflt;

    if(fs_scr==NULL)
        fs_scr=clientwin_fullscreen_chkrq(cwin, param->geom.w, param->geom.h);

    if(fs_scr!=NULL){
        WPHolder *fs_ph=region_prepare_manage((WRegion*)fs_scr, cwin, param,
                                              MANAGE_PRIORITY_NOREDIR);

        if(fs_ph!=NULL){
            int swf=(param->switchto ? PHOLDER_ATTACH_SWITCHTO : 0);

            cwin->flags|=CLIENTWIN_FS_RQ;

            fs=pholder_attach(fs_ph, swf, (WRegion*)cwin);

            if(!fs)
                cwin->flags&=~CLIENTWIN_FS_RQ;

            destroy_obj((Obj*)fs_ph);
        }
    }

    return fs;
}
示例#26
0
static void menu_do_finish(WMenu *menu)
{
    ExtlFn handler;
    ExtlTab tab;
    bool ok;
    WMenu *head=menu_head(menu);
    
    handler=menu->handler;
    menu->handler=extl_fn_none();
    
    ok=extl_table_geti_t(menu->tab, menu->selected_entry+1, &tab);
    
    if(!region_rqdispose((WRegion*)head)){
        if(head->submenu!=NULL)
            destroy_obj((Obj*)head->submenu);
    }
    
    if(ok)
        extl_call(handler, "t", NULL, tab);

    extl_unref_fn(handler);
    extl_unref_table(tab);
}
示例#27
0
文件: dock.c 项目: dkogan/notion
void mod_dock_deinit()
{
    WDock *dock;

    ioncore_unregister_regclass(&CLASSDESCR(WDock));

    hook_remove(clientwin_do_manage_alt,
                (WHookDummy*)clientwin_do_manage_hook);

    dock=docks;
    while(dock!=NULL){
        WDock *next=dock->dock_next;
        destroy_obj((Obj*)dock);
        dock=next;
    }

    mod_dock_unregister_exports();

    if(dock_bindmap!=NULL){
        ioncore_free_bindmap("WDock", dock_bindmap);
        dock_bindmap=NULL;
    }
}
int fill_mem_obj(request *rq,struct mem_obj *obj,struct mem_obj *old_obj)
{
//	struct	buff		*to_server_request = NULL;
    char *answer=NULL;
    char *fake_header;
    head_info m_head;
    int fake_header_len=0;
    int r=CONNECT_ERR;
    char mk1123buff[50];
    ERRBUF ;
    memset(&m_head,0,sizeof(m_head));
    if(srv_connect(rq)<=0)
        goto error;
    /*
    to_server_request = alloc_buff(4*CHUNK_SIZE);
    if ( !to_server_request ) {
    //	change_state(obj, OBJ_READY);
    	obj->flags |= FLAG_DEAD;
    	goto error;
    }
    */
//	stored_obj(NULL);
//	printf("rq->if_modified_since=%d,obj->times.last_modified=%d\n",rq->if_modified_since,old_obj->times.last_modified);
    if(old_obj && !TEST(rq->flags,RQ_HAS_IF_MOD_SINCE)) {
        if(old_obj->times.last_modified) {
            if (!mk1123time(old_obj->times.last_modified, mk1123buff, sizeof(mk1123buff)) ) {
                klog(ERR_LOG,"cann't mk1123time obj obj->times.date=%d.\n",old_obj->times.last_modified);
                goto error;
            }
        } else {
            if (!mk1123time(obj->created, mk1123buff, sizeof(mk1123buff)) ) {
                klog(ERR_LOG,"cann't mk1123time obj created=%d.\n",old_obj->created);
                goto error;
            }
        }
        fake_header_len=19+sizeof(mk1123buff)+4;
        fake_header = (char *)malloc(fake_header_len);
        if ( !fake_header ) {
            goto error;
            //error	goto validate_err;
        }
        //	printf("fake_header=%s\n",fake_header);
        memset(fake_header,0,fake_header_len);
        snprintf(fake_header,fake_header_len-1, "If-Modified-Since: %s\r\n", mk1123buff);
        answer=build_direct_request("GET", &rq->url, fake_header, rq, 0);
        free(fake_header);
        //	printf("client have no if-modified-since.\n");
    } else {
        answer=build_direct_request("GET",&rq->url,NULL,rq,0);//连接远程主机
    }
//	printf("answer=%s\n",answer);

    if ( !answer ) {
        klog(ERR_LOG,"no mem to alloc.\n");
        goto error;
    }
    /*
    if ( attach_data(answer, strlen(answer), to_server_request) ) {
    	free_container(to_server_request);
    	goto error;
    }
    if(answer){
    	free(answer);
    	answer = NULL;
    }
    */

    r = rq->client->send(answer);
//	free(answer);
//   free_container(to_server_request); to_server_request = NULL;
    //	printf("send data to remote is:%s",to_server_request->data);
    if ( r <=0 ) {//send error
        say_bad_request("Can't send","",
                        ERR_TRANSFER, rq);
        //	printf("cann't send to server.\n");
        //printf("errno=%d\n",ERRNO);
        goto error;
    }
    r=load_head(rq,obj,m_head);
    switch(r) {
    case HEAD_OK:
        if(load_body(rq,obj)<=0) {
            //printf("load body failed.\n");
            r=CONNECT_ERR;
            goto error;
        }
        goto done;
    case CONNECT_ERR:
        //printf("load head failed.\n");
        goto error;
    case HEAD_NOT_MODIFIED:
        if(old_obj && !TEST(rq->flags,RQ_HAS_IF_MOD_SINCE)) {
            goto error;
        } else {
            if(rq->server->send(m_head.head,m_head.len)<0)
                goto error;
        }
        //	printf("%s\n",m_head.head);
        break;

    default:
//		printf("obj->content_length=%d,path=%s\n",obj->content_length,obj->url.path);
        if(m_head.head) {
            if(rq->server->send(m_head.head,m_head.len)<0)
                goto error;
            if(create_select_pipe(rq->server,rq->client,conf.time_out[HTTP],0,-1)==-2)
                r=1;
        }
    }
error:
    IF_FREE(answer);
    IF_FREE(m_head.head);
    rq->client->close();
    destroy_obj(obj,0);
    return r;
done:
    IF_FREE(answer);
    IF_FREE(m_head.head);
    rq->client->close();
    if(!old_obj)
        stored_obj(obj);
    return r;
};
示例#29
0
文件: dock.c 项目: 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;
}
示例#30
0
文件: manage.c 项目: dkogan/notion
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);
}