Brauche hilfe bei KDE-Programmierung

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
napo
Beiträge: 230
Registriert: 27.07.2004 15:07:54

Brauche hilfe bei KDE-Programmierung

Beitrag von napo » 13.11.2005 15:48:38

Hi,

ich versuche gerade den Shutdown-Dialog von KDE zu erweitern. Mein Ziel ist es zwei zusätzliche Buttons zu haben. Und zwar "Suspend to disk" und "Suspend to ram".

Also hab ich mir die Quellen von ksmserver besorgt und darin die shutdown.cpp bearbeitet.
Folgende Zeilen hab ich erweitert und die Buttons werden auch angezeigt :)

Code: Alles auswählen

        // Suspend to disk
        KPushButton* btnSuspend2disk = new KPushButton( KGuiItem( i18n("&Suspend to disk"), "disk"), frame );
        btnSuspend2disk->setFont( btnFont );
        buttonlay->addWidget( btnSuspend2disk );

        connect(btnSuspend2disk, SIGNAL(clicked()), SLOT(slotSuspend2disk()));
        if ( sdtype == 3 )
            btnSuspend2disk->setFocus();

        // Suspend to ram
        KPushButton* btnSuspend2ram = new KPushButton( KGuiItem( i18n("&Suspend to ram"), "ram"), frame );
        btnSuspend2ram->setFont( btnFont );
        buttonlay->addWidget( btnSuspend2ram );

        connect(btnSuspend2ram, SIGNAL(clicked()), SLOT(reject()));
        if ( sdtype == 4 )
            btnSuspend2ram->setFocus();
Bei Suspend to disk hab ich den Slot bei einem Klick auf eine eigene Slot-Methode verlinkt. Die sieht so aus:

Code: Alles auswählen

void KSMShutdownDlg::slotSuspend2disk()
{
	execlp("/usr/bin/sudo", "~/.kde/share/apps/ksmserver/suspend2disk.sh", (char*)0);
	reject();
}
Bei Suspend to ram hab ich den Slot auf reject() gesetzt (so wie beim Abbrechen-Button).
Im slotSuspend2disk() ruf ich am Ende auch die reject()-Methode auf. Aber hier gibt es ein unterschiedliches Verhalten.
Bei "Suspend to ram" wird das Shutdown-Dialog geschlossen, genau wie beim Abbrechen-Button.
Bei "Suspend to disk" wird aber das Shutdown-Dialog nicht geschlossen, sondern ich werde einfach ausgeloggt. Obwohl ich am Ende der Methode reject() aufrufe. Also ich erwarte eigentlich genau das gleiche Verhalten wie beim "Suspend to ram"-Button.

Kann mir jemand helfen? Ich bin doch totaler Anfänger in der KDE-Programmierung.

Grüssle, napo

Benutzeravatar
napo
Beiträge: 230
Registriert: 27.07.2004 15:07:54

Beitrag von napo » 14.11.2005 18:57:18

schade dass mir keiner helfen kann :(

Ich hätte mich wirklich gefreut, wenn ich eine Suspen to disk-Button und ein Suspend to ram-Button im Abmelden-Dialog hätte.

Benutzeravatar
peschmae
Beiträge: 4844
Registriert: 07.01.2003 12:50:33
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: nirgendwo im irgendwo

Beitrag von peschmae » 14.11.2005 20:51:37

habs erst gerade nicht gesehen. Aber:

Du führst execlp() aus. Ich kann mich auch irren, aber soviel ich weiss ersetzen die exec*() Funktionen den aktuellen Prozess.
[quote=Manpage]
DESCRIPTION
The exec family of functions replaces the current process image with a
new process image. [/quote]

Verwende besser QProcess() um das auszuführen. (Oder KProcess, falls die kdelibs irgend ein Pendant dazu haben)

MfG Peschmä
"er hätte nicht in die usa ziehen dürfen - die versauen alles" -- Snoopy

Benutzeravatar
Leonidas
Beiträge: 2032
Registriert: 28.04.2003 13:48:49
Lizenz eigener Beiträge: MIT Lizenz
Kontaktdaten:

Beitrag von Leonidas » 14.11.2005 21:27:59

peschmae hat geschrieben:Verwende besser QProcess() um das auszuführen. (Oder KProcess, falls die kdelibs irgend ein Pendant dazu haben)
Warum eigentlich nicht mit system()?

(Sorry, wenn diese Frage dämlich ist, ich komme mit C/C++ nur noch in Kontakt, wenn ich etwas kompilieren muss und das nicht geht)
Wir wollten einen Marsch spielen, aber wir hatten nur Xylophone.

Benutzeravatar
napo
Beiträge: 230
Registriert: 27.07.2004 15:07:54

Beitrag von napo » 14.11.2005 23:02:38

Ich hab meine beiden Slots zu dem hier geändert:

Code: Alles auswählen

void KSMShutdownDlg::slotSuspend2disk()
{
    KProcess *proc = new KProcess;

    *proc << "/usr/bin/sudo";
    *proc << "/usr/sbin/hibernate";
    connect(proc, SIGNAL(processExited(KProcess *)), this, SLOT(reject()));
    proc->start();
}

void KSMShutdownDlg::slotSuspend2ram()
{
    KProcess *proc = new KProcess;

    *proc << "/usr/bin/sudo";
    *proc << "/usr/sbin/suspend2ram.sh";
    connect(proc, SIGNAL(processExited(KProcess *)), this, SLOT(reject()));
    proc->start();
}
und es funktioniert :):)

Danke schööön

Benutzeravatar
vicbrother
Beiträge: 1016
Registriert: 23.12.2001 11:15:07
Wohnort: Hamburg

Beitrag von vicbrother » 14.11.2005 23:56:06

Hey cool, und da es GPL ist wird es im nächsten offiziellen Shutdownmenü der KDE sein? :D
Ich habe auch schon lange auf sowas gewartet :)
Debian GNU/Linux "unstable" + KDE4 @ Dell Precision M6400
T9600 - 4GB RAM - 2x160GB RAID0 - nVIDIA Quadro FX 3700M - 17" WUXGA RGB LED - Webcam - Backlit Keyboard - UMTS - 9 Cell Battery -

Benutzeravatar
Leonidas
Beiträge: 2032
Registriert: 28.04.2003 13:48:49
Lizenz eigener Beiträge: MIT Lizenz
Kontaktdaten:

Beitrag von Leonidas » 15.11.2005 15:48:15

vicbrother hat geschrieben:Hey cool, und da es GPL ist wird es im nächsten offiziellen Shutdownmenü der KDE sein? :D
Erst wenn jemand den Patch einschickt und es auch wirklich in KDE reinkommt.
Soo magisch ist Freie Software auch nicht :wink:
Wir wollten einen Marsch spielen, aber wir hatten nur Xylophone.

Benutzeravatar
napo
Beiträge: 230
Registriert: 27.07.2004 15:07:54

Beitrag von napo » 16.11.2005 17:32:53

Also falls, jemand an dieser Änderung interessiert ist. Hier ist der Patch: http://nopaste.debianforum.de/1634

In der Datei ~/.kde/share/config/ksmserverrc konfiguriert man, welche Programme bei den Buttons ausgeführt werden sollen.
Einfach folgendes in die Sektion [General] hinzufügen:

Code: Alles auswählen

suspend2disk=programm1
suspend2ram=programm2
Aber vorsicht, die Programme werden mit User-Rechten ausgeführt. Also sudo oder so verwenden.

Benutzeravatar
peschmae
Beiträge: 4844
Registriert: 07.01.2003 12:50:33
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: nirgendwo im irgendwo

Beitrag von peschmae » 16.11.2005 18:49:11

Leonidas hat geschrieben:
peschmae hat geschrieben:Verwende besser QProcess() um das auszuführen. (Oder KProcess, falls die kdelibs irgend ein Pendant dazu haben)
Warum eigentlich nicht mit system()?

In einem Qt-Programm verwende ich bevorzugterweise QProcess (oder auch im Allgemeinen Qt-Klassen und nicht andere) weil:
- es ist portabel - Qt auf Windows/Mac hat genau diese Klasse auch und die verhält sich genau gleich
- das Interface ist gleich wie beim Rest der verwendeten Qt Klassen - das Ding sendet Signals, kann wie ein normaler stream behandelt werden, ich arbeite mit QStrings, etc...

Aber du hast recht, im konkreten Fall ist eigentlich egal was man benutzt. - ob KProcess, QProcess, fork()&&exec(), system()...

MfG Peschmä
"er hätte nicht in die usa ziehen dürfen - die versauen alles" -- Snoopy

Antworten