/* OBJECTOPTION: only display and screen options are supported */ static CompObject * fuseGetObjectFromInode(FuseInode *inode) { CompObject *object; object = compObjectFind(&core.base, COMP_OBJECT_TYPE_DISPLAY, NULL); if (!object) return NULL; if (inode->type & FUSE_INODE_TYPE_SCREEN) { return compObjectFind(object, COMP_OBJECT_TYPE_SCREEN, inode->name + 6); } else if (inode->type & FUSE_INODE_TYPE_DISPLAY) { return object; } return NULL; }
static void sessionSessionEvent (CompCore *c, CompSessionEvent event, CompOption *arguments, unsigned int nArguments) { SESSION_CORE (c); if (event == CompSessionEventSaveYourself) { Bool shutdown, fast, saveSession; int saveType, interactStyle; char *clientId; shutdown = getBoolOptionNamed (arguments, nArguments, "shutdown", FALSE); saveType = getIntOptionNamed (arguments, nArguments, "save_type", SmSaveLocal); interactStyle = getIntOptionNamed (arguments, nArguments, "interact_style", SmInteractStyleNone); fast = getBoolOptionNamed (arguments, nArguments, "fast", FALSE); if (saveType == SmSaveGlobal) { /* ignore global saves, which are used only to make e.g. word processors show a 'do you want to save' dialog on session shutdown */ saveSession = FALSE; } else if (!shutdown && !fast && saveType == SmSaveLocal && interactStyle == SmInteractStyleNone) { /* ignore saveYourself after registering for the first time (SM specification 7.2) */ saveSession = FALSE; } else { saveSession = TRUE; } clientId = getSessionClientId (CompSessionClientId); if (saveSession && clientId) { CompObject *object; object = compObjectFind (&c->base, COMP_OBJECT_TYPE_DISPLAY, NULL); if (object) { CompDisplay *d = (CompDisplay *) object; saveState (d, clientId); } } if (clientId) free (clientId); } UNWRAP (sc, c, sessionEvent); (*c->sessionEvent) (c, event, arguments, nArguments); WRAP (sc, c, sessionEvent, sessionSessionEvent); }
static Bool ccpInitCore (CompPlugin *p, CompCore *c) { CCPCore *cc; CompObject *o; int i; unsigned int *screens; if (!checkPluginABI ("core", CORE_ABIVERSION)) return FALSE; cc = malloc (sizeof (CCPCore)); if (!cc) return FALSE; ccsSetBasicMetadata (TRUE); o = compObjectFind (&core.base, COMP_OBJECT_TYPE_DISPLAY, NULL); if (o) { CompScreen *s; CORE_DISPLAY (o); for (s = d->screens, i = 0; s; s = s->next, i++); screens = calloc (i, sizeof (unsigned int)); if (!screens) { free (cc); return FALSE; } for (s = d->screens, i = 0; s; s = s->next) screens[i++] = s->screenNum; cc->context = ccsContextNew (screens, i); free (screens); } else cc->context = ccsContextNew (NULL, 0); if (!cc->context) { free (cc); return FALSE; } ccsReadSettings (cc->context); cc->context->changedSettings = ccsSettingListFree (cc->context->changedSettings, FALSE); cc->applyingSettings = FALSE; cc->reloadHandle = compAddTimeout (0, 0, ccpReload, 0); cc->timeoutHandle = compAddTimeout (CCP_UPDATE_MIN_TIMEOUT, CCP_UPDATE_MAX_TIMEOUT, ccpTimeout, 0); core.base.privates[corePrivateIndex].ptr = cc; WRAP (cc, c, initPluginForObject, ccpInitPluginForObject); WRAP (cc, c, setOptionForPlugin, ccpSetOptionForPlugin); return TRUE; }
static Bool ccpTimeout (void *closure) { unsigned int flags = 0; CCP_CORE (&core); if (findActivePlugin ("glib")) flags |= ProcessEventsNoGlibMainLoopMask; ccsProcessEvents (cc->context, flags); if (ccsSettingListLength (cc->context->changedSettings)) { CCSSettingList list = cc->context->changedSettings; CCSSettingList l = list; CCSSetting *s; CompObject *object; CompPlugin *p; CompOption *option; int nOption; char tmp[256]; cc->context->changedSettings = NULL; while (l) { s = l->data; l = l->next; if (s->isScreen) { snprintf (tmp, 256, "%d", s->screenNum); object = compObjectFind (&core.base, COMP_OBJECT_TYPE_DISPLAY, NULL); object = compObjectFind (object, COMP_OBJECT_TYPE_SCREEN, tmp); } else { object = compObjectFind (&core.base, COMP_OBJECT_TYPE_DISPLAY, NULL); } if (!object) continue; p = findActivePlugin (s->parent->name); if (!p) continue; option = (*p->vTable->getObjectOptions) (p, object, &nOption); option = compFindOption (option, nOption, s->name, 0); if (option) ccpSetOptionFromContext (object, option, s->parent->name); D (D_FULL, "Setting Update \"%s\"\n", s->name); } ccsSettingListFree (list, FALSE); cc->context->changedSettings = ccsSettingListFree (cc->context->changedSettings, FALSE); } return TRUE; }