Làm cách nào để tạo một trình khởi chạy thống nhất thực hiện giám sát tệp?


11

Tôi muốn tạo một trình khởi chạy thực hiện tương tự như biểu tượng thùng rác nơi các danh sách nhanh khác nhau được hiển thị tùy thuộc vào việc có hay không có các mục trên thùng rác.

Tôi muốn một cái gì đó như: nếu thư mục Atồn tại, hiển thị A,B,Ctrên danh sách nhanh, nếu thư mục Akhông tồn tại, hiển thị D,E,Ftrên danh sách nhanh.


3
Tôi đã xem xét điều này trước đây và có lẽ nó phải được thực hiện thông qua giao thức Thông báo khởi động . Và bằng cách đặt StartupNotify thành true trong tệp .desktop. Nhưng tôi không chắc từ đó.
Paul van Schayck

1
Hãy xem: wiki.ubfox.com/Unity/LauncherAPI Có ví dụ về danh
S Prasanth

Câu trả lời:


3

Các công việc sau đây:

  1. Tạo 2 tệp: mylauncher.desktop và mylauncher.py với nội dung như được đưa ra dưới đây.
  2. Làm cho mylauncher.desktop thực thi.
  3. Thêm mylauncher.desktop vào launcher của unity.
  4. Chỉnh sửa tên thư mục và thư mục trong mylauncher.py nếu cần.
  5. Chạy python mylauncher.pytrong nền. Bạn sẽ phải thêm phần này vào một trong các kịch bản khởi nghiệp của bạn.

Nguồn: https://wiki.ubfox.com/Unity/LauncherAPI


Nội dung của 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=;

Nội dung của 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

EDIT: Sử dụng thông tin sau đây dưới dạng mylauncher.py cho mục đích được đề cập trong các bình luận. Sửa đổi cho phù hợp với nhu cầu của bạn nên được chuyển thẳng và trong trường hợp không đề cập đến nó trong các bình luận.

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

Tôi đã thử điều này nhưng nó không làm việc cho tôi. Danh sách nhanh không thay đổi. Tôi đang sử dụng Ubuntu 12.10 64-bit.
Rey Leonard Amorato

Tôi đang sử dụng 12.04 32 bit. Kịch bản python nên được chạy SAU khi thêm biểu tượng trình khởi chạy vào trình khởi chạy.
S Prasanth

Thực hiện như sau.1) Đặt mylauncher.desktop vào ~ / .local / share / application 2) Nhấn phím siêu và tìm kiếm 'My Launcher'. 3) Kéo biểu tượng trình khởi chạy xuất hiện trên trình khởi chạy thống nhất. 4) Chạy kịch bản python. Điều này nên làm việc.
S Prasanth

@ReyLeonardAmorato Tôi chỉ tò mò thôi. Nó có hoạt động không?
S Prasanth

Chào. Xin lỗi tôi không thể tìm thấy thời gian để lên mạng gần đây, nhưng phương pháp mới nhất của bạn đã làm việc cho tôi. Tuy nhiên, những gì tôi muốn hơi khác với những gì kịch bản làm. Tôi muốn theo dõi một vị trí thư mục, (tập lệnh đã thực hiện điều này) và nếu thư mục 'A' tồn tại, hãy hiển thị 'unmount' trên danh sách nhanh. Hiển thị 'mount' nếu không. Tôi không có kiến ​​thức về kịch bản python nên tôi không biết làm thế nào để sửa đổi tập lệnh mà bạn đã cung cấp. Sẽ thật tuyệt nếu bạn có thể giúp đỡ với bit cuối cùng này.
Rey Leonard Amorato
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.