Use xrender cursor for restart cursor.
SVN revision: 41417
This commit is contained in:
parent
d10bb9b662
commit
a169e53627
|
@ -27,13 +27,86 @@
|
||||||
#include "xwin.h"
|
#include "xwin.h"
|
||||||
#include <X11/Xutil.h>
|
#include <X11/Xutil.h>
|
||||||
#include <X11/extensions/shape.h>
|
#include <X11/extensions/shape.h>
|
||||||
|
#if HAVE_X11_EXTENSIONS_XRENDER_H
|
||||||
|
#include <X11/extensions/Xrender.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
Cursor curs;
|
Cursor curs;
|
||||||
XSetWindowAttributes attr;
|
XSetWindowAttributes attr;
|
||||||
Window cwin;
|
Window cwin;
|
||||||
|
char argb;
|
||||||
} EiwData;
|
} EiwData;
|
||||||
|
|
||||||
|
#if HAVE_X11_EXTENSIONS_XRENDER_H
|
||||||
|
#include <Imlib2.h>
|
||||||
|
|
||||||
|
static void
|
||||||
|
_ExtInitWinLoopInit(Window win __UNUSED__, EiwData * d)
|
||||||
|
{
|
||||||
|
Visual *vis;
|
||||||
|
|
||||||
|
vis = EVisualFindARGB();
|
||||||
|
if (vis)
|
||||||
|
imlib_context_set_visual(vis);
|
||||||
|
|
||||||
|
d->curs = None;
|
||||||
|
d->argb = (vis) ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_ExtInitWinLoopRun(Window win, EImage * im, EiwData * d)
|
||||||
|
{
|
||||||
|
int w, h;
|
||||||
|
XRenderPictFormat *pictfmt;
|
||||||
|
Pixmap pmap;
|
||||||
|
Picture pict;
|
||||||
|
|
||||||
|
EImageGetSize(im, &w, &h);
|
||||||
|
|
||||||
|
if (d->argb)
|
||||||
|
{
|
||||||
|
pictfmt = XRenderFindStandardFormat(disp, PictStandardARGB32);
|
||||||
|
pmap = XCreatePixmap(disp, WinGetXwin(VROOT), w, h, 32);
|
||||||
|
imlib_context_set_image(im);
|
||||||
|
imlib_context_set_drawable(pmap);
|
||||||
|
imlib_render_image_on_drawable(0, 0);
|
||||||
|
pict = XRenderCreatePicture(disp, pmap, pictfmt, 0, 0);
|
||||||
|
XFreePixmap(disp, pmap);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Imlib2 will not render an ARGB pixmap without an ARGB visual */
|
||||||
|
XRenderPictFormat *pictfmt1, *pictfmtm;
|
||||||
|
Pixmap pmap1, mask;
|
||||||
|
Picture pict1, pictm;
|
||||||
|
|
||||||
|
pictfmt = XRenderFindStandardFormat(disp, PictStandardARGB32);
|
||||||
|
pictfmt1 = XRenderFindStandardFormat(disp, PictStandardRGB24);
|
||||||
|
pictfmtm = XRenderFindStandardFormat(disp, PictStandardA1);
|
||||||
|
pmap = XCreatePixmap(disp, WinGetXwin(VROOT), w, h, 32);
|
||||||
|
EImageRenderPixmaps(im, VROOT, 0, &pmap1, &mask, 0, 0);
|
||||||
|
pict = XRenderCreatePicture(disp, pmap, pictfmt, 0, 0);
|
||||||
|
pict1 = XRenderCreatePicture(disp, pmap1, pictfmt1, 0, 0);
|
||||||
|
pictm = XRenderCreatePicture(disp, mask, pictfmtm, 0, 0);
|
||||||
|
XRenderComposite(disp, PictOpSrc, pict1, pictm, pict, 0, 0, 0, 0, 0, 0,
|
||||||
|
w, h);
|
||||||
|
XRenderFreePicture(disp, pict1);
|
||||||
|
XRenderFreePicture(disp, pictm);
|
||||||
|
EImagePixmapsFree(pmap1, mask);
|
||||||
|
XFreePixmap(disp, pmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (d->curs != None)
|
||||||
|
XFreeCursor(disp, d->curs);
|
||||||
|
d->curs = XRenderCreateCursor(disp, pict, w / 2, h / 2);
|
||||||
|
XRenderFreePicture(disp, pict);
|
||||||
|
|
||||||
|
XDefineCursor(disp, win, d->curs);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_ExtInitWinLoopInit(Window win, EiwData * d)
|
_ExtInitWinLoopInit(Window win, EiwData * d)
|
||||||
{
|
{
|
||||||
|
@ -82,6 +155,8 @@ _ExtInitWinLoopRun(Window win, EImage * im, EiwData * d)
|
||||||
XMapWindow(disp, d->cwin);
|
XMapWindow(disp, d->cwin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
static Window
|
static Window
|
||||||
ExtInitWinMain(void)
|
ExtInitWinMain(void)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue