/*--lowlevel routine not to be called by the user--*/ EXTL_EXPORT WMenu *mod_menu_do_grabmenu(WMPlex *mplex, ExtlFn handler, ExtlTab tab, ExtlTab param) { WMenuCreateParams fnp; WMPlexAttachParams par; WMenu *menu; XKeyEvent *ev; uint state, kcb; bool sub; if(!ioncore_current_key(&kcb, &state, &sub)) return NULL; if(state==0){ WMenu *menu=mod_menu_do_menu(mplex, handler, tab, param); /* if(menu!=NULL && cycle!=extl_fn_none()){ uint kcb, state; menu->cycle_bindmap=region_add_cycle_bindmap((WRegion*)menu, kcb, state, ???, ???); }*/ return menu; } fnp.handler=handler; fnp.tab=tab; fnp.pmenu_mode=FALSE; fnp.submenu_mode=FALSE; fnp.big_mode=extl_table_is_bool_set(param, "big"); fnp.initial=0; extl_table_gets_i(param, "initial", &(fnp.initial)); par.flags=(MPLEX_ATTACH_SWITCHTO| MPLEX_ATTACH_LEVEL| MPLEX_ATTACH_UNNUMBERED| MPLEX_ATTACH_SIZEPOLICY); par.szplcy=SIZEPOLICY_FULL_BOUNDS; par.level=STACKING_LEVEL_MODAL1+2; menu=(WMenu*)mplex_do_attach_new(mplex, &par, (WRegionCreateFn*)create_menu, (void*)&fnp); if(menu==NULL) return NULL; menu->gm_kcb=kcb; menu->gm_state=state; ioncore_grab_establish((WRegion*)menu, grabmenu_handler, grabkilled_handler, 0); return menu; }
static void clientwin_get_winprops(WClientWin *cwin) { ExtlTab tab, tab2; char *s; int i1, i2; tab=ioncore_get_winprop(cwin); cwin->proptab=tab; if(tab==extl_table_none()) return; if(extl_table_is_bool_set(tab, "transparent")) cwin->flags|=CLIENTWIN_PROP_TRANSPARENT; if(extl_table_is_bool_set(tab, "acrobatic")) cwin->flags|=CLIENTWIN_PROP_ACROBATIC; if(extl_table_is_bool_set(tab, "lazy_resize")) cwin->flags|=CLIENTWIN_PROP_LAZY_RESIZE; DO_SZH("max_size", CLIENTWIN_PROP_MAXSIZE, CLIENTWIN_PROP_I_MAXSIZE, PMaxSize, max_width, max_height, { }); DO_SZH("min_size", CLIENTWIN_PROP_MINSIZE, CLIENTWIN_PROP_I_MINSIZE, PMinSize, min_width, min_height, { }); DO_SZH("resizeinc", CLIENTWIN_PROP_RSZINC, CLIENTWIN_PROP_I_RSZINC, PResizeInc, width_inc, height_inc, { }); DO_SZH("aspect", CLIENTWIN_PROP_ASPECT, CLIENTWIN_PROP_I_ASPECT, PAspect, min_aspect.x, min_aspect.y, { cwin->size_hints.max_aspect.x=i1; cwin->size_hints.max_aspect.y=i2; });
WPHolder *groupws_prepare_manage(WGroupWS *ws, const WClientWin *cwin, const WManageParams *param, int priority) { int cpriority=MANAGE_PRIORITY_SUB(priority, MANAGE_PRIORITY_GROUP); int bpriority=MANAGE_PRIORITY_SUBX(priority, MANAGE_PRIORITY_GROUP); WRegion *b=(ws->grp.bottom!=NULL ? ws->grp.bottom->reg : NULL); WPHolder *ph=NULL; bool act_b=(ws->grp.bottom==ws->grp.current_managed); bool use_bottom; if(b!=NULL && !HAS_DYN(b, region_prepare_manage)) b=NULL; use_bottom=(act_b ? !extl_table_is_bool_set(cwin->proptab, "float") : act_b); if(b!=NULL && use_bottom) ph=region_prepare_manage(b, cwin, param, bpriority); if(ph==NULL){ /* Check current */ WRegion *r=(ws->grp.current_managed!=NULL ? ws->grp.current_managed->reg : NULL); if(r!=NULL && r!=b) ph=region_prepare_manage(r, cwin, param, cpriority); } if(ph==NULL && MANAGE_PRIORITY_OK(priority, MANAGE_PRIORITY_GROUP)) ph=groupws_do_prepare_manage(ws, cwin, param); if(ph==NULL && b!=NULL && !use_bottom) ph=region_prepare_manage(b, cwin, param, cpriority); return ph; }
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; }
WSplit *load_splitfloat(WTiling *ws, const WRectangle *geom, ExtlTab tab) { WSplit *tl=NULL, *br=NULL; WSplitFloat *split; char *dir_str; int dir, brs, tls; ExtlTab subtab; WRectangle tlg, brg; int set=0; set+=(extl_table_gets_i(tab, "tls", &tls)==TRUE); set+=(extl_table_gets_i(tab, "brs", &brs)==TRUE); set+=(extl_table_gets_s(tab, "dir", &dir_str)==TRUE); if(set!=3) return NULL; if(strcmp(dir_str, "vertical")==0){ dir=SPLIT_VERTICAL; }else if(strcmp(dir_str, "horizontal")==0){ dir=SPLIT_HORIZONTAL; }else{ warn(TR("Invalid direction.")); free(dir_str); return NULL; } free(dir_str); split=create_splitfloat(geom, ws, dir); if(split==NULL) return NULL; if(!extl_table_is_bool_set(tab, "tls_brs_incl_handles")){ if(split->ssplit.dir==SPLIT_HORIZONTAL){ tls+=split->tlpwin->bdw.right; brs+=split->brpwin->bdw.left; }else{ tls+=split->tlpwin->bdw.bottom; brs+=split->brpwin->bdw.top; } } calc_tlg_brg(geom, tls, brs, dir, &tlg, &brg); splitfloat_update_handles(split, &tlg, &brg); if(extl_table_gets_t(tab, "tl", &subtab)){ WRectangle g=tlg; splitfloat_tl_pwin_to_cnt(split, &g); tl=tiling_load_node(ws, &g, subtab); extl_unref_table(subtab); } if(extl_table_gets_t(tab, "br", &subtab)){ WRectangle g; if(tl==NULL){ g=*geom; }else{ g=brg; splitfloat_br_pwin_to_cnt(split, &g); } br=tiling_load_node(ws, &g, subtab); extl_unref_table(subtab); } if(tl==NULL || br==NULL){ destroy_obj((Obj*)split); if(tl!=NULL){ split_do_resize(tl, geom, PRIMN_ANY, PRIMN_ANY, FALSE); return tl; } if(br!=NULL){ split_do_resize(br, geom, PRIMN_ANY, PRIMN_ANY, FALSE); return br; } return NULL; } tl->parent=(WSplitInner*)split; br->parent=(WSplitInner*)split; split->ssplit.tl=tl; split->ssplit.br=br; return (WSplit*)split; }