/** Destroy a clock tray component. */ void Destroy(TrayComponentType *cp) { Assert(cp); if(cp->pixmap != None) { JXFreePixmap(display, cp->pixmap); } }
/** Shutdown the task bar. */ void ShutdownTaskBar(void) { TaskBarType *bp; for(bp = bars; bp; bp = bp->next) { JXFreePixmap(display, bp->buffer); } }
/** Resize a clock tray component. */ void Resize(TrayComponentType *cp) { ClockType *clk; TimeType now; Assert(cp); clk = (ClockType*)cp->object; Assert(clk); if(cp->pixmap != None) { JXFreePixmap(display, cp->pixmap); } cp->pixmap = JXCreatePixmap(display, rootWindow, cp->width, cp->height, rootDepth); memset(&clk->lastTime, 0, sizeof(clk->lastTime)); GetCurrentTime(&now); DrawClock(clk, &now); }
/** Resize. */ void Resize(TrayComponentType *cp) { if(cp->pixmap != None) { JXFreePixmap(display, cp->pixmap); } cp->pixmap = JXCreatePixmap(display, rootWindow, cp->width, cp->height, rootVisual.depth); ClearTrayDrawable(cp); }
/** Resize a task bar tray component. */ void Resize(TrayComponentType *cp) { TaskBarType *tp = (TaskBarType*)cp->object; if(tp->buffer != None) { JXFreePixmap(display, tp->buffer); } cp->pixmap = JXCreatePixmap(display, rootWindow, cp->width, cp->height, rootDepth); tp->buffer = cp->pixmap; ClearTrayDrawable(cp); }
/** Signal popup (this is used to hide popups after awhile). */ void SignalPopup(const TimeType *now, int x, int y, Window w, void *data) { if(popup.window != None) { if(popup.mw != w || abs(popup.mx - x) > 0 || abs(popup.my - y) > 0) { JXDestroyWindow(display, popup.window); JXFreePixmap(display, popup.pmap); popup.window = None; } } }
/** Shutdown popups. */ void ShutdownPopup(void) { UnregisterCallback(SignalPopup, NULL); if(popup.text) { Release(popup.text); popup.text = NULL; } if(popup.window != None) { JXDestroyWindow(display, popup.window); JXFreePixmap(display, popup.pmap); popup.window = None; } }
/** 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; }
/** Shutdown background support. */ void ShutdownBackgrounds() { BackgroundNode *bp; for(bp = backgrounds; bp; bp = bp->next) { if(bp->pixmap != None) { JXFreePixmap(display, bp->pixmap); bp->pixmap = None; } if(bp->window != None) { JXDestroyWindow(display, bp->window); bp->window = None; } } }
/** Destroy a confirm dialog. */ void DestroyConfirmDialog(void) { int x; Assert(dialog); /* This will take care of destroying the dialog window since * its parent will be destroyed. */ RemoveClient(dialog->node); /* Free the pixmap. */ JXFreePixmap(display, dialog->pmap); /* Free the message. */ for(x = 0; x < dialog->lineCount; x++) { Release(dialog->message[x]); } Release(dialog->message); Release(dialog); dialog = NULL; }
/** Create a scaled icon. */ ScaledIconNode *CreateScaledRenderIcon(IconNode *icon, int width, int height) { ScaledIconNode *result = NULL; #ifdef USE_XRENDER XRenderPictFormat *fp; XColor color; GC maskGC; XImage *destImage; XImage *destMask; unsigned long alpha; int index, yindex; int x, y; int imageLine; int maskLine; Assert(icon); if(!haveRender || !icon->useRender) { return NULL; } result = Allocate(sizeof(ScaledIconNode)); result->next = icon->nodes; icon->nodes = result; result->width = width; result->height = height; width = icon->image->width; height = icon->image->height; result->mask = JXCreatePixmap(display, rootWindow, width, height, 8); maskGC = JXCreateGC(display, result->mask, 0, NULL); result->image = JXCreatePixmap(display, rootWindow, width, height, rootDepth); destImage = JXCreateImage(display, rootVisual, rootDepth, ZPixmap, 0, NULL, width, height, 8, 0); destImage->data = Allocate(sizeof(unsigned long) * width * height); destMask = JXCreateImage(display, rootVisual, 8, ZPixmap, 0, NULL, width, height, 8, 0); destMask->data = Allocate(width * height); imageLine = 0; maskLine = 0; for(y = 0; y < height; y++) { yindex = y * icon->image->width; for(x = 0; x < width; x++) { index = 4 * (yindex + x); alpha = icon->image->data[index]; color.red = icon->image->data[index + 1]; color.red |= color.red << 8; color.green = icon->image->data[index + 2]; color.green |= color.green << 8; color.blue = icon->image->data[index + 3]; color.blue |= color.blue << 8; color.red = (color.red * alpha) >> 8; color.green = (color.green * alpha) >> 8; color.blue = (color.blue * alpha) >> 8; GetColor(&color); XPutPixel(destImage, x, y, color.pixel); destMask->data[maskLine + x] = alpha; } imageLine += destImage->bytes_per_line; maskLine += destMask->bytes_per_line; } /* Render the image data to the image pixmap. */ JXPutImage(display, result->image, rootGC, destImage, 0, 0, 0, 0, width, height); Release(destImage->data); destImage->data = NULL; JXDestroyImage(destImage); /* Render the alpha data to the mask pixmap. */ JXPutImage(display, result->mask, maskGC, destMask, 0, 0, 0, 0, width, height); Release(destMask->data); destMask->data = NULL; JXDestroyImage(destMask); JXFreeGC(display, maskGC); /* Create the alpha picture. */ fp = JXRenderFindStandardFormat(display, PictStandardA8); Assert(fp); result->alphaPicture = JXRenderCreatePicture(display, result->mask, fp, 0, NULL); /* Create the render picture. */ fp = JXRenderFindVisualFormat(display, rootVisual); Assert(fp); result->imagePicture = JXRenderCreatePicture(display, result->image, fp, 0, NULL); /* Free unneeded pixmaps. */ JXFreePixmap(display, result->image); result->image = None; JXFreePixmap(display, result->mask); result->mask = None; #endif return result; }
/** 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); }