summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Warrick2014-12-30 21:03:42 +0100
committerChris Warrick2014-12-30 21:03:42 +0100
commitdc60ab141b94119296a5bdf5f1a41aa51bee94bb (patch)
tree042cb912a9346b6881a3971b68945f22a8066bdd
downloadaur-dc60ab141b94119296a5bdf5f1a41aa51bee94bb.tar.gz
init ob-autostart
Signed-off-by: Chris Warrick <kwpolska@gmail.com>
-rw-r--r--.SRCINFO14
-rw-r--r--PKGBUILD16
-rwxr-xr-xob-autostart416
3 files changed, 446 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO
new file mode 100644
index 000000000000..2a73b8e6bb84
--- /dev/null
+++ b/.SRCINFO
@@ -0,0 +1,14 @@
+pkgbase = ob-autostart
+ pkgdesc = A simple autostart application for Openbox
+ pkgver = 1
+ pkgrel = 3
+ url = http://crunchbanglinux.org/forums/topic/2614/
+ arch = any
+ license = GPL2
+ depends = python
+ depends = pygtk
+ source = ob-autostart
+ md5sums = 7e19c8d8c02f296e7235e2dbe31b7b00
+
+pkgname = ob-autostart
+
diff --git a/PKGBUILD b/PKGBUILD
new file mode 100644
index 000000000000..ba3d761c1140
--- /dev/null
+++ b/PKGBUILD
@@ -0,0 +1,16 @@
+# Maintainer: Chris Warrick <aur@chriswarrick.com>
+pkgname=ob-autostart
+pkgver=1
+pkgrel=3
+pkgdesc="A simple autostart application for Openbox"
+arch=('any')
+url="http://crunchbanglinux.org/forums/topic/2614/"
+license=('GPL2')
+depends=('python' 'pygtk')
+#optdepends=('python-notify')
+source=('ob-autostart') #from http://www.ad-comp.be/public/projets/ob-autostart/ob-autostart
+md5sums=('7e19c8d8c02f296e7235e2dbe31b7b00')
+
+package() {
+ install -D -m755 ${srcdir}/ob-autostart ${pkgdir}/usr/bin/ob-autostart
+}
diff --git a/ob-autostart b/ob-autostart
new file mode 100755
index 000000000000..525aeb5110e8
--- /dev/null
+++ b/ob-autostart
@@ -0,0 +1,416 @@
+#!/usr/bin/python2
+# -*- coding: utf-8 -*-
+
+##
+# OpenBox Autostart Control
+#
+# Created by
+# ADcomp <david.madbox@gmail.com>
+# http://www.ad-comp.be/
+#
+# This program is distributed under the terms of the GNU General Public License
+# For more info see http://www.gnu.org/licenses/gpl.txt
+##
+
+try:
+ import os
+ import sys
+ import gtk
+ import gobject
+ import string
+ import pwd
+ import locale
+ import gettext
+except:
+ print("ERROR : All required python dependencies were not found!")
+ sys.exit()
+
+## Not yet !
+gettext.install('ob-autostart', './locale', unicode=1)
+
+LAUNCH_LIST = []
+
+# position in list
+ID_ACTIVE = 0
+ID_DESC = 1
+ID_CMD = 2
+ID_TIMER = 3
+
+# Find the Name / Command / Icon from .desktop file
+def info_desktop_file(file):
+ name, cmd = None, None
+ try:
+ cfile = open(file,"r")
+
+ for line in cfile:
+ if '=' in line:
+ words = line.split('=')
+ if words[0] == 'Name':
+ name = words[1].replace('\n','')
+
+ if words[0] == 'Exec':
+ cmd = words[1].replace('\n','')
+ cmd = cmd.split(' ')[0]
+ cfile.close()
+ except:
+ print "Error : .desktop file info"
+ return (name, cmd)
+
+#----------------------------------------------------------------------------
+class Conf:
+#----------------------------------------------------------------------------
+ def __init__(self):
+ # Create window
+ self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
+ self.window.set_title(_("OB Autostart"))
+ self.window.set_position(gtk.WIN_POS_CENTER)
+ self.window.connect("destroy", self.destroy)
+
+ # Containers
+ BoxBase = gtk.VBox()
+ BoxBase.set_spacing(10)
+ BoxBase.set_border_width(5)
+
+ BoxList = gtk.VBox()
+ BoxList.set_spacing(5)
+ BoxList.set_border_width(5)
+
+ BoxListControls = gtk.HButtonBox()
+
+ BoxControls = gtk.HButtonBox()
+ BoxControls.set_spacing(5)
+ BoxControls.set_layout(gtk.BUTTONBOX_END)
+
+ #Icon ListStore
+ self.treeview = gtk.TreeView()
+ model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING)
+ self.filtremodele = model.filter_new()
+ self.treeview.set_model(model)
+
+ cell_text = gtk.CellRendererText()
+ col_text = gtk.TreeViewColumn(_("A"), cell_text, text=ID_ACTIVE)
+ self.treeview.append_column(col_text)
+
+ cell_text = gtk.CellRendererText()
+ col_text = gtk.TreeViewColumn(_("Description"), cell_text, text=ID_DESC)
+ self.treeview.append_column(col_text)
+
+ cell_command = gtk.CellRendererText()
+ col_command = gtk.TreeViewColumn(_("command"), cell_command, text=ID_CMD)
+ #~ col_command.set_visible(False)
+ self.treeview.append_column(col_command)
+
+ cell_icon = gtk.CellRendererText()
+ col_icon = gtk.TreeViewColumn(_("Time"), cell_icon, text=ID_TIMER)
+ #~ col_icon.set_visible(True)
+ self.treeview.append_column(col_icon)
+
+ for my_item in LAUNCH_LIST:
+ item = model.append(None)
+ desc , cmd , timer, isactive = my_item
+
+ model.set_value(item, ID_ACTIVE, str(isactive))
+ model.set_value(item, ID_DESC, str(desc))
+ model.set_value(item, ID_CMD, str(cmd))
+ model.set_value(item, ID_TIMER, str(timer))
+
+ self.treeview.connect("row-activated", self.EditItem)
+ self.treeview.set_reorderable(True)
+ self.treeview.get_selection().set_mode(gtk.SELECTION_SINGLE)
+
+ ## Control buttons for list
+ # Add
+ button = gtk.Button(stock=gtk.STOCK_ADD)
+ button.connect("clicked", self.button_control_new_clicked)
+ BoxListControls.pack_start(button)
+ # Delete
+ button = gtk.Button(stock=gtk.STOCK_REMOVE)
+ button.connect("clicked", self.button_control_delete_clicked)
+ BoxListControls.pack_start(button)
+
+ ## Main Controls
+ # Save
+ button_save = gtk.Button(stock=gtk.STOCK_SAVE)
+ button_save.connect("clicked", self.saveconf)
+ BoxControls.pack_end(button_save, False, False)
+ # Exit
+ button_exit = gtk.Button(stock=gtk.STOCK_CLOSE)
+ button_exit.connect("clicked", self.destroy)
+ BoxControls.pack_end(button_exit, False, False)
+
+ BoxList.pack_start(self.treeview, True, True)
+ BoxList.pack_end(BoxListControls, False, True)
+
+ BoxBase.pack_start(BoxList, True)
+ BoxBase.pack_start(gtk.HSeparator(), True)
+ BoxBase.pack_end(BoxControls, False)
+
+ self.window.add(BoxBase)
+
+ ## Show main window frame and all content
+ self.window.show_all()
+
+ def saveconf(self, widget=None, event=None):
+ '''Save configuration'''
+ model = self.treeview.get_model()
+ iter = model.get_iter_root()
+ launch_list = []
+
+ while (iter):
+ tmp_data = (
+ model.get_value(iter, ID_DESC),
+ model.get_value(iter, ID_CMD),
+ model.get_value(iter, ID_TIMER),
+ model.get_value(iter, ID_ACTIVE)
+ )
+ launch_list.append(tmp_data)
+ iter = model.iter_next(iter)
+
+ home = pwd.getpwuid(os.getuid())[5]
+ if not os.path.exists("%s/.config/ob-autostart" % home):
+ os.makedirs("%s/.config/ob-autostart" % home)
+
+ src = "%s/.config/ob-autostart/config" % home
+ cfile = open(src,"w")
+ cfile.write("# OB_Autostart config\n")
+ cfile.write("LAUNCH_LIST = [ \n")
+ for item in launch_list:
+ desc = item[0]
+ timer = str(item[2])
+ isactive = item[3]
+ cmd = item[1].replace("\"","\\\"")
+ output = '\t ("%s","%s","%s","%s"),\n' % (desc,cmd,timer,isactive)
+ cfile.write(output)
+ cfile.write("\t]\n")
+
+ if (cfile.closed == False):
+ cfile.close()
+
+ def EditItem(self, treeview, path=None, view_column=None):
+ nsel = treeview.get_cursor()
+ selection = nsel[0][0]
+ if (selection is not None):
+ item = {}
+ model = self.treeview.get_model()
+ item['desc'] = model.get_value(model.get_iter(selection), ID_DESC)
+ item['cmd'] = model.get_value(model.get_iter(selection), ID_CMD)
+ item['timer'] = model.get_value( model.get_iter(selection), ID_TIMER )
+ item['is_active'] = model.get_value( model.get_iter(selection), ID_ACTIVE )
+ Edit_Item(self.window, item, model, selection)
+
+ # Add new treeview object, position=-1 inserts into cursor's position
+ def new_treeview_entry(self, position=-1, insertAfter=True):
+ self.treeview.grab_focus()
+ model = self.treeview.get_model()
+ try:
+ position = self.treeview.get_cursor()[0][0]
+ try:
+ iter = model.get_iter(position)
+ except ValueError:
+ print("> Empty list ?")
+ iter = model.get_iter()
+
+ if (insertAfter == True):
+ item = model.insert_after(iter)
+ else:
+ item = model.insert_before(iter)
+ except TypeError:
+ print "typeError _ treeview"
+ item = model.append(None)
+ self.treeview.grab_focus()
+
+ model.set_value(item, ID_DESC, '')
+ model.set_value(item, ID_CMD, '')
+ model.set_value(item, ID_TIMER, '0')
+ model.set_value(item, ID_ACTIVE, '')
+
+ ## Set focus to new entry and edit
+ path = model.get_path(model.get_iter(position+1))
+ self.treeview.set_cursor(path)
+ self.EditItem(self.treeview)
+
+ def button_control_new_clicked(self, n):
+ self.new_treeview_entry()
+ return
+
+ def button_control_delete_clicked(self, n):
+ # remove item from configuration
+ try:
+ self.treeview.grab_focus()
+ pos = self.treeview.get_cursor()[0][0]
+ model = self.treeview.get_model()
+ self.treeview.set_cursor(pos-1)
+ self.treeview.grab_focus()
+ model.remove(model.get_iter(pos))
+ if pos < 0:
+ pos = 0
+ # Set the focus and cursor correctly
+ self.treeview.set_cursor(pos);
+ self.treeview.grab_focus()
+ except TypeError:
+ print( "> nothing to delete !?" )
+
+ def main(self):
+ gtk.main()
+
+ def destroy(self, widget=None, data=None):
+ self.window.hide()
+ gtk.main_quit()
+
+#----------------------------------------------------------------------------
+class Edit_Item:
+#----------------------------------------------------------------------------
+ def __init__(self, master, item, model, selection):
+ self.model = model
+ self.selection = selection
+
+ # Create window
+ self.master = master
+ self.window = gtk.Dialog(_("Edit Item"), master, gtk.DIALOG_MODAL, buttons=None)
+ self.window.set_default_size(400, 100)
+ self.window.set_position(gtk.WIN_POS_CENTER)
+
+ self.frame = gtk.Frame()
+ self.frame.set_border_width(5)
+
+ BoxOptions = gtk.VBox()
+ BoxOptions.set_border_width(10)
+ self.frame.add(BoxOptions)
+ BoxOptions.set_spacing(10)
+
+ #Command options
+ label = gtk.Label(_("Description:"))
+
+ self.description = gtk.Entry()
+ self.description.set_text(item['desc'])
+
+ box = gtk.HBox()
+ box.pack_start(label, False, False)
+ box.pack_end(self.description, True, True)
+ BoxOptions.pack_start(box, False, True)
+
+ #Command options
+ label = gtk.Label(_("Command:"))
+
+ self.text_command = gtk.Entry()
+ command = item['cmd'].replace("\\\"", "\"")
+ self.text_command.set_text(command)
+
+ self.button_command = gtk.Button("...")
+ self.button_command.connect("clicked", self.button_command_clicked)
+
+ box = gtk.HBox()
+ box.pack_start(label, False, False)
+ box.pack_start(self.text_command, True, True)
+ box.pack_end(self.button_command, False, True)
+ BoxOptions.pack_start(box, False, True)
+
+
+ self.is_active_chk = gtk.CheckButton('is active')
+ self.is_active_chk.show()
+ if item['is_active']=="*":
+ self.is_active_chk.set_active(1)
+
+ sep = gtk.VSeparator()
+
+ #Icon options
+ label = gtk.Label("Sleep:")
+
+ ## Timer _ Sleep
+ timer = float(item['timer'])
+ adjustment = gtk.Adjustment(value=timer, lower=0, upper=600, step_incr=1, page_incr=10, page_size=0)
+ self.sleep_time = gtk.SpinButton(adjustment=adjustment, climb_rate=0.0, digits=0)
+
+ box = gtk.HBox()
+ box.pack_start(self.is_active_chk, False, False)
+ box.pack_start(sep, True, True)
+ box.pack_start(label, False, False)
+ box.pack_end(self.sleep_time, False, False)
+ BoxOptions.pack_start(box, False, True)
+
+ self.window.vbox.pack_start(self.frame)
+
+ bouton = gtk.Button(stock=gtk.STOCK_CANCEL)
+ bouton.connect("clicked", self.close)
+ self.window.action_area.pack_start(bouton, True, True, 0)
+ bouton.show()
+
+ bouton = gtk.Button(stock=gtk.STOCK_OK)
+ bouton.connect("clicked", self.change_item)
+ self.window.action_area.pack_start(bouton, True, True, 0)
+ bouton.show()
+
+ #Show main window frame and all content
+ self.window.show_all()
+ self.window.run()
+
+ def change_item(self, data):
+ command = self.text_command.get_text()
+ desc = self.description.get_text()
+ timer = int(self.sleep_time.get_value())
+ isactive = ''
+ if self.is_active_chk.get_active():
+ isactive = "*"
+ item = self.model.get_iter(self.selection)
+
+ self.model.set_value(item, ID_DESC, desc)
+ self.model.set_value(item, ID_CMD, command)
+ self.model.set_value(item, ID_TIMER, timer)
+ self.model.set_value(item, ID_ACTIVE, isactive)
+ self.close()
+
+ def close(self, data=None):
+ self.window.hide()
+ self.window.destroy()
+
+ def button_command_clicked(self, n):
+ dialog = gtk.FileChooserDialog(_("Select command.."),
+ None,
+ gtk.FILE_CHOOSER_ACTION_OPEN,
+ (gtk.STOCK_CANCEL,
+ gtk.RESPONSE_CANCEL,
+ gtk.STOCK_OPEN,
+ gtk.RESPONSE_OK))
+ dialog.set_default_response(gtk.RESPONSE_OK)
+
+ filter = gtk.FileFilter()
+ filter.set_name(_("All files"))
+ filter.add_pattern("*")
+ dialog.add_filter(filter)
+ dialog.set_current_folder('/usr/share/applications')
+
+ response = dialog.run()
+ if response == gtk.RESPONSE_OK:
+ ## .desktop file selected ?
+ filename = dialog.get_filename()
+ if '.desktop' in filename:
+ name, cmd = info_desktop_file(filename)
+ self.text_command.set_text(cmd)
+ self.description.set_text(name)
+ else:
+ self.text_command.set_text(filename)
+ dialog.destroy()
+
+if __name__ == "__main__":
+ home = pwd.getpwuid(os.getuid())[5]
+ os.chdir(home)
+ cfg_file = None
+
+ if os.access("%s/.config/ob-autostart/config" % home, os.F_OK|os.R_OK):
+ execfile("%s/.config/ob-autostart/config" % home)
+ del home
+
+ if len(sys.argv) == 2:
+ if sys.argv[1] == "-d":
+ for item in LAUNCH_LIST:
+ cmd = item[1]
+ timer = int(item[2])
+ is_active = item[3]
+ if is_active == '*' and cmd != "":
+ if timer > 0:
+ cmd = "sleep %ss && %s" % (timer,cmd)
+ print cmd
+ os.spawnl(os.P_NOWAIT, "/bin/sh", "/bin/sh", "-c", cmd)
+ else:
+ conf = Conf()
+ conf.main() \ No newline at end of file