1% 2% © 2009 Michael Stapelberg 3% 4% 2009-03-12 5% 6\documentclass[mode=print,paper=screen,style=jefka]{powerdot} 7\usepackage[utf8]{inputenc} 8\usepackage{graphicx} 9\usepackage{ngerman} 10\usepackage{url} 11\usepackage{listings} 12\newcommand{\bs}{\textbackslash} 13\pdsetup{palette=white} 14\definecolor{darkblue}{rgb}{0,0,.6} 15\definecolor{darkred}{rgb}{.6,0,0} 16\definecolor{darkgreen}{rgb}{0,.6,0} 17\definecolor{darkgray}{gray}{.3} 18\definecolor{lightblue}{rgb}{0.97,0.99,1} 19 20\lstloadlanguages{C} 21\lstdefinestyle{colors}{keywordstyle={\bf\color{darkblue}}, commentstyle={\em\color{magenta}}, stringstyle={\color{darkred}},% 22 emphstyle={\color{darkgray}}} 23\lstnewenvironment{code}{% 24 \lstset{frame=single, basicstyle=\footnotesize\ttfamily, language=C, showstringspaces=false,% 25 style=colors, numbers=left, morekeywords={xcb_get_window_attributes_cookie_t, xcb_map_request_event_t,% 26 xcb_connection_t, xcb_get_window_attributes_reply_t, window_attributes_t, xcb_intern_atom_cookie_t,% 27 xcb_intern_atom_reply_t, xcb_atom_t},% 28 moreemph={xcb_get_window_attributes_reply, xcb_get_window_attributes_unchecked, manage_window,% 29 add_ignore_event, xcb_intern_atom, xcb_intern_atom_reply, fprintf, printf, free, load_configuration,% 30 XInternAtom, exit, strlen}} 31}{} 32\title{i3 - an improved dynamic tiling window manager} 33\author{sECuRE beim NoName e.V.\\ 34~\\ 35powered by \LaTeX, of course} 36\begin{document} 37\maketitle 38 39\begin{slide}{Geschichte} 40\begin{list}{$\bullet$}{\itemsep=1em} 41 \item<1-> „All window managers suck, this one just sucks less”? 42 \item<2-> Desktop environment vs. window manager (GNOME, KDE, Xfce, …) 43 \item<3-> Stacking (e17, fluxbox, IceWM, fvwm, …) vs Tiling (dwm, wmii, xmonad, …) 44 \item<4-> dwm, awesome, xmonad, …: statisches Layout 45 \item<5-> wmii, ion: dynamisches layout 46 \item<6-> Problem an ion: tuomov (Lizenz, Kommunikation), Config, Look and feel 47 \item<7-> Probleme an wmii: Xinerama-support, Xlib, undokumentierter code, nur Spalten, keine Reihen, Kleinigkeiten (titellose Fenster) 48\end{list} 49\end{slide} 50 51\begin{slide}{Screenshots!} 52\centering 53Drücken Sie Mod1+2 um diese Demo zu starten. 54\end{slide} 55 56\begin{slide}{Merkmale} 57\begin{list}{$\bullet$}{\itemsep=1em} 58 \item<1-> gut lesbarer, dokumentierter Code. Dokumentation. 59 \item<2-> XCB anstelle von Xlib 60 \item<3-> Xinerama done right™ 61 \item<4-> Spalten und Zeilen 62 \item<5-> command-mode, wie in vim 63 \item<6-> UTF-8 clean 64 \item<7-> kein Antialiasing, schlank und schnell bleiben 65\end{list} 66\end{slide} 67 68\begin{slide}{Typische Kommunikation mit X} 69\begin{list}{$\bullet$}{\itemsep=1em} 70 \item<1-> Verbindung aufbauen 71 \item<2-> Requests über die Leitung schicken (Fenster erzeugen) 72 \item<3-> Eventloop starten, reagieren (Fenster zeichnen, Eingaben, …) 73\end{list} 74\end{slide} 75 76\begin{slide}{Was genau macht ein WM?} 77\begin{list}{$\bullet$}{\itemsep=1em} 78 \item<1-> Events umlenken 79 \item<2-> Neue Fenster anzeigen/positionieren (MapRequest) 80 \item<3-> Titelleisten malen (reparenting) 81 \item<4-> Den Fokus verwalten 82 \item<5-> Mit Hints umgehen (Fenstertitel, Fullscreen, Dock, …) 83 \item<6-> Auf Benutzereingaben reagieren 84\end{list} 85\end{slide} 86 87\begin{slide}{Was an X toll ist} 88\begin{list}{$\bullet$}{\itemsep=1em} 89 \item<1-> Man hat an Window Manager gedacht (Mac OS X *hust*) 90 \item<2-> Netzwerk-transparent (debugging, xtrace) 91 \item<3-> Das Protokoll ist gut designed (Extensions möglich, simpel) 92\end{list} 93\end{slide} 94 95\begin{slide}[method=direct]{Protokoll, Beispielcode} 96\begin{code} 97int handle_map_request(void *prophs, xcb_connection_t *conn, 98 xcb_map_request_event_t *event) { 99 xcb_get_window_attributes_cookie_t cookie; 100 xcb_get_window_attributes_reply_t *reply; 101 102 cookie = xcb_get_window_attributes_unchecked(conn, event->window); 103 104 if ((reply = xcb_get_window_attributes_reply(conn, cookie, NULL)) 105 == NULL) { 106 LOG("Could not get window attributes\n"); 107 return -1; 108 } 109 110 window_attributes_t wa = { TAG_VALUE }; 111 wa.u.override_redirect = reply->override_redirect; 112 113 add_ignore_event(event->sequence); 114 115 manage_window(prophs, conn, event->window, wa); 116 117 return 1; 118} 119\end{code} 120\end{slide} 121 122\begin{slide}{Was an X nicht so toll ist} 123\begin{list}{$\bullet$}{\itemsep=1em} 124 \item<1-> Einige race conditions vorhanden 125 \item<2-> Man kann nicht fein genug angeben, welche Events man gerne hätte 126 \item<3-> Xlib ist ziemlich eklig, aber es gibt ja xcb 127 \item<4-> Bugs: Keyboard state wird nicht richtig übermittelt 128 \item<5-> Ich empfehle auch: „Why X is not our ideal window system” \url{http://www.std.org/~msm/common/WhyX.pdf} 129\end{list} 130\end{slide} 131 132\begin{slide}{XCB} 133\begin{list}{$\bullet$}{\itemsep=1em} 134 \item \url{http://xcb.freedesktop.org/} 135 \item<1-> „X-protocol C-language Binding” 136 \item<2-> Klein, wartbar (aus einer Protokollbeschreibung auto-generiert) 137 \item<3-> Sinnvoll benannte Funktionsnamen und Datentypen 138 \item<4-> Threadsafe (nicht dass wir das bräuchten, aber…) 139 \item<5-> Nutzt die Asynchronität von X aus 140 \item<6-> Dokumentation? Ne, das ist was für Anfänger. 141 \item<7-> xcb-util: XCB noch mal ein bisschen gekapselt, nützliche Funktionen abstrahiert 142\end{list} 143\end{slide} 144 145\begin{slide}[method=direct]{Xlib-Beispielcode} 146\begin{code} 147 char *names[10] = {"_NET_SUPPORTED", "_NET_WM_STATE", 148 "_NET_WM_STATE_FULLSCREEN", "_NET_WM_NAME" /* ... */}; 149 Atom atoms[10]; 150 151 /* Get atoms */ 152 for (int i = 0; i < 10; i++) { 153 atoms[i] = XInternAtom(display, names[i], 0); 154 } 155\end{code} 156\end{slide} 157 158\begin{slide}[method=direct]{XCB-Beispielcode} 159\begin{code} 160char *names[10] = {"_NET_SUPPORTED", "_NET_WM_STATE", 161 "_NET_WM_STATE_FULLSCREEN", "_NET_WM_NAME" /* ... */}; 162xcb_intern_atom_cookie_t cookies[10]; 163 164/* Place requests for atoms as soon as possible */ 165for (int c = 0; c < 10; c++) 166 xcb_intern_atom(connection, 0, strlen(names[c]), names[c]); 167 168/* Do other stuff here */ 169load_configuration(); 170 171/* Get atoms */ 172for (int c = 0; c < 10; c++) { 173 xcb_intern_atom_reply_t *reply = 174 xcb_intern_atom_reply(connection, cookies[c], NULL); 175 if (!reply) { 176 fprintf(stderr, "Could not get atom\n"); 177 exit(-1); 178 } 179 printf("atom has ID %d\n", reply->atom); 180 free(reply); 181} 182\end{code} 183\end{slide} 184 185\begin{slide}{Xft} 186\begin{list}{$\bullet$}{\itemsep=1em} 187 \item<1-> „X FreeType”, library um antialiased fonts zu benutzen 188 \item<2-> Benutzt man am besten mit Pango (rendert fonts) und Cairo 189 \item<3-> Keine Möglichkeit, pixel fonts zu benutzen („x core fonts”) 190 \item<4-> Was macht man (urxvt) also? Beide APIs benutzen, fallback fonts 191 \item<5-> Was machen wir (i3)? misc-fixed-*-iso10646!\\ 192 ISO 10646 = Universal Character Set, selbe Zeichen wie Unicode 193 \item<6-> Fontconfig/xft soll wohl x core fonts ablösen :-( 194\end{list} 195\end{slide} 196 197\begin{slide}{Ein paar Zahlen} 198\begin{list}{$\bullet$}{\itemsep=1em} 199 \item<1-> 6118 Zeilen Code, Dokumentation, Website, READMEs 200 \item<2-> \~{} 2800 Zeilen Sourcecode 201 \item<3-> 73 KB groß (ohne debug symbols) 202\end{list} 203\end{slide} 204 205\begin{slide}{Benutzen} 206\begin{list}{$\bullet$}{\itemsep=1em} 207 \item git clone \url{git://code.stapelberg.de/i3} 208 \item Debian: cd i3; dpkg-buildpackage; sudo dpkg -i ../i3-wm*deb 209 \item non-Debian: cd i3; cat DEPENDS; make; sudo make install 210 \item in \~{}/.xsession: exec /usr/bin/i3 211 \item Siehe manpage i3(1) 212\end{list} 213\end{slide} 214 215\begin{slide}{Mehr infos} 216\begin{list}{$\bullet$}{\itemsep=1em} 217 \item git-webinterface: \url{http://code.stapelberg.de/git/i3} 218 \item Website: \url{http://i3wm.org} 219 \item IRC: \#i3 auf irc.twice-irc.de 220\end{list} 221\end{slide} 222 223\end{document} 224