Revert "html update"
[clinton/website/site/unknownlamer.org.git] / SCWM.muse
CommitLineData
8a7c1bf7 1#title Scheme Your Windows
2
3* Installing SCWM
4
5** Dependencies
6
7*** Required
8
9 - [[http://www.gnu.org/software/guile][Guile]] 1.8.0+
10 - IMLib 1.x (in Debian imlib11-dev)
11
12*** Optional
13
14 - [[ftp://ftp.gnu.org/gnu/guile-gtk/guile-gtk-0.60.tar.gz][Guile-GTK]] 0.60 for dialog support. Guile-GTK 2.x and scwm are not
15 compatible yet
16
17** Downloading and Building
18
19A working version of SCWM can be obtained from
20[[http://sourceforge.net/cvs/?group_id=225][sourceforge CVS]]. Compilation is much more straightforward than one
21would suspect from a project so old (thanks to dsmith for doing the
22painful parts of unbitrotting). The standard autoconf sequence of
23commands should work.
24
25<example>
26./autogen.sh
27./configure
28make
29sudo make install
30</example>
31
32** Running
33
34The directory =sample.scwmrc= has a few sample SCWM
35configurations. =system.scwmrc= and =sample.scwmrc= both work fairly well;
36I have yet to test the others. If not using =system.scwmrc= it is useful
37to at least include the bits that enable debugging.
38
39<src lang="scheme">
40(define debug #t)
41
42(if debug
43 (begin
44 (add-hook! module-loaded-hook display-module-loaded)
45 (set! %load-verbosely #t)
46 (debug-enable 'debug 'backtrace)
47 (read-enable 'positions)))
48</src>
49
50SCWM will attempt to load =system.scwmrc= by default, but this can be
51overridden with the =-f= option. The default =system.scwmrc= loads user
52config from a series of files in =~/.scwm/=.
53
54** Hacking
55
56*** XNested Setup
57
58The easiest way to hack on SCWM is to run it inside of Xnest.
59
60<example>
61Xnest :1 &
62scwm --display :1 --debug # --debug makes X requests synchronous
63</example>
64
65*** GDS for Interaction
66
67SCWM has an emacs interaction mode that communicates with the window
68manager using X window properties, but the emacs side of the code
69doesn't quite work, and GDS is featureful enough now to be used to
70interact with scwm. Using GDS makes hacking scwm quite a bit
71easier. **GDS requires a Guile built with threads to work properly
72(the version in Debian is built *without* threading).**
73
74**** scwmrc code
75
76The following code should be in your scwmrc somewhere.
77
78<src lang="scheme">
79(use-modules (ice-9 gds-client)
80 (ice-9 threads))
81
82;;; GDS thread (in case it must be killed during debugging, ...)
83(define cke-gds-thread #f)
84
85(define (connect-to-debugging-server)
86 (set! cke-gds-thread
87 (call-with-new-thread (lambda () (run-utility))))
88 cke-gds-thread)
89</src>
90
91After defining you can either use =scwmrepl= to run
92=(connect-to-debugging-server)= after starting a GDS server, or simply
93add =(connect-to-debugging-server)= to the config if one will always be
94running.
95
96**** Emacs config
97
98I wrote [[http://darcs.unknownlamer.org/site-emacs/init.d/guile-debug.el][a bit of elisp]] to simplify setting up a scratch buffer for
99interaction with guile.
100
101<src lang="emacs-lisp">
102(require 'gds)
103(require 'gds-server)
104(require 'gds-scheme)
105
106(defvar guile-scratch-buffer-name "*guile-scratch*"
107 "Name of the Guile evaluation scratch buffer")
108
109(defun make-guile-scratch-buffer ()
110 (interactive)
111 (let ((scratch-buf (generate-new-buffer guile-scratch-buffer-name)))
112 (switch-to-buffer scratch-buf)
113 (scheme-mode)
114 (gds-auto-associate-buffer)))
115</src>
116
117If you were already running a debugging client process you will need
118to choose the process to associate the buffer with; =ps= will tell you
119the PID of scwm.
120
121**** Known Issues
122
123Occasionally evaluating an expression or viewing a backtrace will make
124scwm lockup. My understanding is that scwm is not threadsafe, and
125there are some evil issues that will take a while to solve. GDS works
126well enough for now; if I can't make GDS completely reliable I shall
127unbitrot the scwm emacs interaction mode (unless someone else beats me
128to it, *hint hint*).