Gestionnaire de fenêtres personnalisé (Avez-vous un gestionnaire de fenêtres X? 2)

Cette fois, j'aimerais créer mon propre gestionnaire de fenêtres. La dernière fois, j'ai parlé du fait que le serveur X n'a pas besoin d'avoir un gestionnaire de fenêtres, et comme il en est une suite, [Dernière fois, "Avez-vous un gestionnaire de fenêtres X?"](Https://qiita.com/ai56go Voir aussi / items / 1b8bfeede2b467ac0667).

OS utilisé: ArchLinux (invité VirtualBox)

supposition

Nous procéderons en supposant que les packages suivants, etc. sont installés à l'avance. ・ Dernier package installé ・ Gcc ・ Wget ・ Nano (éditeur de texte tel que)

Comme précédemment, commençons par l'état de la console tty.

Tout d'abord, le code source

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);
    }
}

Ceci est une copie du code source de http://incise.org/tinywm.html.

Si vous souhaitez télécharger à partir d'Internet, il existe les méthodes suivantes.

mkdir ~/work1
cd ~/work1
wget https://raw.githubusercontent.com/mackstann/tinywm/master/tinywm.c

Il y a trois endroits dans le code source, Mod1Mask, qui signifie la touche Alt. Avec les invités VirtualBox, le côté hôte utilise de préférence la touche Alt, ce qui ne fonctionne pas. Remplacez les trois par ControlMask.

nano tinywm.c
#Modifier avec l'éditeur de texte

Puis compilez

gcc -o tinywm tinywm.c -lX11

Vous devriez avoir un fichier appelé tinywm. Ceci est un gestionnaire de fenêtres fraîchement créé.

Et démarrez le serveur X

Configurez le gestionnaire de fenêtres (tinywm) et xterm pour qu'ils s'exécutent immédiatement après le démarrage du serveur X.

echo "~/work1/tinywm& xterm" > ~/.xinitrc
#Mise en garde,.Remplacez xinitrc, s'il existe.

Tapez la commande suivante pour démarrer le serveur X.

startx

VirtualBox_ArchLinux_26_01_2020_09_28_12.png

La fonction est ・ Ctrl + clic gauche pour se déplacer (à l'origine Alt + clic gauche) -Ctrl + clic droit pour redimensionner (à l'origine Alt + clic droit) ・ Appuyez sur Ctrl + F1 pour l'amener à l'avant (à l'origine Alt + F1) Il n'y en a qu'un, mais il est beaucoup plus confortable que le précédent "Êtes-vous un gestionnaire de fenêtres X?" Où vous avez entré des commandes pour déplacer et redimensionner.

Arrêtez le serveur X

Comme la dernière fois, avec le premier (.xinitrc) exécuté xterm

exit

Tapez pour quitter le serveur X et revenir au premier écran.

finalement

Cette fois, j'ai compilé le gestionnaire de fenêtres à partir du fichier source et l'ai exécuté. Le fichier source est aussi court que 50 lignes, et pour ceux qui ont estimé que le gestionnaire de fenêtres était "strict et inaccessible", j'ai réalisé qu'il n'était pas très différent d'une application X normale, et je me suis familiarisé avec lui. N'est-ce pas?

Recommended Posts

Gestionnaire de fenêtres personnalisé (Avez-vous un gestionnaire de fenêtres X? 2)
Ce que vous pouvez et ne pouvez pas faire avec Tensorflow 2.x