void ShapeFrame(UltimateContext *uc) { int a, shaped, wbs, hbs; XShapeQueryExtents(disp,uc->win,&shaped,&a,&a,&wbs,&hbs,&a,&a,&a,&a,&a); if(uc->frame != None) { if(shaped){ uc->flags |= SHAPED; XShapeCombineShape(disp, uc->frame, ShapeBounding, uc->BorderWidth, uc->BorderWidth + TheScreen.TitleHeight, uc->win, ShapeBounding, ShapeSet); if(uc->title.win != None) XShapeCombineShape(disp, uc->frame, ShapeBounding, uc->title.x, uc->title.y , uc->title.win, ShapeBounding, ShapeUnion); XUnmapWindow(disp, uc->border); UpdateName(uc); } else { if(uc->flags & SHAPED) { XShapeCombineMask(disp, uc->frame, ShapeBounding, 0, 0, None, ShapeSet); } uc->flags &= ~SHAPED; XMapWindow(disp, uc->border); UpdateName(uc); } } }
// does the window w need a shape combine mask around it? bool Shape::hasShape(WId w) { int xws, yws, xbs, ybs; unsigned int wws, hws, wbs, hbs; int boundingShaped = 0, clipShaped = 0; if(!available()) return FALSE; XShapeQueryExtents(qt_xdisplay(), w, &boundingShaped, &xws, &yws, &wws, &hws, &clipShaped, &xbs, &ybs, &wbs, &hbs); return boundingShaped != 0; }
// does the window w need a shape combine mask around it? bool Extensions::hasShape( Window w ) { int xws, yws, xbs, ybs; unsigned int wws, hws, wbs, hbs; int boundingShaped = 0, clipShaped = 0; if( !shapeAvailable()) return false; XShapeQueryExtents(display(), w, &boundingShaped, &xws, &yws, &wws, &hws, &clipShaped, &xbs, &ybs, &wbs, &hbs); return boundingShaped != 0; }
void set_shape(Client *c) { int bounding_shaped; int i, b; unsigned int u; /* dummies */ if (!have_shape) return; /* Logic to decide if we have a shaped window cribbed from fvwm-2.5.10. * Previous method (more than one rectangle returned from * XShapeGetRectangles) worked _most_ of the time. */ if (XShapeQueryExtents(dpy, c->window, &bounding_shaped, &i, &i, &u, &u, &b, &i, &i, &u, &u) && bounding_shaped) { LOG_DEBUG("%d shape extents\n", bounding_shaped); XShapeCombineShape(dpy, c->parent, ShapeBounding, 0, 0, c->window, ShapeBounding, ShapeSet); } }
/** Check if a window uses the shape extension. */ char CheckShape(Window win) { #ifdef USE_SHAPE int shaped = 0; int r1; unsigned int r2; if(haveShape) { JXShapeSelectInput(display, win, ShapeNotifyMask); XShapeQueryExtents(display, win, &shaped, &r1, &r1, &r2, &r2, &r1, &r1, &r1, &r2, &r2); return shaped ? 1 : 0; } else { return 0; } #else return 0; #endif }
/*********************************************************************** * * Procedure: * HandleConfigureRequest - ConfigureRequest event handler * ************************************************************************/ void HandleConfigureRequest() { XWindowChanges xwc; unsigned long xwcm; int x, y, width, height; XConfigureRequestEvent *cre = &Event.xconfigurerequest; Bool sendEvent=False; FvwmWindow *FvwmSib; DBUG("HandleConfigureRequest","Routine Entered"); /* * Event.xany.window is Event.xconfigurerequest.parent, so Tmp_win will * be wrong */ Event.xany.window = cre->window; /* mash parent field */ if (XFindContext (dpy, cre->window, FvwmContext, (caddr_t *) &Tmp_win) == XCNOENT) Tmp_win = NULL; /* * According to the July 27, 1988 ICCCM draft, we should ignore size and * position fields in the WM_NORMAL_HINTS property when we map a window. * Instead, we'll read the current geometry. Therefore, we should respond * to configuration requests for windows which have never been mapped. */ if (!Tmp_win || cre->window == Tmp_win->icon_w || cre->window == Tmp_win->icon_pixmap_w) { xwcm = cre->value_mask & (CWX | CWY | CWWidth | CWHeight | CWBorderWidth); xwc.x = cre->x; xwc.y = cre->y; if((Tmp_win)&&((Tmp_win->icon_pixmap_w == cre->window))) { Tmp_win->icon_p_height = cre->height+ cre->border_width + cre->border_width; } else if((Tmp_win)&&((Tmp_win->icon_w == cre->window))) { Tmp_win->icon_xl_loc = cre->x; Tmp_win->icon_x_loc = cre->x + (Tmp_win->icon_w_width - Tmp_win->icon_p_width)/2; Tmp_win->icon_y_loc = cre->y - Tmp_win->icon_p_height; if(!(Tmp_win->flags & ICON_UNMAPPED)) BroadcastPacket(M_ICON_LOCATION, 7, Tmp_win->w, Tmp_win->frame, (unsigned long)Tmp_win, Tmp_win->icon_x_loc, Tmp_win->icon_y_loc, Tmp_win->icon_w_width, Tmp_win->icon_w_height + Tmp_win->icon_p_height); } xwc.width = cre->width; xwc.height = cre->height; xwc.border_width = cre->border_width; XConfigureWindow(dpy, Event.xany.window, xwcm, &xwc); if(Tmp_win) { if (cre->window != Tmp_win->icon_pixmap_w && Tmp_win->icon_pixmap_w != None) { xwc.x = Tmp_win->icon_x_loc; xwc.y = Tmp_win->icon_y_loc - Tmp_win->icon_p_height; xwcm = cre->value_mask & (CWX | CWY); XConfigureWindow(dpy, Tmp_win->icon_pixmap_w, xwcm, &xwc); } if(Tmp_win->icon_w != None) { xwc.x = Tmp_win->icon_x_loc; xwc.y = Tmp_win->icon_y_loc; xwcm = cre->value_mask & (CWX | CWY); XConfigureWindow(dpy, Tmp_win->icon_w, xwcm, &xwc); } } return; } /* Stacking order change requested... */ if (cre->value_mask & CWStackMode) { FvwmWindow *otherwin; otherwin = NULL; xwc.sibling = (((cre->value_mask & CWSibling) && (XFindContext (dpy, cre->above, FvwmContext, (caddr_t *) &otherwin) == XCSUCCESS)) ? otherwin->frame : cre->above); xwc.stack_mode = cre->detail; XConfigureWindow (dpy, Tmp_win->frame, cre->value_mask & (CWSibling | CWStackMode), &xwc); sendEvent = True; /* RBW - Update the stacking order ring. */ if (xwc.stack_mode == Above || xwc.stack_mode == Below) { FvwmSib = (otherwin != NULL ) ? otherwin: Scr.FvwmRoot.stack_next; /* Set up for Above. */ if (xwc.stack_mode == Below) { /* If Below-sibling, raise above next lower window. If no sibling, bottom of stack is "above" Scr.FvwmRoot in the ring. */ FvwmSib = (FvwmSib == otherwin) ? FvwmSib->stack_next: FvwmSib->stack_prev; } if (Tmp_win != FvwmSib) /* Don't chain it to itself! */ { Tmp_win->stack_prev->stack_next = Tmp_win->stack_next; /* Pluck from chain. */ Tmp_win->stack_next->stack_prev = Tmp_win->stack_prev; Tmp_win->stack_next = FvwmSib; /* Set new pointers. */ Tmp_win->stack_prev = FvwmSib->stack_prev; FvwmSib->stack_prev->stack_next = Tmp_win; /* Re-insert above sibling. */ FvwmSib->stack_prev = Tmp_win; } } else { /* Oh, bother! We have to rebuild the stacking order ring to figure out where this one went (TopIf, BottomIf, or Opposite). */ ResyncFvwmStackRing(); } } #ifdef SHAPE if (ShapesSupported) { int xws, yws, xbs, ybs; unsigned wws, hws, wbs, hbs; int boundingShaped, clipShaped; XShapeQueryExtents (dpy, Tmp_win->w,&boundingShaped, &xws, &yws, &wws, &hws,&clipShaped, &xbs, &ybs, &wbs, &hbs); Tmp_win->wShaped = boundingShaped; } #endif /* SHAPE */ /* Don't modify frame_XXX fields before calling SetupWindow! */ x = Tmp_win->frame_x; y = Tmp_win->frame_y; width = Tmp_win->frame_width; height = Tmp_win->frame_height; /* for restoring */ if (cre->value_mask & CWBorderWidth) { Tmp_win->old_bw = cre->border_width; } /* override even if border change */ if (cre->value_mask & CWX) x = cre->x - Tmp_win->boundary_width - Tmp_win->bw; if (cre->value_mask & CWY) y = cre->y - Tmp_win->boundary_width - Tmp_win->title_height - Tmp_win->bw; if (cre->value_mask & CWWidth) width = cre->width + 2*Tmp_win->boundary_width; if (cre->value_mask & CWHeight) height = cre->height+Tmp_win->title_height+2*Tmp_win->boundary_width; /* * SetupWindow (x,y) are the location of the upper-left outer corner and * are passed directly to XMoveResizeWindow (frame). The (width,height) * are the inner size of the frame. The inner width is the same as the * requested client window width; the inner height is the same as the * requested client window height plus any title bar slop. */ ConstrainSize(Tmp_win, &width, &height, False, 0, 0); SetupFrame (Tmp_win, x, y, width, height,sendEvent); KeepOnTop(); }