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)
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.
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
gcc -o tinywm tinywm.c -lX11
Vous devriez avoir un fichier appelé tinywm. Ceci est un gestionnaire de fenêtres fraîchement créé.
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
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.
Comme la dernière fois, avec le premier (.xinitrc) exécuté xterm
exit
Tapez pour quitter le serveur X et revenir au premier écran.
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?