2 % © 2009 Michael Stapelberg
6 \documentclass[mode=print,paper=screen,style=jefka]{powerdot}
7 \usepackage[utf8]{inputenc}
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}
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}}
32 \title{i3 - an improved dynamic tiling window manager}
33 \author{sECuRE beim NoName e.V.\\
35 powered by \LaTeX, of course}
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)
51 \begin{slide}{Screenshots!}
53 Drücken Sie Mod1+2 um diese Demo zu starten.
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
64 \item<7-> kein Antialiasing, schlank und schnell bleiben
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, …)
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
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)
95 \begin{slide}[method=direct]{Protokoll, Beispielcode}
97 int 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;
102 cookie = xcb_get_window_attributes_unchecked(conn, event->window);
104 if ((reply = xcb_get_window_attributes_reply(conn, cookie, NULL))
106 LOG("Could not get window attributes\n");
110 window_attributes_t wa = { TAG_VALUE };
111 wa.u.override_redirect = reply->override_redirect;
113 add_ignore_event(event->sequence);
115 manage_window(prophs, conn, event->window, wa);
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}
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
145 \begin{slide}[method=direct]{Xlib-Beispielcode}
147 char *names[10] = {"_NET_SUPPORTED", "_NET_WM_STATE",
148 "_NET_WM_STATE_FULLSCREEN", "_NET_WM_NAME" /* ... */};
152 for (int i = 0; i < 10; i++) {
153 atoms[i] = XInternAtom(display, names[i], 0);
158 \begin{slide}[method=direct]{XCB-Beispielcode}
160 char *names[10] = {"_NET_SUPPORTED", "_NET_WM_STATE",
161 "_NET_WM_STATE_FULLSCREEN", "_NET_WM_NAME" /* ... */};
162 xcb_intern_atom_cookie_t cookies[10];
164 /* Place requests for atoms as soon as possible */
165 for (int c = 0; c < 10; c++)
166 xcb_intern_atom(connection, 0, strlen(names[c]), names[c]);
168 /* Do other stuff here */
169 load_configuration();
172 for (int c = 0; c < 10; c++) {
173 xcb_intern_atom_reply_t *reply =
174 xcb_intern_atom_reply(connection, cookies[c], NULL);
176 fprintf(stderr, "Could not get atom\n");
179 printf("atom has ID %d\n", reply->atom);
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 :-(
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)
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)
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://i3.zekjur.net}
219 \item IRC: \#i3 auf irc.twice-irc.de