[LINUX] Selbst erstellter Fenstermanager (Haben Sie einen X-Fenstermanager? 2)

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)

Annahme

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.

Zunächst der Quellcode

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

Dann kompilieren

gcc -o tinywm tinywm.c -lX11

Sie sollten eine Datei namens tinywm haben. Dies ist ein frisch gemachter Fenstermanager.

Und starten Sie den X-Server

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

VirtualBox_ArchLinux_26_01_2020_09_28_12.png

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.

Fahren Sie den X-Server herunter

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.

Schließlich

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?

Recommended Posts

Selbst erstellter Fenstermanager (Haben Sie einen X-Fenstermanager? 2)
Was Sie mit Tensorflow 2.x tun können und was nicht