staging.inyokaproject.org

KDialog & Sonderzeichen

Status: Gelöst | Ubuntu-Version: Kubuntu 18.04 (Bionic Beaver)
Antworten |

Chip88

Anmeldungsdatum:
16. Juni 2008

Beiträge: 568

Hey zusammen,

wie kann man bei KDialog bei einem Titel oder der Inputbox Sonderzeichen wie beispielsweise das & benutzen? Oder geht das gar nicht?!

Danke im Voraus für Eure Unterstützung!

Chipy

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

kdialog --yesno "hallo & auf wiedersehen!" funktioniert bei mir tadellos. Ansonsten kannst du es ggf. mit einem \ maskieren.

Chip88

(Themenstarter)

Anmeldungsdatum:
16. Juni 2008

Beiträge: 568

ChickenLipsRfun2eat schrieb:

kdialog --yesno "hallo & auf wiedersehen!" funktioniert bei mir tadellos. Ansonsten kannst du es ggf. mit einem \ maskieren.

Danke für Deine schnelle Rückmeldung, ChickenLipsRfun2eat!

Wenn ich Deinen Code in die Konsole eingebe, funktioniert es bei mir auch einwandfrei.

Dann präzisiere ich mal meine Frage: Es geht um ein Servicemenü. Ich kopiere jetzt mal nur den Anfang des an sich funktionierenden Befehls ein:

Exec=TIMESTAMP=$(kdialog --icon=ks-clock --title="Datum + Uhrzeit ändern [Datei | Ordner]");

Wie kann ich hier erreichen, dass der Titel als Datum & Uhrzeit ändern angezeigt wird?

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Die doppelte Zuweisung Exec=TIMESTAMP verstehe ich nicht. Aber es funktionieren einfache Anführungszeichen, wenn du statischen Text hast; dann musst du keine pipe oder ampersand maskieren:

kdialog --title 'Datum + Uhrzeit ändern [Datei | Ordner]' --yesno "hallo & auf wiedersehen!"

Der Unterschied ist, dass die in normalen Anführungszeichen verwendeten Variablen, etc. interpretiert werden. In einfachen Anführungszeichen ist das nur ein string literal, also eine Zeichenkette. Die bash interpretiert das + schon als build-in command, [ ist das Synonym für test, die pipe leitet die Ausgabe an Ordner ]' weiter, was nicht funktioniert, usw.

Chip88

(Themenstarter)

Anmeldungsdatum:
16. Juni 2008

Beiträge: 568

ChickenLipsRfun2eat schrieb:

Die doppelte Zuweisung Exec=TIMESTAMP verstehe ich nicht. Aber es funktionieren einfache Anführungszeichen, wenn du statischen Text hast; dann musst du keine pipe oder ampersand maskieren:

kdialog --title 'Datum + Uhrzeit ändern [Datei | Ordner]' --yesno "hallo & auf wiedersehen!"

Der Unterschied ist, dass die in normalen Anführungszeichen verwendeten Variablen, etc. interpretiert werden. In einfachen Anführungszeichen ist das nur ein string literal, also eine Zeichenkette. Die bash interpretiert das + schon als build-in command, [ ist das Synonym für test, die pipe leitet die Ausgabe an Ordner ]' weiter, was nicht funktioniert, usw.

Habe den Code mal aus einem anderen Servicemenü (Change-Timestamp_addtoservicemenu.desktop) übernommen und sprachlich angepasst.

Der gesamte Servicemenü - Eintrag sieht jetzt so bei mir aus:

1
2
3
4
[Desktop Action change_timestamp]
Exec=TIMESTAMP=$(kdialog --icon=ks-clock --title='Datum & Uhrzeit ändern [Datei | Ordner]' --inputbox='Neues Datum & Uhrzeit eingeben:' "$(date "+%0Y-%0m-%0d %0H:%0M:%0S")"); if [ "$?" != "0" ];then exit 1; else COUNT="0"; COUNTFILES=$(echo %F|wc -w); COUNTFILES=$((++COUNTFILES));  DBUSREF=$(kdialog --icon=ks-clock --title='Datum & Uhrzeit ändern [Datei | Ordner]' --progressbar "\t\t\t\t\t\t\t" $COUNTFILES); for file in %F;do COUNT=$((++COUNT)); qdbus $DBUSREF setLabelText "Datum von ${file##*/} wird geändert. [$COUNT/$((COUNTFILES-1))]"; qdbus $DBUSREF Set "" value $COUNT; cd ${file%/*}; touch -cd "$TIMESTAMP" "$file";done; qdbus $DBUSREF Set "" value $COUNTFILES; sleep 1; qdbus $DBUSREF close; kdialog --icon=ks-clock --title='Datum & Uhrzeit ändern [Datei | Ordner]' --passivepopup="[Abgeschlossen]";fi
Icon=ks-clock
Name[de]=Datum ändern

Der Titel wird jetzt tatsächlich mit dem Ampersand angezeigt. Leider funktioniert das bei der Inputbox noch nicht ganz korrekt. Dort erscheint zwischen den beiden Wörtern einfach ein leeres Feld: Datum Uhrzeit.

Hast Du bitte noch einen Tipp?

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Mit Doppel-& klappts:

kdialog --inputbox 'Neues Datum && Uhrzeit angeben'

Chip88

(Themenstarter)

Anmeldungsdatum:
16. Juni 2008

Beiträge: 568

ChickenLipsRfun2eat schrieb:

Mit Doppel-& klappts:

kdialog --inputbox 'Neues Datum && Uhrzeit angeben'

ChickenLipsRfun2eat, hervorragend! Hat super funktioniert! Danke!

Gibt es noch die Möglichkeit, zu unterdrücken, dass bei der Ausführung eines Servicemenüs nichts in der Taskbar angezeigt wird? Ich meine allerdings nicht die Meldung ganz am Ende.

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Chip88 schrieb:

Gibt es noch die Möglichkeit, zu unterdrücken, dass bei der Ausführung eines Servicemenüs nichts in der Taskbar angezeigt wird? Ich meine allerdings nicht die Meldung ganz am Ende.

Das weiß ich nicht. Ich habe keine Taskbar in dem Sinne. Schau dir mal die Option --attach an, vielleicht kannst du damit was zaubern.

Chip88

(Themenstarter)

Anmeldungsdatum:
16. Juni 2008

Beiträge: 568

ChickenLipsRfun2eat schrieb:

Chip88 schrieb:

Gibt es noch die Möglichkeit, zu unterdrücken, dass bei der Ausführung eines Servicemenüs nichts in der Taskbar angezeigt wird? Ich meine allerdings nicht die Meldung ganz am Ende.

Das weiß ich nicht. Ich habe keine Taskbar in dem Sinne. Schau dir mal die Option --attach an, vielleicht kannst du damit was zaubern.

Schade! ☹

Verstehe nicht, wieso bei der Ausführung eines Servicemenüs immer etwas in der Kontrollleiste angezeigt wird...

Mit --attach komm ich nicht wirklich weiter...

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Eigene grafische Prozesse (sprich, ein eigenes Hauptfenster) werden als Programme angezeigt. Du müsstest also deinen KDialog als Subprozess eines bestehenden Fensters ausgeben, um es dem Hauptfenster dieses Prozesses unterzuordnen. Wie das mit der kdialog-executable geht, weiß ich nicht, daher die Idee mit --attach. Versuch einfach mal als window id die id der plasmashell anzugeben.

Chip88

(Themenstarter)

Anmeldungsdatum:
16. Juni 2008

Beiträge: 568

ChickenLipsRfun2eat schrieb:

Eigene grafische Prozesse (sprich, ein eigenes Hauptfenster) werden als Programme angezeigt. Du müsstest also deinen KDialog als Subprozess eines bestehenden Fensters ausgeben, um es dem Hauptfenster dieses Prozesses unterzuordnen. Wie das mit der kdialog-executable geht, weiß ich nicht, daher die Idee mit --attach. Versuch einfach mal als window id die id der plasmashell anzugeben.

Und wo finde ich die ID der Plasmashell heraus? 🙄

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Unter X gibt es xwininfo, unter Wayland funktioniert das allerdings nicht, weil KDialog QWindow::fromWinId() verwendet und es unter Wayland keine X-Window-ID gibt — außer für Fenster im xwayland-Kompatibilitätsmodus. Die Plasmashell hat unter X auch mehrere IDs, du müsstest also eine Logik finden die richtige zu ermitteln. Einfacher wäre das über JavaScript zu realisieren, mit Hilfe der KWin-Scripting-Console. ⇨ https://techbase.kde.org/Development/Tutorials/KWin/Scripting. Dort durch die bestehenden Fenster loopen und das entsprechende auswählen.

Ich hatte es gerade mal in einem separaten XServer versucht, allerdings kam trotzdem ein KDialog-Eintrag in der Taskleiste:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
user@desktop[~]› xwininfo -root -tree

xwininfo: Window id: 0x734 (the root window) (has no name)

  Root window id: 0x734 (the root window) (has no name)
  Parent window id: 0x0 (none)
     99 children:
     0x3a00092 "Qt Clipboard Requestor Window — Konqueror": ()  3x3+0+0  +0+0
     0x1000f7d "KWin": ("kwin_x11" "kwin")  160x160+0+0  +0+0
     0x600004 "Qt Selection Owner for kwalletd5": ()  3x3+0+0  +0+0
     0x360001a "Qt Clipboard Requestor Window — Konsole": ()  3x3+0+0  +0+0
     0x1e0007c "Qt Clipboard Requestor Window — Plasma": ()  3x3+0+0  +0+0
     0x1e0007a "Plasma": ("plasmashell" "plasmashell")  160x160+0+0  +0+0
     0x400003f "Qt Clipboard Requestor Window — System Settings": ()  3x3+0+0  +0+0
     0x1e00068 "Plasma": ("plasmashell" "plasmashell")  640x480+0+0  +0+0
…
user@desktop[~]› kdialog --yesno test --attach 1E0007A
user@desktop[~]› kdialog --yesno test --attach 0x1E0007A
user@desktop[~]› echo "obase=10;ibase=16;1E0007A" | bc
31457402
user@desktop[~]› kdialog --yesno test --attach 31457402

Da ich nicht wusste, wie ich die ID übergeben soll, habe ich drei Varianten versucht. Alle drei hatten trotzdem einen Eintrag in der Taskleiste. Hinweis: bc kommt leider nur mit Großbuchstaben klar.

Du kannst ja mit den Ansätzen weiterspielen. Allerdings glaube ich nicht, dass wir da auf dem richtigen Weg sind. War nur meine Idee das auszuprobieren und ich würde weitere Mühen in der Richtung scheuen und mich an die JavaScript-Methode halten — oder das Ganze gleich in Qt5/CPP/Python umsetzen.

Chip88

(Themenstarter)

Anmeldungsdatum:
16. Juni 2008

Beiträge: 568

ChickenLipsRfun2eat schrieb:

Eigene grafische Prozesse (sprich, ein eigenes Hauptfenster) werden als Programme angezeigt. Du müsstest also deinen KDialog als Subprozess eines bestehenden Fensters ausgeben, um es dem Hauptfenster dieses Prozesses unterzuordnen. Wie das mit der kdialog-executable geht, weiß ich nicht, daher die Idee mit --attach. Versuch einfach mal als window id die id der plasmashell anzugeben.

Hab mir meine Servicemenüs grad nochmal genauer angesehen.

Bei dem hier beispielsweise

1
2
3
4
[Desktop Action copy_path]
Exec=echo "%U" | tr -d '\n' | xclip -selection clipboard
Name=Pfad kopieren
Icon=klipper

kann ich doch kein --attach ergänzen. Oder gibt es da einen anderen Workaround?

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Chip88 schrieb:

…kann ich doch kein --attach ergänzen.

Brauchst du auch nicht. Dessen Aufgabe ist es ja die Auswahl in die Zwischenablage zu speichern, da ist ein KDialog sinnfrei.

Chip88

(Themenstarter)

Anmeldungsdatum:
16. Juni 2008

Beiträge: 568

ChickenLipsRfun2eat schrieb:

Chip88 schrieb:

…kann ich doch kein --attach ergänzen.

Brauchst du auch nicht. Dessen Aufgabe ist es ja die Auswahl in die Zwischenablage zu speichern, da ist ein KDialog sinnfrei.

Ja, genau. Aber trotzdem erscheint auch hier bei der Ausführung etwas in der Taskleiste. 😕

Antworten |