/** Update a specific component on a tray. */ void UpdateSpecificTray(const TrayType *tp, const TrayComponentType *cp) { if(cp->pixmap != None && !shouldExit) { JXCopyArea(display, cp->pixmap, tp->window, rootGC, 0, 0, cp->width, cp->height, cp->x, cp->y); } }
/** Draw an icon. */ void PutIcon(const VisualData *visual, IconNode *icon, Drawable d, long fg, int x, int y, int width, int height) { ImageNode *imageNode; ScaledIconNode *node; Assert(icon); if(icon == &emptyIcon) { return; } /* Scale the icon. */ imageNode = GetBestImage(icon, width, height); node = GetScaledIcon(icon, imageNode, fg, width, height); if(node) { const int ix = x + (width - node->width) / 2; const int iy = y + (height - node->height) / 2; /* If we support xrender, use it. */ #ifdef USE_XRENDER if(haveRender) { PutScaledRenderIcon(visual, imageNode, d, ix, iy); return; } #endif /* Draw the icon the old way. */ if(node->image != None) { /* Set the clip mask. */ if(node->mask != None) { JXSetClipOrigin(display, iconGC, ix, iy); JXSetClipMask(display, iconGC, node->mask); } /* Draw the icon. */ JXCopyArea(display, node->image, d, iconGC, 0, 0, node->width, node->height, ix, iy); /* Reset the clip mask. */ if(node->mask != None) { JXSetClipMask(display, iconGC, None); JXSetClipOrigin(display, iconGC, 0, 0); } } } }
/** Update a specific component on a tray. */ void UpdateSpecificTray(const TrayType *tp, const TrayComponentType *cp) { if(JUNLIKELY(shouldExit)) { return; } /* If the tray is hidden, draw only the background. */ if(!tp->hidden && cp->pixmap != None) { JXCopyArea(display, cp->pixmap, tp->window, rootGC, 0, 0, cp->width, cp->height, cp->x, cp->y); } }
/** Process an event on a popup window. */ char ProcessPopupEvent(const XEvent *event) { if(popup.window != None && event->xany.window == popup.window) { if(event->type == Expose && event->xexpose.count == 0) { JXCopyArea(display, popup.pmap, popup.window, rootGC, 0, 0, popup.width, popup.height, 0, 0); } else if(event->type == MotionNotify) { JXDestroyWindow(display, popup.window); JXFreePixmap(display, popup.pmap); popup.window = None; } return 1; } return 0; }
/** Copy the pixmap to the confirm dialog. */ void ExposeConfirmDialog(void) { Assert(dialog); JXCopyArea(display, dialog->pmap, dialog->node->window, rootGC, 0, 0, dialog->width, dialog->height, 0, 0); }
/** Show a popup window. */ void ShowPopup(int x, int y, const char *text, const PopupMaskType context) { const ScreenType *sp; Assert(text); if(!(settings.popupMask & context)) { return; } if(popup.text) { if(x == popup.x && y == popup.y && !strcmp(popup.text, text)) { // This popup is already shown. return; } Release(popup.text); popup.text = NULL; } if(text[0] == 0) { return; } GetMousePosition(&popup.mx, &popup.my, &popup.mw); popup.text = CopyString(text); popup.height = GetStringHeight(FONT_POPUP) + 2; popup.width = GetStringWidth(FONT_POPUP, popup.text) + 9; sp = GetCurrentScreen(x, y); if(popup.width > sp->width) { popup.width = sp->width; } popup.x = x; if(y + 2 * popup.height + 2 >= sp->height) { popup.y = y - popup.height - 2; } else { popup.y = y + popup.height + 2; } if(popup.width + popup.x > sp->x + sp->width) { popup.x = sp->x + sp->width - popup.width - 2; } if(popup.height + popup.y > sp->y + sp->height) { popup.y = sp->y + sp->height - popup.height - 2; } if(popup.x < 2) { popup.x = 2; } if(popup.y < 2) { popup.y = 2; } if(popup.window == None) { XSetWindowAttributes attr; unsigned long attrMask = 0; attrMask |= CWEventMask; attr.event_mask = ExposureMask | PointerMotionMask | PointerMotionHintMask; attrMask |= CWSaveUnder; attr.save_under = True; attrMask |= CWDontPropagate; attr.do_not_propagate_mask = PointerMotionMask | ButtonPressMask | ButtonReleaseMask; popup.window = JXCreateWindow(display, rootWindow, popup.x, popup.y, popup.width, popup.height, 0, CopyFromParent, InputOutput, CopyFromParent, attrMask, &attr); SetAtomAtom(popup.window, ATOM_NET_WM_WINDOW_TYPE, ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION); JXMapRaised(display, popup.window); } else { JXMoveResizeWindow(display, popup.window, popup.x, popup.y, popup.width, popup.height); JXFreePixmap(display, popup.pmap); } popup.pmap = JXCreatePixmap(display, popup.window, popup.width, popup.height, rootDepth); JXSetForeground(display, rootGC, colors[COLOR_POPUP_BG]); JXFillRectangle(display, popup.pmap, rootGC, 0, 0, popup.width - 1, popup.height - 1); JXSetForeground(display, rootGC, colors[COLOR_POPUP_OUTLINE]); JXDrawRectangle(display, popup.pmap, rootGC, 0, 0, popup.width - 1, popup.height - 1); RenderString(popup.pmap, FONT_POPUP, COLOR_POPUP_FG, 4, 1, popup.width, popup.text); JXCopyArea(display, popup.pmap, popup.window, rootGC, 0, 0, popup.width, popup.height, 0, 0); }