Esempio n. 1
0
File: fuse.c Progetto: zmike/compiz
/* 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;
}