Earlybite
Hallo,
ich bin auf der Suche nach einer Möglichkeit ein Xlib-Fenster mit einem eigenen Color-Key transparent zu machen, so das darauf Child-Fenster mit jeglicher anderer Hintergrundfarbe opaque sind.
Mit XRender geht z. Bsp.:
Bei XCreateWindow:
XMatchVisualInfo(vDisplay, DefaultScreen(vDisplay), 32, TrueColor, &vinfo);
attr.colormap = XCreateColormap(vDisplay, vSectionRoot, vinfo.visual, AllocNone);
attr.border_pixel = 0;
attr.background_pixel = 0;
nWin = XCreateWindow(vDisplay, vSectionRoot
, x, y, w, h, 0, vinfo.depth, InputOutput, vinfo.visual
, CWColormap | CWBorderPixel | CWBackPixel, &attr);
Dann:
XShapeCombineMask(mDisplay, mWin, ShapeBounding, 0, 0, p, ShapeSubtract);
Aber dann muss ein Child-Fenster darauf RGB = 255, 255, 255 sein um opaque zu sein.
Und es muss jedesmal eine neue Maske bei z. Bsp. Resize erstellt werden.
SDL bietet eine Möglichkeit mit SDL_SetColorKey, aber das braucht dann wohl ein eigenes SDL-Fenster...
Und unter Windows und VB6 kann man das verwenden:
SetLayeredWindowAttributes Me.hwnd, vbBlue, Level, LWA_COLORKEY
Das weiteren bin ich am überlegen, ob man das vielleicht mit XRenderComposite und einem alpha-Picture als Mask-Picture hin bekommt, aber da sind so viele Möglichkeiten und die alle austesten...
Vielleicht weiß hier ja jemand, wie man das mit 'nem eigenem Color-Key hin bekommen könnte, oder hat vielleicht 'nen guten Tipp.
Mit Gruß
Earlybite
Earlybite
Hallo (noch mal),
ich habe mir folgendes überlegt:
XMatchVisualInfo(vDisplay, DefaultScreen(vDisplay), 32, TrueColor, &vinfo);
attr.colormap = XCreateColormap(vDisplay, vSectionRoot, vinfo.visual, AllocNone);
attr.border_pixel = 0;
attr.background_pixel = 0;
nWin = XCreateWindow(vDisplay, vSectionRoot
, x, y, w, h, 0, vinfo.depth, InputOutput, vinfo.visual
, CWColormap | CWBorderPixel | CWBackPixel, &attr);
Also ein transparentes Fenster erstellen...
Dann:
int Create_XShape(int x, int y, unsigned int w, unsigned int h
, unsigned long color){
XWindowAttributes attr;
XGetWindowAttributes(mDisplay, mArea, &attr);
Pixmap p = XCreatePixmap(mDisplay, mSectionA, mWidth, mHeight, 1);
GC shape_gc = XCreateGC(mDisplay, p, 0, NULL);
XSetBackground(mDisplay, shape_gc, color);
XSetForeground(mDisplay, shape_gc, color);
XFillRectangle(mDisplay, p, shape_gc, x, y, w, h);
XShapeCombineMask(mDisplay, mSectionA, ShapeBounding, 0, 0, p, ShapeSubtract);
XFreePixmap(mDisplay, p);
XFreeGC(mDisplay, shape_gc);
XSetInputFocus(mDisplay, mSectionA, RevertToNone, CurrentTime);
return 1;
}
Wobei mArea ein Child-Fenster auf mSectionA ist und mSectionA ein Child-Fenster auf defaultroot() ist und color ist WhitePixel..
Damit sollte doch eigentlich ein weißes Viereck auf mSectionA gezeichnet werden?
Is' / tut aber nicht, mSectionA bleibt voll transparent.
Wie kann ich denn da jetzt für mArea einen opaquen Hintergrund auf mSectionA bekommen?
Earlybite
Ich will wirklich keinen nerven, aber ich bin ächt am verzweifeln...
Ich habe die Shape-Funktion jetzt mal geändert und zunächst das Child-Fenster nicht gemappt.
int Create_XShape(int x, int y, unsigned int w, unsigned int h){
XWindowAttributes attr;
mSec_Values.width = mWidth;
mSec_Values.height = mHeight;
XConfigureWindow(mDisplay, mSectionA, CWWidth | CWHeight, &mSec_Values);
XGetWindowAttributes(mDisplay, mArea, &attr);
Pixmap p = XCreatePixmap(mDisplay, mSectionA, mWidth, mHeight, 1);
GC shape_gc = XCreateGC(mDisplay, p, 0, NULL);
XSetBackground(mDisplay, shape_gc, 0);
XSetForeground(mDisplay, shape_gc, 0);
XFillRectangle(mDisplay, p, shape_gc, x, y, w, h);
XSetForeground(mDisplay, shape_gc, mTransparent);
XFillRectangle(mDisplay, p, shape_gc, attr.x, attr.y, attr.width, attr.height);
XShapeCombineMask(mDisplay, mSectionA, ShapeBounding, 0, 0, p, ShapeSet);
XFreePixmap(mDisplay, p);
XFreeGC(mDisplay, shape_gc);
XFlush(mDisplay);
XSetInputFocus(mDisplay, mSectionA, RevertToNone, CurrentTime);
return 1;
}
Um zu sehen, ob ich ein Square habe, wo sich das Child-Fenster befindet, das opque ist.
Und es ist auch da, und es ist auch opaque. Aber wenn ich das Child-Fenster mäppe, dann ist es dort sofort wieder transparent! 🙁
Mit XCreateSimpleWindow ginge es, aber damit kann ich kein Alpha-Blending vornehmen, weil nur 24bit. Ich brauche also ein 32bit-Fenster, das transparent ist, aber die Child-Fenster opaque erscheinen läßt, die ich später dann per Alpha blenden möchte...
Ich habe vor GNU/Linux mit Windows und VB6 programmiert, und damit geht das, weil ich eben ein Fenster haben kann, was auf eine spezifische Farbe transparent ist, und *nur auf die...
Und das hätte ich wirklich ganz gerne auch "wieder" unter GNU/Linux.
Mit Gruß
Earlybite