Bagaimana cara membuat peluncur kesatuan yang melakukan pemantauan file?

11

Saya ingin membuat peluncur yang melakukan hal yang sama dengan ikon tempat sampah di mana daftar cepat berbeda ditampilkan tergantung pada apakah ada item di tempat sampah.

Saya ingin sesuatu seperti: jika folder Aada, tunjukkan A,B,Cpada daftar cepat, jika folder Atidak ada, tunjukkan D,E,Fpada daftar cepat.

Rey Leonard Amorato
sumber
3
Saya telah melihat ini sebelumnya, dan mungkin harus dilakukan melalui protokol Pemberitahuan Startup . Dan dengan mengatur StartupNotify ke true dalam file .desktop. Tapi saya tidak yakin dari sana.
Paul van Schayck
1
Lihat: wiki.ubuntu.com/Unity/LauncherAPI Memiliki contoh daftar cepat dinamis
S Prasanth

Jawaban:

3

Karya-karya berikut:

  1. Buat 2 file: mylauncher.desktop dan mylauncher.py dengan konten seperti yang diberikan di bawah ini.
  2. Jadikan mylauncher.desktop sebuah executable.
  3. Tambahkan mylauncher.desktop ke launcher unity.
  4. Edit Folder Lipat dan Folderlokasi di mylauncher.py seperlunya.
  5. Jalankan python mylauncher.pydi latar belakang. Anda harus menambahkan ini ke salah satu skrip start-up Anda.

Sumber: https://wiki.ubuntu.com/Unity/LauncherAPI


Isi dari mylauncher.desktop:

[Desktop Entry]
Name=My Launcher
Comment=A,B,C if A else D,E,F
Exec=nautilus %U
Icon=nautilus
Terminal=false
StartupNotify=true
Type=Application
OnlyShowIn=GNOME;Unity;
Actions=;

Isi dari mylauncher.py:

updateinterval = 1 #Update interval in seconds. Set it to a +ve integer.
#In Foldernames and Folderlocations, spaces shouldn't be preceded by \.
Foldernames = ["A", "B", "C", "D", "E", "F"]
Folderlocations = ["/home/prasanth/A", "/home/prasanth/B", "/home/prasanth/C", "/home/prasanth/D", "/home/prasanth/E", "/home/prasanth/F"]
#####################################

from gi.repository import Unity, Gio, GObject, Dbusmenu
import os, subprocess

def nautilusopen(junk1, junk2, location): #Function that opens `location` in nautilus. Equivalent to `nautilus location` in bash.
    subprocess.Popen(['nautilus', "%s" % location])

launcher = Unity.LauncherEntry.get_for_desktop_id("mylauncher.desktop") #You won't have to modify this, except if you rename `mylauncher.desktop`

#Code block A: This code block builds 6 quicklist entries, 3 for when A is found and 3 for when it isn't
QLentries = [Dbusmenu.Menuitem.new() for i in Foldernames]
for i in xrange(6):
    QLentries[i].property_set(Dbusmenu.MENUITEM_PROP_LABEL, "Goto %s" % Foldernames[i])
    QLentries[i].connect("item-activated", nautilusopen, Folderlocations[i])
    QLentries[i].property_set_bool(Dbusmenu.MENUITEM_PROP_VISIBLE, True)
################

#Code block B: This code block creates 2 quicklists 1 for when A is found and 1 for when it isn't. Then it adds the first 3 quicklist entries to QLifA and the next 3 to QLifnotA
QLifA = Dbusmenu.Menuitem.new() #Quicklist if A is found
QLifnotA = Dbusmenu.Menuitem.new() #Quicklist if A is not found.
for i in xrange(3):
    QLifA.child_append(QLentries[i])
for i in xrange(3, 6):
    QLifnotA.child_append(QLentries[i])
################

#The rest of the code simply monitors the file system for A's existence and switches appropriately between QLifA and QLifnotA
prevState = None
def updateql():
    global prevState
    currentState = 'A' if os.path.exists(Folderlocations[0]) else 'notA' #currentState is 'A' if Folderlocations[0] (which is /home/prasanth/A) exists, 'notA' otherwise
    if currentState != prevState:
        if currentState == 'A':
            launcher.set_property("quicklist", QLifA)
        else:
            launcher.set_property("quicklist", QLifnotA)
        prevState = currentState
    return True

#GObject.timeout_add_seconds(updateinterval, updateql)
#mainloop = GObject.MainLoop()
#mainloop.run()

#If the 3-line commented block above worked as expected, the remainder of this script would be unnecessary. Unfortunately, it doesn't.
import signal
def alarmhandler(signum, frame):
    raise Exception('Alarm has rung')
signal.signal(signal.SIGALRM, alarmhandler)

mainloop = GObject.MainLoop()

while True:
    try:
        updateql()
        signal.alarm(updateinterval)
        mainloop.run()
    except KeyboardInterrupt:
        continue

Sunting: Gunakan yang berikut ini sebagai mylauncher.py untuk tujuan yang disebutkan dalam komentar. Memodifikasi yang sesuai dengan kebutuhan Anda harus langsung dan jika tidak disebutkan dalam komentar.

from gi.repository import Unity, Gio, GObject, Dbusmenu
import os, subprocess

updateinterval = 1 #Update interval in seconds. Set it to a +ve integer.

#Quicklist entries if already mounted:
ifMountedEntry1text = """Unmount A""" #Text shown in the quicklist menu for this entry.
ifMountedEntry1command = """unmount A""" #Bash command to execute when entry 1 is clicked. Doubt if `unmount A` will work. Modify appropriately.

ifMountedEntry2text = """Open A""" #Maybe you'll want to open A directly from the launcher. Included just so you get a hang of how this works.
ifMountedEntry2command = """nautilus A"""
#Extend as required.

#Quicklist entries if not already mounted:
ifnotMountedEntry1text = """Mount A"""
ifnotMountedEntry1command = """mount A""" #Again modify `mount A` appropriately.
#Extend as required.

#My old file monitoring should work. But in case you want to change the criteria for modifying quicklists, it is better to do the following:
filemonitoringcommand = """if [ -d /folder/to/monitor/ ]; then echo True; else echo False; fi;""" #<Bash command>/<location to script> which prints 'True' if A is mounted, 'False' otherwise.
#####################

def systemcall(junk1, junk2, command):
    os.system(command)

launcher = Unity.LauncherEntry.get_for_desktop_id("mylauncher.desktop") #You won't have to modify this, except if you rename `mylauncher.desktop`

#Quicklist if already mounted:
QLifMounted = Dbusmenu.Menuitem.new()

ifMountedEntry1 = Dbusmenu.Menuitem.new()
ifMountedEntry1.property_set(Dbusmenu.MENUITEM_PROP_LABEL, ifMountedEntry1text) #Sets the text shown in the quicklist menu for this entry.
ifMountedEntry1.connect("item-activated", systemcall, ifMountedEntry1command) #Sets the corresponding bash command.
ifMountedEntry1.property_set_bool(Dbusmenu.MENUITEM_PROP_VISIBLE, True)
QLifMounted.child_append(ifMountedEntry1) #Adds the first entry to the quicklist

ifMountedEntry2 = Dbusmenu.Menuitem.new()
ifMountedEntry2.property_set(Dbusmenu.MENUITEM_PROP_LABEL, ifMountedEntry2text)
ifMountedEntry2.connect("item-activated", systemcall, ifMountedEntry2command)
ifMountedEntry2.property_set_bool(Dbusmenu.MENUITEM_PROP_VISIBLE, True)
QLifMounted.child_append(ifMountedEntry2)
#Extend as required.

#Quicklist if not already mounted:
QLifnotMounted = Dbusmenu.Menuitem.new()

ifnotMountedEntry1 = Dbusmenu.Menuitem.new()
ifnotMountedEntry1.property_set(Dbusmenu.MENUITEM_PROP_LABEL, ifnotMountedEntry1text)
ifnotMountedEntry1.connect("item-activated", systemcall, ifnotMountedEntry1command)
ifnotMountedEntry1.property_set_bool(Dbusmenu.MENUITEM_PROP_VISIBLE, True)
QLifnotMounted.child_append(ifnotMountedEntry1)
#Extend as required.

#The rest of the code uses `filemonitoringcommand` to monitor the filesystem and dynamically modifies (or rather switches between) quicklists.
prevState = None
def updateql():
    global prevState
    currentState = 'True' in os.popen(filemonitoringcommand).read()
    if currentState != prevState:
        if currentState == True:
            launcher.set_property("quicklist", QLifMounted) #If already mounted, sets QLifMounted as the quicklist.
        else:
            launcher.set_property("quicklist", QLifnotMounted) #Otherwise sets QLifnotMounted as the quicklist.
        prevState = currentState
    return True

#GObject.timeout_add_seconds(updateinterval, updateql)
#mainloop = GObject.MainLoop()
#mainloop.run()

#If the 3-line commented block above worked as expected, the remainder of this script would be unnecessary. Unfortunately, it doesn't.
import signal
def alarmhandler(signum, frame):
    raise Exception('Alarm has rung')
signal.signal(signal.SIGALRM, alarmhandler)

mainloop = GObject.MainLoop()

while True:
    try:
        updateql()
        signal.alarm(updateinterval)
        mainloop.run()
    except KeyboardInterrupt:
        continue
S Prasanth
sumber
Saya sudah mencoba ini tetapi tidak berhasil untuk saya. Daftar cepat tidak berubah. Saya menggunakan ubuntu 12.10 64-bit.
Rey Leonard Amorato
Saya menggunakan 12,04 32 bit. Skrip python harus dijalankan SETELAH menambahkan ikon peluncur ke peluncur.
S Prasanth
Lakukan hal berikut.1) Masukkan mylauncher.desktop di ~ / .local / share / Applications 2) Tekan tombol super dan cari 'Peluncur Saya'. 3) Seret ikon peluncur yang muncul di peluncur kesatuan. 4) Jalankan skrip python. Ini seharusnya bekerja.
S Prasanth
@ReyLeonardAmorato Saya hanya ingin tahu. Apa itu bekerja?
S Prasanth
Hai. Maaf saya tidak dapat menemukan waktu untuk online akhir-akhir ini, tetapi metode terbaru Anda berhasil untuk saya. Namun, apa yang saya inginkan sedikit berbeda dari apa yang script lakukan. Saya ingin memantau lokasi folder, (skrip sudah melakukannya) dan jika folder 'A' ada, tunjukkan 'unmount' pada daftar cepat. Perlihatkan 'mount' jika tidak. Saya tidak memiliki pengetahuan tentang skrip python jadi saya tidak tahu bagaimana cara memodifikasi skrip yang Anda berikan. Akan sangat bagus jika Anda bisa membantu dengan bagian akhir ini.
Rey Leonard Amorato