Δεν μπορουσα να βρω καλυτερο τιτλο να καταλαβαινετε, ισως ειμαι πιο περιγραφικος πιο κατω.
Στο kde plasma arch linux αλλα και σε ολες τις διανομες με kde οταν αρχιζεις να το πειραζεις λιγο η να προσθετεις κανενα widget, αυτο προκαλει καθυστερηση καποιον δευτερολεπτων στον τερματισμο λειτουργιας, επανεκκινησης και αποσυνδεσης και δεν μπορω να βρω καποια λυση να το διορθωσω αν και απ οτι καταλαβα αυτο το προβλημα ερχεται απ την sddm του πλασμα.
Τελος παντος απ οτι βλεπω στο κλεισιμο με τερματικο δεν υπαρχει καμια καθυστερηση, για αυτο εβγαλα 3 ‘‘link to applications’’ με δεξι κλικ στην επ.εργασιας οπως διχνει η φωτο, και δουλευουν μια χαρα αφου μεσα στα link εβαλα τις παρακατω εντολες:
shutdown:
shutdown -h now
reboot:
reboot
logout:
kill -9 -1
αν και για logout η σωστη εντολη αν δεν κανω λαθος ειναι η παρακατω για kde αλλα και αυτη κλεινει με καθυστερηση για αυτο χρησιμοποιω kill -9 -1.
Αυτο που ψαχνω ειναι αν μπορω ολο αυτο να το κανω με καποιο αλλο τροπο ωστε να βγαλω στην επ.εργασιας ενα εικονιδιο με ενα script η κατι αλλο που να εχει τις τρεις εντολες που διχνω σε μια, και να ρωταει τι θελω να επιλεξω, π.χ shutdown, reboot η logout.
Μετα αυτο θα το συρο στο panel του latte και θα ησυχασω απ την καθυστερηση.
Και ετσι οπως το εχω κανει γινεται να πανε στο panel αλλα αντι για τρια διαφορετικα εικονιδια ηθελα να γινει ολο αυτο σε ενα.
Αν έχεις καθυστέρηση ολόκληρων δευτερολέπτων, τότε κατά 99,99999% υπάρχει κάποιο bug στο ή στα widgets και καλό θα ήταν να το αναφέρεις. Έχε όμως υπόψη σου ότι το Latte Dock είναι πρόσθετο στο σύστημα (άρα έξτρα δουλειά για αυτό, ειδικά αν τρέχεις παράλληλα και το default taskbar του Plasma) και τα widgets δεν έχουν σχεδιαστεί απαραίτητα για να δουλεύουν με το Latte.
Γενικότερα για τις περιπτώσεις αποσύνδεσης, τερματισμού κλπ. υπάρχουν δύο βασικοί τρόποι για να γίνουν. Ο πρώτος είναι να πούμε στο σύστημα «ψόφα», όπως κάνεις για παράδειγμα με το kill. Αυτός είναι γρήγορος και μας αρέσει αλλά πρέπει να είναι πάντοτε η τελευταία μας επιλογή. Ο δεύτερος είναι να ακολουθήσουμε τη σωστή διαδικασία (στην περίπτωση του Plasma εμπεριέχει το qdbus που έγραψες). Αυτό δίνει χρόνο στο σύστημα ώστε να σιγουρευτεί ότι τα πάντα έχουν τερματίσει όπως πρέπει και δε θα αφήσει κάτι στη μέση που θα μας βγάλει προβλήματα στο μέλλον.
Επειδή όμως θα τα αγνοήσεις όλα αυτά (μακάρι να μην το κάνεις), πάμε να απαντήσουμε στην ερώτηση. Μπορείς να κάνεις αυτό που θέλεις πολύ εύκολα, με… widget. Δύο ενδεικτικά παραδείγματα:
Εγώ χρησιμοποιώ το δεύτερο και έχω αλλάξει τις προεπιλεγμένες εντολές που έχει (με το χέρι γίνεται αλλά δεν είναι κάτι δύσκολο).
Ενώ συμφωνώ με Soulrain ότι πιθανότατα υπάρχει κάποιο σοβαρό θέμα από πίσω και θα ήταν καλύτερα να το κοιτάξεις παρά να βάλεις shell script, αυτό εδώ θα κάνει αυτό που ψάχνεις
#!/bin/bash
echo "Διαλέξτε τι θα θέλατε να κάνετε"
echo "1. Τερματισμός λειτουργίας"
echo "2. Αποσύνδεση"
echo "3. Επανεκκίνηση"
read option
if [ "$option" -eq 1 ]; then
shutdown -h now
fi
if [ "$option" -eq 2 ] then
kill -9 -1
fi
if [ "$option" -eq 3 ]; then
reboot
fi
Βάλε το σε ένα αρχείο .sh, κάν’ το και εκτελέσιμο και έτοιμος. Για έξοδο υπάρχει το κλασσικό Control C
Μπορείς να χρησιμοποίσεις το yad(ίσως είναι ήδη εγκατεστημένο) σε ένα script ώστε να εμφανίζεται ένα παράθυρο που να σε ρωτάει τι θέλεις να κάνεις. Κάτι τέτοιο:
#!/bin/bash
opt1="Τερματισμος"
opt2="Επανεκκίνηση"
opt3="Αποσύνδεση"
optQuit="Έξοδος"
function main()
{
answer=$(yad --center --width=850 --height=680 --list --radiolist \
--title="Αποσύνδεση-Τερματισμος-Επανεκκίνηση" \
--text '<span foreground="green" font="16">Επιλέξτε ενέργεια για εκτελέση:</span>' \
--column "Επιλογή " \
--column "Ενέργεια" FALSE "$opt1" FALSE "$opt2" FALSE "$opt3" FALSE "$optQuit")
echo "${answer:=default}"
out=$(echo $answer | cut -d '|' -f 2)
case $out in
$opt1)
shutdown -h now
;;
$opt2)
reboot
;;
$opt3)
kill -9 -1
;;
$optQuit)
exit
;;
esac
}
while :
do
main
done
Ευχαριστω πολυ για τις απαντησεις, δεν το εχω ομως καθολου με script.
Προσπαθησα να καταλαβω κατι αλλα μονο τον χρονο μου σπαταλησα, και τον δικο σας.
@dancaer69 κατεβασα το ‘‘yad’’ και ανοιγει, αλλα δεν ξερω που βοηθαει ακριβως.
Τα opt1,2,3 και optQuit ειναι οι εντολες που θελω να βαλω οπως αναφερω πιο πανω;
To ιδιο θα ρωτουσα και στον @Kosmas_Raptis για τα ‘‘echo’’. Eπισης τι ονομασια θα εχει το script ακριβως, και σε ποια θεση να ειναι. Για παραδειγμα θελω να ειναι στην επ.εργασιας. Desktop για την ακριβεια. Το user μου ειναι ‘‘dimitris’’.
Θα ηθελα και την εντολη για να γινει εκτελεσιμο.
@anon54176929 κατεβασα το ‘‘USwitchMod’’ και παιδευομαι να αλλαξω τις εντολες τερματισμου κτλ με τις δικες μου στο αρχειο: .local/share/plasma/plasmoids/org.kde.plasma.uswitcher/contents/ui/main.qml
Mπορεις να βοηθησεις λιγο περισσοτερο;
Οντως εχεις δικιο και εσυ και τα παιδια. ειναι σφαλμα widget η καθυστερηση, η αλλιως του latte-dock και ειναι τοσο ενοχλητικο που πολλες φορες λες καλυτερα να σκοτωνεις τα παντα με ρισκο να παρεις το συστημα στα χερια και να τα κανεις ολα απ την αρχη.
Kαι ναι τρεχω latte-dock και στο πανω panel. Το ‘‘USwitchMod’’ το εβαλα και σε default panel του plasma και δουλευει και στο default οσο και στο latte-dock (task). Τωρα παιδευομε στο ‘‘main.qml’’.
Η ονομασία δεν έχει σημασία, ότι θέλεις βάζεις για ονομα. Ούτε κατάλληξη χρειάζεται. Απλά πρέπει να κάνεις το αρχείο εκτελέσιμο. Αφού θέλεις γρήγορη πρόσβαση βάλ’ το στην επιφάνεια εργασίας.
Σε ενδιαφέρει βασικά η τελευταία γραμμή με το executable.exec. Για παράδειγμα, αν θέλεις μια επιλογή για τερματισμό όπως έγραψες παραπάνω, μπορείς να κάνεις το αντίστοιχο κομμάτι κάπως έτσι:
Τι χρειάζεται να προσέξεις: αυτό που υπάρχει για κάθε εντολή στη γραμμή με το id:πρέπει να υπάρχει και στη γραμμή 178 όπου ορίζεται η σειρά των επιλογών. Άρα, για το υποθετικό id: shutdown θα πρέπει να έχεις και το αντίστοιχο shutdown.height.
EDIT: για να λύσεις το πραγματικό πρόβλημα, μπορείς να κάνεις το εξής: αφού αποθηκεύσεις ένα αντίγραφο του αρχείου $HOME/.config/plasma-org.kde.plasma.desktop-appletsrc, διέγραψε το αρχικό και κάνε μια αποσύνδεση-επανασύνδεση. Θα έχεις την προεπιλεγμένη επιφάνεια καθαρή και μπορείς να δοκιμάσεις ένα-ένα τα widgets που θέλεις.
Όταν βρεις ποιο προκαλεί την καθυστέρηση, απλά το αφαιρείς από το αντίγραφο που αποθήκευσες πριν, μεταφέρεις αυτό το αντίγραφο ώστε να γίνει το κανονικό plasma-org.kde.plasma.desktop-appletsrc και δε θα χρειάζεσαι έξτρα κουμπιά για τερματισμούς και τα σχετικά.
To πρωι θα τσεκαρω ξεκουραστος, ειναι πολλα για τωρα! δεν προλαβαινω. Ευχαριστω, ειναι πολυ αναλυτικα ολα οσα γραψατε και νομιζω ειμαι κοντα στην λυση του προβληματος… μαλλον τις αρχικης ερωτησης μου, μιας και το προβλημα θελει πολυ δουλεια αλλα ποτε δεν ξερεις.
@dancaer69 Το script σου ειναι αυτο που χρειαζομουν! Χαρη στο ‘‘yad’’ ανοιγει το παραθυρο ε; Υπαρχει σε ολες τις διανομες;
Παντος δεν ξερω τι ειναι το yad και πρωτη φορα το ακουσα αλλα αν συνεχισει να υπαρχει, ειδα οτι εμπνεει σιγουρια τουλαχιστον στο προβλημα που ενδιαφερει εμενα προς το παρον, μιας και θα κοιταξω τι αλλο μπορω να κερδισω με τα script ξεκινοντας διαβασμα απ αθρα που εγραψε ο @Asfodelus πιο πανω.
@Kosmas_Raptis δεν μπορεσα να το ταιριαξω το δικο σου,μαλλον δεν το καταλαβα, τι να πω.
Εβαλα το παρακατω σε ενα .sh αρχειο με καποιο ονομα αλλα στην πρωτη σειρα echo "Διαλέξτε τι θα θέλατε να κάνετε" δεν ηξερα τι ακριβως να βαλω.
Δες τι εκανα:
#!/bin/bash
echo "Choose what you would like to do"
echo "shutdown -h now"
echo "kill -9 -1"
echo "reboot"
read option
if [ "$option" -eq 1 ]; then
shutdown -h now
fi
if [ "$option" -eq 2 ] then
kill -9 -1
fi
if [ "$option" -eq 3 ]; then
reboot
fi
Οι επιλογες με τα echo βλεπω οτι δουλευουν αν τις εχω μια μια.
@anon54176929 με παιδεψες πολυ μερα που ειναι αλλα ειναι αυτο που κρατησα και μου ταιριαζει περισσοτερο.
Αρχικα δεν ειχα καταλαβει τιποτα πριν μιλησεις.
και μου ειχε κανει εντυπωση που δεν υπαρχει μια γραμμη με executable.exec στο default main.qml.
Mετα καλα μου ειπες να κοιταξω το παρακατω:
και το παλευα (καμια 15ρια ωρες) μεχρι να πετυχει και τιποτα. αφου εσπασαν τα νευρα μου γιατι ηθελα αυτο το widget, και σε καθε αλλαγη που δοκιμαζα εκανα επανεκινηση και μετα δεν ανοιγε καν το widget.
Μετα… αφου ηπια και τον δευτερο καφε σκεφτηκα οτι στη γραμμη 178, (που για μενα δεν ειναι 178 αλλα 192 αν θυμαμε καλα) να βαλω με την σειρα την γραμμη + shutdown.Button.height + rebootButton.height + suspendButton.height + leaveButton.height οπως ακριβως ειχα με την ιδια σειρα αντιστοιχα τα ListDelegate και τα id: τους αφου εσβησα κατι id: lockScreenButton κατι τετοια, και τα αντικατεστησα με αυτα που ηθελα. Ελπιζω αυτη η αλλαγη να μην επηρεασει το widget στο μελλον.
Θελω να πω πως σε περιπτωση update του ''USwitchMod'' τι θα γινει; Θα κανω απλα αντικατασταση το σωμενο main.qml και θα ειναι ενταξει;
Tο main.qml:
/*
* Copyright 2015 Kai Uwe Broulik <kde@privat.broulik.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA.
*/
import QtQuick 2.2
import QtQuick.Controls 1.1 as QtControls
import QtQuick.Layouts 1.1
import QtQuick.Window 2.1
import org.kde.plasma.plasmoid 2.0
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.plasma.components 2.0 as PlasmaComponents
import org.kde.plasma.extras 2.0 as PlasmaExtras
import org.kde.kcoreaddons 1.0 as KCoreAddons // kuser
import org.kde.kquickcontrolsaddons 2.0 // kcmshell
import org.kde.kirigami 2.13 as Kirigami
import org.kde.plasma.private.sessions 2.0 as Sessions
Item {
id: root
readonly property bool isVertical: plasmoid.formFactor === PlasmaCore.Types.Vertical
readonly property string displayedName: showFullName ? kuser.fullName : kuser.loginName
readonly property bool showFace: plasmoid.configuration.showFace
readonly property bool showSett: plasmoid.configuration.showSett
readonly property bool showName: plasmoid.configuration.showName
property var iconSett: plasmoid.configuration.icon
readonly property bool showFullName: plasmoid.configuration.showFullName
// TTY number and X display
readonly property bool showTechnicalInfo: plasmoid.configuration.showTechnicalInfo
Plasmoid.switchWidth: units.gridUnit * 10
Plasmoid.switchHeight: units.gridUnit * 12
Plasmoid.toolTipTextFormat: Text.StyledText
Plasmoid.toolTipSubText: i18n("You are logged in as <b>%1</b>", displayedName)
PlasmaCore.DataSource {
id: executable
engine: "executable"
connectedSources: []
property var callbacks: ({})
onNewData: {
var stdout = data["stdout"]
if (callbacks[sourceName] !== undefined) {
callbacks[sourceName](stdout);
}
exited(sourceName, stdout)
disconnectSource(sourceName) // cmd finished
}
function exec(cmd, onNewDataCallback) {
if (onNewDataCallback !== undefined){
callbacks[cmd] = onNewDataCallback
}
connectSource(cmd)
}
signal exited(string sourceName, string stdout)
}
Binding {
target: plasmoid
property: "icon"
value: kuser.faceIconUrl
// revert to the plasmoid icon if no face given
when: !!kuser.faceIconUrl
}
KCoreAddons.KUser {
id: kuser
}
Plasmoid.compactRepresentation: MouseArea {
id: compactRoot
// Taken from DigitalClock to ensure uniform sizing when next to each other
readonly property bool tooSmall: plasmoid.formFactor === PlasmaCore.Types.Horizontal && Math.round(2 * (compactRoot.height / 5)) <= theme.smallestFont.pixelSize
Layout.minimumWidth: isVertical ? 0 : compactRow.implicitWidth
Layout.maximumWidth: isVertical ? Infinity : Layout.minimumWidth
Layout.preferredWidth: isVertical ? undefined : Layout.minimumWidth
Layout.minimumHeight: isVertical ? label.height : theme.smallestFont.pixelSize
Layout.maximumHeight: isVertical ? Layout.minimumHeight : Infinity
Layout.preferredHeight: isVertical ? Layout.minimumHeight : theme.mSize(theme.defaultFont).height * 2
onClicked: plasmoid.expanded = !plasmoid.expanded
Row {
id: compactRow
anchors.centerIn: parent
spacing: units.smallSpacing
Kirigami.Avatar {
id: icon
width: compactRoot.height
height: compactRoot.height
source: visible ? (kuser.faceIconUrl || "user-identity") : ""
visible: root.showFace
}
PlasmaCore.IconItem {
id: icon2
width: height
height: compactRoot.height
Layout.preferredWidth: height
source: visible ? (iconSett || "avatar-default-symbolic") : ""
visible: root.showSett
}
PlasmaComponents.Label {
id: label
text: root.displayedName
height: compactRoot.height
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
wrapMode: Text.NoWrap
fontSizeMode: Text.VerticalFit
font.pixelSize: tooSmall ? theme.defaultFont.pixelSize : units.roundToIconSize(units.gridUnit * 2)
minimumPointSize: theme.smallesFont.pointSize
visible: root.showName
}
}
}
Plasmoid.fullRepresentation: Item {
id: fullRoot
Layout.preferredWidth: units.gridUnit * 12
Layout.preferredHeight: Math.min(Screen.height * 0.5, column.contentHeight)
PlasmaCore.DataSource {
id: pmEngine
engine: "powermanagement"
connectedSources: ["PowerDevil", "Sleep States"]
function performOperation(what) {
var service = serviceForSource("PowerDevil")
var operation = service.operationDescription(what)
service.startOperationCall(operation)
}
}
Sessions.SessionsModel {
id: sessionsModel
}
Connections {
target: plasmoid
onExpandedChanged: {
if (plasmoid.expanded) {
sessionsModel.reload()
}
}
}
PlasmaComponents.Highlight {
id: delegateHighlight
visible: false
z: -1 // otherwise it shows ontop of the icon/label and tints them slightly
}
ColumnLayout {
id: column
// there doesn't seem a more sensible way of getting this due to the expanding ListView
readonly property int contentHeight: aboutComputerItem.height + systemSettingsItem.height + systemMonitorItem.height + 2*separatorItem.height + currentUserItem.height + userList.contentHeight
+ (newSessionButton.visible ? newSessionButton.height : 0)
+ (lockScreenButton.visible ? lockScreenButton.height : 0)
+ shutdown.Button.height + rebootButton.height + suspendButton.height + leaveButton.height
anchors.fill: parent
spacing: 0
ListDelegate {
id: aboutComputerItem
text: i18n("About This Computer")
icon: "help-about"
highlight: delegateHighlight
onClicked: {
executable.exec("kinfocenter");
}
}
ListDelegate {
id: systemMonitorItem
text: i18n("System Monitor")
icon: "view-process-tree"
highlight: delegateHighlight
onClicked: {
executable.exec("ksysguard");
}
}
ListDelegate {
id: systemSettingsItem
text: i18n("System Settings")
icon: "settings-configure"
highlight: delegateHighlight
onClicked: {
executable.exec("systemsettings5");
}
}
Rectangle {
id: separatorItem
Layout.alignment: Qt.AlignCenter
width: parent
height: units.smallSpacing*2
opacity: 0
}
ListDelegate {
id: currentUserItem
text: root.displayedName
subText: i18n("<i>Current user</i>")
icon: "user-identity"
interactive: false
interactiveIcon: true
onIconClicked: KCMShell.open("user_manager")
}
PlasmaExtras.ScrollArea {
Layout.fillWidth: true
Layout.fillHeight: true
ListView {
id: userList
model: sessionsModel
highlight: PlasmaComponents.Highlight {}
highlightMoveDuration: 0
delegate: ListDelegate {
width: userList.width
text: {
if (!model.session) {
return i18nc("Nobody logged in on that session", "Unused")
}
if (model.realName && root.showFullName) {
return model.realName
}
return model.name
}
icon: "user-identity"
subText: {
if (!root.showTechnicalInfo) {
return ""
}
if (model.isTty) {
return i18nc("User logged in on console number", "TTY %1", model.vtNumber)
} else if (model.displayNumber) {
return i18nc("User logged in on console (X display number)", "on %1 (%2)", model.vtNumber, model.displayNumber)
}
return ""
}
onClicked: sessionsModel.switchUser(model.vtNumber, sessionsModel.shouldLock)
onContainsMouseChanged: {
if (containsMouse) {
userList.currentIndex = index
} else {
userList.currentIndex = -1
}
}
}
}
}
ListDelegate {
id: newSessionButton
text: i18n("New Session")
highlight: delegateHighlight
visible: sessionsModel.canStartNewSession
onClicked: sessionsModel.startNewSession(sessionsModel.shouldLock)
}
Rectangle {
id: separatorItem3
Layout.alignment: Qt.AlignCenter
width: parent
height: units.smallSpacing*2
opacity: 0
}
ListDelegate {
id: shutdownButton
text: i18n("Shut Down")
highlight: delegateHighlight
icon: "system-shutdown"
onClicked: {
executable.exec("shutdown -h now");
}
}
ListDelegate {
id: rebootButton
text: i18n("Reboot")
highlight: delegateHighlight
icon: "system-reboot"
onClicked: {
executable.exec("reboot");
}
}
ListDelegate {
id: suspendButton
text: i18n("Suspend")
highlight: delegateHighlight
icon: "system-suspend"
onClicked: pmEngine.performOperation("suspend")
}
ListDelegate {
id: leaveButton
text: i18nc("Show a dialog with options to logout/shutdown/restart", "Leave...")
highlight: delegateHighlight
icon: "system-log-out"
onClicked: pmEngine.performOperation("requestShutDown")
}
}
}
}
edit:
Θα το ξεχνουσα.
Βασικο!
Με το log out δεν μπορεσα να καταφερω κατι, δε καταλαβα πως πρεπει να το κανω.
Με reboot, shutdown ok.
Το yad όπως και το zenity(του οποίου είναι fork) ουσιαστικά λειτουργεί ως frontend για τα scripts. Απ’ όσο ξέρω υπάρχει στα αποθετήρια όλων των διανομών οπότε δε νομίζω να έχεις πουθενά πρόβλημα να το εγκαταστήσεις.
Δικό μου λάθος. Επειδή στην προηγούμενη απάντηση είπες ότι πήγες κατευθείαν στο main.qml, υπέθεσα ότι είχες μια γενική ιδέα για το τι να ψάξεις. Το log out μπορείς να το αντιγράψεις όπως είναι από το παράδειγμα παραπάνω. Απλά πρόσεξε να μη λείπει καμία αγκύλη.
Σε περίπτωση update δε θα γίνει τίποτα γιατί ουσιαστικά δεν υπάρχει update παρά μόνο αν βάλεις εσύ κάποια νεότερη έκδοση. Δεν αλλάζει αυτόματα δηλαδή.
Παρεμπιπτόντως, οι αριθμοί στην εντολή με το qdbusμπορούν να αλλάξουν και για επανεκκίνηση, τερματισμό κλπ., αν τυχόν θέλεις να τα έχεις όλα με τον τρόπο που ακολουθεί το Plasma.
Παρεμπιπτόντως 2, για παραθυράκια και διάφορα τέτοια θα σου συνιστούσα και πάλι να ακολουθήσεις τον τρόπο του Plasma, που είναι το kdialog.
Οχι δεν θα το ελεγα, δικο μου ειναι το λαθος γιατι δεν ειχα ρωτησει απο χθες, απ την πρωτη φορα που δεν μου βγηκε. οπως και να εχει ευχαριστω πολυ, και ευχαριστω σε ολους!
Δεν μου ειναι αδιαφορο, απλα θα ψαξω αργοτερα για αυτο το κομματι, αν καταλαβω βεβαια κατι γιατι τα αγγλικα ειναι ενα αγκαθι για μενα οσες φορες τα εχω χρειαστει.