]> git.sur5r.net Git - i3/i3/blob - docs/NoName-2009-03-12/i3.tex
s/i3.zekjur.net/i3wm.org/g
[i3/i3] / docs / NoName-2009-03-12 / i3.tex
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 ~\\
35 powered 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
53 Drü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}
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;
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}
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];
163
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]);
167
168 /* Do other stuff here */
169 load_configuration();
170
171 /* Get atoms */
172 for (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}