<chapter id="tinkering-under-the-hood">
<!-- Uncomment the <*info
> below and add your name to be -->
<!-- credited for writing this section. -->

<!--
<chapterinfo>
<authorgroup>
<author>
<firstname
>Your First Name here</firstname>
<surname
>Your Surname here </surname>
</author>
</authorgroup>
</chapterinfo>
-->

<title
>&kde; - "Grzebanie pod maską"</title>

<sect1 id="hand-editing-config-files">

<sect1info>
<author
><personname
> <firstname
>Nicolas</firstname
> <surname
>Goutte</surname
> </personname
> <email
>goutte@kde.org</email
> </author>
</sect1info>

<title
>Ręczna edycja plików konfiguracyjnych</title>

<sect2 id="hand-editing-intro">
<title
>Wprowadzenie</title>
<para
>W &kde; można łatwo edytować pliki konfiguracyjne za pomocą prostego edytora tekstowego jak &kate;, bowiem są one zapisane w formacie zwykłego tekstu.</para>

<para
>Przykład pliku tekstowego:</para>

<programlisting
>[General]
AutoSave=1
LastFile=/var/tmp/test.txt</programlisting>

<para
>Pliki konfiguracyjne zalogowanego użytkownika są przechowywane w katalogu <filename class="directory"
>.kde/share/config</filename
> (zamień <filename
>.kde</filename
> na ustawienie $<envar
>KDEHOME</envar
>), zaś pliki globalne znajdują się w podkatalogach <filename class="directory"
>share/config</filename
> katalogu instalacyjnego &kde; (możesz go znaleźć przez wydanie polecenia <command
>kde-config --prefix</command
>). Nazwy plików konfiguracyjnych są zwykle zakończone na literki rc np. <filename
>kopeterc</filename
> od multikomunikatora &kopete;.</para>

<warning
><para
>Ręczna edycja plików konfiguracyjnych może narazić &kde; na utratę stabilności. Programy zwykle nie sprawdzają tego, co odczytują z plików konfiguracyjnych. Oznacza to, że przez niepoprawne ustawienia, program może pracować nieprawidłowo, a nawet wyłączyć się.</para
></warning>

</sect2>

<sect2 id="hand-editing-backups">
<title
>Kopie zapasowe</title>

<para
>A więc pierwszą zasadą jest zrobienie kopii zapasowej pliku, który chcesz edytować. Kopie najlepiej przechowywać poza katalogiem <filename class="directory"
>.kde</filename
> (lub odpowiednio $<envar
>KDEHOME</envar
>). Abstrahując, robienie kopii jest dobrym pomysłem w ogóle. Może się zdarzyć, że jakiś program się zawiesi i zniszczy plik konfiguracyjny (np. ustawienia &kmail-dopelniacz;, które są przechowywane w pliku <filename
>kmailrc</filename
>. Teoretycznie nic takiego nie powinno mieć miejsca, ale lepiej dmuchać na zimne.</para>
</sect2>

<sect2 id="hand-editing">
<title
>Edycja</title>

<para
>Po co w ogóle modyfikować pliki konfiguracyjne? Np. po to, żeby włączyć tryb pracy w kawiarence internetowej. Być może programista poprosił Cię o dodanie jakiegoś wpisu przy próbie rozwiązania problemu z programem. A może chcesz naprawić jakiś problem bez konieczności usuwania całego katalogu <filename class="directory"
>.kde</filename
>. Możliwe też, że chcesz zgłębić wiedzę na temat &kde;.</para>

<para
>Jakikolwiek masz powód, zakładamy, że chcesz zmodyfikować ręcznie plik konfiguracyjny.</para>

<para
>Gdy planujesz wyedytować jakiś plik, upewnij się, że program korzystający z tego pliku jest w tej chwili wyłączony. Jeśli jest to plik używany przez ważne programy &kde;, które nie mogą być wyłączone, rozważ edycję przy wyłączonym &kde;.</para>

<para
>Gotowy? Zrób więc kopię pliku (powtarzam się?), uruchom ulubiony edytor (powiedzmy, że będzie to &kate;), otwórz w nim plik (zwróć uwagę na wybór kodowania, powinno być UTF-8, &kate; wyświetla tą pozycję pod nazwą <quote
>utf8</quote
>).</para>

<para
>Zobaczysz plik w postaci:</para>

<programlisting
>[Grupa]
Klucz1=Wartość1
Klucz2=Wartość2
Klucz3=Wartość3</programlisting>

<para
>Możesz teraz zmodyfikować ten plik (uważnie!), a później zapisać go (upewnij się, że zapisujesz w kodowaniu <acronym
>UTF-8</acronym
>).</para>

<para
>Następnie możesz wypróbować działanie programu. Jeśli program nie działa poprawnie, zamknij go i przywróć kopię zapasową pliku.</para>

<itemizedlist>
<title
>Dodatkowe informacje</title>


<listitem
><para
><xref linkend="kde-for-administrators"/> zawiera więcej informacji o strukturze katalogów &kde;, dzięki temu znajdziesz plik, który chcesz zmodyfikować.</para>
</listitem>

</itemizedlist>

</sect2>

</sect1>

<sect1 id="scripting-the-desktop">
<title
>Zautomatyzowanie wykonywania zadań dzięki zastosowaniu skryptów</title>

<para
>&kde; zawiera potężny system komunikacji międzyprocesowej nazywany &DCOP; (Desktop COmmunication Protocol - protokół komunikacji na pulpicie).Za pomocą &DCOP; możesz sterować wieloma funkcjami &kde; z linii poleceń lub za pomocą skryptu napisanego w Twoim ulubionym języku skryptowym. Możesz również uzyskać informacje z programów &kde;: na przykład kilka z odtwarzaczy multimedialnych dla &kde; umożliwia uzyskanie nazwy aktualnie odtwarzanego utworu.</para>

<para
>Ogólnie mówiąc, każdy program &kde; udostępnia jeden lub więcej <firstterm
>interfejsów</firstterm
> &DCOP;, które dalej zawierają metody (lub, jeśli wolisz taką nazwę, funkcje), które inne program może wywołać. Tak więc, pierwszym krokiem w używaniu &DCOP; jest znalezienie odpowiedniej metody do wybranego zadania. Najprostszym sposobem zrobienia tego jest użycie interfejsu graficznego do &DCOP; zwanego <application
>kdcop</application
>.</para>

<para
>Uruchom <application
>kdcop</application
> z &konsole-dopelniacz; lub mini-linii poleceń (okienka, które pojawia się po naciśnięciu <keycombo action="simul"
>&Alt;<keycap
>F2</keycap
> </keycombo
>). Okno programu <application
>kdcop</application
> pokazuje obecnie działające programy, które udostępniają interfejsy &DCOP;, w postaci struktury drzewiastej. Ogólnie rzecz biorąc, znalezienie odpowiedniej metody wymaga trochę poszukiwań w tym drzewie, ale użyteczną informacją jest, że zwykle interfejs oznaczony jako <quote
>(domyślny)</quote
> zwiera najczęściej używane funkcje.</para>



<para
>Aby sprawdzić, że funkcja działa zgodnie z oczekiwaniami, kliknij dwa razy na funkcji <guilabel
>setColor</guilabel
>. Aby ustawić kolor <varname
>c</varname
>, kliknij na przycisku wyboru koloru i wybierz kolor. Ustaw, czy kolor ma być kolorem A za pomocą opcji. Kliknij <guilabel
>OK</guilabel
>, aby ustawić kolor tła.</para>

<para
>Aby użyć metod &DCOP; z Twojego ulubionego języka skryptowego, możesz użyć interfejsów językowych &DCOP;, o ile są dostępne w module kdebindings, lub możesz uruchomić program <command
>dcop</command
> z linii poleceń. Do prostych zastosowań używanie programu <command
>dcop</command
> wystarcza. Aby wywołać metodę &DCOP; z linii poleceń, konieczne jest podanie programu, interfejsu, w którym znajduje się metoda, nazwy metody i argumentów, w postaci odpowiedniej dla poleceń powłoki.</para>

<para
>Podaje się kolejno: nazwę programu, nazwę interfejsu, nazwę metody, a po nich argumenty w takiej kolejności, jak są one pokazane w programie <application
>kdcop</application
>. <command
>dcop</command
> posiada mnóstwo innych opcji: aby je poznać, proszę zobaczyć wynik wykonania polecenia <userinput
><command
>dcop</command
> <option
>--help</option
></userinput
>.</para>

<para
>Tyle teorii, czas na przykład:</para>

<example>
<title
>Skrypt zmieniający kolor tła za pomocą &DCOP;</title>

<para
>Za pomocą programu <command
>dcop</command
> i odrobiny kodu Perla, stworzymy skrypt, który powoli zmienia kolor tła pulpitu przez całe spektrum.</para>

<para
>Najpierw, szukamy odpowiedniej metody w <application
>kdcop</application
>. W tym przykładzie pominiemy wyszukiwanie i od razu idziemy tam, gdzie potrzeba: metoda, której szukamy to <menuchoice
><guimenu
>kdesktop</guimenu
><guisubmenu
>KBackgroundIface</guisubmenu
><guimenuitem
>setColor</guimenuitem
> </menuchoice
>. Argumenty i typ zwracany przez funkcję są pokazane w stylu języka C++. Argumenty funkcji <methodname
>setColor</methodname
>to kolor, <varname
>c</varname
>, który określa nowy kolor tła, oraz wartość logiczna (prawda lub fałsz), <varname
>isColorA</varname
>, która określa, czy podany kolor to kolor pierwszy, czy drugi (używany do ustawienia gradientów, itp.).</para>

<para
>Aby użyć metody <methodname
>setColor</methodname
> z linii poleceń, użyjemy następującego polecenia: <screen
><prompt
>%</prompt
> <userinput
><command
>dcop</command
> kdesktop KBackgroundIface setColor '#ffffff' false</userinput
>
</screen>
</para>

<para
>Aby podać kolor, użyliśmy szesnastkowej wartości RGB, takiej jak używana w &HTML;-u. Proszę zauważyć, że wartość podana jest w apostrofach, aby zabezpieczyć <token
>#</token
> przed interpretacją przez powłokę.</para>

<para
>Aby poznać szesnastkową wartość RGB dla koloru, otwórz jakiekolwiek okienko wyboru koloru w programie &kde; (na przykład, w &kcontrolcenter-miejscownik;, <menuchoice
><guimenu
>Wygląd i motywy</guimenu
><guimenuitem
>Kolory</guimenuitem
> </menuchoice
>), wybierz kolor, który chcesz, a potem użyj wartości podanej w polu tekstowym <guilabel
>HTML</guilabel
>.</para>


<para
>Tak więc, to wszystko czego potrzebujemy od &DCOP;. Teraz to po prostu sprawa napisania skryptu używającego go. Oto (bardzo) siermiężna implementacja: <programlisting
><![CDATA[
$min=49;  # Minimum value of R, G, or B colour
$max=174; # Maximum value of R, G, or B colour
$step=5;  # Amount to step colour by on each step
$sleeptime=15; # Interval in seconds between each step

@start = ($max, $min, $min);
@colour = @start;

while (1) {
        foreach (0..5) {
                my $which = $_ % 3; # Which colour (R, G or B) to change
                my $updown = $_ % 2; # Whether to increase or decrease the colour value
                do {
                        if ($updown == 0) { $colour[$which]+=$step; }
                        if ($updown == 1) { $colour[$which]-=$step; }
                        my $dcopcall=sprintf "dcop kdesktop KBackgroundIface setColor '#%x%x%x' true\n", @colour;
                        system($dcopcall);
                        sleep $sleeptime;
                        } while (($colour[$which] 
>= $min) and ($colour[$which] <= $max));
                }
}
]]>
</programlisting>
</para>

<para
>Po prostu uruchom ten skrypt bez argumentów, a będzie on zmieniał kolor przez prawie całe spektrum, dopóki nie zostanie przerwany. <foreignphrase
>Voil&agrave;</foreignphrase
>!</para>

</example>

<para
>Oczywiście, Perl to nie jedyny język, w którym możesz pisać skrypty używające &DCOP;&mdash; jeśli wolisz użyć skryptów powłoki, można to też zrobić:</para>

<example>
<title
>Ustawianie tła z Internetu</title>

<para
>Ten skrypt pobiera główny obrazek ze strony komiksowej <quote
>User Friendly</quote
> i ustawia go jako tapetę pulpitu, wykorzystując powszechnie dostępne narzędzia i odrobinę &DCOP;:</para>

<programlisting
><![CDATA[
#!/bin/sh
COMICURL=`wget -qO - http://www.userfriendly.org/static/index.html | \
          grep Latest | sed -e "s,.*SRC=\",," -e "s,\"
>.*,,"`
TMPFILE=`mktemp /tmp/$0.XXXXXX` || exit 1
wget -q -O $TMPFILE $COMICURL
dcop kdesktop KBackgroundIface setWallpaper $TMPFILE 1
]]>
</programlisting>

<para
>Pierwsza linia za #!/bin/sh wykorzystuje <command
>wget</command
> i trochę magii wyrażeń regularnych, aby uzyskać adres obrazka ze źródła &HTML; strony głównej. Druga i trzecia linia zajmują się pobraniem obrazka i w końcu polecenie <command
>dcop</command
> powoduje ustawienie pobranego obrazka jako tapety.</para>

</example>


<!-- <itemizedlist>
<title
>Related Information</title>
<listitem
><para
>to be written</para>
</listitem>
</itemizedlist
> -->


</sect1>


<sect1 id="adding-extra-keys">
<title
>Dodawanie specjalnych skrótów klawiaturowych</title>

<para
>Wiele nowoczesnych klawiatur posiada różne dodatkowe klawisze, które domyślnie nie są przyporządkowane żadnemu działaniu.</para>

<para
><quote
>Klawisze multimedialne</quote
> często generują sygnał, który może być w łatwy sposób wykorzystany jako skrót klawiaturowy dla jakiegoś programu, tak, jak każdy inny klawisz na klawiaturze. Mimo to, niektóre klawisze nie są wykrywane i ich naciskanie w oknie <guilabel
>Konfiguracja skrótów</guilabel
> nie przynosi żadnego efektu.</para>

<para
>Przykładowo niektóre laptopy firmy IBM posiadają dodatkowe klawisze koło strzałek, które wyglądają, jak ikony <guiicon
>strona w lewo</guiicon
> i <guiicon
>strona w prawo</guiicon
>.</para>

<procedure>
<step
><para
>Użyj polecenia <command
>xev</command
> do ustalenia kodów przycisków. W tym przypadku będą to 233 i 234 </para
></step>
<step
><para
>Wybierz jakieś kody klawisza. Istnieje wiele kodów, które nie są domyślnie używane, więc możesz je wykorzystać. Listę znajdziesz w pliku <filename
>/usr/X11R6/include/X11/keysymdef.h</filename
> (lub jego odpowiedniku w Twoim systemie).</para
></step>
<step
><para
>W katalogu domowym utwórz plik o nazwie <filename
>.Xmodmap</filename
> i dodaj do niego coś takiego:</para>
<screen
>keycode 233 = Next_Virtual_Screen
keycode 234 = Prev_Virtual_Screen</screen>
</step>
<step
><para
>Uruchom polecenie <userinput
><command
>xmodmap</command
> <filename
>~/.Xmodmap</filename
></userinput
></para
></step>
</procedure>

<para
>Teraz możesz uruchomić ponownie program <command
>xev</command
> i upewnić się, że przyciski generują kod klawisza, który został im przez Ciebie przypisany. Kody możesz teraz zwyczajnie przypisać do jakiegoś działania.</para>

<itemizedlist>
<title
>Dodatkowe informacje</title>
<listitem
><para
>Możesz przejrzeć pomoc programu <command
>xev</command
> przez wpisanie <userinput
>man:/xev</userinput
> w oknie &konqueror-dopelniacz; lub <userinput
><command
>man</command
> xev</userinput
> w terminalu.</para
></listitem>
</itemizedlist>

</sect1>

<sect1 id="keys-for-scripts">
<title
>Dodawanie skrótów klawiaturowych dla nowych działań</title>

<para
>Większość działań dostępnych na pulpicie lub w programach można też bardzo łatwo przypisać do skrótów klawiaturowych. Jeśli działanie, dla którego chcesz utworzyć skrót zostało napisane przez Ciebie lub nie jest dostępne, ciągle możesz utworzyć skrót.</para>

<para
>Żeby zebrać razem 2 poprzednie sekcje, być może chcesz przypisać któryś z nieużywanych klawiszy do jakiegoś skryptu lub polecenia DCOP. Nasz przykład przypiszemy dwa klawisze, które dodaliśmy w sekcji <xref linkend="adding-extra-keys"/>, żeby służyły do przechodzenia do poprzedniego lub następnego wirtualnego pulpity. Są to dwie funkcje, do których potrzebny będzie DCOP (który został omówiony w sekcji <xref linkend="scripting-the-desktop"/>).</para>

<para
>Można łatwo uzyskać opisany efekt, korzystając z następującej metody:</para>

<procedure>
<step>
<para
>Otwórz &kcontrol;, w sekcji the <guilabel
>Regionalne i dostępność</guilabel
> wybierz <guilabel
>Skróty i gesty</guilabel
></para>
</step>
<step>
<para
>Wybierz <guibutton
>Nowe działanie</guibutton
></para>
</step>
<step>
<para
>Nazwij je jakoś, np. <userinput
>Następny wirtualny pulpit</userinput
></para>
</step>
<step>
<para
>Ustaw <guilabel
>Typ działania:</guilabel
> jako <guilabel
>Skrót klawiaturowy -> Polecenie/URL (proste)</guilabel
></para>
</step>
<step>
<para
>Na zakładce <guilabel
>Skrót klawiszowy</guilabel
> wymyśl kombinację, którą chcesz uruchamiać polecenie. Dla naszego przykładu niech będzie to jeden z klawiszy z symbolem <guiicon
>następny</guiicon
>. Na ilustracji skrótu pojawi się napis <keysym
>Next_Virtual_Screen</keysym
>.</para>
</step>
<step>
<para
>Na zakładce <guilabel
>Ustawienia poleceń/URL</guilabel
> wpisz polecenie: <userinput
><command
>dcop kwin default nextDesktop</command
></userinput
></para>
</step>
</procedure>

<para
>Powtórz poprzednie czynności z klawiszem <keysym
>Prev_Virtual_Screen</keysym
>, ale wpisz tym razem: <userinput
><command
>dcop kwin default previousDesktop</command
></userinput
>.</para>

<para
>Teraz, naciskając klawisze <keysym
>Prev_Virtual_Screen</keysym
> lub <keysym
>Next_Virtual_Screen</keysym
> możesz się przełanczać odpowiednio do poprzedniego wirtualnego pulpitu lub do następnego.</para>

<para
>Oczywiście możesz przypisać każdy wolny klawisz do każdego działania.</para>

<itemizedlist>
<title
>Dodatkowe informacje</title
> 
<listitem
><para
>Sprawdź w &khelpcenter-miejscownik; dokumentację programu <application
>KHotKeys</application
>. Możesz też wpisać w oknie &konqueror-dopelniacz; <userinput
>help:/khotkeys</userinput
>.</para
></listitem
> 
<listitem
><para
><xref linkend="adding-extra-keys"/></para
></listitem>
<listitem
><para
><xref linkend="scripting-the-desktop"/></para
></listitem>
</itemizedlist>

</sect1>

<sect1 id="kdebugdialog">
<sect1info>
<authorgroup>
<author
><personname
> <firstname
>Adriaan</firstname
> <surname
>de Groot</surname
> </personname
> <email
>groot@kde.org</email
> </author>
</authorgroup>
</sect1info>

<title
>&kdebugdialog; - Kontrola wyjścia debugowania &kde;</title>

<sect2 id="kdebugdialog-basic-usage">
<title
>Użycie podstawowe</title>

<para
>&kdebugdialog;nie znajduje się domyślnie w &kmenu;. Musisz więc użyć konsoli lub Alt + F2 i wpisać <userinput
><command
>kdebugdialog</command
></userinput
>. &kdebugdialog;wyświetli okno z długą listą pozycji do debugowania.Każda pozycja ma pole wyboru, które może być zaznaczone lub odznaczone odpowiednio w celu włączenia lub wyłączenia wyjścia debugowania przez program, który jest częścią &kde;.</para>

<para
>Lista pozycji jest posortowana numerycznie, nie alfabetycznie, więc kio (127) znajduje się przed artskde (400). Numery docierają do ok. 200000, ale tak naprawdę jest tylko 400 pozycji. Nie musisz przedzierać się przez całą listę, żeby znaleźć żądaną pozycję; powyżej znajdziesz wyszukiwarkę. Lista wyświetlanych wpisów jest filtrowana na bierząco. Wpisanie <userinput
>k</userinput
> nie wyfiltruje zbyt wielu pozycji, ale wpisanie <userinput
>kont</userinput
> pokaże tylko wpisy dotyczące &kontact-dopelniacz;. Jako jeszcze szybszy sposób włanczania i wyłanczania wyjścia debugowania, znajdziesz też przyciski <guibutton
>Zaznacz wszystko</guibutton
> i <guibutton
>Usuń zaznaczenie</guibutton
>, które nakazują &kde; generowanie wielu informacji diagnostycznych, albo bardzo małej ilości.</para>
</sect2>

<sect2 id="kdebugdialog-fullmode">
<title
>KDebugDialog w trybie pełnym</title>

<!-- this text partly taken from the kdebugdialog handbook -->

<para
>W trybie pełnym, który można uzyskać, uruchamiając program kdebugdialog w sposób: <userinput
><command
>kdebugdialog</command
> <option
>--fullmode</option
></userinput
>, wyświetlana jest ta sama lista wpisów, co w trybie zwykłym, ale jednocześnie możesz wybrać tylko jeden wpis z listy rozwijalnej. Następnie możesz niezależnie ustawić wyjście dla różnych typów wiadomości, jak: Informacja, Ostrzeżenie, Błąd, Błąd krytyczny. Dla każdego z tych typów możesz wybrać, gdzie wiadomości zostaną wysłane. Wyborem mogą być:</para>

<para
>Plik, który możesz nazwać. Plik zostanie zapisany do katalogu $<envar
>HOME</envar
>.</para>

<para
>Komunikat. Każda wiadomość debugowania jest wyświetlana w oknie informacyjnym, gdzie trzeba kliknąć <guibutton
>OK</guibutton
> w celu kontynuacji pracy z programem.</para>

<para
>Powłoka, domyślny wybór. Wiadomości są zapisywane do standardowego wyjścia błędów, czyli pojawiają w oknie powłoki, gdzie program został uruchomiony lub dodawane są do pliku <filename
>.xsession-errors</filename
>.</para>

<para
>Syslog (dziennik systemowy). Ta opcja powoduje przesłanie wiadomości z wyjścia programu do systemowego demona syslog, który może dokonać dalszej obróbki wiadomości.</para>

<para
>Brak. Ta opcja tłumi wyjście wiadomości wybranego typu.</para>

<para
>Dla wiadomości wygenerowanych przez błędy krytyczne zwykle niedobrym pomysłem jest wybranie opcji Brak lub Syslog (dziennik systemowy), ponieważ dla tych wyborów zwyczajnie nie zobaczysz owych wiadomości i program, który napotka na błąd krytyczny, zniknie bez podania przyczyny. Zachowanie, czy program ma zostać zamknięty przy napotkaniu na błąd krytyczny można kontrolować za pomocą pola wyboru <guilabel
>Przerwij przy krytycznych błędach</guilabel
>, które domyślnie jest zaznaczone &mdash; jednak możesz chcieć, żeby program przerwał działanie (w brzydkim stylu), jeśli napotka na błąd krytyczny.</para>

<!-- Add links to "further reading" here -->
<!-- <itemizedlist>
<title
>Related Information</title>
<listitem
><para
>to be written</para>
</listitem>
</itemizedlist
>-->



</sect2>
</sect1>
</chapter>

<!-- Keep this comment at the end of the file
Local variables:
mode: xml
sgml-omittag:nil
sgml-shorttag:nil
sgml-namecase-general:nil
sgml-general-insert-case:lower
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:0
sgml-indent-data:true
sgml-parent-document:("index.docbook" "book" "chapter")
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->
