add more spacing
[personal-kdebase.git] / runtime / doc / userguide / under-the-hood.docbook
blobf7fb4fd7f88b2aef31e93668a77ffdf7444ff289
1 <chapter id="tinkering-under-the-hood">
2 <!-- Uncomment the <*info> below and add your name to be -->
3 <!-- credited for writing this section. -->
5 <!--
6 <chapterinfo>
7 <authorgroup>
8 <author>
9 <firstname>Your First Name here</firstname>
10 <surname>Your Surname here </surname>
11 </author>
12 </authorgroup>
13 </chapterinfo>
14 -->
16 <title>Tinkering Under the Hood of &kde;</title>
18 <sect1 id="hand-editing-config-files">
20 <sect1info>
21 <author>
22 <personname>
23 <firstname>Nicolas</firstname>
24 <surname>Goutte</surname>
25 </personname>
26 <email>goutte@kde.org</email>
27 </author>
28 </sect1info>
30 <title>Hand-Editing Configuration Files</title>
32 <sect2 id="hand-editing-intro">
33 <title>Introduction</title>
34 <para>In &kde;, the configuration files are easy to edit with a simple
35 editor like &kate; as the configuration files are text files.</para>
37 <para>An example of a text file:</para>
39 <programlisting>[General]
40 AutoSave=1
41 LastFile=/var/tmp/test.txt</programlisting>
43 <para>The user-specific configuration files are stored in <filename
44 class="directory">.kde/share/config</filename> (replace 
45 <filename>.kde</filename> with your $<envar>KDEHOME</envar> setting) and
46 the global ones are in the <filename
47 class="directory">share/config</filename> sub-directory of &kde;'s
48 installation path. (You can find this path by running the command
49 <command>kde4-config --prefix</command>.) Their filenames typically
50 end in rc (without an initial period), for example <filename>kopeterc</filename>.</para>
52 <warning><para>
53 Editing configuration files by hand can risk the stability of your
54 &kde; installation. Applications usually do  not check what they read from the
55 configuration files. This means that they can be disturbed by what they
56 get as configuration and might even
57 crash.</para></warning>
59 </sect2>
61 <sect2 id="hand-editing-backups">
62 <title>Backups</title>
64 <para>So the first rule is to make a backup of your file before modifying
65 it. The backup is better stored outside any
66 <filename class="directory">.kde</filename> subdirectory 
67 (or the corresponding $<envar>KDEHOME</envar> directory). Backups are anyway
68 a good idea in case of a major failure of &kde; that would
69 destroy important configuration files (for example your &kmail;  settings,
70 which are in in the file <filename>kmailrc</filename>).
71 (Such a major failure should not happen but it still can happen.)</para>
72 </sect2>
74 <sect2 id="hand-editing">
75 <title>Editing</title>
77 <para>So why would you want to touch the configuration files at all? Well, first you need it
78 when you want to enforce the KIOSK mode. Perhaps a developer has asked you
79 to add an entry to help him to solve a problem with the application. Perhaps you want to recover from
80 a problem without having to remove all the <filename
81 class="directory">.kde</filename> directory. Perhaps you want to learn more
82 about the depths of &kde;.</para>
84 <para>Anyway, whatever your reason, you want to modify by hand a
85 configuration file.</para>
87 <para>When planning to edit such a file, make sure that the application
88 using it is not running. If it is one of the basic configuration files,
89 consider editing the file while &kde; is not running at all.</para>
91 <para>Ready? So make a backup of the file (Did I tell you this already?),
92 start you favorite editor (let us assume it is &kate;), load the file
93 (Be careful to load as UTF-8, &kate; displays it as
94 <quote>utf8</quote>).</para>
96 <para>Now you have a file like:</para>
98 <programlisting>[Group]
99 Key1=Value1
100 Key2=Value2
101 Key3=Value3</programlisting>
103 <para>You can now modify it (with care!) and then save it (Be sure that it
104 is as <acronym>UTF-8</acronym> again).</para>
106 <para>Now you can test the application and if the application does not run
107 correctly anymore, close the application and restore the backup of the
108 configuration file.</para>
110 <itemizedlist>
111 <title>Related Information</title>
114 <listitem><para><xref linkend="kde-for-administrators"/> has more
115 information about &kde;'s directory structure, to help you find the
116 file you need to edit.</para>
117 </listitem>
119 </itemizedlist>
121 </sect2>
123 </sect1>
125 <sect1 id="scripting-the-desktop">
126 <title>Scripting the Desktop</title>
128 <para>&kde; provides a powerful interprocess communication system in
129 &DCOP;, the Desktop COmmunication Protocol. Using &DCOP;, you can
130 control a wide range of functions in &kde; from the command line or
131 from a script written in your favorite scripting language. You can
132 also get information out of &kde; applications: for example, several
133 &kde; media players provide methods to query the player for
134 information about the currently-playing track.</para>
136 <para>Broadly speaking, each &kde; application provides one or more
137 &DCOP; <firstterm>interfaces</firstterm>, which in turn provide
138 methods (or, if you prefer, functions) that another application can
139 call. So, the first step in using &DCOP; is to find the appropriate
140 method for the task. The easiest way to do this is using the
141 <application>kdcop</application> frontend to the available &DCOP;
142 methods.</para>
144 <para>Run <application>kdcop</application> from a &konsole; or the
145 mini-<acronym>CLI</acronym> (the window which pops up on <keycombo
146 action="simul">&Alt;<keycap>F2</keycap> </keycombo>). The
147 <application>kdcop</application> window shows the applications
148 currently running which provide &DCOP; interfaces, using a tree
149 view. 
150 <!-- TODO: Describe the search lineedit thingy -->
151 In general, finding the correct method requires a little bit of
152 searching through the tree view, but a useful hint is that the
153 interface marked <quote>(default)</quote> usually contains the most
154 frequently-used functions.</para>
158 <para>To test that the function does what we expect, double-click on
159 the <guilabel>setColor</guilabel> entry. To set the color
160 <varname>c</varname>, click on the color selector button, and choose a
161 color. Set whether the color should be color A with the
162 checkbox. Click <guilabel>OK</guilabel> and the background color is
163 set.</para>
165 <para>To access the &DCOP; method from your favorite scripting
166 language, you can either use &DCOP; bindings, if available in the
167 kdebindings module, or call the <command>dcop</command> command-line
168 application. For simple usage, calling the
169 <command>dcop</command> command-line application is sufficient. To
170 call a &DCOP; method on the command line, we need to specify the
171 application and interface owning the method, the method itself, and
172 the arguments, in a form suitable for the shell.</para>
174 <para>We specify the application, interface and method in that order,
175 followed by the arguments in the same order that they are shown in
176 <application>kdcop</application>.  <command>dcop</command>
177 has plenty of other options: take a look at the output of
178 <userinput><command>dcop</command>
179 <option>--help</option></userinput>.</para>
181 <para>That's enough theory: time for an example:</para>
183 <example>
184 <title>A Background Color Changing Script with &DCOP;</title>
186 <para>With the <command>dcop</command> command-line application and a
187 little bit of Perl, we're going to make a simple script which slowly
188 cycles the desktop background through the spectrum.</para>
190 <para>Firstly, we look for the appropriate method with
191 <application>kdcop</application>. For this example, we'll short
192 circuit the searching, and go straight to it: the method we want is
193 <menuchoice><guimenu>kdesktop</guimenu><guisubmenu>KBackgroundIface</guisubmenu><guimenuitem>setColor</guimenuitem>
194 </menuchoice>. The arguments and return type of the function are shown
195 in the style of the C++ language. For
196 <methodname>setColor</methodname>, the arguments are a color,
197 <varname>c</varname>, which specifies the new background color, and a
198 boolean (true or false) value, <varname>isColorA</varname>, which
199 specifies whether the color is the first or second (this is useful for
200 setting gradients and so on).</para>
202 <para>To use our <methodname>setColor</methodname> method on the
203 command line, we use the following:
205 <screen>
206 <prompt>%</prompt> <userinput><command>dcop</command> kdesktop KBackgroundIface setColor '#ffffff' false</userinput>
207 </screen>
208 </para>
210 <para>To specify the color, we used the
211 hexadecimal RGB value, as used in &HTML;. Note that it is enclosed in
212 single quotes to protect the <token>#</token> from the shell.</para>
214 <para>To find the hexadecimal RGB value of a color, open any
215 color chooser dialog in a &kde; application (for example, in
216 &kcontrolcenter;, <menuchoice><guimenu>Appearance &amp; Themes</guimenu><guimenuitem>Colors</guimenuitem>
217 </menuchoice>), select the color you want, and use the value given in
218 the <guilabel>HTML</guilabel> text box.</para>
221 <para>So, that's all we need from &DCOP;; now it's just a case of
222 writing a script around it. Here's a (very!) rough implementation:
224 <programlisting>
225 <![CDATA[
226 $min=49;  # Minimum value of R, G, or B colour
227 $max=174; # Maximum value of R, G, or B colour
228 $step=5;  # Amount to step colour by on each step
229 $sleeptime=15; # Interval in seconds between each step
231 @start = ($max, $min, $min);
232 @colour = @start;
234 while (1) {
235         foreach (0..5) {
236                 my $which = $_ % 3; # Which colour (R, G or B) to change
237                 my $updown = $_ % 2; # Whether to increase or decrease the colour value
238                 do {
239                         if ($updown == 0) { $colour[$which]+=$step; }
240                         if ($updown == 1) { $colour[$which]-=$step; }
241                         my $dcopcall=sprintf "dcop kdesktop KBackgroundIface setColor '#%x%x%x' true\n", @colour;
242                         system($dcopcall);
243                         sleep $sleeptime;
244                         } while (($colour[$which] >= $min) and ($colour[$which] <= $max));
245                 }
248 </programlisting>
249 </para>
251 <para>Just run the script with no arguments, and it will cycle the
252 background colour through a slightly muted spectrum until it is
253 killed. <foreignphrase>Voil&agrave;</foreignphrase>!</para>
255 </example>
257 <para>Of course, Perl isn't the only language you can use to write
258 scripts with &DCOP;&mdash;if you prefer shell scripting, that's
259 available too:</para>
261 <example>
262 <title>Setting a background from the Internet</title>
264 <para>The following script gets the main image from the <quote>User
265 Friendly</quote> comic strip and sets it as the desktop wallpaper,
266 using commonly available tools and a little bit of &DCOP;:</para>
268 <programlisting>
269 <![CDATA[
270 #!/bin/sh
271 COMICURL=`wget -qO - http://www.userfriendly.org/static/index.html | \
272           grep Latest | sed -e "s,.*SRC=\",," -e "s,\">.*,,"`
273 TMPFILE=`mktemp /tmp/$0.XXXXXX` || exit 1
274 wget -q -O $TMPFILE $COMICURL
275 dcop kdesktop KBackgroundIface setWallpaper $TMPFILE 1
277 </programlisting>
279 <para>The first line after the #!/bin/sh uses <command>wget</command> and some regular
280 expression magic to extract the image location from the main page's
281 &HTML; source. The second and third lines download the image, and
282 finally, <command>dcop</command> sets the downloaded image as
283 wallpaper.</para>
285 </example>
288 <!-- <itemizedlist>
289 <title>Related Information</title>
290 <listitem><para>to be written</para>
291 </listitem>
292 </itemizedlist> -->
295 </sect1>
298 <sect1 id="adding-extra-keys">
299 <title>Adding Extra Keybindings to &kde;</title>
301 <para>Many modern keyboards contain extra keys that are not by default
302 assigned to any action.</para>
304 <para><quote>Multimedia</quote> keys often generate a signal, and can simply
305 be chosen as a keybinding within an application just like choosing any other
306 key. Some keys however, are not detected and pressing them in a
307 <guilabel>Configure Shortcuts</guilabel> has no effect.</para>
309 <para>Some IBM laptops, for instance, have extra keys about the left and right
310 arrows, which look like <guiicon>page left</guiicon> and <guiicon>page
311 right</guiicon>.</para>
313 <procedure>
314 <step><para>Use <command>xev</command> to find the code of the keys.  In
315 this case, they are 233 and 234 <!-- TODO: Very briefly how to use xev here -->
316 </para></step>
317 <step><para>Choose key symbols. There are quite a range of these that are not
318 used by default, so many are free.  You can find the list in
319 <filename>/usr/X11R6/include/X11/keysymdef.h</filename> (or its equivalent
320 on your system).</para></step>
321 <step><para>Create a file in your home directory called
322 <filename>.Xmodmap</filename>, and add to it the following:</para>
323 <screen>keycode 233 = Next_Virtual_Screen
324 keycode 234 = Prev_Virtual_Screen</screen>
325 </step>
326 <step><para>Run the command <userinput><command>xmodmap</command>
327 <filename>~/.Xmodmap</filename></userinput></para></step>
328 </procedure>
330 <para>At this point, you should be able to run <command>xev</command> again
331 and see that the keys now generate the keysym that you assigned.  You can now
332 simply assign them to any action as normal.</para>
334 <itemizedlist>
335 <title>Related Information</title>
336 <listitem><para>The <command>xev</command> manpage.  You can see this by typing
337 <userinput>man:/xev</userinput> into a &konqueror; window or by typing
338 <userinput><command>man</command> xev</userinput> into a terminal.</para></listitem>
339 </itemizedlist>
341 </sect1>
343 <sect1 id="keys-for-scripts">
344 <title>Adding Keybindings for New Actions</title>
346 <para>Most actions in either the desktop or in applications are readily
347 available to assign a keybinding to.  If the action you want a
348 shortcut for is something you wrote yourself, or is otherwise not available,
349 you can still assign a shortcut.</para>
351 <para>To bring together the two previous sections, perhaps you want to
352 assign an otherwise unused key on your keyboard to a script or dcop
353 command. Our example here will be to assign the two keys we added
354 in <xref linkend="adding-extra-keys"/> to go to the previous or
355 next virtual desktop, two functions for which you will need DCOP (as discussed in
356 <xref linkend="scripting-the-desktop"/>).</para>
358 <para>This can be achieved easily using the following method:</para>
360 <procedure>
361 <step>
362 <para>Open &kcontrol;, and in the <guilabel>Regional &amp; Accessibility</guilabel>
363 section, select <guilabel>Input Action</guilabel></para>
364 </step>
365 <step>
366 <para>Choose <guibutton>New Action</guibutton></para>
367 </step>
368 <step>
369 <para>Name the new action, &eg; <userinput>Next Virtual
370 Screen</userinput></para>
371 </step>
372 <step>
373 <para>Select <guilabel>Keyboard shortcut -> Command/URL (simple)</guilabel>
374 for the <guilabel>Action type:</guilabel></para>
375 </step>
376 <step>
377 <para>In the <guilabel>Keyboard Shortcut</guilabel> tab, click the button
378 you wish to use to trigger the command.  For this example, you would press
379 the one with the <guiicon>Next Page</guiicon> picture on it.
380 <keysym>Next_Virtual_Screen</keysym> will appear in the key image.</para>
381 </step>
382 <step>
383 <para>In the <guilabel>Command/URL Settings</guilabel> tab, enter the
384 command to run in the field: <userinput><command>dcop kwin default
385 nextDesktop</command></userinput></para>
386 </step>
387 </procedure>
389 <para>Repeat the above with the <keysym>Prev_Virtual_Screen</keysym> key and
390 <userinput><command>dcop kwin default
391 previousDesktop</command></userinput>.</para>
393 <para>Now pressing the <keysym>Prev_Virtual_Screen</keysym> or
394 <keysym>Next_Virtual_Screen</keysym> will switch you to the previous or next
395 virtual desktop, respectively.</para>
397 <para>Obviously you can assign any free key to any action.</para>
399 <itemizedlist>
400 <title>Related Information</title> 
401 <listitem><para>See the <application>KHotKeys</application> documentation by
402 looking it up in &khelpcenter;, or typing
403 <userinput>help:/khotkeys</userinput> in a &konqueror;
404 window.</para></listitem> 
405 <listitem><para><xref linkend="adding-extra-keys"/></para></listitem>
406 <listitem><para><xref linkend="scripting-the-desktop"/></para></listitem>
407 </itemizedlist>
409 </sect1>
411 <sect1 id="kdebugdialog">
412 <sect1info>
413 <authorgroup>
414 <author>
415 <personname>
416 <firstname>Adriaan</firstname>
417 <surname>de Groot</surname>
418 </personname>
419 <email>groot@kde.org</email>
420 </author>
421 </authorgroup>
422 </sect1info>
424 <title>&kdebugdialog;  - Controlling &kde;'s Debugging Output</title>
426 <sect2 id="kdebugdialog-basic-usage">
427 <title>Basic Usage</title>
429 <para>&kdebugdialog; is not in the &kmenu; by default. You will need to run
430 it from the shell or from the mini-CLI <!-- link to CLI, for sure --> with
431 the command <userinput><command>kdebugdialog</command></userinput>.
432 &kdebugdialog; pops up a window with a long list of debugging areas. Each
433 area has a checkbox that you can check or uncheck <!-- perhaps
434 select/deselect --> in order to enable or disable debugging output for
435 that part of &kde;.</para>
437 <para>The list of debugging areas is sorted numerically, not alphabetically,
438 so kio (127) comes before artskde (400). The numbers go up to 200000 or so,
439 but there are really only 400 areas. You don't have to scroll through the
440 entire list to find the area you need, though. There is a line edit <!--
441 text-entry ? --> box at the top of the dialog where you can enter a part of
442 the name of the area you want. The list of entries that is displayed is
443 filtered to include only those debug areas that contain the text you have
444 entered. &eg; entering <userinput>k</userinput> does not filter very much at
445 all, but entering <userinput>kont</userinput> <!-- that's "butt" in dutch,
446 haha --> will show you just the &kontact; debugging areas. As an even
447 quicker way of enabling or disabling debugging output, there are also
448 <guibutton>select all</guibutton> and <guibutton>deselect all</guibutton>
449 buttons which will cause &kde; to produce a mountain of debugging output, or
450 very little.</para>
451 </sect2>
453 <sect2 id="kdebugdialog-fullmode">
454 <title>KDebugDialog in full mode</title>
456 <!-- this text partly taken from the kdebugdialog handbook -->
458 <para>In full mode, which is what you get when you start kdebugdialog as
459 <userinput><command>kdebugdialog</command>
460 <option>--fullmode</option></userinput>, the same list of debugging areas
461 as in plain mode is available, but you can select only one at a time from a
462 drop-down <!-- combo? --> box. You may then  independently set the output
463 for various types of messages: Information, Warning, Error and Fatal Error.
464 For each of these types, you can choose where the messages are sent. The
465 choices are:</para>
467 <para>File, in which case you can enter a filename. This file is written into your
468 $<envar>HOME</envar> directory.</para>
470 <para>Message Box. Each debugging message is displayed in an information dialog,
471 which you must <guibutton>OK</guibutton> to continue with the
472 application.</para>
474 <para>Shell, the default entry. Messages are printed to stderr, and will appear
475  either in the shell window where the application was started, or
476 in <filename>.xsession-errors</filename>.</para>
478 <para>Syslog. This sends each debugging message to the system's syslog facility,
479 which can perform its own processing of the message.</para>
481 <para>None. This suppresses the output of this type of message.</para>
483 <para>For messages generated by  fatal errors, it is generally a bad idea to choose
484 None or Syslog, since in both cases you most likely will not see the message
485 and the application that encounters the fatal error will vanish without
486 leaving a clue as to why it vanishes. Whether or not the application will
487 vanish on fatal errors can be controlled by the checkbox <guilabel>abort on
488 fatal errors</guilabel>, which is checked by default &mdash; but you might
489 expect an application to crash (in a messy fashion) if a fatal error is
490 encountered anyway.</para>
492 <!-- Add links to "further reading" here -->
493 <!-- <itemizedlist>
494 <title>Related Information</title>
495 <listitem><para>to be written</para>
496 </listitem>
497 </itemizedlist>-->
501 </sect2>
502 </sect1>
503 </chapter>
505 <!-- Keep this comment at the end of the file
506 Local variables:
507 mode: xml
508 sgml-omittag:nil
509 sgml-shorttag:nil
510 sgml-namecase-general:nil
511 sgml-general-insert-case:lower
512 sgml-minimize-attributes:nil
513 sgml-always-quote-attributes:t
514 sgml-indent-step:0
515 sgml-indent-data:true
516 sgml-parent-document:("index.docbook" "book" "chapter")
517 sgml-exposed-tags:nil
518 sgml-local-catalogs:nil
519 sgml-local-ecat-files:nil
520 End: