X11 and Wayland

X11 and Wayland

X11 and Wayland A tale of two implementations 1 / 20 Concepts What is hikari and what am I trying to achieve? and Goals window manager / compositor started 1.5 years ago written from scratch stacking / tiling hybrid approach inspired by cwm tiling algorithmX11 inspired and by Waylandherbstluftwm keyboard driven, for fast navigation modal, inspired by vim waste little screen space allowsA tale to arbitrarily of two group implementations windows minimal dependencies energy efficient target FreeBSD X11 and Wayland implementation 2 / 20 Concepts What is hikari and what am I trying to achieve? Concepts What is hikari and what am I trying to achieve? and Goals window manager / compositor started 1.5 years ago written from scratch stacking / tiling hybrid approach inspired by cwm tiling algorithm inspired by herbstluftwm keyboard driven, for fast navigation modal, inspired by vim waste little screen space allows to arbitrarily group windows minimal dependencies energy efficient target FreeBSD X11 and Wayland implementation 3 / 20 X Window System Architecture 4 / 20 X Window System Architecture X Window System Architecture // TinyWM is written by Nick Welch <[email protected]> in 2005 & 2011. // // 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(void) { Display * dpy; XWindowAttributes attr; XButtonEvent start; XEvent ev; if(!(dpy = XOpenDisplay(0x0))) return 1; XGrabKey(dpy, XKeysymToKeycode(dpy, XStringToKeysym("F1")), Mod1Mask, DefaultRootWindow(dpy), True, GrabModeAsync, GrabModeAsync); XGrabButton(dpy, 1, Mod1Mask, DefaultRootWindow(dpy), True, ButtonPressMask|ButtonReleaseMask|PointerMotionMask, GrabModeAsync, GrabModeAsync, None, None); XGrabButton(dpy, 3, Mod1Mask, DefaultRootWindow(dpy), True, ButtonPressMask|ButtonReleaseMask|PointerMotionMask, GrabModeAsync, GrabModeAsync, None, None); start.subwindow = 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) { XGetWindowAttributes(dpy, ev.xbutton.subwindow, &attr); start = ev.xbutton; } else if(ev.type == MotionNotify && start.subwindow != None) { int xdiff = ev.xbutton.x_root - start.x_root; int ydiff = ev.xbutton.y_root - start.y_root; XMoveResizeWindow(dpy, start.subwindow, 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) start.subwindow = None; } } 5 / 20 // TinyWM is written by Nick Welch <[email protected]> in 2005 & 2011. // // This software is in the public domain // and is provided AS IS, with NO WARRANTY. #include <X11/Xlib.h> #define TalkingMAX(a, b) ((a) to > (b)the ? (a) X : Server (b)) int main(void) { Xlib Display * dpy; XWindowAttributes attr; XButtonEvent start; XEventW-----RW-----RW-----RW-----R ev; if(!(dpy = XOpenDisplay(0x0))) return 1; XGrabKey(dpy, XKeysymToKeycode(dpy, XStringToKeysym("F1")), Mod1Mask, XCB DefaultRootWindow(dpy), True, GrabModeAsync, GrabModeAsync); XGrabButton(dpy, 1, Mod1Mask, DefaultRootWindow(dpy), True, ButtonPressMask|ButtonReleaseMask|PointerMotionMask, GrabModeAsync, GrabModeAsync, None, None); XGrabButton(dpy,WWWW--RRRR 3, Mod1Mask, DefaultRootWindow(dpy), True, ButtonPressMask|ButtonReleaseMask|PointerMotionMask, GrabModeAsync, GrabModeAsync, None, None); start.subwindow = None; for(;;) {W : Writing request XNextEvent(dpy, &ev); if(ev.type- : Stalled, == KeyPress waiting && ev.xkey.subwindow for data != None) XRaiseWindow(dpy,R : Reading reply ev.xkey.subwindow); else if(ev.type == ButtonPress && ev.xbutton.subwindow != None) { XGetWindowAttributes(dpy, ev.xbutton.subwindow, &attr); start = ev.xbutton; } else if(ev.type == MotionNotify && start.subwindow != None) { int xdiff = ev.xbutton.x_root - start.x_root; int ydiff = ev.xbutton.y_root - start.y_root; XMoveResizeWindow(dpy, start.subwindow, 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) start.subwindow = None; } 6 / 20 } Talking to the X Server Talking to the X Server WindowXlib ordering W-----RW-----RW-----RW-----R XCBWindow 2 Window 1 WWWW--RRRR W : Writing request - : Stalled, waiting for data R : Reading reply 7 / 20 Window ordering Window ordering Screen Artifacts Window 2 Window 2 Window 1 Window 1 8 / 20 Screen Artifacts Screen Artifacts Screen Artifacts Window 2 Window 2 Window 1 Window 1 9 / 20 Screen Artifacts Screen Artifacts I can haz keyboardz plz? // taken from awesome keygrabber.c static bool keygrabber_grab(void) { xcb_grab_keyboard_reply_tWindow *xgb; 2 for(int i = 1000; i; i--) { if((xgb = xcb_grab_keyboard_reply(globalconf.connection,Window 1 xcb_grab_keyboard(globalconf.connection, true, globalconf.screen->root, XCB_CURRENT_TIME, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC), NULL))) { p_delete(&xgb); return true; } usleep(1000); } return false; } 10 / 20 I can haz keyboardz plz? I can haz keyboardz plz? Conclusion // taken from awesome keygrabber.c very easystatic to boolget something up and running keygrabber_grab(void) graphical{ user interfaces have evolved xcb_grab_keyboard_reply_t *xgb; "gazillions" of X extensions (legacy demands it) for(int i = 1000; i; i--) { global name space (bad security implications) if((xgb = xcb_grab_keyboard_reply(globalconf.connection, window manager xcb_grab_keyboard(globalconf.connection, is just a client true, globalconf.screen->root, duplicating functionality XCB_CURRENT_TIME, in the window XCB_GRAB_MODE_ASYNC, manager XCB_GRAB_MODE_ASYNC), screen artifacts (gets a bit better with COMPOSITE) NULL))) { p_delete(&xgb); return true; } usleep(1000); } return false; } 11 / 20 Conclusion Conclusion Wayland Architecturevery easy to get something up and running graphical user interfaces have evolved "gazillions" of X extensions (legacy demands it) global name space (bad security implications) window manager is just a client duplicating functionality in the window manager screen artifacts (gets a bit better with COMPOSITE) 12 / 20 Wayland Architecture Wayland Architecture Every frame is perfect! Client A Client B Compositor no need to draw draw draw draw draw draw draw [1] https://emersion.fr/blog/2019/intro-to-damage-tracking/ 13 / 20 Every frame is perfect! Every frame is perfect! wlroots Client A Pluggable, composable, unopinionated modules for building a Wayland compositor; or about 50,000 lines of code you were going to write anyway.Client B Compositor [2] https://github.com/swaywm/wlroots no need to draw written in C draw draw draw draw draw used by sway [3] https://swaywm.org/ [1] https://emersion.fr/blog/2019/intro-to-damage-tracking/ 0.1 release Oct 21, 2018 provides a common ground for many compositors Interesting compositors based on wlroots tinywl ~1KLOC (shipped with wlroots ) cage [4] https://www.hjdskes.nl/projects/cage/ 14 / 20 wlroots wlroots Toolkits GTK GDK_BACKEND=waylandPluggable, composable, unopinionated modules for building a Wayland compositor; or about 50,000 lines of code you were going Qt QT_QPA_PLATFORM=wayland-eglto write anyway. Clutter CLUTTER_BACKEND=wayland SDL [2]SDL_VIDEODRIVER=wayland https://github.com/swaywm/wlroots Applicationswritten in C used by sway [3] https://swaywm.org/ Firefox / Thunderbird MOZ_ENABLE_WAYLAND=1 mpv 0.1 release Oct 21, 2018 wl-clipboardprovides (makes my a common neovim happy) ground for many compositors RunningInteresting X Applications compositors on Wayland based on wlroots Xwayland (needs compositor support) tinywl ~1KLOC (shipped with wlroots ) cage [4] https://www.hjdskes.nl/projects/cage/15 / 20 Toolkits Toolkits Conclusion GTK GDK_BACKEND=wayland it's harderQt to QT_QPA_PLATFORM=wayland-eglget something up and running slightly more code to have the same functionality I had with X11Clutter CLUTTER_BACKEND=wayland fewer processesSDL SDL_VIDEODRIVER=wayland involved (no duplicated functionality) UI isolation way Applicationsless complexity direct control over devices Firefox / Thunderbird MOZ_ENABLE_WAYLAND=1 control over frames (no flickering, no tearing, no flashes) mpv client side decorations wl-clipboard (makes my neovim happy) more responsibility on the compositor largeRunning toolkit support X Applications on Wayland great opportunity for Open Source systems to catch up Xwayland (needs compositor support) 16 / 20 Conclusion Conclusion it's harder to get something up and running slightly more code to have the same functionality I had with X11 fewer processes involved (no duplicated functionality) UI isolation way less complexity direct control over devices control over frames (no flickering, no tearing, no flashes) client side decorations more responsibility on the compositor large toolkit support great opportunity for Open Source systems to catch up 17 / 20 Y U NO RUST? The compositor part of Way Cooler is now written in C. The client portion (i.e. the side that implements the AwesomeWM functionality) is still written in Rust. Ultimately, wlroots-rs was too difficult to write. The mental overhead of attempting to wrap complicated C libraries with Rust is too demanding. This complexity often leads to a RiiR mindset, which I am strongly against. So, the compositor is now written in C. [5] https://github.com/way-cooler/way-cooler/pull/609 18 / 20 Y U NO RUST? Y U NO RUST?

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    21 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us