Kleine Modifikation an kleinem X-Programm - kann jemand helfen?



  • ich habe hier ein einfaches programm, mit dem unter x der bildschirm gesperrt werden soll, ohne dass man ihn ohne weiteres entsperren kann... (soll nur über kill/term-sig gehen) allerdings wird der screen hier weiß... kann mir jemand helfen, wie ich den gesamten bildschirm schwarz bekomme? wahrscheinlich nur irgendein widget erzeugen, kenne mich aber wiegesagt nicht weiter aus... das programm ist dadurch entstanden, dass ich ein entsprechendes x-programm abgespeckt habe, habe also an sich nichts weiter programmiert... hier also nun der code:

    #include <stdio.h>
    #include <unistd.h>
    #include <X11/StringDefs.h>
    #include <X11/Shell.h>
    #include <X11/Xaw/Viewport.h>
    
    #define AllPointerEventMask \
    	(ButtonPressMask | ButtonReleaseMask | \
    	EnterWindowMask | LeaveWindowMask | \
    	PointerMotionMask | PointerMotionHintMask | \
    	Button1MotionMask | Button2MotionMask | \
    	Button3MotionMask | Button4MotionMask | \
    	Button5MotionMask | ButtonMotionMask | \
    	KeymapStateMask)
    
    int main (int argc, char **argv) {
    
    	Display * display;
    
    	Pixmap src, msk;
    	XColor fg, bg;
    
    	Widget toplevel;
    	Dimension displayWidth, displayHeight;
    
    	Cursor blankcursor;
    
    	Widget form, viewport, desktop;
    
    	char srcBits[] = { 0,0,0,0,0 };
    	char mskBits[] = { 0,0,0,0,0 };
    
    	/* Call the main Xt initialisation function.  It parses command-line options, generating appropriate resource specs, and makes a
    	 * connection to the X display. */
    	toplevel = XtVaAppInitialize(NULL, "ScreenLocker", NULL, 0, &argc, argv, NULL, XtNborderWidth, 0, NULL);
    
    	display = XtDisplay(toplevel);
    
    	displayWidth = WidthOfScreen(DefaultScreenOfDisplay(display));
    	displayHeight = HeightOfScreen(DefaultScreenOfDisplay(display));
    
    	/* full screen - set position to 0,0, but defer size calculation until widgets are realized */
    	XtVaSetValues(toplevel, XtNoverrideRedirect, True, XtNgeometry, "+0+0", NULL);
    
    	form = XtVaCreateManagedWidget("form", formWidgetClass, toplevel, XtNborderWidth, 0, XtNdefaultDistance, 0, NULL);
    	viewport = XtVaCreateManagedWidget("viewport", viewportWidgetClass, form, XtNborderWidth, 0, NULL);
    	desktop = XtVaCreateManagedWidget("desktop", coreWidgetClass, viewport, XtNborderWidth, 0, NULL);
    
    	XtVaSetValues(desktop, XtNwidth, displayWidth, XtNheight, displayHeight, NULL);
    
    	/* "Realize" all the widgets, i.e. actually create and map their X windows */
    	XtRealizeWidget(toplevel);
    
    	/* We want to stop the window manager from managing our toplevel window. This is not really a nice thing to do, so may not work
    	 * properly with every window manager.  We do this simply by setting overrideRedirect and reparenting our window to the root. 
    	 * The window manager will get a ReparentNotify and hopefully clean up its frame window. */
    	//XtVaSetValues(toplevel, XtNoverrideRedirect, True, NULL);
    	//XReparentWindow(display, XtWindow(toplevel), DefaultRootWindow(display), 0, 0);
    
    	/* Now we want to fix the size of "viewport".  We shouldn't just change it directly.
    	 * Instead we set "toplevel" to the required size (which should propagate through "form" to "viewport").
    	 * Then we remove "viewport" from being managed by "form", change its resources to position it and make sure that "form" won't
    	 * attempt to resize it, then ask "form" to manage it again. */
    	//XtResizeWidget(toplevel, displayWidth, displayHeight, 0);
    	//XtUnmanageChild(viewport);
    	//XtVaSetValues(viewport, XtNhorizDistance, 0, XtNvertDistance, 0, XtNleft, XtChainLeft, XtNright, XtChainLeft, XtNtop, XtChainTop, XtNbottom, XtChainTop, NULL);
    	//XtManageChild(viewport);
    
    	/* Now we can set "toplevel" to its proper size. */
    	//XtResizeWidget(toplevel, displayWidth, displayHeight, 0);
    
    	src = XCreateBitmapFromData(display, DefaultRootWindow(display), srcBits, 5, 5);
    	msk = XCreateBitmapFromData(display, DefaultRootWindow(display), mskBits, 5, 5);
    	XAllocNamedColor(display, DefaultColormap(display,DefaultScreen(display)), "black", &fg, &fg);
    	XAllocNamedColor(display, DefaultColormap(display,DefaultScreen(display)), "white", &bg, &bg);
    	blankcursor = XCreatePixmapCursor(display, src, msk, &fg, &bg, 2, 2);
    	XFreePixmap(display, src);
    	XFreePixmap(display, msk);
    
    	/* Try to get the input focus. */
    	XSetInputFocus(display, DefaultRootWindow(display), RevertToPointerRoot, CurrentTime);
    
    	/* now grab keyboard and mouse */
    	if (XtGrabKeyboard(desktop, True, GrabModeAsync, GrabModeAsync, CurrentTime) != GrabSuccess ||
    	    XtGrabPointer(desktop, True, (unsigned int) AllPointerEventMask, GrabModeAsync, GrabModeAsync, None, blankcursor, CurrentTime) != GrabSuccess) {
    		printf ("Could not grab keyboard and mouse.\n");
    	}
    
    	while (1) {
    		/* sleep a little bit - only for better task-scheduling... */
    		sleep (1);
    	}
    
    	return (0);
    
    }
    

    Danke schon im Vorraus!



  • hat sich erledigt, habs hinbekommen... 🙂


Anmelden zum Antworten