3
# This application is released under the GNU General Public License
4
# v3 (or, at your option, any later version). You can find the full
5
# text of the license under http://www.gnu.org/licenses/gpl.txt.
6
# By using, editing and/or distributing this software you agree to
7
# the terms and conditions of this license.
8
# Thank you for using free software!
10
# Screenlets Manager - (c) RYX (Rico Pfaus) 2007 / Whise (Helder Fraga) <helder.fraga@hotmail.com>
13
# This is a graphical manager application that simplifies managing and
14
# starting screenlets. It also allows simple install and uninstall of
15
# per-user Screenlets.
18
# - support for using sessions (via commandline), (NOTE: if a session is selected
19
# all autostart-files need to be removed and created new)
22
# - different View-modes (icons/details)
29
from screenlets import utils,install
38
gettext.textdomain('screenlets-manager')
39
gettext.bindtextdomain('screenlets-manager', screenlets.INSTALL_PREFIX + '/share/locale')
45
return gettext.gettext(s)
48
# name/version of this app
49
APP_NAME = _('Screenlets Manager')
53
# get executing user (root or normal) and set user-dependant constants
55
# we run as root, install system-wide
57
DIR_USER = screenlets.DIR_USER_ROOT
58
DIR_AUTOSTART = '/etc/xdg/autostart' # TODO: use pyxdg here
60
# we run as normal user, install into $HOME
62
DIR_USER = screenlets.DIR_USER
63
DIR_AUTOSTART = utils.get_autostart_dir()
73
#inst = ScreenletInstaller()
74
#print inst.get_info_from_package_name('ClockScreenlet-0.3.2.tar.bz2')
75
#print inst.get_info_from_package_name('/home/ryx/tmp/ExampleScreenlet-0.3.zip')
76
#print inst.get_info_from_package_name('/somewhere/MyScreenlet-0.1.tar.gz')
81
class ScreenletsManager(object):
82
"""The main application class."""
89
if not os.path.isdir(screenlets.DIR_CONFIG):
90
os.system('mkdir %s' % screenlets.DIR_CONFIG)
91
if not os.path.isdir(DIR_USER):
92
os.system('mkdir %s' % DIR_USER)
93
# create ui and populate it
96
self.load_screenlets()
97
# if we are running as root, show error
99
screenlets.show_error(None, _("""Important! You are running this application as root user, almost all functionality is disabled. You can use this to install screenlets into the system-wide path."""),
102
# lookup, connect dameon
103
utils.lookup_daemon_autostart()
105
self.connect_daemon()
113
def lookup_daemon (self):
114
"""Find the screenlets-daemon or try to launch it. Initializes
115
self.daemon_iface if daemon is found."""
116
self.daemon_iface = utils.get_daemon_iface()
117
# if daemon is not available,
118
if self.daemon_iface == None:
120
print "Trying to launching screenlets-daemon ..."
121
os.system(screenlets.INSTALL_PREFIX + \
122
'/share/screenlets-manager/screenlets-daemon.py &')
124
print "checking for running daemon again ..."
125
self.daemon_iface = utils.get_daemon_iface()
126
if self.daemon_iface:
127
print "DAEMON FOUND - Ending timeout"
128
self.connect_daemon()
130
print "Error: Unable to connect/launch daemon."
131
screenlets.show_error(None, _("Unable to connect or launch daemon. Some values may be displayed incorrectly."), _('Error'))
133
gobject.timeout_add(2000, daemon_check)
138
def connect_daemon (self):
139
"""Connect to org.screenlets.ScreenletsDaemon and connect to
140
the register/unregister signals."""
141
if self.daemon_iface:
142
print "DAEMON FOUND!"
144
self.daemon_iface.connect_to_signal('screenlet_registered',
145
self.handle_screenlet_registered)
146
self.daemon_iface.connect_to_signal('screenlet_unregistered',
147
self.handle_screenlet_unregistered)
150
def delete_selected_screenlet (self):
151
"""Delete the selected screenlet from the user's screenlet dir."""
152
sel = self.view.get_selected_items()
153
if sel and len(sel) > 0 and len(sel[0]) > 0:
154
it = self.model.get_iter(sel[0][0])
156
info = self.model.get_value(it, 2)
157
if info and not info.system:
159
if screenlets.show_question(None, _('Do you really want to permanently uninstall and delete the %sScreenlet from your system?') % info.name, _('Delete Screenlet')):
160
# delete screenlet's directory from userdir
161
os.system('rm -rf %s/%s' % (DIR_USER, info.name))
162
# remove entry from model
163
self.model.remove(it)
164
if screenlets.show_question(None, _('Do you also want to remove the Screenlet configuration files?')):
165
os.system('rm -rf %s/%s' % (screenlets.DIR_CONFIG, info.name))
166
os.system('rm -rf %s/%sScreenlet.log' % (screenlets.DIR_CONFIG, info.name))
168
screenlets.show_error(None, _('Can\'t delete system-wide screenlets.'))
171
def load_screenlets (self):
172
"""Load all available screenlets, create ScreenletInfo-objects for
173
them and add them to the iconview-model."""
175
noimg = gtk.gdk.pixbuf_new_from_file_at_size(\
176
screenlets.INSTALL_PREFIX + '/share/screenlets-manager/noimage.svg',
178
# get list of available/running screenlets
179
lst_a = utils.list_available_screenlets()
180
lst_r = utils.list_running_screenlets()
186
filter_input = str(self.txtsearch.get_text()).lower()
187
combo_sel = self.combo.get_active()
188
if filter_input != '':
190
filter_slname = str(s).lower()
191
filter_find = filter_slname.find(filter_input)
192
if filter_input == None or filter_find != -1:
193
lst_filtered.append(s)
194
if lst_filtered == [] and filter_input == '': lst_filtered = lst_a
195
for s in lst_filtered:
197
img = utils.get_screenlet_icon(s, 56, 56)
198
except Exception, ex:
199
#print "Exception while loading icon '%s': %s" % (path, ex)
201
# get metadata and create ScreenletInfo-object from it
202
meta = utils.get_screenlet_metadata(s)
205
def setfield(name, default):
206
if meta.has_key(name):
207
if meta[name] != None:
213
name = setfield('name', '')
214
info = setfield('info', '')
215
author = setfield('author', '')
216
version = setfield('version', '')
218
slinfo = utils.ScreenletInfo(s, name, info, author, version, img)
219
# check if already running
220
if lst_r.count(s + 'Screenlet'):
222
# check if system-wide
223
#if path.startswith(screenlets.INSTALL_PREFIX):
224
# print "SYSTEM: %s" % s
227
print 'Error while loading screenlets metadata for "%s".' % s
228
slinfo = utils.ScreenletInfo(s, '', '', '', '', img)
233
self.model.append(['<span size="9000">%s</span>' % s, img, slinfo])
235
if slinfo.active :self.model.append(['<span size="9000">%s</span>' % s, img, slinfo])
237
if slinfo.autostart == True :self.model.append(['<span size="9000">%s</span>' % s, img, slinfo])
239
if slinfo.system == True :self.model.append(['<span size="9000">%s</span>' % s, img, slinfo])
241
if slinfo.system == False:self.model.append(['<span size="9000">%s</span>' % s, img, slinfo])
245
def get_Info_by_name (self, name):
246
"""Returns a ScreenletInfo-object for the screenlet with given name."""
247
for row in self.model:
248
if row[2] and row[2].name == name:
252
def get_selection (self):
253
"""Returns a ScreenletInfo-object for the currently selected entry
255
sel = self.view.get_selected_items()
256
if sel and len(sel)>0 and len(sel[0])>0:
257
it = self.model.get_iter(sel[0][0])
259
return self.model.get_value(it, 2)
262
def reset_selected_screenlet(self):
263
sel = self.view.get_selected_items()
264
if sel and len(sel) > 0 and len(sel[0]) > 0:
265
it = self.model.get_iter(sel[0][0])
267
info = self.model.get_value(it, 2)
268
if screenlets.show_question(None, _('Do you really want to reset the %sScreenlet configuration?') % info.name, _('Reset Screenlet')):
269
# delete screenlet's config directory
270
os.system('rm -rf %s/%s' % (screenlets.DIR_CONFIG, info.name))
271
# remove entry from model
274
def set_info (self, info_obj):
275
"""Set the values in the infobox according to the given data in the ScreenletInfo-object (and recreate infobox first)."""
277
self.recreate_infobox(info_obj)
279
def set_screenlet_active (self, name, active):
280
"""Set the screenlet's active-state to active (True/False)."""
281
for row in self.model:
282
if row[2].name == name[:-9]:
283
row[2].active = active
284
# if selected, also toggle checkbox
285
sel = self.get_selection()
286
if sel and sel.name == name[:-9]:
287
self.recreate_infobox(sel)
292
def create_ui (self):
295
self.window = w = gtk.Window()
296
if USER == 0: # add note about "root-mode"
297
w.set_title(APP_NAME + ' (root mode)')
299
w.set_title(APP_NAME)
300
w.set_skip_taskbar_hint(False)
301
w.set_skip_pager_hint(False)
302
#w.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_NORMAL)
303
w.set_position(gtk.WIN_POS_CENTER)
305
icontheme = gtk.icon_theme_get_default()
306
w.set_icon_list(icontheme.load_icon("screenlets", 24, 0))
308
w.connect('delete-event', self.delete_event)
309
w.connect('notify::is-active', self.on_active_changed)
311
#w.set_has_separator(False)
312
# create outer vbox in window
315
# create hbox for upper part
317
vbox.pack_start(hbox, True, True)
320
self.model= gtk.ListStore(object)
321
self.view = iv = gtk.IconView()
322
self.model = gtk.ListStore(str, gtk.gdk.Pixbuf, object)
323
iv.set_model(self.model)
324
iv.set_markup_column(0)
325
iv.set_pixbuf_column(1)
326
# disable UI for root user
328
iv.set_sensitive(False)
329
iv.connect('selection-changed', self.selection_changed)
330
iv.connect('item-activated', self.item_activated)
331
iv.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
332
gtk.DEST_DEFAULT_DROP, #gtk.DEST_DEFAULT_ALL,
333
[("text/plain", 0, 0),
335
("text/uri-list", 0, 2)],
337
iv.connect("drag_data_received", self.drag_data_received)
338
# wrap iconview in scrollwin
339
sw = self.slwindow = gtk.ScrolledWindow()
340
sw.set_size_request(560, 350)
341
sw.set_shadow_type(gtk.SHADOW_IN)
342
sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
345
# infobox at bottom (empty yet, filled later)
346
# wrap scrollwin and infobox in a paned
347
self.paned = paned = gtk.VPaned()
348
paned.pack1(sw, True, True)
350
hbox.pack_end(paned, True, True)
351
w.set_border_width(5)
352
# add HBox to dialog's vbox
355
# create right area with buttons
356
butbox = self.bbox = gtk.VBox()
357
self.button_add = but1 = gtk.Button(_('Launch/Add'))
358
#but1.set_image(gtk.image_new_from_stock(gtk.STOCK_EXECUTE,
359
# gtk.ICON_SIZE_BUTTON))
360
but1.set_sensitive(False)
361
but2 = gtk.Button(_('Install'))
362
#but2.set_image(gtk.image_new_from_stock(gtk.STOCK_ADD,
363
# gtk.ICON_SIZE_BUTTON))
364
self.button_delete = but3 = gtk.Button(_('Uninstall'))
365
but3.set_sensitive(False)
366
#but3.set_image(gtk.image_new_from_stock(gtk.STOCK_DELETE,
367
# gtk.ICON_SIZE_BUTTON))
368
self.button_reset = but4 = gtk.Button(_('Reset Screenlet Config'))
369
but4.set_sensitive(False)
370
#but4.set_image(gtk.image_new_from_stock(gtk.STOCK_CLEAR,
371
# gtk.ICON_SIZE_BUTTON))
372
self.button_theme = but5 = gtk.Button(_('Install New Theme'))
373
but5.set_sensitive(False)
374
#but5.set_image(gtk.image_new_from_stock(gtk.STOCK_ADD,
375
# gtk.ICON_SIZE_BUTTON))
376
self.button_restartall = but6 = gtk.Button(_('Re-Start All'))
377
but6.set_sensitive(True)
378
#but6.set_image(gtk.image_new_from_stock(gtk.STOCK_REFRESH,
379
# gtk.ICON_SIZE_BUTTON))
380
self.button_closeall = but7 = gtk.Button(_('Close All'))
381
but7.set_sensitive(True)
382
#but7.set_image(gtk.image_new_from_stock(gtk.STOCK_REMOVE,
383
# gtk.ICON_SIZE_BUTTON))
384
self.button_prop = but8 = gtk.Button(_('Options'))
385
but8.set_sensitive(True)
386
self.button_shortcut = but9 = gtk.Button(_('Create Desktop Shortcut'))
387
but9.set_sensitive(False)
388
#but8.set_image(gtk.image_new_from_stock(gtk.STOCK_PROPERTIES,
389
# gtk.ICON_SIZE_BUTTON))
390
#self.sep = gtk.Separator()
391
but1.connect('clicked', self.button_clicked, 'add')
392
but2.connect('clicked', self.button_clicked, 'install')
393
but3.connect('clicked', self.button_clicked, 'uninstall')
394
but4.connect('clicked', self.button_clicked, 'reset')
395
but5.connect('clicked', self.button_clicked, 'theme')
396
but6.connect('clicked', self.button_clicked, 'restartall')
397
but7.connect('clicked', self.button_clicked, 'closeall')
398
but8.connect('clicked', self.button_clicked, 'prop')
399
but9.connect('clicked', self.button_clicked, 'desktop_shortcut')
400
but1.set_relief(gtk.RELIEF_NONE)
401
but2.set_relief(gtk.RELIEF_NONE)
402
but3.set_relief(gtk.RELIEF_NONE)
403
but4.set_relief(gtk.RELIEF_NONE)
404
but5.set_relief(gtk.RELIEF_NONE)
405
but6.set_relief(gtk.RELIEF_NONE)
406
but7.set_relief(gtk.RELIEF_NONE)
407
but8.set_relief(gtk.RELIEF_NONE)
408
but9.set_relief(gtk.RELIEF_NONE)
409
but1.set_alignment(0,0.5)
410
but2.set_alignment(0,0.5)
411
but3.set_alignment(0,0.5)
412
but4.set_alignment(0,0.5)
413
but5.set_alignment(0,0.5)
414
but6.set_alignment(0,0.5)
415
but7.set_alignment(0,0.5)
416
but8.set_alignment(0,0.5)
417
but9.set_alignment(0,0.5)
418
but1.set_tooltip_text(_("Launch/add a new instance of the selected Screenlet ..."))
419
but2.set_tooltip_text(_("Install a new Screenlet, SuperKaramba or Web Widget or Web Application ..."))
420
but3.set_tooltip_text(_("Permanently uninstall/delete the currently selected Screenlet ..."))
421
but4.set_tooltip_text(_("Reset this Screenlet configuration (will only work if Screenlet isn't running)"))
422
but5.set_tooltip_text(_("Install new theme for this screenlet"))
423
but6.set_tooltip_text(_("Restart all Screenlets that have auto start at login"))
424
but7.set_tooltip_text(_("Close all Screenlets running"))
425
but8.set_tooltip_text(_("New Screenlets Options/Properties"))
426
but9.set_tooltip_text(_("Create a Desktop shortcut for this Screenlet"))
427
self.label = gtk.Label('')
428
self.label.set_line_wrap(1)
429
self.label.set_width_chars(70)
430
self.label.set_alignment(0, 0)
431
self.label.set_size_request(-1, 65)
432
self.btnsearch = gtk.Button()
433
self.searchbox = gtk.HBox()
434
self.txtsearch = gtk.Entry()
435
self.btnsearch.set_image(gtk.image_new_from_stock(gtk.STOCK_CLOSE,
436
gtk.ICON_SIZE_BUTTON))
437
self.btnsearch.connect("clicked",self.redraw_screenlets, 'clean')
438
self.txtsearch.connect("changed",self.redraw_screenlets, 'enter')
439
self.txtsearch.connect("backspace",self.redraw_screenlets, 'backspace')
441
self.searchbox.pack_start(self.txtsearch, 1)
442
self.searchbox.pack_start(self.btnsearch, False)
443
butbox.pack_start(self.searchbox, False,0,3)
444
self.combo = gtk.combo_box_new_text()
445
self.combo.append_text(_('All Screenlets'))
446
self.combo.append_text(_('Running Screenlets'))
447
self.combo.append_text(_('Autostart Screenlets'))
448
self.combo.append_text(_('Only native Screenlets'))
449
self.combo.append_text(_('Only third party'))
450
self.combo.set_active(0)
451
self.combo.connect("changed",self.redraw_screenlets, 'enter')
453
butbox.pack_start(but1, False)
454
butbox.pack_start(but2, False)
455
butbox.pack_start(but3, False)
456
butbox.pack_start(but4, False)
457
butbox.pack_start(but5, False)
458
butbox.pack_start(but6, False)
459
butbox.pack_start(but7, False)
460
butbox.pack_start(but9, False)
461
#sep2 = gtk.HSeparator()
462
#butbox.pack_start(sep2, False,False,5)
463
butbox.pack_start(but8, False)
464
butbox.pack_start(self.combo, False)
465
#butbox.pack_start(self.label, False)
467
hbox.pack_start(butbox, False, False, 10)
469
# create lower buttonbox
470
action_area = gtk.HButtonBox()
471
vbox.pack_start(action_area, False, False)
472
# add about/close buttons to window
473
but_about = gtk.Button(stock=gtk.STOCK_ABOUT)
474
but_close = gtk.Button(stock=gtk.STOCK_CLOSE)
475
but_download = gtk.Button(_('Get more screenlets'))
476
but_download.set_image(gtk.image_new_from_stock(gtk.STOCK_GO_DOWN,
477
gtk.ICON_SIZE_BUTTON))
478
but_about.connect('clicked', self.button_clicked, 'about')
479
but_close.connect('clicked', self.button_clicked, 'close')
480
but_download.connect('clicked', self.button_clicked, 'download')
481
but_about.set_tooltip_text(_("Show info about this dialog ..."))
482
but_download.set_tooltip_text(_("Download more screenlets ..."))
483
but_close.set_tooltip_text(_("Close this dialog ..."))
484
action_area.set_layout(gtk.BUTTONBOX_EDGE)
485
action_area.pack_start(but_about, False, False)
486
action_area.pack_start(but_download, False, False)
487
action_area.pack_end(but_close, False, False)
489
# initially create lower infobox
490
self.vbox_info = None
491
self.recreate_infobox(None)
493
#self.gtk_screen = w.get_screen()
494
#colormap = self.gtk_screen.get_rgba_colormap()
496
# self.window.set_colormap(colormap)
500
def recreate_infobox (self, info_obj):
501
"""Recerate the infobox at the bottom and fill data accoring to the
505
self.vbox_info.destroy()
508
self.vbox_info = ibox = gtk.VBox()
509
ibox.set_size_request(-1, 70)
510
#vbox_info.set_spacing(20)
511
self.label_info = itxt = gtk.Label('')
512
itxt.set_alignment(0, 0)
513
itxt.set_line_wrap(True)
514
#itxt.set_padding(3, 3)
517
self.cb_enable_disable = cb = gtk.CheckButton(_('Start/Stop'))
518
self.cb_autostart = cb2 = gtk.CheckButton(_('Auto start on login'))
519
self.cb_tray = cb3 = gtk.CheckButton(_('Show daemon in tray'))
520
ini = utils.IniReader()
522
if ini.load (DIR_USER + '/config.ini'):
524
print ini.get_option('show_in_tray')
525
if not os.path.isfile(DIR_USER + '/config.ini'):
526
f = open(DIR_USER + '/config.ini', 'w')
527
f.write("[Options]\n")
528
f.write("show_in_tray=True\n")
529
f.write("Keep_above=True\n")
532
if ini.load(DIR_USER + '/config.ini'):
533
show_in_tray = ini.get_option('show_in_tray', section='Options')
534
if show_in_tray == 'True': #doesnt work with the bool variable directly..dont know why
537
cb3.set_active(False)
540
f = open(DIR_USER + '/config.ini', 'w')
541
f.write("[Options]\n")
542
f.write("show_in_tray=True\n")
543
f.write("Keep_above=True\n")
545
if ini.load(DIR_USER + '/config.ini'):
546
show_in_tray = ini.get_option('show_in_tray', section='Options')
547
if show_in_tray == 'True':
550
cb3.set_active(False)
553
cb.set_sensitive(True)
554
cb2.set_sensitive(True)
555
cb.set_active(info_obj.active)
556
cb2.set_active(info_obj.autostart)
557
itxt.set_markup('<big><b>' + info_obj.name + '</b></big>\n' + \
561
cb2.set_active(False)
562
cb.set_sensitive(False)
563
cb2.set_sensitive(False)
564
cb.connect('toggled', self.toggle_enabled)
565
cb2.connect('toggled', self.toggle_autostart)
566
cb3.connect('toggled', self.toggle_tray)
568
sep2 = gtk.HSeparator()
569
ibox.pack_start(cb, False, False)
570
ibox.pack_start(cb2, False,False, 3)
571
ibox.pack_start(sep2, False,False,3)
572
ibox.pack_start(cb3, False,False)
573
#ibox.pack_start(itxt, True, True)
575
# add infbox to lower paned area
576
self.paned.pack2(self.label,False,False)
577
#self.bbox.set_spacing(2)
578
sep1 = gtk.HSeparator()
579
#self.bbox.pack_start(sep1, False,False,5)
580
self.bbox.pack_start(ibox, False,False)
582
def redraw_screenlets(self,widget,id):
583
if id == 'backspace':
584
if len(self.txtsearch.get_text()) == 1:
585
self.txtsearch.set_text('')
587
self.txtsearch.set_text('')
590
self.load_screenlets()
592
def show_about_dialog (self):
593
"""Create/Show about dialog for this app."""
594
dlg = gtk.AboutDialog()
595
gtk.about_dialog_set_url_hook(self.website_open, None)
597
dlg.set_name(screenlets.APP_NAME)
598
dlg.set_comments(_(screenlets.COMMENTS))
599
dlg.set_version(screenlets.VERSION)
600
dlg.set_copyright(screenlets.COPYRIGHT)
601
dlg.set_authors(screenlets.AUTHORS)
602
dlg.set_website(screenlets.WEBSITE)
603
dlg.set_website_label(screenlets.WEBSITE)
604
dlg.set_license(_('This application is released under the GNU General Public License v3 (or, at your option, any later version). You can find the full text of the license under http://www.gnu.org/licenses/gpl.txt. By using, editing and/or distributing this software you agree to the terms and conditions of this license. Thank you for using free software!'))
605
dlg.set_wrap_license(True)
606
dlg.set_documenters(screenlets.DOCUMENTERS)
607
dlg.set_artists(screenlets.ARTISTS)
608
dlg.set_translator_credits(screenlets.TRANSLATORS)
610
icontheme = gtk.icon_theme_get_default()
611
logo = icontheme.load_icon("screenlets", 128, 0)
618
def website_open(self, d, link, data):
619
subprocess.Popen(["xdg-open", "http://www.screenlets.org"])
621
# could be used to reload screenlets on every activation (but it's a bit too much)
622
def on_active_changed(self, window, param):
623
if window.is_active():
624
# this makes the right one started/used at least if not displayed
625
utils.refresh_available_screenlet_paths()
626
# this seems too much (but if saved the active selection in view, maybe it could work)
628
# self.load_screenlets()
630
def drag_data_received (self, widget, dc, x, y, sel_data, info, timestamp):
632
print "Data dropped ..."
634
# get text-elements in selection data
636
txt = unicode.encode(sel_data.get_text(), 'utf-8')
639
txt = sel_data.get_text()
640
txt = urllib.unquote(txt)
644
txt.replace('\n', '\\n')
645
# if it is a filename, use it
646
if txt.startswith('file://'):
649
screenlets.show_error(self, _('Invalid string: %s.') % txt)
651
# else get uri-part of selection
652
uris = sel_data.get_uris()
653
if uris and len(uris)>0:
654
#print "URIS: "+str(uris )
655
filename = uris[0][7:]
657
#self.set_image(filename)
658
installer = install.ScreenletInstaller()
659
if not utils.containsAny(filename,'%'):
660
result = installer.install(filename)
662
# reload screenlets to add new screenlet to iconview and show result
664
self.load_screenlets()
665
screenlets.show_message(None, installer.get_result_message())
667
screenlets.show_error(None, installer.get_result_message())
669
self.show_install_dialog()
670
print 'Please install screenlets from folders without strange characters'
672
def show_install_dialog (self):
673
"""Craete/Show the install-dialog."""
675
flt = gtk.FileFilter()
676
flt.add_pattern('*.tar.bz2')
677
flt.add_pattern('*.skz')
678
flt.add_pattern('*.tar.gz')
679
flt.add_pattern('*.zip')
681
dlg = gtk.FileChooserDialog(buttons=(gtk.STOCK_CANCEL,
682
gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
683
dlg.set_current_folder(os.environ['HOME'])
684
dlg.set_title(_('Install a Screenlet or SuperKaramba theme'))
688
filename = dlg.get_filename()
690
if resp == gtk.RESPONSE_OK:
691
# create new installer
692
installer = install.ScreenletInstaller()
694
#print installer.get_info_from_package_name (filename)
697
# try installing and show result dialog
698
self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
699
result = installer.install(filename)
700
self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR))
702
# reload screenlets to add new screenlet to iconview and show result
704
self.load_screenlets()
705
screenlets.show_message(None, installer.get_result_message())
707
screenlets.show_error(None, installer.get_result_message())
709
def show_install_theme_dialog (self):
710
"""Craete/Show the install-dialog."""
712
flt = gtk.FileFilter()
713
flt.add_pattern('*.tar.bz2')
714
flt.add_pattern('*.tar.gz')
715
flt.add_pattern('*.zip')
716
try: os.system('rm -rf /tmp/screenlets/install-temp')
719
dlg = gtk.FileChooserDialog(buttons=(gtk.STOCK_CANCEL,
720
gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
721
dlg.set_current_folder(os.environ['HOME'])
722
dlg.set_title((_('Install a new theme for the selected Screenlet')))
726
filename = dlg.get_filename()
728
if resp == gtk.RESPONSE_OK:
729
# create new installer
731
# try installing and show result dialog
732
self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
733
print 'Installing %s' % filename
735
info = self.get_selection()
736
basename = os.path.basename(filename)
737
ext = str(filename)[len(str(filename)) -3:]
745
# if not info.system:
746
install_dir = DIR_USER + '/'
747
themes_dir = DIR_USER + '/' + info.name + '/themes/'
750
# if not screenlets.show_question(None, _("You are about to install a theme in root mode. Continue only if you have gksudo installed, do you wish to continue?")):
751
# self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR))
753
# themes_dir = screenlets.INSTALL_PREFIX + '/share/screenlets' + '/' + info.name + '/themes/'
754
# install_dir = screenlets.INSTALL_PREFIX + '/share/screenlets' + '/'
755
# install_prefix = 'gksudo '
757
if not os.path.isdir('/tmp/screenlets/'):
758
os.system('mkdir ' + '/tmp/screenlets/')
760
tmpdir = '/tmp/screenlets' + '/install-temp/'
761
os.system('mkdir %s' % tmpdir)
763
os.system('tar %s %s -C %s' % (tar_opts, chr(34)+filename+chr(34), tmpdir))
765
print os.listdir(tmpdir)[0]
767
screenlets.show_message(None, _("Error Found"))
768
self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR))
769
result = False #is it a valid folder?
771
if not os.path.exists(tmpdir + os.listdir(tmpdir)[0]):
772
screenlets.show_message(None, _("Theme install error 1 found - Theme not installed , maybe a package error "))
773
self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR))
774
result = False #is it a valid folder?
776
if os.listdir(tmpdir)[0] == 'themes':
777
install_dir = install_dir + info.name
778
print "list contains themes folder"
779
elif os.listdir(tmpdir)[0] == info.name:
780
print "list contains the screenlet name folder"
781
install_dir = install_dir
782
if os.path.exists(tmpdir + os.listdir(tmpdir)[0] + '/'+ info.name + 'Screenlet.py') and os.path.isfile(tmpdir + os.listdir(tmpdir)[0] + '/'+ info.name + 'Screenlet.py'):
783
screenlets.show_message(None, _("This package seams to contain a full Screenlet and not just a theme, please use the screenlet install instead"))
784
self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR))
788
for f in os.listdir(tmpdir + os.listdir(tmpdir)[0]):
791
if f.endswith('png') or f.endswith('svg'):
792
if not f.startswith('icon'):
795
screenlets.show_message(None, _("This package doesnt seem to contain a theme"))
796
self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR))
798
install_dir = install_dir + info.name + '/themes/'
799
print "only contains the themes folders"
801
os.system('rm -rf %s/install-temp' % screenlets.DIR_TMP)
803
os.system('mkdir -p ' + themes_dir)
805
for f in os.listdir(themes_dir):
807
if install_prefix != '':
808
os.system(install_prefix +chr(34) +'tar '+tar_opts+' '+ chr(39)+ filename + chr(39)+ ' -C ' + chr(39) + install_dir + chr(39)+chr(34))
810
os.system('tar '+tar_opts+' '+ chr(39)+ filename + chr(39)+ ' -C ' + chr(39) + install_dir + chr(39))
812
#% (tar_opts, chr(39)+ filename + chr(39), chr(39) + screenlets.INSTALL_PREFIX + '/share/screenlets' + '/' + info.name + '/themes/'+ chr(39)))
813
for f in os.listdir(themes_dir):
818
screenlets.show_message(None, _("Theme installed , please restart %s") % info.name )
819
self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR))
823
screenlets.show_message(None, _("Theme install error 2 found - Theme not installed or already installed"))
824
self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR))
827
self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR))
831
def button_clicked (self, widget, id):
832
"""Called when one of the buttons is clicked."""
834
self.delete_event(self.window, None)
835
elif id == 'widgetsite':
836
a = self.combo1.get_active()
838
os.system("xdg-open http://www.google.com/ig/directory?synd=open &")
840
os.system("xdg-open http://www.yourminis.com/minis &")
842
os.system("xdg-open http://www.springwidgets.com/widgets/ &")
844
os.system("xdg-open http://www.widgetbox.com/galleryhome/ &")
847
self.show_about_dialog()
849
info = self.get_selection()
851
screenlets.launch_screenlet(info.name, debug=screenlets.DEBUG_MODE)
853
elif id == 'install':
854
self.show_install_chose_ui()
855
elif id == 'uninstall':
856
self.delete_selected_screenlet()
858
self.reset_selected_screenlet()
860
self.show_install_theme_dialog()
862
self.show_options_ui()
863
elif id == 'desktop_shortcut':
864
info = self.get_selection()
866
path = utils.find_first_screenlet_path(name)
867
desk = utils.get_desktop_dir()
868
if name.endswith('Screenlet'):
870
starter = '%s/%sScreenlet.desktop' % (desk, name)
872
print "Create desktop shortcut for: %s/%sScreenlet.py" % (path, name)
873
code = ['[Desktop Entry]']
874
code.append('Name=%sScreenlet' % name)
875
code.append('Encoding=UTF-8')
876
code.append('Version=1.0')
877
if os.path.exists('%s/icon.svg' % path):
878
code.append('Icon=%s/icon.svg' % path)
879
elif os.path.exists('%s/icon.png' % path):
880
code.append('Icon=%s/icon.png' % path)
881
code.append('Type=Application')
882
code.append('Exec= python -u %s/%sScreenlet.py > /dev/null' % (path, name))
883
code.append('X-GNOME-Autostart-enabled=true')
885
f = open(starter, 'w')
892
print 'Failed to create autostarter for %s.' % name
894
elif id == 'restartall':
895
utils.quit_all_screenlets()
896
for s in os.listdir(DIR_AUTOSTART):
898
if s.lower().endswith('screenlet.desktop'):
900
os.system('sh '+ DIR_AUTOSTART + s + ' &')
901
elif id == 'closeall':
902
utils.quit_all_screenlets()
904
elif id == 'download':
905
if screenlets.UBUNTU:
906
if not utils.is_screenlets_ppa_enabled():
907
if screenlets.show_question(None, _('The Screenlets PPA is not listed among Software Sources. Adding this enables installing individual screenlets from Package Manager (or Software Center) and by clicking on an AptURL on web pages like Gnome-look.org. Would you like to add the Screenlets PPA to your system?'), title=_("Do you want to enable the Screenlets PPA?")):
908
result = commands.getstatusoutput('gksudo add-apt-repository ppa:screenlets/ppa && sudo apt-get update')[0]
910
screenlets.show_message(None, _('The Screenlets PPA added successfully.'), title=_("Success!"))
912
screenlets.show_error(None, _('Adding the Screenlets PPA failed.'), title=_("Failed!"))
913
subprocess.Popen(["xdg-open", screenlets.THIRD_PARTY_DOWNLOAD])
915
def show_install_chose_ui(self):
916
install_combo = gtk.combo_box_new_text()
917
install_combo.append_text(_('Install Screenlet'))
918
install_combo.append_text(_('Install SuperKaramba Theme'))
919
install_combo.append_text(_('Convert Web Widget'))
920
install_combo.append_text(_('Install Web Application'))
921
install_combo.set_active(0)
922
dialog = gtk.Dialog(_("Install"),self.window,
923
gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
924
(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
925
gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
927
dialog.vbox.add(install_combo)
930
if resp == gtk.RESPONSE_ACCEPT:
931
if install_combo.get_active() == 0 or install_combo.get_active() == 1:
932
self.show_install_dialog()
933
elif install_combo.get_active() == 2:
934
self.show_widget_converter()
935
elif install_combo.get_active() == 3:
939
def show_options_ui(self):
940
label = gtk.Label(_('New screenlets atributes..'))
941
cb1 = gtk.CheckButton(_('Lock'))
942
cb2 = gtk.CheckButton(_('Sticky'))
943
cb3 = gtk.CheckButton(_('Widget'))
944
cb4 = gtk.CheckButton(_('Keep above'))
946
cb5 = gtk.CheckButton(_('Keep below'))
947
cb6 = gtk.CheckButton(_('Show buttons'))
948
ini = utils.IniReader()
949
if ini.load (DIR_USER + '/config.ini'):
951
if ini.get_option('Lock', section='Options') == 'True':
953
elif ini.get_option('Lock', section='Options') == 'False':
954
cb1.set_active(False)
955
if ini.get_option('Sticky', section='Options') == 'True':
957
elif ini.get_option('Sticky', section='Options') == 'False':
958
cb2.set_active(False)
959
if ini.get_option('Widget', section='Options') == 'True':
961
elif ini.get_option('Widget', section='Options') == 'False':
962
cb3.set_active(False)
963
if ini.get_option('Keep_above', section='Options') == 'True':
965
elif ini.get_option('Keep_above', section='Options') == 'False':
966
cb4.set_active(False)
969
if ini.get_option('Keep_below', section='Options') == 'True':
971
elif ini.get_option('Keep_below', section='Options') == 'False':
972
cb5.set_active(False)
973
if ini.get_option('draw_buttons', section='Options') == 'True':
975
elif ini.get_option('draw_buttons', section='Options') == 'False':
976
cb6.set_active(False)
979
dialog = gtk.Dialog(_("New Screenlets atributes"),
981
gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
982
(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
983
gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
991
dialog.vbox.add(label)
1001
if resp == gtk.RESPONSE_ACCEPT:
1003
ret = 'show_in_tray=' + str(self.cb_tray.get_active()) + '\n'
1004
ret = ret + 'Lock=' + str(cb1.get_active()) + '\n'
1005
ret = ret + 'Sticky=' + str(cb2.get_active()) + '\n'
1006
ret = ret + 'Widget=' + str(cb3.get_active()) + '\n'
1007
ret = ret + 'Keep_above=' + str(cb4.get_active()) + '\n'
1008
ret = ret + 'Keep_below=' + str(cb5.get_active()) + '\n'
1009
ret = ret + 'draw_buttons=' + str(cb6.get_active()) + '\n'
1010
f = open(DIR_USER + '/config.ini', 'w')
1011
f.write("[Options]\n")
1016
def show_webapp(self):
1017
label1 = gtk.Label(_('Web Application Url'))
1018
label2 = gtk.Label(_('Web Application Name'))
1023
h.pack_start(label1,False,False)
1024
h.pack_start(code,True,True)
1025
h1.pack_start(label2,False,False)
1026
h1.pack_start(name,True,True)
1027
dialog = gtk.Dialog(_("Install Web Application"),self.window,
1028
gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
1029
(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
1030
gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
1037
dialog.vbox.pack_start(h,False,False,5)
1038
dialog.vbox.pack_start(h1,False,False,5)
1043
if resp == gtk.RESPONSE_ACCEPT:
1044
if code.get_text() != '':
1045
if name.get_text() != '':
1048
a = a.replace(' ','')
1049
if os.path.isdir(DIR_USER + '/' + a):#found_path != None:
1050
if screenlets.show_question(None,(_("There is already a screenlet with that name installed\nDo you wish to continue?") )):
1054
os.system('mkdir ' +DIR_USER + '/' + a)
1055
os.system('mkdir ' +DIR_USER + '/' + a + '/themes')
1056
os.system('mkdir ' +DIR_USER + '/' + a + '/themes/default')
1057
os.system('mkdir ' +DIR_USER + '/' + a + '/mozilla')
1058
os.system('cp ' + screenlets.INSTALL_PREFIX + '/share/screenlets-manager/WebappScreenlet.py ' +DIR_USER + '/' + a + '/' + a + 'Screenlet.py')
1059
os.system('cp ' + screenlets.INSTALL_PREFIX + '/share/screenlets-manager/webapp.png ' +DIR_USER + '/' + a + '/icon.png')
1060
os.system('cp ' + screenlets.INSTALL_PREFIX + '/share/screenlets-manager/webapp.png ' +DIR_USER + '/' + a + '/themes/default')
1061
os.system('cp ' + screenlets.INSTALL_PREFIX + '/share/screenlets-manager/prefs.js ' +DIR_USER + '/' + a + '/mozilla')
1063
enginecopy = open(DIR_USER + '/' + a + '/' + a + 'Screenlet.py','r')
1064
enginesave = enginecopy.read()
1065
enginesave = enginesave.replace('WebappScreenlet',a + 'Screenlet')
1066
enginesave = enginesave.replace("url = 'myurl'","url = " + chr(34) + code.get_text() + chr(34))
1068
enginecopy = open(DIR_USER + '/' + a + '/' + a + 'Screenlet.py','w')
1069
enginecopy.write(enginesave)
1071
screenlets.show_message (None,_("Web Application was successfully installed"))
1073
self.load_screenlets()
1074
except: screenlets.show_error(None,_("Error installing!!!"))
1075
else: screenlets.show_error(None,_("Please specify a name for the widget"))
1076
else: screenlets.show_error(None,_("No HTML code found"))
1079
def show_widget_converter(self):
1080
label1 = gtk.Label(_('Convert any webpage widget into a Screenlet.'))
1081
label2 = gtk.Label(_('Step 1 : Find the widget you want to convert'))
1082
label3 = gtk.Label(_('Step 2 : Copy and Paste the HTML from the widget in the box below'))
1083
label4 = gtk.Label(_('Step 3 : Give it a name in the box below and click on Ok to convert'))
1084
label5 = gtk.Label(_('The name of the widget'))
1089
self.combo1 = combo = gtk.combo_box_new_text()
1090
combo.append_text('Google Gadgets')
1091
combo.append_text('Yourminis Widgets')
1092
combo.append_text('SpringWidgets')
1093
combo.append_text('Widgetbox')
1095
web = gtk.Button('Go to web page')
1096
web.connect('clicked', self.button_clicked, 'widgetsite')
1108
dialog = gtk.Dialog(_("Widget converter"),
1110
gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
1111
(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
1112
gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
1113
#dialog.set_size_request(300, 500)
1114
dialog.vbox.pack_start(label1,False,False,20)
1115
dialog.vbox.pack_start(label2,True,False,5)
1116
h.pack_start(combo,True,True,5)
1117
h.pack_start(web,False,False,5)
1118
dialog.vbox.pack_start(h,False,False,5)
1119
dialog.vbox.pack_start(label3,False,False,10)
1120
dialog.vbox.pack_start(code,False,False,5)
1121
dialog.vbox.pack_start(label4,False,False,5)
1122
h1.pack_start(label5,False,False,5)
1123
h1.pack_start(name,True,True,5)
1124
dialog.vbox.pack_start(h1,False,False,5)
1127
if resp == gtk.RESPONSE_ACCEPT:
1128
if code.get_text() != '':
1129
if name.get_text() != '':
1132
a = a.replace(' ','')
1133
if os.path.isdir(DIR_USER + '/' + a):#found_path != None:
1134
if screenlets.show_question(None,(_("There is already a screenlet with that name installed\nDo you wish to continue?") )):
1138
os.system('mkdir ' +DIR_USER + '/' + a)
1139
os.system('mkdir ' +DIR_USER + '/' + a + '/themes')
1140
os.system('mkdir ' +DIR_USER + '/' + a + '/themes/default')
1141
os.system('mkdir ' +DIR_USER + '/' + a + '/mozilla')
1142
f = open(DIR_USER + '/' + a + '/' + 'index.html' , 'w')
1143
f.write(code.get_text())
1145
os.system('cp ' + screenlets.INSTALL_PREFIX + '/share/screenlets-manager/WidgetScreenlet.py ' +DIR_USER + '/' + a + '/' + a + 'Screenlet.py')
1146
os.system('cp ' + screenlets.INSTALL_PREFIX + '/share/screenlets-manager/widget.png ' +DIR_USER + '/' + a + '/icon.png')
1147
os.system('cp ' + screenlets.INSTALL_PREFIX + '/share/screenlets-manager/widget.png ' +DIR_USER + '/' + a + '/themes/default')
1148
os.system('cp ' + screenlets.INSTALL_PREFIX + '/share/screenlets-manager/prefs.js ' +DIR_USER + '/' + a + '/mozilla')
1149
enginecopy = open(DIR_USER + '/' + a + '/' + a + 'Screenlet.py','r')
1150
enginesave = enginecopy.read()
1151
enginesave = enginesave.replace('WidgetScreenlet',a + 'Screenlet')
1153
enginecopy = open(DIR_USER + '/' + a + '/' + a + 'Screenlet.py','w')
1154
enginecopy.write(enginesave)
1156
screenlets.show_message (None,_("Widget was successfully converted"))
1158
self.load_screenlets()
1159
except: screenlets.show_error(None,_("Error converting!!!"))
1160
else: screenlets.show_error(None,_("Please specify a name for the widget"))
1161
else: screenlets.show_error(None,_("No HTML code found"))
1164
def handle_screenlet_registered (self, name):
1165
"""Callback for dbus-signal, called when a new screenlet gets
1166
registered within the daemon."""
1167
print "REGISTER screenlet: " + name
1168
self.set_screenlet_active(name, True)
1170
def handle_screenlet_unregistered (self, name):
1171
"""Callback for dbus-signal, called when a screenlet gets
1172
unregistered within the daemon."""
1173
print "UNREGISTER screenlet: " + name
1174
self.set_screenlet_active(name, False)
1176
def selection_changed (self, iconview):
1177
"""Callback for handling selection changes in the IconView."""
1178
self.slwindow.set_size_request(560, 300)
1179
info = self.get_selection()
1183
self.label.set_line_wrap(1)
1184
a = info.name + ' ' + info.version+' by ' + info.author + '\n' + info.info
1186
self.label.set_label(a + '...')
1188
self.button_add.set_sensitive(True)
1189
self.button_reset.set_sensitive(True)
1190
self.button_theme.set_sensitive(True)
1191
# self.button_restartall.set_sensitive(True)
1192
# self.button_closeall.set_sensitive(True)
1194
self.button_delete.set_sensitive(True)
1196
self.button_delete.set_sensitive(False)
1197
self.button_shortcut.set_sensitive(True)
1200
self.label.set_label('')
1201
self.cb_enable_disable.set_sensitive(False)
1202
self.cb_autostart.set_sensitive(False)
1203
self.button_add.set_sensitive(False)
1204
self.button_delete.set_sensitive(False)
1205
self.button_reset.set_sensitive(False)
1206
self.button_theme.set_sensitive(False)
1207
self.button_shortcut.set_sensitive(False)
1208
# self.button_restartall.set_sensitive(False)
1209
# self.button_closeall.set_sensitive(False)
1210
self.label_info.set_text('')
1212
def item_activated (self, iconview, item):
1213
"""Callback for handling doubleclick/ENTER in the IconView."""
1214
info = self.get_selection()
1216
# launch/add screenlet
1217
screenlets.launch_screenlet(info.name)
1220
def toggle_enabled (self, widget):
1221
"""Callback for handling changes to the Enable/Disable CheckButton."""
1223
info = self.get_selection()
1225
info.active = not info.active
1228
print "Launch %s" % info.name
1229
screenlets.launch_screenlet(info.name, debug=screenlets.DEBUG_MODE)
1233
utils.quit_screenlet_by_name(info.name)
1234
print "Quit %s" % info.name
1236
self.load_screenlets()
1238
def toggle_autostart (self, widget):
1239
"""Callback for handling changes to the Autostart-CheckButton."""
1240
info = self.get_selection()
1242
info.autostart = not info.autostart
1244
if not utils.create_autostarter(info.name):
1245
widget.set_active(False)
1246
widget.set_sensitive(False)
1248
utils.delete_autostarter(info.name)
1250
def toggle_tray (self, widget):
1251
"""Callback for handling changes to the tray-CheckButton."""
1252
ini = utils.IniReader()
1253
if ini.load (DIR_USER + '/config.ini'):
1255
if ini.get_option('Lock', section='Options') != None:
1256
r = r + 'Lock=' + str(ini.get_option('Lock', section='Options')) + '\n'
1258
if ini.get_option('Sticky', section='Options') != None:
1259
r = r + 'Sticky=' + str(ini.get_option('Sticky', section='Options')) + '\n'
1261
if ini.get_option('Widget', section='Options') != None:
1262
r = r + 'Sticky=' + str(ini.get_option('Sticky', section='Options')) + '\n'
1264
if ini.get_option('Keep_above', section='Options') != None:
1265
r = r + 'Keep_above=' + str(ini.get_option('Keep_above', section='Options')) + '\n'
1267
if ini.get_option('Keep_below', section='Options') != None:
1268
r = r + 'Keep_below=' + str(ini.get_option('Keep_below', section='Options')) + '\n'
1270
if ini.get_option('draw_buttons', section='Options') != None:
1271
r = r + 'draw_buttons=' + str(ini.get_option('draw_buttons', section='Options')) + '\n'
1273
f = open(DIR_USER + '/config.ini', 'w')
1274
DIR_USER + '/config.ini'
1275
f.write("[Options]\n")
1276
f.write("show_in_tray="+str(widget.get_active())+"\n")
1279
os.system('pkill -f screenlets-daemon.py') #restart the daemon
1280
os.system(screenlets.INSTALL_PREFIX + \
1281
'/share/screenlets-manager/screenlets-daemon.py &')
1282
screenlets.show_message(None, _('Screenlets-Manager must now be restarted'))
1284
os.system('screenlets-manager &')
1287
self.delete_event(self.window, None)
1289
def delete_event (self, widget, event):
1291
gtk.widget_pop_colormap()
1301
proc = os.popen("""ps axo "%p,%a" | grep "python.*screenlets-manager.py" | grep -v grep|cut -d',' -f1""").read()
1302
procs = proc.split('\n')
1306
wnck.set_client_type(wnck.CLIENT_TYPE_PAGER)
1307
except AttributeError:
1308
print "Error: Failed to set libwnck client type, window " \
1309
"activation may not work"
1311
print "Manager already started"
1312
screen = wnck.screen_get_default()
1313
while gtk.events_pending():
1314
gtk.main_iteration()
1315
wins = screen.get_windows_stacked()
1318
name = win.get_name()
1319
if name == gettext.gettext('Screenlets Manager'):
1321
if win and win.is_active():
1323
elif win and win.is_minimized():
1325
elif win and win.is_active() == False:
1332
app = ScreenletsManager()