1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import os
20 import gconf
21 import gconfsource
22 import subprocess
23 import bonobo
24 import xdg.DesktopEntry
25
26 try:
27 import userprofile
28 import util
29 from config import *
30 import debuglog
31 except:
32 from sabayon import userprofile
33 from sabayon import util
34 from sabayon.config import *
35 from sabayon import debuglog
36
39
40 PANEL_LAUNCHER_DIR = ".gnome2/panel2.d/default/launchers"
41
42 -def copy_dir (src_client, dst_client, dst_address, dir):
43 for entry in src_client.all_entries (dir):
44 schema_name = entry.get_schema_name ()
45 if schema_name:
46 gconfsource.associate_schema (dst_address, entry.key, schema_name)
47 if entry.value and not entry.get_is_default ():
48 dst_client.set (entry.key, entry.value)
49 for subdir in src_client.all_dirs (dir):
50 copy_dir (src_client, dst_client, dst_address, subdir)
51
53 - def __init__ (self, source, delegate, id):
57 return self.id
59 pass
60
62 - def __init__ (self, source, delegate, id):
65 return _("Panel '%s' added") % self.id
66
68 - def __init__ (self, source, delegate, id):
71 return _("Panel '%s' removed") % self.id
72
74 - def __init__ (self, source, delegate, id):
77 return _("Applet '%s' added" % self.id)
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
97 - def __init__ (self, source, delegate, id):
100 return _("Applet '%s' removed" % self.id)
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
120 - def __init__ (self, source, delegate, id):
123 return _("Object '%s' added" % self.id)
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
147
149 - def __init__ (self, source, delegate, id):
152 return _("Object '%s' removed" % self.id)
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
175
178 - def __init__ (self, delegate, id, added, removed):
179 self.delegate = delegate
180 self.id = id
181 self.added = added
182 self.removed = removed
183 self.gconf_client = self.delegate.get_gconf_client ()
184 self.SORTPRIORITY = 60
185
191
193 - def __init__ (self, delegate, id, added = False, removed = False):
199
200
201
202
203
205 - def __init__ (self, delegate, id, added = False, removed = False):
206 PanelDelegate.PanelThing.__init__ (self, delegate, id, added, removed)
207
208 self._copy_tree (PANEL_KEY_BASE + "/applets/" + id)
209
210 toplevel_key_name = PANEL_KEY_BASE + "/applets/" + id + "/toplevel_id"
211 bonobo_iid_key_name = PANEL_KEY_BASE + "/applets/" + id + "/bonobo_iid"
212
213 self.toplevel_id = self.gconf_client.get_string (toplevel_key_name)
214 self.bonobo_iid = self.gconf_client.get_string (bonobo_iid_key_name)
215
216 dprint ("Creating PanelApplet for '%s' (toplevel_key %s, toplevel_id %s, bonobo_key %s, bonobo_iid %s)",
217 id,
218 toplevel_key_name, self.toplevel_id,
219 bonobo_iid_key_name, self.bonobo_iid)
220
221 if self.bonobo_iid:
222 applet = bonobo.activation.query("iid == '" + self.bonobo_iid + "'" )
223 for i in applet:
224 for prop in i.props:
225 if prop.name == "name":
226 self.name = prop.v.value_string
227
228
229
231 - def __init__ (self, delegate, id, added = False, removed = False):
232 PanelDelegate.PanelThing.__init__ (self, delegate, id, added, removed)
233
234 self._copy_tree (PANEL_KEY_BASE + "/objects/" + id)
235
236 self.toplevel_id = self.gconf_client.get_string (PANEL_KEY_BASE + "/objects/" + id + "/toplevel_id")
237 self.object_type = self.gconf_client.get_string (PANEL_KEY_BASE + "/objects/" + id + "/object_type")
238
239 if self.object_type == "drawer-object":
240
241 self.name = _("Drawer")
242 elif self.object_type == "menu-object":
243 self.name = _("Main Menu")
244 elif self.object_type == "launcher-object":
245 launcher_location = self.gconf_client.get_string (PANEL_KEY_BASE + "/objects/" + id + "/launcher_location")
246 if launcher_location[0] == '/':
247 desktop_file = launcher_location
248 elif launcher_location[0:7] == "file://":
249 desktop_file = launcher_location[7:]
250 else:
251 desktop_file = PANEL_LAUNCHER_DIR + "/" + launcher_location
252 launcher = xdg.DesktopEntry.DesktopEntry(desktop_file)
253 self.name = _("%s launcher") % launcher.getName()
254 elif self.object_type == "action-applet":
255 action_type = self.gconf_client.get_string (PANEL_KEY_BASE + "/objects/" + id + "/action_type")
256 if action_type == "lock":
257 self.name = _("Lock Screen button")
258 elif action_type == "logout":
259 self.name = _("Logout button")
260 elif action_type == "run":
261 self.name = _("Run Application button")
262 elif action_type == "search":
263 self.name = _("Search button")
264 elif action_type == "force-quit":
265 self.name = _("Force Quit button")
266 elif action_type == "connect-server":
267 self.name = _("Connect to Server button")
268 elif action_type == "shutdown":
269 self.name = _("Shutdown button")
270 elif action_type == "screenshot":
271 self.name = _("Screenshot button")
272
273 else:
274 self.name = _("Unknown")
275 else:
276 self.name = _("Menu Bar")
277
285
287 return self.source.gconf_client
288
309
311 if not change.value or \
312 change.value.type != gconf.VALUE_LIST or \
313 change.value.get_list_type () != gconf.VALUE_STRING:
314 return True
315
316 id_list = []
317 for v in change.value.get_list ():
318 id_list.append (v.get_string ())
319
320 added = []
321 for id in id_list:
322 if dict.has_key (id) and not dict[id].removed:
323 continue
324 if not dict.has_key (id):
325 dict[id] = thing_class (self, id, True)
326 else:
327 dict[id].added = True
328 dict[id].removed = False
329 added.append (id)
330
331 removed = []
332 for id in dict:
333 if id in id_list:
334 continue
335 if dict.has_key (id) and not dict[id].removed:
336 dict[id].removed = True
337 removed.append (id)
338
339 dprint ("%s changed: (%s) added, (%s) removed\n",
340 change.key, added, removed);
341
342 for id in added:
343 self.source.emit ("changed", added_class (self.source, self, id))
344 for id in removed:
345 self.source.emit ("changed", removed_class (self.source, self, id))
346
347 return True
348
350 if change.key.startswith (PANEL_KEY_BASE + "/toplevels/"):
351 toplevel_id = change.key.split ("/")[4]
352 if not self.toplevels.has_key (toplevel_id) or \
353 self.toplevels[toplevel_id].added or \
354 self.toplevels[toplevel_id].removed:
355 return True
356
357 elif change.key.startswith (PANEL_KEY_BASE + "/objects/"):
358 object_id = change.key.split ("/")[4]
359 if not self.objects.has_key (object_id) or \
360 self.objects[object_id].added or \
361 self.objects[object_id].removed:
362 return True
363
364 elif change.key.startswith (PANEL_KEY_BASE + "/applets"):
365 applet_id = change.key.split ("/")[4]
366 if not self.applets.has_key (applet_id) or \
367 self.applets[applet_id].added or \
368 self.applets[applet_id].removed:
369 return True
370
371 elif change.key == PANEL_KEY_BASE + "/general/toplevel_id_list":
372 return self.__handle_id_list_change (change,
373 self.toplevels,
374 PanelDelegate.PanelToplevel,
375 PanelAddedChange,
376 PanelRemovedChange)
377
378 elif change.key == PANEL_KEY_BASE + "/general/applet_id_list":
379 return self.__handle_id_list_change (change,
380 self.applets,
381 PanelDelegate.PanelApplet,
382 PanelAppletAddedChange,
383 PanelAppletRemovedChange)
384
385 elif change.key == PANEL_KEY_BASE + "/general/object_id_list":
386 return self.__handle_id_list_change (change,
387 self.objects,
388 PanelDelegate.PanelObject,
389 PanelObjectAddedChange,
390 PanelObjectRemovedChange)
391
392 return False
393
395 id_list = []
396 for id in dict:
397 if dict[id].added:
398 continue
399 id_list.append (id)
400 return id_list
401
421
441
443 if isinstance (change, PanelAddedChange):
444 self.__commit_added_change (change,
445 mandatory,
446 self.toplevels,
447 "toplevel_id_list",
448 "toplevels")
449 elif isinstance (change, PanelRemovedChange):
450 self.__commit_removed_change (change,
451 mandatory,
452 self.toplevels,
453 "toplevel_id_list",
454 "toplevels")
455 elif isinstance (change, PanelAppletAddedChange):
456 self.__commit_added_change (change,
457 mandatory,
458 self.applets,
459 "applet_id_list",
460 "applets")
461 elif isinstance (change, PanelAppletRemovedChange):
462 self.__commit_removed_change (change,
463 mandatory,
464 self.applets,
465 "applet_id_list",
466 "applets")
467 elif isinstance (change, PanelObjectAddedChange):
468 self.__commit_added_change (change,
469 mandatory,
470 self.objects,
471 "object_id_list",
472 "objects")
473 elif isinstance (change, PanelObjectRemovedChange):
474 self.__commit_removed_change (change,
475 mandatory,
476 self.objects,
477 "object_id_list",
478 "objects")
479
481 return "Panel launcher: %s"%os.path.basename(path)
482
487
489 """Stop monitoring for configuration changes."""
490
491 pass
492
494
495 pass
496
498
499 pass
500
503
504 - def apply (self, is_sabayon_session):
507
510
514
516 dprint ("Ignoring file chage due to panel delegation: %s"%change)
517 return True
518
520 pass
521
523 pass
524
526 pass
527
529 pass
530
531 - def apply (self, is_sabayon_session):
532 pass
533
536
537
538
539
540
542 import gobject
543 import os
544 import os.path
545 import time
546 import tempfile
547 import shutil
548
549
550 subprocess.call (["gconftool-2", "--recursive-unset", "%s/toplevels/foo" % PANEL_KEY_BASE])
551 subprocess.call (["gconftool-2", "--recursive-unset", "%s/objects/foo" % PANEL_KEY_BASE])
552 subprocess.call (["gconftool-2", "--recursive-unset", "%s/applets/foo" % PANEL_KEY_BASE])
553 time.sleep (1)
554
555 client = gconf.client_get_default ()
556
557 for id_list_name in ("toplevel_id_list", "object_id_list", "applet_id_list"):
558 id_list = client.get_list (PANEL_KEY_BASE + "/general/" + id_list_name, gconf.VALUE_STRING)
559 while "foo" in id_list:
560 id_list.remove ("foo")
561 client.set_list (PANEL_KEY_BASE + "/general/" + id_list_name, gconf.VALUE_STRING, id_list)
562
563 temp_path = tempfile.mkdtemp (prefix = "test-paneldelegate-")
564
565
566 class TempSource (userprofile.ProfileSource):
567 def __init__ (self, temp_path):
568 userprofile.ProfileSource.__init__ (self, "panel-temp")
569 self.delegates.append (PanelDelegate (self))
570 self.temp_path = temp_path
571 self.defaults_client = None
572 self.defaults_address = None
573 self.mandatory_client = None
574 self.mandatory_address = None
575 def get_committing_client_and_address (self, mandatory):
576 if not mandatory:
577 if not self.defaults_client:
578 (client, address) = gconfsource.get_client_and_address_for_path (
579 os.path.join (self.temp_path, GCONF_DEFAULTS_SOURCE))
580 self.defaults_client = client
581 self.defaults_address = address
582 return (self.defaults_client, self.defaults_address)
583 else:
584 if not self.mandatory_client:
585 (client, address) = gconfsource.get_client_and_address_for_path (
586 os.path.join (self.temp_path, GCONF_MANDATORY_SOURCE))
587 self.mandatory_client = client
588 self.mandatory_address = address
589 return (self.mandatory_client, self.mandatory_address)
590 gobject.type_register (TempSource)
591 source = TempSource (temp_path)
592
593
594 def handle_notify (client, cnx_id, entry, source):
595 source.emit_change (gconfsource.GConfChange (source, entry.key, entry.value))
596 client.add_dir (PANEL_KEY_BASE + "", gconf.CLIENT_PRELOAD_RECURSIVE)
597 notify_id = client.notify_add (PANEL_KEY_BASE + "", handle_notify, source)
598
599
600 global changes
601 changes = []
602 def handle_change (source, change):
603 global changes
604 changes.append (change)
605 source.connect ("changed", handle_change)
606
607
608
609
610 main_loop = gobject.MainLoop ()
611 def poll (main_loop):
612 while main_loop.get_context ().pending ():
613 main_loop.get_context ().iteration (False)
614
615
616 def copy_dir (client, dst, src):
617 for entry in client.all_entries (src):
618 key = dst + "/" + os.path.basename (entry.key)
619 client.set (key, entry.value)
620 for dir in client.all_dirs (src):
621 subdir = os.path.basename (dir)
622 copy_dir (client, dst + "/" + subdir, src + "/" + subdir)
623
624
625 show_program_list = client.get_bool (PANEL_KEY_BASE + "/general/show_program_list")
626 client.set_bool (PANEL_KEY_BASE + "/general/show_program_list", not show_program_list)
627 poll (main_loop)
628
629
630 copy_dir (client, PANEL_KEY_BASE + "/toplevels/foo", PANEL_KEY_BASE + "/toplevels/top_panel")
631 poll (main_loop)
632
633
634 copy_dir (client, PANEL_KEY_BASE + "/applets/foo", PANEL_KEY_BASE + "/applets/clock")
635 client.set_string (PANEL_KEY_BASE + "/applets/foo/toplevel_id", "foo")
636 poll (main_loop)
637
638
639 copy_dir (client, PANEL_KEY_BASE + "/objects/foo", PANEL_KEY_BASE + "/objects/menu_bar")
640 client.set_string (PANEL_KEY_BASE + "/objects/foo/toplevel_id", "foo")
641 poll (main_loop)
642
643
644 toplevels = client.get_list (PANEL_KEY_BASE + "/general/toplevel_id_list", gconf.VALUE_STRING)
645 toplevels.append ("foo")
646 client.set_list (PANEL_KEY_BASE + "/general/toplevel_id_list", gconf.VALUE_STRING, toplevels)
647 poll (main_loop)
648
649
650 applets = client.get_list (PANEL_KEY_BASE + "/general/applet_id_list", gconf.VALUE_STRING)
651 applets.append ("foo")
652 client.set_list (PANEL_KEY_BASE + "/general/applet_id_list", gconf.VALUE_STRING, applets)
653 poll (main_loop)
654
655
656 objects = client.get_list (PANEL_KEY_BASE + "/general/object_id_list", gconf.VALUE_STRING)
657 objects.append ("foo")
658 client.set_list (PANEL_KEY_BASE + "/general/object_id_list", gconf.VALUE_STRING, objects)
659 poll (main_loop)
660
661 time.sleep (3)
662
663 client.set_int (PANEL_KEY_BASE + "/toplevels/foo/hide_delay", 5)
664 poll (main_loop)
665
666 assert len (changes) == 4
667 for change in changes:
668 assert isinstance (change, userprofile.ProfileChange)
669 assert isinstance (changes[0], gconfsource.GConfChange)
670 assert changes[0].key == PANEL_KEY_BASE + "/general/show_program_list"
671 for change in changes[1:4]:
672 assert isinstance (change, PanelChange)
673 assert change.id == "foo"
674
675 (
676 PANEL_ADDED,
677 PANEL_APPLET_ADDED,
678 PANEL_OBJECT_ADDED
679 ) = range (1, 4)
680
681 assert isinstance (changes[PANEL_ADDED], PanelAddedChange)
682 assert isinstance (changes[PANEL_APPLET_ADDED], PanelAppletAddedChange)
683 assert isinstance (changes[PANEL_OBJECT_ADDED], PanelObjectAddedChange)
684
685 source.commit_change (changes[PANEL_ADDED], False)
686
687 subprocess.call (["gconftool-2", "--shutdown"])
688 time.sleep (1)
689
690 assert os.access (os.path.join (temp_path, GCONF_DEFAULTS_SOURCE + "/apps/panel/general/%gconf.xml"), os.F_OK)
691 assert os.access (os.path.join (temp_path, GCONF_DEFAULTS_SOURCE + "/apps/panel/toplevels/foo/%gconf.xml"), os.F_OK)
692
693 changes = []
694
695
696 while "foo" in objects:
697 objects.remove ("foo")
698 client.set_list (PANEL_KEY_BASE + "/general/object_id_list", gconf.VALUE_STRING, objects)
699 poll (main_loop)
700
701
702 while "foo" in applets:
703 applets.remove ("foo")
704 client.set_list (PANEL_KEY_BASE + "/general/applet_id_list", gconf.VALUE_STRING, applets)
705 poll (main_loop)
706
707
708 while "foo" in toplevels:
709 toplevels.remove ("foo")
710 client.set_list (PANEL_KEY_BASE + "/general/toplevel_id_list", gconf.VALUE_STRING, toplevels)
711 poll (main_loop)
712
713
714 client.set_bool (PANEL_KEY_BASE + "/general/show_program_list", show_program_list)
715 poll (main_loop)
716
717
718 client.notify_remove (notify_id)
719 client.remove_dir (PANEL_KEY_BASE + "")
720
721 assert len (changes) == 4
722 for change in changes:
723 assert isinstance (change, userprofile.ProfileChange)
724 for change in changes[:3]:
725 assert isinstance (change, PanelChange)
726 assert change.id == "foo"
727 assert isinstance (changes[3], gconfsource.GConfChange)
728 assert changes[3].key == PANEL_KEY_BASE + "/general/show_program_list"
729
730 (
731 PANEL_OBJECT_REMOVED,
732 PANEL_APPLET_REMOVED,
733 PANEL_REMOVED
734 ) = range (3)
735
736 assert isinstance (changes[PANEL_OBJECT_REMOVED], PanelObjectRemovedChange)
737 assert isinstance (changes[PANEL_APPLET_REMOVED], PanelAppletRemovedChange)
738 assert isinstance (changes[PANEL_REMOVED], PanelRemovedChange)
739
740 source.commit_change (changes[PANEL_REMOVED], False)
741
742 dprint ("Committed changes to %s", temp_path)
743 subprocess.call (["gconftool-2", "--shutdown"])
744 time.sleep (1)
745
746 assert not os.access (os.path.join (temp_path, GCONF_DEFAULTS_SOURCE + "/apps/panel/toplevels/foo/%gconf.xml"), os.F_OK)
747
748
749 subprocess.call (["gconftool-2", "--recursive-unset", "%s/toplevels/foo" % PANEL_KEY_BASE])
750 subprocess.call (["gconftool-2", "--recursive-unset", "%s/objects/foo" % PANEL_KEY_BASE])
751 subprocess.call (["gconftool-2", "--recursive-unset", "%s/applets/foo" % PANEL_KEY_BASE])
752
753 shutil.rmtree (temp_path, True)
754