static void scaleaddonHandleEvent (CompDisplay *d, XEvent *event) { ADDON_DISPLAY (d); UNWRAP (ad, d, handleEvent); (*d->handleEvent) (d, event); WRAP (ad, d, handleEvent, scaleaddonHandleEvent); switch (event->type) { case PropertyNotify: { if (event->xproperty.atom == XA_WM_NAME) { CompWindow *w; w = findWindowAtDisplay (d, event->xproperty.window); if (w) { SCALE_SCREEN (w->screen); if (ss->grabIndex) { scaleaddonRenderWindowTitle (w); addWindowDamage (w); } } } } break; case MotionNotify: { CompScreen *s; s = findScreenAtDisplay (d, event->xmotion.root); if (s) { SCALE_SCREEN (s); if (ss->grabIndex) { SCALE_DISPLAY (d); ad->highlightedWindow = sd->hoveredWindow; scaleaddonCheckWindowHighlight (s); } } } break; default: break; } }
static Bool setScaledPaintAttributes (CompWindow *w, WindowPaintAttrib *attrib) { Bool drawScaled = FALSE; SCALE_SCREEN (w->screen); SCALE_WINDOW (w); if (sw->adjust || sw->slot) { SCALE_DISPLAY (w->screen->display); if (w->id != sd->selectedWindow && ss->opacity != OPAQUE && ss->state != SCALE_STATE_IN) { /* modify opacity of windows that are not active */ attrib->opacity = (attrib->opacity * ss->opacity) >> 16; }
static void scalefilterRelayout (CompScreen *s) { CompOption o[1]; CompAction *action; SCALE_DISPLAY (s->display); sd->selectedWindow = None; sd->hoveredWindow = None; action = &sd->opt[SCALE_DISPLAY_OPTION_RELAYOUT].value.action; o[0].type = CompOptionTypeInt; o[0].name = "root"; o[0].value.i = s->root; if (action->initiate) { if ((*action->initiate) (s->display, NULL, 0, o, 1)) damageScreen (s); } }
static Bool scaleaddonPullWindow(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) { CompWindow *w; SCALE_SCREEN(s); ADDON_DISPLAY(d); if (!ss->grabIndex) return FALSE; w = findWindowAtDisplay(d, ad->highlightedWindow); if (w) { int x, y, vx, vy; defaultViewportForWindow(w, &vx, &vy); x = w->attrib.x + (s->x - vx) * s->width; y = w->attrib.y + (s->y - vy) * s->height; if (scaleaddonGetConstrainPullToScreen(s)) { XRectangle workArea; CompWindowExtents extents; getWorkareaForOutput(s, outputDeviceForWindow(w), &workArea); extents.left = x - w->input.left; extents.right = x + w->width + w->input.right; extents.top = y - w->input.top; extents.bottom = y + w->height + w->input.bottom; if (extents.left < workArea.x) x += workArea.x - extents.left; else if (extents.right > workArea.x + workArea.width) x += workArea.x + workArea.width - extents.right; if (extents.top < workArea.y) y += workArea.y - extents.top; else if (extents.bottom > workArea.y + workArea.height) y += workArea.y + workArea.height - extents.bottom; } if (x != w->attrib.x || y != w->attrib.y) { SCALE_WINDOW(w); moveWindowToViewportPosition(w, x, y, TRUE); /* Select this window when ending scale */ (*ss->selectWindow) (w); /* stop scaled window dissapearing */ sw->tx -= (s->x - vx) * s->width; sw->ty -= (s->y - vy) * s->height; if (scaleaddonGetExitAfterPull(s)) { int opt; CompAction *action2; CompOption o[1]; SCALE_DISPLAY(d); opt = SCALE_DISPLAY_OPTION_INITIATE_KEY; action2 = &sd->opt[opt].value.action; o[0].type = CompOptionTypeInt; o[0].name = "root"; o[0].value.i = s->root; if (action2->terminate) (*action2->terminate) (d, action, 0, o, 1); } else { /* provide a simple animation */ addWindowDamage(w); sw->tx -= (sw->slot->x2 - sw->slot->x1) / 20; sw->ty -= (sw->slot->y2 - sw->slot->y1) / 20; sw->scale *= 1.1f; sw->adjust = TRUE; ss->state = SCALE_STATE_OUT; addWindowDamage(w); } return TRUE; } } } return FALSE; }