Dieses Mal möchte ich meinen eigenen Fenstermanager erstellen. Letztes Mal habe ich über die Tatsache gesprochen, dass der X-Server keinen Fenstermanager haben muss, und da es sich um eine Fortsetzung handelt, Letztes Mal "Haben Sie einen X-Fenstermanager?" Siehe auch / items / 1b8bfeede2b467ac0667).
Verwendetes Betriebssystem: ArchLinux (VirtualBox-Gast)
Wir gehen davon aus, dass die folgenden Pakete usw. im Voraus installiert werden. ・ Zuletzt installiertes Paket ・ Gcc ・ Wget ・ Nano (Texteditor wie)
Beginnen wir nach wie vor mit dem Status der tty-Konsole.
tinywm.c
/* TinyWM is written by Nick Welch <[email protected]>, 2005.
*
* This software is in the public domain
* and is provided AS IS, with NO WARRANTY. */
#include <X11/Xlib.h>
#define MAX(a, b) ((a) > (b) ? (a) : (b))
int main()
{
Display * dpy;
Window root;
XWindowAttributes attr;
XButtonEvent start;
XEvent ev;
if(!(dpy = XOpenDisplay(0x0))) return 1;
root = DefaultRootWindow(dpy);
XGrabKey(dpy, XKeysymToKeycode(dpy, XStringToKeysym("F1")), Mod1Mask, root,
True, GrabModeAsync, GrabModeAsync);
XGrabButton(dpy, 1, Mod1Mask, root, True, ButtonPressMask, GrabModeAsync,
GrabModeAsync, None, None);
XGrabButton(dpy, 3, Mod1Mask, root, True, ButtonPressMask, GrabModeAsync,
GrabModeAsync, None, None);
for(;;)
{
XNextEvent(dpy, &ev);
if(ev.type == KeyPress && ev.xkey.subwindow != None)
XRaiseWindow(dpy, ev.xkey.subwindow);
else if(ev.type == ButtonPress && ev.xbutton.subwindow != None)
{
XGrabPointer(dpy, ev.xbutton.subwindow, True,
PointerMotionMask|ButtonReleaseMask, GrabModeAsync,
GrabModeAsync, None, None, CurrentTime);
XGetWindowAttributes(dpy, ev.xbutton.subwindow, &attr);
start = ev.xbutton;
}
else if(ev.type == MotionNotify)
{
int xdiff, ydiff;
while(XCheckTypedEvent(dpy, MotionNotify, &ev));
xdiff = ev.xbutton.x_root - start.x_root;
ydiff = ev.xbutton.y_root - start.y_root;
XMoveResizeWindow(dpy, ev.xmotion.window,
attr.x + (start.button==1 ? xdiff : 0),
attr.y + (start.button==1 ? ydiff : 0),
MAX(1, attr.width + (start.button==3 ? xdiff : 0)),
MAX(1, attr.height + (start.button==3 ? ydiff : 0)));
}
else if(ev.type == ButtonRelease)
XUngrabPointer(dpy, CurrentTime);
}
}
Dies ist eine Kopie des Quellcodes von http://incise.org/tinywm.html.
Wenn Sie aus dem Internet herunterladen möchten, gibt es die folgenden Methoden.
mkdir ~/work1
cd ~/work1
wget https://raw.githubusercontent.com/mackstann/tinywm/master/tinywm.c
Es gibt drei Stellen im Quellcode, Mod1Mask, was die Alt-Taste bedeutet. Bei VirtualBox-Gästen verwendet die Hostseite bevorzugt die Alt-Taste, was nicht funktioniert. Ändern Sie alle drei in ControlMask.
nano tinywm.c
#Mit Texteditor bearbeiten
gcc -o tinywm tinywm.c -lX11
Sie sollten eine Datei namens tinywm haben. Dies ist ein frisch gemachter Fenstermanager.
Stellen Sie den Fenstermanager (tinywm) und xterm so ein, dass sie unmittelbar nach dem Start des X-Servers ausgeführt werden.
echo "~/work1/tinywm& xterm" > ~/.xinitrc
#Hinweis,.Überschreiben Sie xinitrc, falls vorhanden.
Geben Sie den folgenden Befehl ein, um den X-Server zu starten.
startx
Die Funktion ist ・ Strg + Linksklick zum Verschieben (ursprünglich Alt + Linksklick) -Strg + Rechtsklick zum Ändern der Größe (ursprünglich Alt + Rechtsklick) ・ Drücken Sie Strg + F1, um es nach vorne zu bringen (ursprünglich Alt + F1). Es gibt nur einen, aber er ist viel komfortabler als der vorherige "Sind Sie ein X-Fenstermanager?", Wo Sie Befehle zum Verschieben und Ändern der Größe eingegeben haben.
Wie beim letzten Mal wird mit dem ersten (.xinitrc) xterm ausgeführt
exit
Geben Sie ein, um den X-Server zu beenden und zum ersten Bildschirm zurückzukehren.
Dieses Mal habe ich den Fenstermanager aus der Quelldatei kompiliert und ausgeführt. Die Quelldatei ist nur 50 Zeilen lang, und für diejenigen, die den Fenstermanager als "streng und unzugänglich" empfanden, wurde mir klar, dass sie sich nicht wesentlich von einer normalen X-App unterscheidet, und ich wurde damit vertraut. Ist es nicht?