KDE-4 konsole drop file patch.

Εδώ και πολλά χρόνια σαν γραφικό περιβάλλον χρησιμοποιώ το KDE. Δεν ξέρω γιατί. Απλά έτυχε. Για κονσόλα λοιπόν χρησιμοποιούσα το konsole. Το konsole, σε εποχή KDE-3, είχε μια ωραία Drag-n-Drop λειτουργία. Άφηνες πάνω του κάποιον φάκελο και έκανε “cd” στον φάκελο αυτόν. Άφηνες πάνω του κάποιο αρχείο και έκανε “cd” στον φάκελο που περιείχε το αρχείο αυτό, και έπαιρνε το focus. Όταν ήρθε το KDE-4 οι λειτουργίες αυτές είχαν αφαιρεθεί.

konsole

Μετά από ένα feature request που έκανα (και κώδικα που έστειλα) υλοποιήθηκε τελικά. Κουτσουρεμένο όμως. Η λειτουργία για το αρχείο έλλειπε. Είχε μόνο για φάκελο και έπρεπε να κάνεις “κλικ” για να πάρει το focus. Άλλαξα λοιπόν πάλι τον κώδικα (το καλό του ελεύθερου λογισμικού. Αν δεν σου κάνει κάτι, φτιάξε το μόνος σου) για να κάνει αυτό που θέλω. Πρέπει να τονίσω πως δεν γνωρίζω προγραμματισμό Qt, C++ (φτου κακά) και KDE framework. Έκατσα μισή ωρίτσα διάβασα για μερικές βιβλιοθήκες της Qt και έφτιαξα κάτι που με βόλευε. Δεν ξέρω αν είναι όμορφο/σωστό.

Το KDE στέλνει την θέση του αρχείου μέσα σε μονά εισαγωγικά (‘/home/firewalker/koko lala/testfile.txt’)όταν στην διαδρομή υπάρχει κενός χαρακτήρας ακολουθούμενο από ένα κενό διάστημα. Όταν η διαδρομή δεν περιέχει κάποιον κενό χαρακτήρα στέλνει την διαδρομή χωρίς εισαγωγικά ακολουθούμενο πάλι από ένα κενό. Για να μπορέσει να γίνει “cd” πρέπει να αφαιρεθεί από την διαδρομή το όνομα του αρχείου από το τέλος. Για τον σκοπό αυτό χρησιμοποιώ ένα RegEx που ψάχνει το όνομα του αρχείου που πιθανόν να το ακολουθεί ένα μονό εισαγωγικό “‘” και σίγουρα ένα κενό. Οπότε η RegEx θα είναι “filename’* “. Δεν χρησιμοποιώ απλά replace διότι αν το όνομα του αρχείου υπάρχει και αλλού μέσα στην διαδρομή (π.χ. /home/firewalker/koko/lala/koko γινόταν /home/firewalker//lala/) υπήρχε πρόβλημα. Στην συνέχει αφαιρώ και τυχόν μονό εισαγωγικό στην αρχή της διαδρομής. Τα προσθέτω αργότερα για όλες τις περιπτώσεις (ακόμη και για διαδρομές χωρίς κενούς χαρακτήρες). Α, “κλέβω” και το focus.

--- konsole-4.10.1/src/TerminalDisplay.cpp	2013-03-01 08:37:14.497248956 +0200
+++ konsole-4.10.1/src/TerminalDisplay.cpp.new	2013-03-13 19:16:51.040746638 +0200
@@ -3002,15 +3002,26 @@ void TerminalDisplay::dropEvent(QDropEve
                 if (url.isLocalFile()) {
                     const QFileInfo fileInfo(url.path());
 
-                    if (fileInfo.isDir()) {
                         QAction* cdAction = new QAction(i18n("Change &Directory To"), this);
-                        dropText = QLatin1String(" cd ") + dropText + QChar('\n');
+			qDebug() << url;
+			if (fileInfo.isFile()){
+			  QString pattern = fileInfo.fileName();
+			  
+			  //Removing the file name part  and the trailing "'" (if exist)+space.
+			  dropText.remove(QRegExp(pattern + QChar('\'') + QChar('*') + QChar(' ')));
+			  
+			  //Removing "'" from the start if exist.
+			  dropText.remove(QRegExp(QChar('^') + QChar('\'')));
+			  dropText = QLatin1String(" cd ") + QChar('\'') + dropText + QChar('\'') + QChar('\n');
+			} else {
+			  dropText = QLatin1String(" cd ") + dropText + QChar('\n');
+			}
                         cdAction->setData(dropText);
                         connect(cdAction, SIGNAL(triggered()), this, SLOT(dropMenuCdActionTriggered()));
                         additionalActions.append(cdAction);
-                    }
                 }
             }
+		activateWindow();
 
             KUrl target(_sessionController->currentDir());
Advertisements
This entry was posted in GNU/Linux and tagged , , , , , , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s