예제 #1
0
static void waterHandleMotionEvent(CompDisplay * d, Window root)
{
	CompScreen *s;

	s = findScreenAtDisplay(d, root);
	if (s) {
		WATER_SCREEN(s);

		if (ws->grabIndex) {
			XPoint p[2];

			p[0].x = waterLastPointerX;
			p[0].y = waterLastPointerY;

			p[1].x = waterLastPointerX = pointerX;
			p[1].y = waterLastPointerY = pointerY;

			waterVertices(s, GL_LINES, p, 2, 0.2f);

			damageScreen(s);
		}
	}
}
예제 #2
0
파일: fade.c 프로젝트: zmike/compiz
static void
fadeAddDisplayModal(CompDisplay *d,
                    CompWindow *w)
{
   FADE_DISPLAY(d);
   FADE_WINDOW(w);

   if (!(w->state & CompWindowStateDisplayModalMask))
     return;

   if (fw->dModal)
     return;

   fw->dModal = 1;

   fd->displayModals++;
   if (fd->displayModals == 1)
     {
        CompScreen *s;
        for (s = d->screens; s; s = s->next)
          damageScreen(s);
     }
}
예제 #3
0
static Bool
snowToggle (CompDisplay     *d,
	    CompAction      *action,
	    CompActionState state,
	    CompOption      *option,
	    int             nOption)
{
    CompScreen *s;
    Window     xid;

    xid = getIntOptionNamed (option, nOption, "root", 0);
    s = findScreenAtDisplay (d, xid);

    if (s)
    {
	SNOW_SCREEN (s);
	ss->active = !ss->active;
	if (!ss->active)
	    damageScreen (s);
    }

    return TRUE;
}
예제 #4
0
static void waterHandleEvent(CompDisplay * d, XEvent * event)
{
	CompScreen *s;

	WATER_DISPLAY(d);

	switch (event->type) {
	case ButtonPress:
		s = findScreenAtDisplay(d, event->xbutton.root);
		if (s) {
			WATER_SCREEN(s);

			if (ws->grabIndex) {
				XPoint p;

				p.x = pointerX;
				p.y = pointerY;

				waterVertices(s, GL_POINTS, &p, 1, 0.8f);
				damageScreen(s);
			}
		}
		break;
	case EnterNotify:
	case LeaveNotify:
		waterHandleMotionEvent(d, event->xcrossing.root);
		break;
	case MotionNotify:
		waterHandleMotionEvent(d, event->xmotion.root);
	default:
		break;
	}

	UNWRAP(wd, d, handleEvent);
	(*d->handleEvent) (d, event);
	WRAP(wd, d, handleEvent, waterHandleEvent);
}
예제 #5
0
static void
shotHandleMotionEvent (CompScreen *s,
                       int        xRoot,
                       int        yRoot)
{
	SHOT_SCREEN (s);

	/* update screenshot rectangle size */

	if (ss->grabIndex)
	{
		REGION reg;

		reg.rects    = &reg.extents;
		reg.numRects = 1;

		reg.extents.x1 = MIN (ss->x1, ss->x2) - 1;
		reg.extents.y1 = MIN (ss->y1, ss->y2) - 1;
		reg.extents.x2 = MAX (ss->x1, ss->x2) + 1;
		reg.extents.y2 = MAX (ss->y1, ss->y2) + 1;

		damageScreenRegion (s, &reg);

		ss->x2 = xRoot;
		ss->y2 = yRoot;

		reg.extents.x1 = MIN (ss->x1, ss->x2) - 1;
		reg.extents.y1 = MIN (ss->y1, ss->y2) - 1;
		reg.extents.x2 = MAX (ss->x1, ss->x2) + 1;
		reg.extents.y2 = MAX (ss->y1, ss->y2) + 1;

		damageScreenRegion (s, &reg);

		damageScreen (s);
	}
}
예제 #6
0
파일: fade.c 프로젝트: zmike/compiz
static void
fadeHandleEvent(CompDisplay *d,
                XEvent *event)
{
   CompWindow *w;

   FADE_DISPLAY(d);

   switch (event->type)
     {
      case DestroyNotify:
        w = findWindowAtDisplay(d, event->xdestroywindow.window);
        if (w)
          {
             FADE_SCREEN(w->screen);

             if (w->texture->pixmap && isFadeWinForOpenClose(w) &&
                 matchEval(&fs->match, w))
               {
                  FADE_WINDOW(w);

                  if (fw->opacity == 0xffff)
                    fw->opacity = 0xfffe;

                  fw->destroyCnt++;
                  w->destroyRefCnt++;

                  fw->fadeOut = TRUE;

                  addWindowDamage(w);
               }

             fadeRemoveDisplayModal(d, w);
          }
        break;

      case UnmapNotify:
        w = findWindowAtDisplay(d, event->xunmap.window);
        if (w)
          {
             FADE_SCREEN(w->screen);
             FADE_WINDOW(w);

             fw->shaded = w->shaded;

             if (fs->opt[FADE_SCREEN_OPTION_MINIMIZE_OPEN_CLOSE].value.b &&
                 !fd->suppressMinimizeOpenClose &&
                 !fw->shaded && w->texture->pixmap &&
                 matchEval(&fs->match, w))
               {
                  if (fw->opacity == 0xffff)
                    fw->opacity = 0xfffe;

                  fw->unmapCnt++;
                  w->unmapRefCnt++;

                  fw->fadeOut = TRUE;

                  addWindowDamage(w);
               }

             fadeRemoveDisplayModal(d, w);
          }
        break;

      case MapNotify:
        w = findWindowAtDisplay(d, event->xmap.window);
        if (w)
          {
             FADE_SCREEN(w->screen);

             if (fs->opt[FADE_SCREEN_OPTION_MINIMIZE_OPEN_CLOSE].value.b &&
                 !fd->suppressMinimizeOpenClose)
               {
                  fadeWindowStop(w);
               }
             if (w->state & CompWindowStateDisplayModalMask)
               fadeAddDisplayModal(d, w);
          }
        break;

      default:
        if (event->type == d->xkbEvent)
          {
             XkbAnyEvent *xkbEvent = (XkbAnyEvent *)event;

             if (xkbEvent->xkb_type == XkbBellNotify)
               {
                  XkbBellNotifyEvent *xkbBellEvent = (XkbBellNotifyEvent *)
                    xkbEvent;

                  w = findWindowAtDisplay(d, xkbBellEvent->window);
                  if (!w)
                    w = findWindowAtDisplay(d, d->activeWindow);

                  if (w)
                    {
                       CompScreen *s = w->screen;

                       FADE_SCREEN(s);

                       if (fs->opt[FADE_SCREEN_OPTION_VISUAL_BELL].value.b)
                         {
                            int option;

                            option = FADE_SCREEN_OPTION_FULLSCREEN_VISUAL_BELL;
                            if (fs->opt[option].value.b)
                              {
                                 for (w = s->windows; w; w = w->next)
                                   {
                                      if (w->destroyed)
                                        continue;

                                      if (w->attrib.map_state != IsViewable)
                                        continue;

                                      if (w->damaged)
                                        {
                                           FADE_WINDOW(w);

                                           fw->brightness = w->paint.brightness / 2;
                                        }
                                   }

                                 damageScreen(s);
                              }
                            else
                              {
                                 FADE_WINDOW(w);

                                 fw->brightness = w->paint.brightness / 2;

                                 addWindowDamage(w);
                              }
                         }
                    }
               }
          }
        break;
     }

   UNWRAP(fd, d, handleEvent);
   (*d->handleEvent)(d, event);
   WRAP(fd, d, handleEvent, fadeHandleEvent);

   switch (event->type)
     {
      case PropertyNotify:
        if (event->xproperty.atom == d->winStateAtom)
          {
             w = findWindowAtDisplay(d, event->xproperty.window);
             if (w && w->attrib.map_state == IsViewable)
               {
                  if (w->state & CompWindowStateDisplayModalMask)
                    fadeAddDisplayModal(d, w);
                  else
                    fadeRemoveDisplayModal(d, w);
               }
          }
        break;

      case ClientMessage:
        if (event->xclient.message_type == d->wmProtocolsAtom &&
            event->xclient.data.l[0] == d->wmPingAtom)
          {
             w = findWindowAtDisplay(d, event->xclient.data.l[2]);
             if (w)
               {
                  FADE_WINDOW(w);

                  if (w->alive != fw->alive)
                    {
                       addWindowDamage(w);
                       fw->alive = w->alive;
                    }
               }
          }
     }
}
예제 #7
0
파일: zoom.c 프로젝트: zmike/compiz
static void
zoomHandleMotionEvent(CompScreen *s,
                      int xRoot,
                      int yRoot)
{
   ZOOM_SCREEN(s);

   if (zs->grabIndex)
     {
        int output = zs->zoomOutput;
        ZoomBox box;
        float scale, oWidth = s->outputDev[output].width;

        zoomGetCurrentZoom(s, output, &box);

        if (zs->zoomed & (1 << output))
          scale = oWidth / (box.x2 - box.x1);
        else
          scale = 1.0f;

        if (zs->panGrabIndex)
          {
             float dx, dy;

             dx = (xRoot - lastPointerX) / scale;
             dy = (yRoot - lastPointerY) / scale;

             box.x1 -= dx;
             box.y1 -= dy;
             box.x2 -= dx;
             box.y2 -= dy;

             if (box.x1 < s->outputDev[output].region.extents.x1)
               {
                  box.x2 += s->outputDev[output].region.extents.x1 - box.x1;
                  box.x1 = s->outputDev[output].region.extents.x1;
               }
             else if (box.x2 > s->outputDev[output].region.extents.x2)
               {
                  box.x1 -= box.x2 - s->outputDev[output].region.extents.x2;
                  box.x2 = s->outputDev[output].region.extents.x2;
               }

             if (box.y1 < s->outputDev[output].region.extents.y1)
               {
                  box.y2 += s->outputDev[output].region.extents.y1 - box.y1;
                  box.y1 = s->outputDev[output].region.extents.y1;
               }
             else if (box.y2 > s->outputDev[output].region.extents.y2)
               {
                  box.y1 -= box.y2 - s->outputDev[output].region.extents.y2;
                  box.y2 = s->outputDev[output].region.extents.y2;
               }

             zs->current[output] = box;

             damageScreen(s);
          }
        else
          {
             int x1, y1;

             if (zs->zoomed & (1 << output))
               {
                  x1 = box.x1;
                  y1 = box.y1;
               }
             else
               {
                  x1 = s->outputDev[output].region.extents.x1;
                  y1 = s->outputDev[output].region.extents.y1;
               }

             zs->x2 = x1 +
               ((xRoot - s->outputDev[output].region.extents.x1) /
                scale + 0.5f);
             zs->y2 = y1 +
               ((yRoot - s->outputDev[output].region.extents.y1) /
                scale + 0.5f);

             damageScreen(s);
          }
     }
}
예제 #8
0
파일: zoom.c 프로젝트: zmike/compiz
static Bool
zoomInitiate(CompDisplay *d,
             CompAction *action,
             CompActionState state,
             CompOption *option,
             int nOption)
{
   CompScreen *s;
   Window xid;

   xid = getIntOptionNamed(option, nOption, "root", 0);

   s = findScreenAtDisplay(d, xid);
   if (s)
     {
        int output, x1, y1;
        float scale;

        ZOOM_SCREEN(s);

        if (otherScreenGrabExist(s, "zoom", NULL))
          return FALSE;

        if (!zs->grabIndex)
          zs->grabIndex = pushScreenGrab(s, None, "zoom");

        if (state & CompActionStateInitButton)
          action->state |= CompActionStateTermButton;

        /* start selection zoom rectangle */

        output = outputDeviceForPoint(s, pointerX, pointerY);

        if (zs->zoomed & (1 << output))
          {
             ZoomBox box;
             float oWidth;

             zoomGetCurrentZoom(s, output, &box);

             oWidth = s->outputDev[output].width;
             scale = oWidth / (box.x2 - box.x1);

             x1 = box.x1;
             y1 = box.y1;
          }
        else
          {
             scale = 1.0f;
             x1 = s->outputDev[output].region.extents.x1;
             y1 = s->outputDev[output].region.extents.y1;
          }

        zs->x1 = zs->x2 = x1 +
            ((pointerX - s->outputDev[output].region.extents.x1) /
             scale + 0.5f);
        zs->y1 = zs->y2 = y1 +
            ((pointerY - s->outputDev[output].region.extents.y1) /
             scale + 0.5f);

        zs->zoomOutput = output;

        zs->grab = TRUE;

        damageScreen(s);

        return TRUE;
     }

   return FALSE;
}
예제 #9
0
파일: zoom.c 프로젝트: zmike/compiz
static void
zoomInitiateForSelection(CompScreen *s,
                         int output)
{
   int tmp;

   ZOOM_SCREEN(s);

   if (zs->x1 > zs->x2)
     {
        tmp = zs->x1;
        zs->x1 = zs->x2;
        zs->x2 = tmp;
     }

   if (zs->y1 > zs->y2)
     {
        tmp = zs->y1;
        zs->y1 = zs->y2;
        zs->y2 = tmp;
     }

   if (zs->x1 < zs->x2 && zs->y1 < zs->y2)
     {
        float oWidth, oHeight;
        float xScale, yScale, scale;
        BoxRec box;
        int cx, cy;
        int width, height;

        oWidth = s->outputDev[output].width;
        oHeight = s->outputDev[output].height;

        cx = (int)((zs->x1 + zs->x2) / 2.0f + 0.5f);
        cy = (int)((zs->y1 + zs->y2) / 2.0f + 0.5f);

        width = zs->x2 - zs->x1;
        height = zs->y2 - zs->y1;

        xScale = oWidth / width;
        yScale = oHeight / height;

        scale = MAX(MIN(xScale, yScale), 1.0f);

        box.x1 = cx - (oWidth / scale) / 2.0f;
        box.y1 = cy - (oHeight / scale) / 2.0f;
        box.x2 = cx + (oWidth / scale) / 2.0f;
        box.y2 = cy + (oHeight / scale) / 2.0f;

        if (box.x1 < s->outputDev[output].region.extents.x1)
          {
             box.x2 += s->outputDev[output].region.extents.x1 - box.x1;
             box.x1 = s->outputDev[output].region.extents.x1;
          }
        else if (box.x2 > s->outputDev[output].region.extents.x2)
          {
             box.x1 -= box.x2 - s->outputDev[output].region.extents.x2;
             box.x2 = s->outputDev[output].region.extents.x2;
          }

        if (box.y1 < s->outputDev[output].region.extents.y1)
          {
             box.y2 += s->outputDev[output].region.extents.y1 - box.y1;
             box.y1 = s->outputDev[output].region.extents.y1;
          }
        else if (box.y2 > s->outputDev[output].region.extents.y2)
          {
             box.y1 -= box.y2 - s->outputDev[output].region.extents.y2;
             box.y2 = s->outputDev[output].region.extents.y2;
          }

        if (zs->zoomed & (1 << output))
          {
             zoomGetCurrentZoom(s, output, &zs->last[output]);
          }
        else
          {
             zs->last[output].x1 = s->outputDev[output].region.extents.x1;
             zs->last[output].y1 = s->outputDev[output].region.extents.y1;
             zs->last[output].x2 = s->outputDev[output].region.extents.x2;
             zs->last[output].y2 = s->outputDev[output].region.extents.y2;
          }

        zs->current[output].x1 = box.x1;
        zs->current[output].y1 = box.y1;
        zs->current[output].x2 = box.x2;
        zs->current[output].y2 = box.y2;

        zs->scale = 0.0f;
        zs->adjust = TRUE;
        zs->zoomOutput = output;
        zs->zoomed |= (1 << output);

        damageScreen(s);
     }
}
예제 #10
0
/*
 * groupHandleButtonReleaseEvent
 *
 */
static void
groupHandleButtonReleaseEvent (CompScreen *s,
                               XEvent     *event)
{
	GroupSelection *group;
	int vx, vy;
	Region newRegion;
	Bool inserted = FALSE;
	Bool wasInTabBar = FALSE;

	GROUP_SCREEN (s);

	if (event->xbutton.button != 1)
		return;

	if (!gs->draggedSlot)
		return;

	if (!gs->dragged)
	{
		groupChangeTab (gs->draggedSlot, RotateUncertain);
		gs->draggedSlot = NULL;

		if (gs->grabState == ScreenGrabTabDrag)
			groupGrabScreen (s, ScreenGrabNone);

		return;
	}

	GROUP_WINDOW (gs->draggedSlot->window);

	newRegion = XCreateRegion ();
	if (!newRegion)
		return;

	XUnionRegion (newRegion, gs->draggedSlot->region, newRegion);

	groupGetDrawOffsetForSlot (gs->draggedSlot, &vx, &vy);
	XOffsetRegion (newRegion, vx, vy);

	for (group = gs->groups; group; group = group->next)
	{
		Bool inTabBar;
		Region clip, buf;
		GroupTabBarSlot *slot;

		if (!group->tabBar || !HAS_TOP_WIN (group))
			continue;

		/* create clipping region */
		clip = groupGetClippingRegion (TOP_TAB (group));
		if (!clip)
			continue;

		buf = XCreateRegion ();
		if (!buf)
		{
			XDestroyRegion (clip);
			continue;
		}

		XIntersectRegion (newRegion, group->tabBar->region, buf);
		XSubtractRegion (buf, clip, buf);
		XDestroyRegion (clip);

		inTabBar = !XEmptyRegion (buf);
		XDestroyRegion (buf);

		if (!inTabBar)
			continue;

		wasInTabBar = TRUE;

		for (slot = group->tabBar->slots; slot; slot = slot->next)
		{
			GroupTabBarSlot *tmpDraggedSlot;
			GroupSelection  *tmpGroup;
			Region slotRegion, buf;
			XRectangle rect;
			Bool inSlot;

			if (slot == gs->draggedSlot)
				continue;

			slotRegion = XCreateRegion ();
			if (!slotRegion)
				continue;

			if (slot->prev && slot->prev != gs->draggedSlot)
			{
				rect.x = slot->prev->region->extents.x2;
			}
			else if (slot->prev && slot->prev == gs->draggedSlot &&
			         gs->draggedSlot->prev)
			{
				rect.x = gs->draggedSlot->prev->region->extents.x2;
			}
			else
				rect.x = group->tabBar->region->extents.x1;

			rect.y = slot->region->extents.y1;

			if (slot->next && slot->next != gs->draggedSlot)
			{
				rect.width = slot->next->region->extents.x1 - rect.x;
			}
			else if (slot->next && slot->next == gs->draggedSlot &&
			         gs->draggedSlot->next)
			{
				rect.width = gs->draggedSlot->next->region->extents.x1 - rect.x;
			}
			else
				rect.width = group->tabBar->region->extents.x2;

			rect.height = slot->region->extents.y2 - slot->region->extents.y1;

			XUnionRectWithRegion (&rect, slotRegion, slotRegion);

			buf = XCreateRegion ();
			if (!buf)
				continue;

			XIntersectRegion (newRegion, slotRegion, buf);
			inSlot = !XEmptyRegion (buf);

			XDestroyRegion (buf);
			XDestroyRegion (slotRegion);

			if (!inSlot)
				continue;

			tmpDraggedSlot = gs->draggedSlot;

			if (group != gw->group)
			{
				CompWindow     *w = gs->draggedSlot->window;
				GroupSelection *tmpGroup = gw->group;
				int oldPosX = WIN_CENTER_X (w);
				int oldPosY = WIN_CENTER_Y (w);

				/* if the dragged window is not the top tab,
				   move it onscreen */
				if (tmpGroup->topTab && !IS_TOP_TAB (w, tmpGroup))
				{
					CompWindow *tw = TOP_TAB (tmpGroup);

					oldPosX = WIN_CENTER_X (tw) + gw->mainTabOffset.x;
					oldPosY = WIN_CENTER_Y (tw) + gw->mainTabOffset.y;

					groupSetWindowVisibility (w, TRUE);
				}

				/* Change the group. */
				groupDeleteGroupWindow (gs->draggedSlot->window);
				groupAddWindowToGroup (gs->draggedSlot->window, group, 0);

				/* we saved the original center position in oldPosX/Y before -
				   now we should apply that to the new main tab offset */
				if (HAS_TOP_WIN (group))
				{
					CompWindow *tw = TOP_TAB (group);
					gw->mainTabOffset.x = oldPosX - WIN_CENTER_X (tw);
					gw->mainTabOffset.y = oldPosY - WIN_CENTER_Y (tw);
				}
			}
			else
				groupUnhookTabBarSlot (group->tabBar, gs->draggedSlot, TRUE);

			gs->draggedSlot = NULL;
			gs->dragged = FALSE;
			inserted = TRUE;

			if ((tmpDraggedSlot->region->extents.x1 +
			     tmpDraggedSlot->region->extents.x2 + (2 * vx)) / 2 >
			    (slot->region->extents.x1 + slot->region->extents.x2) / 2)
			{
				groupInsertTabBarSlotAfter (group->tabBar,
				                            tmpDraggedSlot, slot);
			}
			else
				groupInsertTabBarSlotBefore (group->tabBar,
				                             tmpDraggedSlot, slot);

			groupDamageTabBarRegion (group);

			/* Hide tab-bars. */
			for (tmpGroup = gs->groups; tmpGroup; tmpGroup = tmpGroup->next)
			{
				if (group == tmpGroup)
					groupTabSetVisibility (tmpGroup, TRUE, 0);
				else
					groupTabSetVisibility (tmpGroup, FALSE, PERMANENT);
			}

			break;
		}

		if (inserted)
			break;
	}

	XDestroyRegion (newRegion);

	if (!inserted)
	{
		CompWindow     *draggedSlotWindow = gs->draggedSlot->window;
		GroupSelection *tmpGroup;

		for (tmpGroup = gs->groups; tmpGroup; tmpGroup = tmpGroup->next)
			groupTabSetVisibility (tmpGroup, FALSE, PERMANENT);

		gs->draggedSlot = NULL;
		gs->dragged = FALSE;

		const BananaValue *
		option_dnd_ungroup_window = bananaGetOption (bananaIndex,
		                                             "dnd_ungroup_window",
		                                             s->screenNum);

		if (option_dnd_ungroup_window->b && !wasInTabBar)
		{
			groupRemoveWindowFromGroup (draggedSlotWindow);
		}
		else if (gw->group && gw->group->topTab)
		{
			groupRecalcTabBarPos (gw->group,
			                      (gw->group->tabBar->region->extents.x1 +
			                       gw->group->tabBar->region->extents.x2) / 2,
			                      gw->group->tabBar->region->extents.x1,
			                      gw->group->tabBar->region->extents.x2);
		}

		/* to remove the painted slot */
		damageScreen (s);
	}

	if (gs->grabState == ScreenGrabTabDrag)
		groupGrabScreen (s, ScreenGrabNone);

	if (gs->dragHoverTimeoutHandle)
	{
		compRemoveTimeout (gs->dragHoverTimeoutHandle);
		gs->dragHoverTimeoutHandle = 0;
	}
}
static void
elementsDisplayOptionChanged (CompDisplay        *d,
			  CompOption         *opt,
			  ElementsDisplayOptions num)
{
	E_DISPLAY (d);
	switch (num)
	{
		case ElementsDisplayOptionToggleAutumnCheck:
		{
			Bool useKeys = FALSE;
			CompScreen *s;
			for (s = d->screens; s; s = s->next)
			{
				E_SCREEN (s);
				useKeys = eScreen->useKeys;
				if (!useKeys)
				{
					eScreen->isActive[0] = elementsGetToggleAutumnCheck(s->display);
					damageScreen (s);
					eScreen->needUpdate = TRUE;
				}
			}
			if (!useKeys)
				createAll( d );
		}
		break;
		case ElementsDisplayOptionToggleFirefliesCheck:
		{
			Bool useKeys = FALSE;
			CompScreen *s;
			for (s = d->screens; s; s = s->next)
			{
				E_SCREEN (s);
				useKeys = eScreen->useKeys;
				if (!useKeys)
				{
					eScreen->isActive[1] = elementsGetToggleFirefliesCheck(s->display);
					damageScreen (s);
					eScreen->needUpdate = TRUE;
				}
			}
			if (!useKeys)
				createAll( d );
		}
		break;
		case ElementsDisplayOptionToggleSnowCheck:
		{
			Bool useKeys = FALSE;
			CompScreen *s;
			for (s = d->screens; s; s = s->next)
			{
				E_SCREEN (s);
				useKeys = eScreen->useKeys;
				if (!useKeys)
				{
					eScreen->isActive[2] = elementsGetToggleSnowCheck(s->display);
					damageScreen (s);
					eScreen->needUpdate = TRUE;
				}
			}
			if (!useKeys)
			createAll( d );
		}
		break;
		case ElementsDisplayOptionToggleStarsCheck:
		{
			Bool useKeys = FALSE;
			CompScreen *s;
			for (s = d->screens; s; s = s->next)
			{
				E_SCREEN (s);
				useKeys = eScreen->useKeys;
				if (!useKeys)
				{
					eScreen->isActive[3] = elementsGetToggleStarsCheck(s->display);
					damageScreen (s);
					eScreen->needUpdate = TRUE;
				}
			}
			if (!useKeys)
				createAll( d );
		}
		break;
		case ElementsDisplayOptionToggleBubblesCheck:
		{
			Bool useKeys = FALSE;
			CompScreen *s;
			for (s = d->screens; s; s = s->next)
			{
				E_SCREEN (s);
				useKeys = eScreen->useKeys;
				if (!useKeys)
				{
					eScreen->isActive[4] = elementsGetToggleBubblesCheck(s->display);
					damageScreen (s);
					eScreen->needUpdate = TRUE;
				}
			}
			if (!useKeys)
			createAll( d );
		}
		break;
		case ElementsDisplayOptionToggle:
		{
			CompScreen *s;

			for (s = d->screens; s; s = s->next)
			{
				E_SCREEN (s);
				eScreen->useKeys = elementsGetToggle(d);
				if (!eScreen->useKeys)
				{
					eScreen->isActive[0] = elementsGetToggleAutumnCheck(s->display);
					eScreen->isActive[1] = elementsGetToggleFirefliesCheck(s->display);
					eScreen->isActive[2] = elementsGetToggleSnowCheck(s->display);
					eScreen->isActive[3] = elementsGetToggleStarsCheck(s->display);
					eScreen->isActive[4] = elementsGetToggleBubblesCheck(s->display);
					createAll( d);
				}
				damageScreen (s);
			}
		}
		break;
		case ElementsDisplayOptionLeafSize:
		{
			CompScreen *s;

			for (s = d->screens; s; s = s->next)
			{
				E_SCREEN (s);
				eScreen->needUpdate = TRUE;
				updateElementTextures (s, FALSE);
			}
		}
		break;
		case ElementsDisplayOptionBubblesSize:
		{
			CompScreen *s;

			for (s = d->screens; s; s = s->next)
			{
				E_SCREEN (s);
				eScreen->needUpdate = TRUE;
				updateElementTextures (s, FALSE);
			}
		}

		break;
		case ElementsDisplayOptionSnowSize:
		{
			CompScreen *s;

			for (s = d->screens; s; s = s->next)
			{
				E_SCREEN (s);
				eScreen->needUpdate = TRUE;
				updateElementTextures (s, FALSE);
			}
		}
		break;
		case ElementsDisplayOptionSnowSway:
		{
			createAll( d );
		}
		break;
		case ElementsDisplayOptionStarsSize:
		{
			CompScreen *s;

			for (s = d->screens; s; s = s->next)
			{
				E_SCREEN (s);
				eScreen->needUpdate = TRUE;
				updateElementTextures (s, FALSE);
			}
		}
		break;
		case ElementsDisplayOptionFireflySize:
		{
			CompScreen *s;
			for (s = d->screens; s; s = s->next)
			{
				E_SCREEN (s);
				eScreen->needUpdate = TRUE;
				updateElementTextures (s, FALSE);
			}
		}
		break;
		case ElementsDisplayOptionNumLeaves:
		{
			createAll( d );
		}
		break;
		case ElementsDisplayOptionNumBubbles:
		{
			createAll( d );
		}
		break;

		case ElementsDisplayOptionAutumnSway:
		{
			createAll( d );
		}
		break;
		case ElementsDisplayOptionNumFireflies:
		{
			createAll( d );
		}
		break;
		case ElementsDisplayOptionNumSnowflakes:
		{
			createAll( d );
		}
		break;
		case ElementsDisplayOptionNumStars:
		{
			createAll( d );
		}
		break;
		case ElementsDisplayOptionLeafTextures:
		{
			CompScreen *s;
			CompOption *texAutOpt;
			texAutOpt = elementsGetLeafTexturesOption (d);
			ed->texFiles[0] = texAutOpt->value.list.value;
			ed->numTex[0] = texAutOpt->value.list.nValue;
			for (s = d->screens; s; s = s->next)
				updateElementTextures (s, TRUE);
		}
		break;
		case ElementsDisplayOptionBubblesTextures:
		{
			CompScreen *s;
			CompOption *texBubblesOpt;
			texBubblesOpt = elementsGetBubblesTexturesOption (d);
			ed->texFiles[4] = texBubblesOpt->value.list.value;
			ed->numTex[4] = texBubblesOpt->value.list.nValue;
			for (s = d->screens; s; s = s->next)
				updateElementTextures (s, TRUE);
		}
		break;
		case ElementsDisplayOptionFirefliesTextures:
		{
			CompScreen *s;
			CompOption *texFfOpt;

			texFfOpt = elementsGetFirefliesTexturesOption (d);

			ed->texFiles[1] = texFfOpt->value.list.value;
			ed->numTex[1] = texFfOpt->value.list.nValue;

			for (s = d->screens; s; s = s->next)
				updateElementTextures (s, TRUE);
		}
		break;
		case ElementsDisplayOptionSnowTextures:
		{
			CompScreen *s;
			CompOption *texSnowOpt;

			texSnowOpt = elementsGetSnowTexturesOption (d);

			ed->texFiles[2] = texSnowOpt->value.list.value;
			ed->numTex[2] = texSnowOpt->value.list.nValue;

			for (s = d->screens; s; s = s->next)
				updateElementTextures (s, TRUE);
		}
		break;
		case ElementsDisplayOptionStarsTextures:
		{
			CompScreen *s;
			CompOption *texStarsOpt;

			texStarsOpt = elementsGetStarsTexturesOption (d);
			ed->texFiles[3] = texStarsOpt->value.list.value;
			ed->numTex[3] = texStarsOpt->value.list.nValue;

			for (s = d->screens; s; s = s->next)
				updateElementTextures (s, TRUE);

		}
		break;
		default:
		break;
	}
}
static void
ringHandleEvent (CompDisplay *d,
		 XEvent      *event)
{
    CompScreen *s;
    CompWindow *w = NULL;

    switch (event->type) {
    case DestroyNotify:
	/* We need to get the CompWindow * for event->xdestroywindow.window
	   here because in the (*d->handleEvent) call below, that CompWindow's
	   id will become 1, so findWindowAtDisplay won't be able to find the
	   CompWindow after that. */
	w = findWindowAtDisplay (d, event->xdestroywindow.window);
	break;
    }

    RING_DISPLAY (d);

    UNWRAP (rd, d, handleEvent);
    (*d->handleEvent) (d, event);
    WRAP (rd, d, handleEvent, ringHandleEvent);

    switch (event->type) {
    case PropertyNotify:
	if (event->xproperty.atom == XA_WM_NAME)
	{
	    CompWindow *w;
	    w = findWindowAtDisplay (d, event->xproperty.window);
	    if (w)
	    {
    		RING_SCREEN (w->screen);
    		if (rs->grabIndex && (w == rs->selectedWindow))
    		{
    		    ringRenderWindowTitle (w->screen);
    		    damageScreen (w->screen);
		}
	    }
	}
	break;
    case ButtonPress:
	if (event->xbutton.button == Button1)
	{
	    s = findScreenAtDisplay (d, event->xbutton.root);
	    if (s)
	    {
    		RING_SCREEN (s);

    		if (rs->grabIndex)
    		    ringWindowSelectAt (s, 
					event->xbutton.x_root, 
					event->xbutton.y_root,
					TRUE);
	    }
	}
	break;
    case MotionNotify:
	s = findScreenAtDisplay (d, event->xmotion.root);
	if (s)
	{
	    RING_SCREEN (s);

	    if (rs->grabIndex)
		ringWindowSelectAt (s,
				    event->xmotion.x_root,
				    event->xmotion.y_root,
				    FALSE);
	}
    case UnmapNotify:
	w = findWindowAtDisplay (d, event->xunmap.window);
	ringWindowRemove (d, w);
	break;
    case DestroyNotify:
	ringWindowRemove (d, w);
	break;
    }
}
static void 
ringWindowRemove (CompDisplay *d, 
		  CompWindow  *w)
{
    if (w)
    {
	Bool   inList = FALSE;
	int    j, i = 0;
	CompWindow *selected;

	RING_SCREEN (w->screen);

	if (rs->state == RingStateNone)
	    return;

	if (isRingWin (w))
    	    return;

	selected = rs->selectedWindow;

	while (i < rs->nWindows)
	{
	    if (w == rs->windows[i])
	    {
		inList = TRUE;

		if (w == selected)
		{
		    if (i < (rs->nWindows - 1))
			selected = rs->windows[i + 1];
		    else
			selected = rs->windows[0];

		    rs->selectedWindow = selected;
		    ringRenderWindowTitle (w->screen);
		}

		rs->nWindows--;
		for (j = i; j < rs->nWindows; j++)
		    rs->windows[j] = rs->windows[j + 1];
	    }
	    else
	    {
		i++;
	    }
	}

	if (!inList)
	    return;

	if (rs->nWindows == 0)
	{
	    CompOption o;

	    o.type = CompOptionTypeInt;
	    o.name = "root";
	    o.value.i = w->screen->root;

	    ringTerminate (d, NULL, 0, &o, 1);
	    return;
	}

	// Let the window list be updated to avoid crash
	// when a window is closed while ending (RingStateIn).
	if (!rs->grabIndex && rs->state != RingStateIn)
	    return;

	if (ringUpdateWindowList (w->screen))
	{
	    rs->moreAdjust = TRUE;
	    rs->state = RingStateOut;
	    damageScreen (w->screen);
	}
    }
}
static void
ringWindowSelectAt (CompScreen *s,
		    int        x,
		    int        y,
		    Bool       terminate)
{
    int    i;
    CompWindow *selected = NULL;

    RING_SCREEN (s);

    if (!ringGetSelectWithMouse (s))
	return;
 
    /* first find the top-most window the mouse 
       pointer is over */
    for (i = rs->nWindows - 1; i >= 0; i--)
    {
    	if (rs->drawSlots[i].slot && *(rs->drawSlots[i].slot))
	{
	    CompWindow *w = rs->drawSlots[i].w;

	    RING_WINDOW (w);

    	    if ((x >= (rw->tx + w->attrib.x)) &&
		(x <= (rw->tx + w->attrib.x + (w->attrib.width * rw->scale))) &&
		(y >= (rw->ty + w->attrib.y)) &&
		(y <= (rw->ty + w->attrib.y + (w->attrib.height * rw->scale))))
	    {
		/* we have found one, select it */
		selected = w;
		break;
	    }
	}
    }

    if (selected && terminate)
    {
	CompOption o;

	o.type = CompOptionTypeInt;
	o.name = "root";
	o.value.i = s->root;

	rs->selectedWindow = selected;

	ringTerminate (s->display, NULL, 0, &o, 1);
    }
    else if (!terminate && (selected != rs->selectedWindow || !rs->textData))
    {
	if (!selected)
	{
	    ringFreeWindowTitle (s);
	}
	else
	{
	    rs->selectedWindow = selected;
	    ringRenderWindowTitle (s);
	}
	damageScreen (s);
    }
}
static Bool
ringInitiate (CompScreen      *s,
 	      CompAction      *action,
	      CompActionState state,
	      CompOption      *option,
	      int	      nOption)
{
    CompMatch *match;
    int       count; 

    RING_SCREEN (s);

    if (otherScreenGrabExist (s, "ring", NULL))
	return FALSE;
	   
    rs->currentMatch = ringGetWindowMatch (s);

    match = getMatchOptionNamed (option, nOption, "match", NULL);
    if (match)
    {
	matchFini (&rs->match);
	matchInit (&rs->match);
	if (matchCopy (&rs->match, match))
	{
	    matchUpdate (s->display, &rs->match);
	    rs->currentMatch = &rs->match;
	}
    }

    count = ringCountWindows (s);

    if (count < 1)
	return FALSE;

    if (!rs->grabIndex)
    {
	if (ringGetSelectWithMouse (s))
	    rs->grabIndex = pushScreenGrab (s, s->normalCursor, "ring");
	else
	    rs->grabIndex = pushScreenGrab (s, s->invisibleCursor, "ring");
    }

    if (rs->grabIndex)
    {
	rs->state = RingStateOut;

	if (!ringCreateWindowList (s))
	    return FALSE;

	rs->selectedWindow = rs->windows[0];
	ringRenderWindowTitle (s);
	rs->rotTarget = 0;

    	rs->moreAdjust = TRUE;
	damageScreen (s);

	switchActivateEvent (s, TRUE);
    }

    return TRUE;
}
예제 #16
0
/*
 * groupHandleEvent
 *
 */
void
groupHandleEvent (XEvent *event)
{
	CompWindow *w;
	CompScreen *s;

	GROUP_DISPLAY (&display);

	switch (event->type) {
	case KeyPress:
		if (isKeyPressEvent (event, &gd->select_single_key))
			groupSelectSingle (display.activeWindow);

		else if (isKeyPressEvent (event, &gd->group_key))
			groupGroupWindows (event->xkey.root);

		else if (isKeyPressEvent (event, &gd->ungroup_key))
			groupUnGroupWindows (event->xkey.root);

		else if (isKeyPressEvent (event, &gd->remove_key))
			groupRemoveWindow (display.activeWindow);

		else if (isKeyPressEvent (event, &gd->close_key))
			groupCloseWindows (display.activeWindow);

		else if (isKeyPressEvent (event, &gd->ignore_key))
			groupSetIgnore ();

		else if (isKeyPressEvent (event, &gd->tabmode_key))
			groupInitTab (display.activeWindow);

		else if (isKeyPressEvent (event, &gd->change_tab_left_key))
			groupChangeTabLeft (display.activeWindow);

		else if (isKeyPressEvent (event, &gd->change_tab_right_key))
			groupChangeTabRight (display.activeWindow);

		else if (isKeyPressEvent (event, &gd->change_color_key))
			groupChangeColor (display.activeWindow);

		break;
	case KeyRelease:
		if (gd->ignore_key.keycode == event->xkey.keycode)
			groupUnsetIgnore ();
		break;

	case MotionNotify:
		s = findScreenAtDisplay (event->xmotion.root);
		if (s)
			groupHandleMotionEvent (s, pointerX, pointerY);
		break;

	case ButtonPress:
		if (isButtonPressEvent (event, &gd->select_button))
			groupSelect (event->xbutton.window);

		s = findScreenAtDisplay (event->xbutton.root);
		if (s)
			groupHandleButtonPressEvent (s, event);
		break;

	case ButtonRelease:
		if (gd->select_button.button == event->xbutton.button)
			groupSelectTerminate (event->xbutton.root);

		s = findScreenAtDisplay (event->xbutton.root);
		if (s)
			groupHandleButtonReleaseEvent (s, event);
		break;

	case MapNotify:
		w = findWindowAtDisplay (event->xmap.window);
		if (w)
		{
			CompWindow *cw;
			for (cw = w->screen->windows; cw; cw = cw->next)
			{
				if (w->id == cw->frame)
				{
					GROUP_WINDOW (cw);
					if (gw->windowHideInfo)
						XUnmapWindow (display.display, cw->frame);
				}
			}
		}
		break;

	case UnmapNotify:
		w = findWindowAtDisplay (event->xunmap.window);
		if (w)
		{
			GROUP_WINDOW (w);

			if (w->pendingUnmaps)
			{
				if (w->shaded)
				{
					gw->windowState = WindowShaded;

					const BananaValue *
					option_shade_all = bananaGetOption (bananaIndex,
					                                    "shade_all",
					                                    w->screen->screenNum);

					if (gw->group && option_shade_all->b)
						groupShadeWindows (w, gw->group, TRUE);
				}
				else if (w->minimized)
				{
					gw->windowState = WindowMinimized;

					const BananaValue *
					option_minimize_all = bananaGetOption (bananaIndex,
					                                      "minimize_all",
					                                     w->screen->screenNum);

					if (gw->group && option_minimize_all->b)
						groupMinimizeWindows (w, gw->group, TRUE);
				}
			}

			if (gw->group)
			{
				if (gw->group->tabBar && IS_TOP_TAB (w, gw->group))
				{
					/* on unmap of the top tab, hide the tab bar and the
					   input prevention window */
					groupTabSetVisibility (gw->group, FALSE, PERMANENT);
				}
				if (!w->pendingUnmaps)
				{
					/* close event */
					if (!(gw->animateState & IS_UNGROUPING))
					{
						groupDeleteGroupWindow (w);
						damageScreen (w->screen);
					}
				}
			}
		}
		break;

	case ClientMessage:
		if (event->xclient.message_type == display.winActiveAtom)
		{
			w = findWindowAtDisplay (event->xclient.window);
			if (w)
			{
				GROUP_WINDOW (w);

				if (gw->group && gw->group->tabBar &&
				    !IS_TOP_TAB (w, gw->group))
				{
					gw->group->checkFocusAfterTabChange = TRUE;
					groupChangeTab (gw->slot, RotateUncertain);
				}
			}
		}
		else if (event->xclient.message_type == gd->resizeNotifyAtom)
		{
			CompWindow *w;
			w = findWindowAtDisplay (event->xclient.window);

			if (w && gd->resizeInfo && (w == gd->resizeInfo->resizedWindow))
			{
				GROUP_WINDOW (w);
				GROUP_SCREEN (w->screen);

				if (gw->group)
				{
					int i;
					XRectangle rect;

					rect.x      = event->xclient.data.l[0];
					rect.y      = event->xclient.data.l[1];
					rect.width  = event->xclient.data.l[2];
					rect.height = event->xclient.data.l[3];

					for (i = 0; i < gw->group->nWins; i++)
					{
						CompWindow  *cw = gw->group->windows[i];
						GroupWindow *gcw;

						gcw = GET_GROUP_WINDOW (cw, gs);
						if (gcw->resizeGeometry)
						{
							if (groupUpdateResizeRectangle (cw, &rect, TRUE))
								addWindowDamage (cw);
						}
					}
				}
			}
		}
		break;

	default:
		if (event->type == display.shapeEvent + ShapeNotify)
		{
			XShapeEvent *se = (XShapeEvent *) event;
			if (se->kind == ShapeInput)
			{
				CompWindow *w;
				w = findWindowAtDisplay (se->window);
				if (w)
				{
					GROUP_WINDOW (w);

					if (gw->windowHideInfo)
						groupClearWindowInputShape (w, gw->windowHideInfo);
				}
			}
		}
		break;
	}

	UNWRAP (gd, &display, handleEvent);
	(*display.handleEvent)(event);
	WRAP (gd, &display, handleEvent, groupHandleEvent);

	switch (event->type) {
	case PropertyNotify:
		if (event->xproperty.atom == display.wmNameAtom)
		{
			CompWindow *w;
			w = findWindowAtDisplay (event->xproperty.window);
			if (w)
			{
				GROUP_WINDOW (w);

				if (gw->group && gw->group->tabBar &&
				    gw->group->tabBar->textSlot    &&
				    gw->group->tabBar->textSlot->window == w)
				{
					/* make sure we are using the updated name */
					groupRenderWindowTitle (gw->group);
					groupDamageTabBarRegion (gw->group);
				}
			}
		}
		break;

	case EnterNotify:
	{
		CompWindow *w;
		w = findWindowAtDisplay (event->xcrossing.window);
		if (w)
		{
			GROUP_WINDOW (w);
			GROUP_SCREEN (w->screen);

			if (gs->showDelayTimeoutHandle)
				compRemoveTimeout (gs->showDelayTimeoutHandle);

			if (w->id != w->screen->grabWindow)
				groupUpdateTabBars (w->screen, w->id);

			if (gw->group)
			{
				if (gs->draggedSlot && gs->dragged &&
				    IS_TOP_TAB (w, gw->group))
				{
					int hoverTime;

					const BananaValue *
					option_drag_hover_time = bananaGetOption (bananaIndex,
					                                        "drag_hover_time",
					                                     w->screen->screenNum);

					hoverTime = option_drag_hover_time->f * 1000;
					if (gs->dragHoverTimeoutHandle)
						compRemoveTimeout (gs->dragHoverTimeoutHandle);

					if (hoverTime > 0)
						gs->dragHoverTimeoutHandle =
						        compAddTimeout (hoverTime,
						                        (float) hoverTime * 1.2,
						                        groupDragHoverTimeout, w);
				}
			}
		}
	}
	break;

	case ConfigureNotify:
	{
		CompWindow *w;

		w = findWindowAtDisplay (event->xconfigure.window);
		if (w)
		{
			GROUP_WINDOW (w);

			if (gw->group && gw->group->tabBar &&
			    IS_TOP_TAB (w, gw->group)      &&
			    gw->group->inputPrevention && gw->group->ipwMapped)
			{
				XWindowChanges xwc;

				xwc.stack_mode = Above;
				xwc.sibling = w->id;

				XConfigureWindow (display.display,
				                  gw->group->inputPrevention,
				                  CWSibling | CWStackMode, &xwc);
			}

			if (event->xconfigure.above != None)
			{
				if (gw->group && !gw->group->tabBar &&
				    (gw->group != gd->lastRestackedGroup))
				{
					const BananaValue *
					option_raise_all = bananaGetOption (bananaIndex,
					                                    "raise_all",
					                                    w->screen->screenNum);

					if (option_raise_all->b)
						groupRaiseWindows (w, gw->group);
				}
				if (w->managed && !w->attrib.override_redirect)
					gd->lastRestackedGroup = gw->group;
			}
		}
	}
	break;

	default:
		break;
	}
}
예제 #17
0
static void
colorFilterChangeNotify (const char        *optionName,
                         BananaType        optionType,
                         const BananaValue *optionValue,
                         int               screenNum)
{
	FILTER_DISPLAY (&display);

	if (strcasecmp (optionName, "toggle_window_key") == 0)
		updateKey (optionValue->s, &cfd->toggle_window_key);

	else if (strcasecmp (optionName, "toggle_screen_key") == 0)
		updateKey (optionValue->s, &cfd->toggle_screen_key);

	else if (strcasecmp (optionName, "switch_filter_key") == 0)
		updateKey (optionValue->s, &cfd->switch_filter_key);

	else if (strcasecmp (optionName, "filter_match") == 0)
	{
		CompWindow *w;
		CompScreen *s = getScreenFromScreenNum (screenNum);

		FILTER_SCREEN (s);

		//Re-check every window against new match settings
		for (w = s->windows; w; w = w->next)
		{
			FILTER_WINDOW (w);

			if (matchEval (&cfs->filter_match, w) &&
			    cfs->isFiltered && !cfw->isFiltered)
			{
				colorFilterToggleWindow (w);
			}
		}
	}

	else if (strcasecmp (optionName, "exclude_match") == 0)
	{
		CompWindow *w;
		CompScreen *s = getScreenFromScreenNum (screenNum);

		FILTER_SCREEN (s);

		// Re-check every window against new match settings
		for (w = s->windows; w; w = w->next)
		{
			Bool isExcluded;

			FILTER_WINDOW (w);

			isExcluded = matchEval (&cfs->exclude_match, w);

			if (isExcluded && cfw->isFiltered)
				colorFilterToggleWindow (w);
			else if (!isExcluded && cfs->isFiltered && !cfw->isFiltered)
				colorFilterToggleWindow (w);
		}
	}

	else if (strcasecmp (optionName, "filters") == 0)
	{
		CompScreen *s = getScreenFromScreenNum (screenNum);

		FILTER_SCREEN (s);

		/* Just set the filtersLoaded boolean to FALSE, unloadFilters will be
		 * called in loadFilters */

		cfs->filtersLoaded = FALSE;
	}

	else if (strcasecmp (optionName, "filter_decorations") == 0)
	{
		CompScreen *s = getScreenFromScreenNum (screenNum);

		damageScreen (s);
	}
}
static void
snowDisplayOptionChanged (CompDisplay        *d,
			  CompOption         *opt,
			  FirefliesDisplayOptions num)
{
    SNOW_DISPLAY (d);

    switch (num)
    {
    case FirefliesDisplayOptionSnowSize:
	{
	    CompScreen *s;

	    for (s = d->screens; s; s = s->next)
	    {
		SNOW_SCREEN (s);
		ss->displayListNeedsUpdate = TRUE;
		updateSnowTextures (s);
	    }
	}
	break;
    case FirefliesDisplayOptionSnowUpdateDelay:
	{
	    CompScreen *s;

	    for (s = d->screens; s; s = s->next)
	    {
		SNOW_SCREEN (s);

		if (ss->timeoutHandle)
		    compRemoveTimeout (ss->timeoutHandle);
		ss->timeoutHandle =
		    compAddTimeout (firefliesGetSnowUpdateDelay (d),
				                           firefliesGetSnowUpdateDelay (d) * 1.2, stepSnowPositions, s);
	    }
	}
	break;
    case FirefliesDisplayOptionNumSnowflakes:
	{
	    CompScreen *s;
	    int        i, numFlakes;
	    SnowFlake  *snowFlake;

	    numFlakes = firefliesGetNumSnowflakes (d);
	    for (s = d->screens; s; s = s->next)
	    {
		SNOW_SCREEN (s);
		ss->allSnowFlakes = realloc (ss->allSnowFlakes,
					     numFlakes * sizeof (SnowFlake));
		snowFlake = ss->allSnowFlakes;

		for (i = 0; i < numFlakes; i++)
		{
		    initiateSnowFlake (ss, snowFlake);
		    setSnowflakeTexture (ss, snowFlake);
		    snowFlake++;
		}
	    }
	}
	break;
    case FirefliesDisplayOptionSnowTextures:
	{
	    CompScreen *s;
	    CompOption *texOpt;

	    texOpt = firefliesGetSnowTexturesOption (d);

	    sd->snowTexFiles = texOpt->value.list.value;
	    sd->snowTexNFiles = texOpt->value.list.nValue;

	    for (s = d->screens; s; s = s->next)
		updateSnowTextures (s);
	}
	break;
    case FirefliesDisplayOptionDefaultEnabled:
	{
	    CompScreen *s;
	    for (s = d->screens; s; s = s->next)
	    {
		SNOW_SCREEN (s);
		ss->active = firefliesGetDefaultEnabled(s->display);
		ss->displayListNeedsUpdate = TRUE;
		damageScreen (s);
	    }
	}
	break;
    default:
	break;
    }
}
예제 #19
0
static void
groupChangeNotify (const char        *optionName,
                   BananaType        optionType,
                   const BananaValue *optionValue,
                   int               screenNum)
{
    GROUP_DISPLAY (&display);

    if (strcasecmp (optionName, "window_match") == 0)
    {
        CompScreen *s = getScreenFromScreenNum (screenNum);
        GROUP_SCREEN (s);

        matchFini (&gs->window_match);
        matchInit (&gs->window_match);
        matchAddFromString (&gs->window_match, optionValue->s);
        matchUpdate (&gs->window_match);
    }
    else if (strcasecmp (optionName, "tab_base_color") == 0 ||
             strcasecmp (optionName, "tab_highlight_color") == 0 ||
             strcasecmp (optionName, "tab_border_color") == 0 ||
             strcasecmp (optionName, "tab_style") == 0 ||
             strcasecmp (optionName, "border_radius") == 0 ||
             strcasecmp (optionName, "border_width") == 0)
    {
        GroupSelection *group;

        CompScreen *s = getScreenFromScreenNum (screenNum);
        GROUP_SCREEN (s);

        for (group = gs->groups; group; group = group->next)
            if (group->tabBar)
                groupRenderTabBarBackground (group);
    }
    else if (strcasecmp (optionName, "tabbar_font_size") == 0 ||
             strcasecmp (optionName, "tabbar_font_color") == 0)
    {
        GroupSelection *group;

        CompScreen *s = getScreenFromScreenNum (screenNum);
        GROUP_SCREEN (s);

        for (group = gs->groups; group; group = group->next)
            groupRenderWindowTitle (group);
    }
    else if (strcasecmp (optionName, "thumb_size") == 0 ||
             strcasecmp (optionName, "thumb_space") == 0)
    {
        GroupSelection *group;

        CompScreen *s = getScreenFromScreenNum (screenNum);
        GROUP_SCREEN (s);

        for (group = gs->groups; group; group = group->next)
            if (group->tabBar)
            {
                BoxPtr box = &group->tabBar->region->extents;
                groupRecalcTabBarPos (group, (box->x1 + box->x2 ) / 2,
                                      box->x1, box->x2);
            }
    }
    else if (strcasecmp (optionName, "glow") == 0 ||
             strcasecmp (optionName, "glow_size") == 0)
    {
        CompScreen *s = getScreenFromScreenNum (screenNum);
        GROUP_SCREEN (s);

        CompWindow *w;

        for (w = s->windows; w; w = w->next)
        {
            GROUP_WINDOW (w);

            groupComputeGlowQuads (w, &gs->glowTexture.matrix);
            if (gw->glowQuads)
            {
                damageWindowOutputExtents (w);
                updateWindowOutputExtents (w);
                damageWindowOutputExtents (w);
            }
        }
    }
    else if (strcasecmp (optionName, "glow_type") == 0)
    {
        CompScreen *s = getScreenFromScreenNum (screenNum);
        GROUP_SCREEN (s);

        int glowType;
        GlowTextureProperties *glowProperty;

        GROUP_DISPLAY (&display);

        const BananaValue *
        option_glow_type = bananaGetOption (bananaIndex,
                                            "glow_type",
                                            s->screenNum);

        glowType = option_glow_type->i;
        glowProperty = &gd->glowTextureProperties[glowType];

        finiTexture (s, &gs->glowTexture);
        initTexture (s, &gs->glowTexture);

        imageDataToTexture (s, &gs->glowTexture,
                            glowProperty->textureData,
                            glowProperty->textureSize,
                            glowProperty->textureSize,
                            GL_RGBA, GL_UNSIGNED_BYTE);

        const BananaValue *
        option_glow = bananaGetOption (bananaIndex,
                                       "glow",
                                       s->screenNum);

        if (option_glow->b && gs->groups)
        {
            CompWindow *w;

            for (w = s->windows; w; w = w->next)
                groupComputeGlowQuads (w, &gs->glowTexture.matrix);

            damageScreen (s);
        }
    }
    else if (strcasecmp (optionName, "select_button") == 0)
        updateButton (optionValue->s, &gd->select_button);
    else if (strcasecmp (optionName, "select_single_key") == 0)
        updateKey (optionValue->s, &gd->select_single_key);
    else if (strcasecmp (optionName, "group_key") == 0)
        updateKey (optionValue->s, &gd->group_key);
    else if (strcasecmp (optionName, "ungroup_key") == 0)
        updateKey (optionValue->s, &gd->ungroup_key);
    else if (strcasecmp (optionName, "remove_key") == 0)
        updateKey (optionValue->s, &gd->remove_key);
    else if (strcasecmp (optionName, "close_key") == 0)
        updateKey (optionValue->s, &gd->close_key);
    else if (strcasecmp (optionName, "ignore_key") == 0)
        updateKey (optionValue->s, &gd->ignore_key);
    else if (strcasecmp (optionName, "tabmode_key") == 0)
        updateKey (optionValue->s, &gd->tabmode_key);
    else if (strcasecmp (optionName, "change_tab_left_key") == 0)
        updateKey (optionValue->s, &gd->change_tab_left_key);
    else if (strcasecmp (optionName, "change_tab_right_key") == 0)
        updateKey (optionValue->s, &gd->change_tab_right_key);
    else if (strcasecmp (optionName, "change_color_key") == 0)
        updateKey (optionValue->s, &gd->change_color_key);
    else if (strcasecmp (optionName, "autotab_windows") == 0)
    {
        CompScreen *s = getScreenFromScreenNum (screenNum);

        GROUP_SCREEN (s);

        int i;
        if (gs->autotab && gs->autotabCount != 0)
        {
            for (i = 0; i <= gs->autotabCount - 1; i++)
                matchFini (&gs->autotab[i]);

            free (gs->autotab);
        }

        gs->autotabCount = optionValue->list.nItem;
        gs->autotab = malloc (gs->autotabCount * sizeof (CompMatch));

        for (i = 0; i <= gs->autotabCount - 1; i++)
        {
            matchInit (&gs->autotab[i]);
            matchAddFromString (&gs->autotab[i], optionValue->list.item[i].s);
            matchUpdate (&gs->autotab[i]);
        }
    }
}
/*
 * Damage decorations after the "Filter Decorations" setting got changed
 */
static void
colorFilterDamageDecorations (CompScreen *s, CompOption *opt,
			      ColorfilterScreenOptions num)
{
    damageScreen (s);
}