X-Git-Url: https://git.decadent.org.uk/gitweb/?p=ion3.git;a=blobdiff_plain;f=ioncore%2Fscreen.c;h=00d675f2f576683323f35ff92ccd3f703f9a4c39;hp=cac75a061b063d51d9fdc97e888b2a0e610ca8c0;hb=20070318;hpb=803afbc1cd633f6c025bcd9537e9b7e9aedadd0d diff --git a/ioncore/screen.c b/ioncore/screen.c index cac75a0..00d675f 100644 --- a/ioncore/screen.c +++ b/ioncore/screen.c @@ -13,7 +13,6 @@ #include #include -#include #include "common.h" #include "global.h" @@ -32,25 +31,18 @@ #include "regbind.h" #include "frame-pointer.h" #include "rectangle.h" -#include "infowin.h" -#include "activity.h" #include "extlconv.h" #include "llist.h" #include "group-ws.h" #include "mplex.h" -#include "tags.h" -#include "gr.h" -#include "gr-util.h" #include "conf.h" +#include "activity.h" +#include "screen-notify.h" WHook *screen_managed_changed_hook=NULL; -static void screen_update_infowin(WScreen *scr); - - - /*{{{ Init/deinit */ @@ -70,7 +62,6 @@ bool screen_init(WScreen *scr, WRootWin *parent, scr->managed_off.h=0; scr->next_scr=NULL; scr->prev_scr=NULL; - scr->rotation=SCREEN_ROTATION_0; watch_init(&(scr->notifywin_watch)); watch_init(&(scr->infowin_watch)); @@ -224,6 +215,9 @@ static void screen_managed_changed(WScreen *scr, int mode, bool sw, n==NULL ? "" : n); } + if(region_is_activity_r((WRegion*)scr)) + screen_update_notifywin(scr); + screen_update_infowin(scr); mplex_call_changed_hook((WMPlex*)scr, @@ -262,218 +256,6 @@ void screen_activated(WScreen *scr) /*}}}*/ -/*}}}*/ - - -/*{{{ Notifications */ - - -static void do_notify(WScreen *scr, Watch *watch, bool right, - const char *str, char *style) -{ - - WInfoWin *iw=(WInfoWin*)(watch->obj); - WFitParams fp; - - if(iw==NULL){ - WMPlexAttachParams param=MPLEXATTACHPARAMS_INIT; - - param.flags=(MPLEX_ATTACH_UNNUMBERED| - MPLEX_ATTACH_SIZEPOLICY| - MPLEX_ATTACH_GEOM| - MPLEX_ATTACH_LEVEL); - param.level=STACKING_LEVEL_ON_TOP; - - if(!right){ - param.szplcy=SIZEPOLICY_GRAVITY_NORTHWEST; - param.geom.x=0; - }else{ - param.szplcy=SIZEPOLICY_GRAVITY_NORTHEAST; - param.geom.x=REGION_GEOM(scr).w-1; - } - - param.geom.y=0; - param.geom.w=1; - param.geom.h=1; - - iw=(WInfoWin*)mplex_do_attach_new(&scr->mplex, ¶m, - (WRegionCreateFn*)create_infowin, - style); - - if(iw==NULL) - return; - - watch_setup(watch, (Obj*)iw, NULL); - } - - infowin_set_text(iw, str); -} - - -void screen_notify(WScreen *scr, const char *str) -{ - do_notify(scr, &scr->notifywin_watch, FALSE, str, "actnotify"); -} - - -void screen_windowinfo(WScreen *scr, const char *str) -{ - do_notify(scr, &scr->infowin_watch, TRUE, str, "tab-info"); -} - - -void screen_unnotify(WScreen *scr) -{ - Obj *iw=scr->notifywin_watch.obj; - if(iw!=NULL){ - watch_reset(&(scr->notifywin_watch)); - region_dispose((WRegion*)iw, FALSE); - } -} - - -void screen_nowindowinfo(WScreen *scr) -{ - Obj *iw=scr->infowin_watch.obj; - if(iw!=NULL){ - watch_reset(&(scr->infowin_watch)); - region_dispose((WRegion*)iw, FALSE); - } -} - - -static char *addnot(char *str, WRegion *reg) -{ - const char *nm=region_name(reg); - char *nstr=NULL; - - if(nm==NULL) - return str; - - if(str==NULL) - return scat(TR("act: "), nm); - - nstr=scat3(str, ", ", nm); - if(nstr!=NULL) - free(str); - return nstr; -} - - -static char *screen_managed_activity(WScreen *scr) -{ - char *notstr=NULL; - WMPlexIterTmp tmp; - WRegion *reg; - - FOR_ALL_MANAGED_BY_MPLEX(&scr->mplex, reg, tmp){ - if(region_is_activity_r(reg) && !REGION_IS_MAPPED(reg)) - notstr=addnot(notstr, reg); - } - - return notstr; -} - - -static void screen_notify_activity(WScreen *scr) -{ - if(ioncore_g.screen_notify){ - char *notstr=screen_managed_activity(scr); - if(notstr!=NULL){ - screen_notify(scr, notstr); - free(notstr); - return; - } - } - - screen_unnotify(scr); - - screen_update_infowin(scr); -} - - -static void screen_notify_tag(WScreen *scr) -{ - screen_update_infowin(scr); -} - - -GR_DEFATTR(active); -GR_DEFATTR(inactive); -GR_DEFATTR(selected); -GR_DEFATTR(tagged); -GR_DEFATTR(not_tagged); -GR_DEFATTR(not_dragged); -GR_DEFATTR(activity); -GR_DEFATTR(no_activity); - - -static void init_attr() -{ - GR_ALLOCATTR_BEGIN; - GR_ALLOCATTR(active); - GR_ALLOCATTR(inactive); - GR_ALLOCATTR(selected); - GR_ALLOCATTR(tagged); - GR_ALLOCATTR(not_tagged); - GR_ALLOCATTR(not_dragged); - GR_ALLOCATTR(no_activity); - GR_ALLOCATTR(activity); - GR_ALLOCATTR_END; -} - - -static void screen_update_infowin(WScreen *scr) -{ - WRegion *reg=mplex_mx_current(&(scr->mplex)); - bool tag=(reg!=NULL && region_is_tagged(reg)); - bool act=(reg!=NULL && region_is_activity_r(reg) && !REGION_IS_ACTIVE(scr)); - bool sac=REGION_IS_ACTIVE(scr); - - if(tag || act){ - const char *n=region_displayname(reg); - WInfoWin *iw; - - screen_windowinfo(scr, n); - - iw=(WInfoWin*)scr->infowin_watch.obj; - - if(iw!=NULL){ - GrStyleSpec *spec=infowin_stylespec(iw); - - init_attr(); - - gr_stylespec_unalloc(spec); - - gr_stylespec_set(spec, GR_ATTR(selected)); - gr_stylespec_set(spec, GR_ATTR(not_dragged)); - gr_stylespec_set(spec, sac ? GR_ATTR(active) : GR_ATTR(inactive)); - gr_stylespec_set(spec, tag ? GR_ATTR(tagged) : GR_ATTR(not_tagged)); - gr_stylespec_set(spec, act ? GR_ATTR(activity) : GR_ATTR(no_activity)); - } - - }else{ - screen_nowindowinfo(scr); - } -} - - -static void screen_managed_notify(WScreen *scr, WRegion *reg, WRegionNotify how) -{ - if(how==ioncore_g.notifies.sub_activity){ - /* TODO: multiple calls */ - mainloop_defer_action((Obj*)scr, - (WDeferredAction*)screen_notify_activity); - }else if(how==ioncore_g.notifies.tag){ - mainloop_defer_action((Obj*)scr, - (WDeferredAction*)screen_notify_tag); - } -} - - -/*}}}*/ - - /*{{{ Misc. */ @@ -583,32 +365,33 @@ int screen_id(WScreen *scr) } -static bool screen_managed_may_destroy(WScreen *scr, WRegion *reg) +static WRegion *screen_managed_disposeroot(WScreen *scr, WRegion *reg) { - bool onmxlist=FALSE; + bool onmxlist=FALSE, others=FALSE; WLListNode *lnode; WLListIterTmp tmp; - - if(OBJ_IS(reg, WClientWin)) - return TRUE; - FOR_ALL_NODES_ON_LLIST(lnode, scr->mplex.mx_list, tmp){ - if(lnode->st->reg==reg) - onmxlist=TRUE; - else /*if(OBJ_IS(node->reg, WGenWS))*/ - return TRUE; + if(OBJ_IS(reg, WGroupWS)){ + FOR_ALL_NODES_ON_LLIST(lnode, scr->mplex.mx_list, tmp){ + if(lnode->st->reg==reg){ + onmxlist=TRUE; + }else if(OBJ_IS(lnode->st->reg, WGroupWS)){ + others=TRUE; + break; + } + } + + if(onmxlist && !others){ + warn(TR("Only workspace may not be destroyed/detached.")); + return NULL; + } } - if(!onmxlist) - return TRUE; - - warn(TR("Only workspace may not be destroyed.")); - - return FALSE; + return reg; } -static bool screen_may_destroy(WScreen *scr) +static bool screen_may_dispose(WScreen *scr) { warn(TR("Screens may not be destroyed.")); return FALSE; @@ -651,13 +434,6 @@ err: } -WPHolder *screen_get_rescue_pholder_for(WScreen *scr, WRegion *mgd) -{ -#warning "TODO: better special case handling for groups" - - return (WPHolder*)mplex_get_rescue_pholder_for(&(scr->mplex), mgd); -} - /*}}}*/ @@ -733,11 +509,11 @@ static DynFunTab screen_dynfuntab[]={ {region_inactivated, screen_inactivated}, - {(DynFun*)region_managed_may_destroy, - (DynFun*)screen_managed_may_destroy}, + {(DynFun*)region_managed_disposeroot, + (DynFun*)screen_managed_disposeroot}, - {(DynFun*)region_may_destroy, - (DynFun*)screen_may_destroy}, + {(DynFun*)region_may_dispose, + (DynFun*)screen_may_dispose}, {mplex_managed_changed, screen_managed_changed}, @@ -757,9 +533,6 @@ static DynFunTab screen_dynfuntab[]={ {(DynFun*)region_fitrep, (DynFun*)screen_fitrep}, - {(DynFun*)region_get_rescue_pholder_for, - (DynFun*)screen_get_rescue_pholder_for}, - END_DYNFUNTAB };