* H. S. Teoh <[EMAIL PROTECTED]> [070630 20:06]:
> > Could you try the attached program, if it also causes the crash?
> > (Needs libx11-dev installed and compile with
> >  gcc xfakewindow.c -o xfakewindow -lX11)
> [...]
> Did you forget the attachment?

Second attempt...

Hochachtungsvoll,
        Bernhard R. Link
#include <assert.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <unistd.h>

#include <X11/X.h>
#include <X11/Xatom.h>
#include <X11/Xutil.h>

int main(int argc, char *argv[]) {
	Display *display;
	int screen;
	Visual *visual;
	Window w;
	XSetWindowAttributes attributes = {
		.background_pixel= 0,
		.event_mask = KeyPressMask,
	};
	Status s;
	char *names[] = { "Intel\302\256 Motherboards - Opera"};
	XTextProperty text,tt;
	XEvent event;
	struct {
		const char *name;
		XICCEncodingStyle style;
		char *list[2]; int nlist;
		Atom atom;
	} properties[] = {
		{"WM_CLIENT_MACHINE", XStringStyle, {"crystal"}, 1},
		{"WM_LOCALE_NAME", XStringStyle, {"en_US.UTF-8"},1},
		{"WM_WINDOW_ROLE", XStringStyle, {"opera-mainwindow#1"},1},
		{"OPERA_VERSION", XStringStyle, {"Opera 9.21"},1},
		{"OPERA_USER", XStringStyle, {"1000"},1},
		{"OPERA_PREFERENCE", XStringStyle, {"/home/hsteoh/.opera"},1},
		{"_NET_WM_NAME", XUTF8StringStyle,
			{"Intel\302\256 Motherboards - Opera"},
		1}
	};
	XClassHint classhint = {"opera", "Opera"};
	Atom _NET_WM_PID;
	long pid = getpid();
	int i;

	display = XOpenDisplay(getenv("DISPLAY"));
	if( display == NULL )
		return 1;
	screen = DefaultScreen(display);
	visual = DefaultVisual(display,screen);

	for( i = 0 ; i < sizeof(properties)/sizeof(properties[0]) ; i++ ) {
		properties[i].atom = XInternAtom(display, properties[i].name, False);
	}
	_NET_WM_PID = XInternAtom(display, "_NET_WM_PID", False);

	w = XCreateWindow(display, RootWindow(display,screen), 0, 0, 100, 100, 1,
			DefaultDepth(display,screen), InputOutput,
			visual, CWBackPixel|CWEventMask, &attributes);
	s = Xutf8TextListToTextProperty(display, names, 1, XStringStyle, &text);
	XSetClassHint(display, w, &classhint);
	XSetWMName(display, w, &text);
	for( i = 0 ; i < sizeof(properties)/sizeof(properties[0]) ; i++ ) {
		properties[i].atom = XInternAtom(display, properties[i].name, False);
		s = Xutf8TextListToTextProperty(display,
				properties[i].list,
				properties[i].nlist,
				properties[i].style, &tt);
		assert( s == 0 );
		XSetTextProperty(display, w, &tt, properties[i].atom);
	}
	XChangeProperty(display, w, _NET_WM_PID, XA_CARDINAL, 32,
			PropModeReplace, (unsigned char*)&pid, 1);
	XMapWindow(display, w);
	XSync(display, False);
	for( i = 0 ; i < 1000 ; i++ ) {
		XSetWMName(display, w, &text);
		XSync(display, False);
	}
	while( XNextEvent(display,&event) ) {
		if( event.type == KeyPress )
			break;
	}
	XUnmapWindow(display, w);
	XDestroyWindow(display, w);
	XSync(display, False);
	return 0;
}

Reply via email to