diff options
Diffstat (limited to 'shell')
48 files changed, 2556 insertions, 2556 deletions
diff --git a/shell/console/console.py b/shell/console/console.py index 565b973..c105e85 100755 --- a/shell/console/console.py +++ b/shell/console/console.py @@ -27,7 +27,7 @@ logviewer_widget = logviewer.Interface().widget logviewer_widget.show() # Terminal interface -terminal_widget = terminal.Interface().widget +terminal_widget = terminal.Interface().widget terminal_widget.show() # Notebook diff --git a/shell/console/logviewer.py b/shell/console/logviewer.py index fb589a2..b93f05e 100644 --- a/shell/console/logviewer.py +++ b/shell/console/logviewer.py @@ -26,76 +26,76 @@ import gobject from sugar import env class LogBuffer(gtk.TextBuffer): - def __init__(self, logfile): - gtk.TextBuffer.__init__(self) + def __init__(self, logfile): + gtk.TextBuffer.__init__(self) - self._logfile = logfile - self._pos = 0 + self._logfile = logfile + self._pos = 0 - self.update() + self.update() - def update(self): - f = open(self._logfile, 'r') + def update(self): + f = open(self._logfile, 'r') - f.seek(self._pos) - self.insert(self.get_end_iter(), f.read()) - self._pos = f.tell() + f.seek(self._pos) + self.insert(self.get_end_iter(), f.read()) + self._pos = f.tell() - f.close() + f.close() - return True + return True class LogView(gtk.ScrolledWindow): - def __init__(self, model): - gtk.ScrolledWindow.__init__(self) + def __init__(self, model): + gtk.ScrolledWindow.__init__(self) - self.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + self.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) - textview = gtk.TextView(model) - textview.set_wrap_mode(gtk.WRAP_WORD) - textview.set_editable(False) + textview = gtk.TextView(model) + textview.set_wrap_mode(gtk.WRAP_WORD) + textview.set_editable(False) - self.add(textview) - textview.show() + self.add(textview) + textview.show() class MultiLogView(gtk.Notebook): - def __init__(self, path): - gtk.Notebook.__init__(self) + def __init__(self, path): + gtk.Notebook.__init__(self) - self._logs_path = path - self._pages = {} + self._logs_path = path + self._pages = {} - self._update() + self._update() - gobject.timeout_add(1000, self._update) + gobject.timeout_add(1000, self._update) - def _add_page(self, logfile): - full_log_path = os.path.join(self._logs_path, logfile) - model = LogBuffer(full_log_path) + def _add_page(self, logfile): + full_log_path = os.path.join(self._logs_path, logfile) + model = LogBuffer(full_log_path) - view = LogView(model) - self.append_page(view, gtk.Label(logfile)) - view.show() + view = LogView(model) + self.append_page(view, gtk.Label(logfile)) + view.show() - self._pages[logfile] = model + self._pages[logfile] = model - def _update(self): - if not os.path.isdir(self._logs_path): - return True + def _update(self): + if not os.path.isdir(self._logs_path): + return True - for logfile in os.listdir(self._logs_path): - if self._pages.has_key(logfile): - self._pages[logfile].update() - else: - self._add_page(logfile) + for logfile in os.listdir(self._logs_path): + if self._pages.has_key(logfile): + self._pages[logfile].update() + else: + self._add_page(logfile) - return True + return True class Interface: - def __init__(self): - path = os.path.join(env.get_profile_path(), 'logs') - viewer = MultiLogView(path) - viewer.show() - self.widget = viewer -
\ No newline at end of file + def __init__(self): + path = os.path.join(env.get_profile_path(), 'logs') + viewer = MultiLogView(path) + viewer.show() + self.widget = viewer +
\ No newline at end of file diff --git a/shell/console/memphis.py b/shell/console/memphis.py index 4513987..5e4e8a2 100644 --- a/shell/console/memphis.py +++ b/shell/console/memphis.py @@ -8,175 +8,175 @@ import plugin from procmem import proc try: - import gtk - import gtk.gdk - import gobject + import gtk + import gtk.gdk + import gobject except: - sys.exit(1) + sys.exit(1) class Interface: - - store_data_types = [] - store_data_types_details = [] - - def __init__(self): - - # Our GtkTree (Treeview) - self.treeview = gtk.TreeView() - self.widget = self.treeview - - # Loading plugins - self.plg = plugin.Plugin() - - # TOP data types (columns) - self.store_data_types = [] - - for plg in self.plg.list: - plg_data = plg.INTERNALS - - # Give plugin object to plugin - plg.INTERNALS['Plg'] = self.plg - - # Creating a store model and loading process data to Treeview - # self.store_data_types, ex [int, str, str, str, int,...] - #self.store = gtk.TreeStore(*self.store_data_types) - self.data = Data(self.treeview, self.plg.list) - + + store_data_types = [] + store_data_types_details = [] + + def __init__(self): + + # Our GtkTree (Treeview) + self.treeview = gtk.TreeView() + self.widget = self.treeview + + # Loading plugins + self.plg = plugin.Plugin() + + # TOP data types (columns) + self.store_data_types = [] + + for plg in self.plg.list: + plg_data = plg.INTERNALS + + # Give plugin object to plugin + plg.INTERNALS['Plg'] = self.plg + + # Creating a store model and loading process data to Treeview + # self.store_data_types, ex [int, str, str, str, int,...] + #self.store = gtk.TreeStore(*self.store_data_types) + self.data = Data(self.treeview, self.plg.list) + class Data: - treeview = None - last_col_index = 0 - - store_data_cols = [] - store_data_types = [] - store_data_types_details = [] - - def __init__(self, treeview, plg_list): - - # Top data types - self.plg_list = plg_list - - for plg in self.plg_list: - - if plg.INTERNALS['top_data'] != None: - last_dt = len(self.store_data_types) - - if last_dt > 0: - last_dt -= 1 - - len_dt = len(plg.INTERNALS['top_data']) - - self.store_data_types_details.append({"plugin": plg, "init": last_dt, "end": last_dt + len_dt}) - - for dt in plg.INTERNALS['top_data']: - self.store_data_types.append(dt) - - for col in plg.INTERNALS['top_cols']: - self.store_data_cols.append(col) - - # Set global treeview - self.treeview = treeview - - # Basic columns - index = 0 - for column_name in self.store_data_cols: - self.add_column(column_name, index) - index += 1 - - self.store = gtk.TreeStore(*self.store_data_types) - treeview.set_model(self.store) - - # Update information every 1 second - gobject.timeout_add(500, self.load_data, treeview) - - # Add a new column to the main treeview - def add_column(self, column_name, index): - cell = gtk.CellRendererText() - col_tv = gtk.TreeViewColumn(column_name, cell, text=index) - col_tv.set_resizable(True) - col_tv.connect('clicked', self.sort_column_clicked) - col_tv.set_property('clickable', True) - - self.treeview.append_column(col_tv) - - # Set the last column index added - self.last_col_index = index - - # Sorting - def sort_column_clicked(self, TreeViewColumn): - cols = self.treeview.get_columns() - - # Searching column index - index = 0 - for col in cols: - if col == TreeViewColumn: - break - - index += 1 - - self.store.set_sort_column_id(index, gtk.SORT_DESCENDING) - - def load_data(self, treeview): - self.store.clear() - - # Getting procfs data - self.procdata = proc.ProcInfo() - self.process_list = [] - - pids = [] - screen = wnck.screen_get_default() - windows = screen.get_windows() - - current_pid = os.getpid() - - for win in windows: - pid = int(win.get_pid()) - if current_pid != pid: - pids.append(pid) - - self.process_list = set(pids) - - # Sort rows using pid - #self.process_list.sort(key=operator.itemgetter('pid')) - self.process_iter = [] - - for pid in self.process_list: - pi = self.build_row(self.store, None, self.procdata, pid) - self.process_iter.append(pi) - - treeview.set_rules_hint(True) - treeview.expand_all() - - return True - - def build_row(self, store, parent_iter, proc_data, pid): - data = [] - - pinfo = proc_data.MemoryInfo(pid) - - # Look for plugins that need to update the top data treeview - for plg in self.plg_list: - plg_data = [] - - if plg.INTERNALS['top_data'] != None: - # data = [xxx, yyy,zzz,...] - plg_data = plg.info.plg_on_top_data_refresh(plg, pinfo) - - for field in plg_data: - data.append(field) - - pi = self.insert_row(store, parent_iter, data) - - return pi - - # Insert a Row in our TreeView - def insert_row(self, store, parent, row_data): - iter = store.insert_after(parent, None) - - index = 0 - - for data in row_data: - store.set_value(iter, index , data) - index += 1 - - return iter + treeview = None + last_col_index = 0 + + store_data_cols = [] + store_data_types = [] + store_data_types_details = [] + + def __init__(self, treeview, plg_list): + + # Top data types + self.plg_list = plg_list + + for plg in self.plg_list: + + if plg.INTERNALS['top_data'] != None: + last_dt = len(self.store_data_types) + + if last_dt > 0: + last_dt -= 1 + + len_dt = len(plg.INTERNALS['top_data']) + + self.store_data_types_details.append({"plugin": plg, "init": last_dt, "end": last_dt + len_dt}) + + for dt in plg.INTERNALS['top_data']: + self.store_data_types.append(dt) + + for col in plg.INTERNALS['top_cols']: + self.store_data_cols.append(col) + + # Set global treeview + self.treeview = treeview + + # Basic columns + index = 0 + for column_name in self.store_data_cols: + self.add_column(column_name, index) + index += 1 + + self.store = gtk.TreeStore(*self.store_data_types) + treeview.set_model(self.store) + + # Update information every 1 second + gobject.timeout_add(500, self.load_data, treeview) + + # Add a new column to the main treeview + def add_column(self, column_name, index): + cell = gtk.CellRendererText() + col_tv = gtk.TreeViewColumn(column_name, cell, text=index) + col_tv.set_resizable(True) + col_tv.connect('clicked', self.sort_column_clicked) + col_tv.set_property('clickable', True) + + self.treeview.append_column(col_tv) + + # Set the last column index added + self.last_col_index = index + + # Sorting + def sort_column_clicked(self, TreeViewColumn): + cols = self.treeview.get_columns() + + # Searching column index + index = 0 + for col in cols: + if col == TreeViewColumn: + break + + index += 1 + + self.store.set_sort_column_id(index, gtk.SORT_DESCENDING) + + def load_data(self, treeview): + self.store.clear() + + # Getting procfs data + self.procdata = proc.ProcInfo() + self.process_list = [] + + pids = [] + screen = wnck.screen_get_default() + windows = screen.get_windows() + + current_pid = os.getpid() + + for win in windows: + pid = int(win.get_pid()) + if current_pid != pid: + pids.append(pid) + + self.process_list = set(pids) + + # Sort rows using pid + #self.process_list.sort(key=operator.itemgetter('pid')) + self.process_iter = [] + + for pid in self.process_list: + pi = self.build_row(self.store, None, self.procdata, pid) + self.process_iter.append(pi) + + treeview.set_rules_hint(True) + treeview.expand_all() + + return True + + def build_row(self, store, parent_iter, proc_data, pid): + data = [] + + pinfo = proc_data.MemoryInfo(pid) + + # Look for plugins that need to update the top data treeview + for plg in self.plg_list: + plg_data = [] + + if plg.INTERNALS['top_data'] != None: + # data = [xxx, yyy,zzz,...] + plg_data = plg.info.plg_on_top_data_refresh(plg, pinfo) + + for field in plg_data: + data.append(field) + + pi = self.insert_row(store, parent_iter, data) + + return pi + + # Insert a Row in our TreeView + def insert_row(self, store, parent, row_data): + iter = store.insert_after(parent, None) + + index = 0 + + for data in row_data: + store.set_value(iter, index , data) + index += 1 + + return iter diff --git a/shell/console/plugin.py b/shell/console/plugin.py index 5ad5ba2..62ed947 100755 --- a/shell/console/plugin.py +++ b/shell/console/plugin.py @@ -9,42 +9,42 @@ from procmem import proc, proc_smaps, analysis class Plugin: - # Plugin list - list = [] - proc = proc.ProcInfo() - - internal_plugin = "memphis_init" - plg_path = os.path.dirname(os.path.abspath(__file__)) + "/plugins" - - # Frequency timer, managed by main program - freq_timer = 0 - - def __init__(self): - - sys.path.insert(0, self.plg_path) - - # Including memphis plugin - self.list.append(__import__(self.internal_plugin)) - - if os.path.isdir(self.plg_path): - # around dir entries - for plg in os.listdir(self.plg_path): - - if plg == self.internal_plugin: - continue - - if os.path.isdir(self.plg_path + "/" + plg): - p = __import__(plg) - self.list.append(__import__(plg)) - - # Parse /proc/PID/smaps information - def proc_get_smaps(self, pid): - return proc_smaps.ProcSmaps(pid) - - # Parse /proc/PID/maps information - def proc_get_maps(self, pid): - return proc_smaps.ProcMaps(pid) + # Plugin list + list = [] + proc = proc.ProcInfo() + + internal_plugin = "memphis_init" + plg_path = os.path.dirname(os.path.abspath(__file__)) + "/plugins" + + # Frequency timer, managed by main program + freq_timer = 0 + + def __init__(self): + + sys.path.insert(0, self.plg_path) + + # Including memphis plugin + self.list.append(__import__(self.internal_plugin)) + + if os.path.isdir(self.plg_path): + # around dir entries + for plg in os.listdir(self.plg_path): + + if plg == self.internal_plugin: + continue + + if os.path.isdir(self.plg_path + "/" + plg): + p = __import__(plg) + self.list.append(__import__(plg)) + + # Parse /proc/PID/smaps information + def proc_get_smaps(self, pid): + return proc_smaps.ProcSmaps(pid) + + # Parse /proc/PID/maps information + def proc_get_maps(self, pid): + return proc_smaps.ProcMaps(pid) - def proc_analysis(self, pid): - return analysis.Analysis(pid) -
\ No newline at end of file + def proc_analysis(self, pid): + return analysis.Analysis(pid) +
\ No newline at end of file diff --git a/shell/console/plugins/clean_size/__init__.py b/shell/console/plugins/clean_size/__init__.py index fed740c..75ce1d1 100644 --- a/shell/console/plugins/clean_size/__init__.py +++ b/shell/console/plugins/clean_size/__init__.py @@ -2,15 +2,15 @@ import info INTERNALS = { - # Basic information - 'PLGNAME': "Clean Size", - 'TABNAME': None, - 'AUTHOR': "Eduardo Silva", - 'DESC': "Print the approx real memory usage", + # Basic information + 'PLGNAME': "Clean Size", + 'TABNAME': None, + 'AUTHOR': "Eduardo Silva", + 'DESC': "Print the approx real memory usage", - # Plugin API - 'Plg': None, # Plugin object + # Plugin API + 'Plg': None, # Plugin object - 'top_data': [int], # Top data types needed by memphis core plugin - 'top_cols': ["Approx Real Usage (kb)"] - } + 'top_data': [int], # Top data types needed by memphis core plugin + 'top_cols': ["Approx Real Usage (kb)"] + } diff --git a/shell/console/plugins/clean_size/info.py b/shell/console/plugins/clean_size/info.py index e223ea5..25ed044 100644 --- a/shell/console/plugins/clean_size/info.py +++ b/shell/console/plugins/clean_size/info.py @@ -7,9 +7,9 @@ ############################################################ def plg_on_top_data_refresh(self, pinfo): - - # Get clean size - maps = self.INTERNALS['Plg'].proc_get_maps(pinfo['pid']) + + # Get clean size + maps = self.INTERNALS['Plg'].proc_get_maps(pinfo['pid']) - size = (maps.clean_size/1024) - return [size] + size = (maps.clean_size/1024) + return [size] diff --git a/shell/console/plugins/cpu/__init__.py b/shell/console/plugins/cpu/__init__.py index 3ec6135..e22a413 100644 --- a/shell/console/plugins/cpu/__init__.py +++ b/shell/console/plugins/cpu/__init__.py @@ -2,20 +2,20 @@ import os import info INTERNALS = { - 'PLGNAME': "cpu", - 'TABNAME': None, - 'AUTHOR': "Eduardo Silva", - 'DESC': "Print CPU usage", + 'PLGNAME': "cpu", + 'TABNAME': None, + 'AUTHOR': "Eduardo Silva", + 'DESC': "Print CPU usage", - # Plugin API - 'Plg': None, # Plugin object - 'current_plg': None, # Current plugin object - 'current_page': None, # Current page number + # Plugin API + 'Plg': None, # Plugin object + 'current_plg': None, # Current plugin object + 'current_page': None, # Current page number - # Top process view requirements - 'top_data': [int], # Top data types needed by memphis core plugin - 'top_cols': ["%CPU "] # Column names - } + # Top process view requirements + 'top_data': [int], # Top data types needed by memphis core plugin + 'top_cols': ["%CPU "] # Column names + } # Get CPU frequency cpu_hz = os.sysconf(2) diff --git a/shell/console/plugins/cpu/info.py b/shell/console/plugins/cpu/info.py index b8b715e..9cb1ad4 100644 --- a/shell/console/plugins/cpu/info.py +++ b/shell/console/plugins/cpu/info.py @@ -7,42 +7,42 @@ ############################################################ def plg_on_top_data_refresh(self, pinfo): - PI = self.INTERNALS['Plg'].proc - - pid = pinfo['pid'] - - # Get JIFFIES CPU usage - used_jiffies = pinfo['utime'] + pinfo['stime'] - last_ujiffies = get_pid_ujiffies(self, pid) - - cpu_usage = PI.get_CPU_usage(self.cpu_hz, used_jiffies, pinfo['start_time']) + PI = self.INTERNALS['Plg'].proc + + pid = pinfo['pid'] + + # Get JIFFIES CPU usage + used_jiffies = pinfo['utime'] + pinfo['stime'] + last_ujiffies = get_pid_ujiffies(self, pid) + + cpu_usage = PI.get_CPU_usage(self.cpu_hz, used_jiffies, pinfo['start_time']) - # Get PERCENT CPU usage - if last_ujiffies == 0.0: - pcpu = 0.0 - set_pid_ujiffies(self, pid, cpu_usage['used_jiffies']) - data = [int(pcpu)] - return data - - used_jiffies = cpu_usage['used_jiffies'] - last_ujiffies + # Get PERCENT CPU usage + if last_ujiffies == 0.0: + pcpu = 0.0 + set_pid_ujiffies(self, pid, cpu_usage['used_jiffies']) + data = [int(pcpu)] + return data + + used_jiffies = cpu_usage['used_jiffies'] - last_ujiffies - # Available jiffies are - avail_jiffies = (500/1000.0)*self.cpu_hz # 500 = 0.5 second - pcpu = ((used_jiffies*100)/avail_jiffies) - - set_pid_ujiffies(self, pid, cpu_usage['used_jiffies']) - - data = [int(pcpu)] - return data + # Available jiffies are + avail_jiffies = (500/1000.0)*self.cpu_hz # 500 = 0.5 second + pcpu = ((used_jiffies*100)/avail_jiffies) + + set_pid_ujiffies(self, pid, cpu_usage['used_jiffies']) + + data = [int(pcpu)] + return data def get_pid_ujiffies(self, pid): - - if pid in self.pids_ujiffies: - return self.pids_ujiffies[pid] - else: - set_pid_ujiffies(self, pid, 0) - return self.pids_ujiffies[pid] + + if pid in self.pids_ujiffies: + return self.pids_ujiffies[pid] + else: + set_pid_ujiffies(self, pid, 0) + return self.pids_ujiffies[pid] def set_pid_ujiffies(self, pid, ujiffies): - self.pids_ujiffies[pid] = ujiffies + self.pids_ujiffies[pid] = ujiffies diff --git a/shell/console/plugins/dirty_size/__init__.py b/shell/console/plugins/dirty_size/__init__.py index 2661db8..f8e9e0a 100644 --- a/shell/console/plugins/dirty_size/__init__.py +++ b/shell/console/plugins/dirty_size/__init__.py @@ -3,15 +3,15 @@ import info INTERNALS = { - # Basic information - 'PLGNAME': "Dirty Size", - 'TABNAME': None, # No tabbed plugin - 'AUTHOR': "Eduardo Silva", - 'DESC': "Get dirty size memory usage", + # Basic information + 'PLGNAME': "Dirty Size", + 'TABNAME': None, # No tabbed plugin + 'AUTHOR': "Eduardo Silva", + 'DESC': "Get dirty size memory usage", - # Plugin API - 'Plg': None, # Plugin object + # Plugin API + 'Plg': None, # Plugin object - 'top_data': [int], # Top data types needed by memphis core plugin - 'top_cols': ["PDRSS (kb)"] - } + 'top_data': [int], # Top data types needed by memphis core plugin + 'top_cols': ["PDRSS (kb)"] + } diff --git a/shell/console/plugins/dirty_size/info.py b/shell/console/plugins/dirty_size/info.py index 631d86a..54a2e7e 100644 --- a/shell/console/plugins/dirty_size/info.py +++ b/shell/console/plugins/dirty_size/info.py @@ -9,12 +9,12 @@ def plg_on_top_data_refresh(self, ppinfo): - dirty_sizes = get_dirty(self, ppinfo['pid']) - - # memhis need an array - return [dirty_sizes['private']] + dirty_sizes = get_dirty(self, ppinfo['pid']) + + # memhis need an array + return [dirty_sizes['private']] def get_dirty(pself, pid): - ProcAnalysis = pself.INTERNALS['Plg'].proc_analysis(pid) + ProcAnalysis = pself.INTERNALS['Plg'].proc_analysis(pid) - return ProcAnalysis.DirtyRSS() + return ProcAnalysis.DirtyRSS() diff --git a/shell/console/plugins/memphis_init/__init__.py b/shell/console/plugins/memphis_init/__init__.py index c13ce2e..f5ada7e 100644 --- a/shell/console/plugins/memphis_init/__init__.py +++ b/shell/console/plugins/memphis_init/__init__.py @@ -1,15 +1,15 @@ import info INTERNALS = { - 'PLGNAME': "memphis", - 'TABNAME': None, - 'AUTHOR': "Eduardo Silva", - 'DESC': "Print basic process information", + 'PLGNAME': "memphis", + 'TABNAME': None, + 'AUTHOR': "Eduardo Silva", + 'DESC': "Print basic process information", - # Plugin API - 'Plg': None, # Plugin object + # Plugin API + 'Plg': None, # Plugin object - # Top process view requirements - 'top_data': [int, str, str], # Top data types needed by memphis core plugin - 'top_cols': ["PID", "Process Name", "Status"] # Column names - } + # Top process view requirements + 'top_data': [int, str, str], # Top data types needed by memphis core plugin + 'top_cols': ["PID", "Process Name", "Status"] # Column names + } diff --git a/shell/console/plugins/memphis_init/info.py b/shell/console/plugins/memphis_init/info.py index 94d2d43..6e524c7 100644 --- a/shell/console/plugins/memphis_init/info.py +++ b/shell/console/plugins/memphis_init/info.py @@ -8,6 +8,6 @@ def plg_on_top_data_refresh(self, ppinfo): - data = [ppinfo['pid'], ppinfo['name'], ppinfo['state_name']] - - return data + data = [ppinfo['pid'], ppinfo['name'], ppinfo['state_name']] + + return data diff --git a/shell/console/procmem/analysis.py b/shell/console/procmem/analysis.py index a468acd..d2a247a 100644 --- a/shell/console/procmem/analysis.py +++ b/shell/console/procmem/analysis.py @@ -1,30 +1,30 @@ import proc, proc_smaps class Analysis: - - pid = 0 - - def __init__(self, pid): - self.pid = pid - - def DirtyRSS(self): - smaps = proc_smaps.ProcSmaps(self.pid) - dirty = [] + + pid = 0 + + def __init__(self, pid): + self.pid = pid + + def DirtyRSS(self): + smaps = proc_smaps.ProcSmaps(self.pid) + dirty = [] - private = 0 - shared = 0 - - for map in smaps.mappings: - private += map.private_dirty - shared += map.shared_dirty + private = 0 + shared = 0 + + for map in smaps.mappings: + private += map.private_dirty + shared += map.shared_dirty - dirty = {"private": int(private), "shared": int(shared)} + dirty = {"private": int(private), "shared": int(shared)} - return dirty - - def ApproxRealMemoryUsage(self): - maps = proc_smaps.ProcMaps(self.pid) - size = (maps.clean_size/1024) + return dirty + + def ApproxRealMemoryUsage(self): + maps = proc_smaps.ProcMaps(self.pid) + size = (maps.clean_size/1024) - return size -
\ No newline at end of file + return size +
\ No newline at end of file diff --git a/shell/console/procmem/proc.py b/shell/console/procmem/proc.py index af0a656..729aa13 100644 --- a/shell/console/procmem/proc.py +++ b/shell/console/procmem/proc.py @@ -5,96 +5,96 @@ import string class ProcInfo: - dir_path = "/proc/" # Our cute Proc File System - status_file = "status" - stat_file = "stat" - - proc_list = [] # Our PID list :D - proc_info = [] # - - def __init__(self): - self.proc_list = self.Get_PID_List() - - # Returns Process List - def Get_PID_List(self): - list = [] - - # Exists our procfs ? - if os.path.isdir(self.dir_path): - # around dir entries - for f in os.listdir(self.dir_path): - if os.path.isdir(self.dir_path+f) & str.isdigit(f): - list.append(int(f)) + dir_path = "/proc/" # Our cute Proc File System + status_file = "status" + stat_file = "stat" + + proc_list = [] # Our PID list :D + proc_info = [] # + + def __init__(self): + self.proc_list = self.Get_PID_List() + + # Returns Process List + def Get_PID_List(self): + list = [] + + # Exists our procfs ? + if os.path.isdir(self.dir_path): + # around dir entries + for f in os.listdir(self.dir_path): + if os.path.isdir(self.dir_path+f) & str.isdigit(f): + list.append(int(f)) - return list - - def MemoryInfo(self, pid): - # Path - pidfile = self.dir_path + str(pid) + "/stat" - try: - infile = open(pidfile, "r") - except: - print "Error trying " + pidfile - return None + return list + + def MemoryInfo(self, pid): + # Path + pidfile = self.dir_path + str(pid) + "/stat" + try: + infile = open(pidfile, "r") + except: + print "Error trying " + pidfile + return None - # Parsing data , check 'man 5 proc' for details - data = infile.read().split() + # Parsing data , check 'man 5 proc' for details + data = infile.read().split() - infile.close() - - state_dic = { - 'R': 'Running', - 'S': 'Sleeping', - 'D': 'Disk sleep', - 'Z': 'Zombie', - 'T': 'Traced/Stopped', - 'W': 'Paging' - } + infile.close() + + state_dic = { + 'R': 'Running', + 'S': 'Sleeping', + 'D': 'Disk sleep', + 'Z': 'Zombie', + 'T': 'Traced/Stopped', + 'W': 'Paging' + } - # user and group owners - pidstat = os.stat(pidfile) - - info = { - 'pid': int(data[0]), # Process ID - 'name': data[1].strip('()'), # Process name - 'state': data[2], # Process State, ex: R|S|D|Z|T|W - 'state_name': state_dic[data[2]], # Process State name, ex: Running, sleeping, Zombie, etc - 'ppid': int(data[3]), # Parent process ID - 'utime': int(data[13]), # Used jiffies in user mode - 'stime': int(data[14]), # Used jiffies in kernel mode - 'start_time': int(data[21]), # Process time from system boot (jiffies) - 'vsize': int(data[22]), # Virtual memory size used (bytes) - 'rss': int(data[23])*4, # Resident Set Size (bytes) - 'user_id': pidstat.st_uid, # process owner - 'group_id': pidstat.st_gid # owner group - } - - return info - + # user and group owners + pidstat = os.stat(pidfile) + + info = { + 'pid': int(data[0]), # Process ID + 'name': data[1].strip('()'), # Process name + 'state': data[2], # Process State, ex: R|S|D|Z|T|W + 'state_name': state_dic[data[2]], # Process State name, ex: Running, sleeping, Zombie, etc + 'ppid': int(data[3]), # Parent process ID + 'utime': int(data[13]), # Used jiffies in user mode + 'stime': int(data[14]), # Used jiffies in kernel mode + 'start_time': int(data[21]), # Process time from system boot (jiffies) + 'vsize': int(data[22]), # Virtual memory size used (bytes) + 'rss': int(data[23])*4, # Resident Set Size (bytes) + 'user_id': pidstat.st_uid, # process owner + 'group_id': pidstat.st_gid # owner group + } + + return info + - # Returns the CPU usage expressed in Jiffies - def get_CPU_usage(self, cpu_hz, used_jiffies, start_time): - - # Uptime info - uptime_file = self.dir_path + "/uptime" - try: - infile = file(uptime_file, "r") - except: - print "Error trying uptime file" - return None - - uptime_line = infile.readline() - uptime = string.split(uptime_line, " ",2) - - infile.close() - - # System uptime, from /proc/uptime - uptime = float(uptime[0]) - - # Jiffies - avail_jiffies = (uptime * cpu_hz) - start_time - - cpu_usage = {'used_jiffies': used_jiffies, 'avail_jiffies': avail_jiffies} + # Returns the CPU usage expressed in Jiffies + def get_CPU_usage(self, cpu_hz, used_jiffies, start_time): + + # Uptime info + uptime_file = self.dir_path + "/uptime" + try: + infile = file(uptime_file, "r") + except: + print "Error trying uptime file" + return None + + uptime_line = infile.readline() + uptime = string.split(uptime_line, " ",2) + + infile.close() + + # System uptime, from /proc/uptime + uptime = float(uptime[0]) + + # Jiffies + avail_jiffies = (uptime * cpu_hz) - start_time + + cpu_usage = {'used_jiffies': used_jiffies, 'avail_jiffies': avail_jiffies} - return cpu_usage + return cpu_usage diff --git a/shell/console/procmem/proc_smaps.py b/shell/console/procmem/proc_smaps.py index 84bef43..9416c52 100644 --- a/shell/console/procmem/proc_smaps.py +++ b/shell/console/procmem/proc_smaps.py @@ -9,121 +9,121 @@ import os # Parse the /proc/PID/smaps file class ProcSmaps: - mappings = [] # Devices information - - def __init__(self, pid): - - smapfile = "/proc/%s/smaps" % pid - self.mappings = [] - - # Coded by Federico Mena (script) - try: - infile = open(smapfile, "r") - input = infile.read() - infile.close() - except: - print "Error trying " + smapfile - return - - lines = input.splitlines() + mappings = [] # Devices information + + def __init__(self, pid): + + smapfile = "/proc/%s/smaps" % pid + self.mappings = [] + + # Coded by Federico Mena (script) + try: + infile = open(smapfile, "r") + input = infile.read() + infile.close() + except: + print "Error trying " + smapfile + return + + lines = input.splitlines() - num_lines = len (lines) - line_idx = 0 - - # 08065000-08067000 rw-p 0001c000 03:01 147613 /opt/gnome/bin/evolution-2.6 - # Size: 8 kB - # Rss: 8 kB - # Shared_Clean: 0 kB - # Shared_Dirty: 0 kB - # Private_Clean: 8 kB - # Private_Dirty: 0 kB - - while num_lines > 0: - fields = lines[line_idx].split (" ", 5) - if len (fields) == 6: - (offsets, permissions, bin_permissions, device, inode, name) = fields - else: - (offsets, permissions, bin_permissions, device, inode) = fields - name = "" - - size = self.parse_smaps_size_line (lines[line_idx + 1]) - rss = self.parse_smaps_size_line (lines[line_idx + 2]) - shared_clean = self.parse_smaps_size_line (lines[line_idx + 3]) - shared_dirty = self.parse_smaps_size_line (lines[line_idx + 4]) - private_clean = self.parse_smaps_size_line (lines[line_idx + 5]) - private_dirty = self.parse_smaps_size_line (lines[line_idx + 6]) - name = name.strip () + num_lines = len (lines) + line_idx = 0 + + # 08065000-08067000 rw-p 0001c000 03:01 147613 /opt/gnome/bin/evolution-2.6 + # Size: 8 kB + # Rss: 8 kB + # Shared_Clean: 0 kB + # Shared_Dirty: 0 kB + # Private_Clean: 8 kB + # Private_Dirty: 0 kB + + while num_lines > 0: + fields = lines[line_idx].split (" ", 5) + if len (fields) == 6: + (offsets, permissions, bin_permissions, device, inode, name) = fields + else: + (offsets, permissions, bin_permissions, device, inode) = fields + name = "" + + size = self.parse_smaps_size_line (lines[line_idx + 1]) + rss = self.parse_smaps_size_line (lines[line_idx + 2]) + shared_clean = self.parse_smaps_size_line (lines[line_idx + 3]) + shared_dirty = self.parse_smaps_size_line (lines[line_idx + 4]) + private_clean = self.parse_smaps_size_line (lines[line_idx + 5]) + private_dirty = self.parse_smaps_size_line (lines[line_idx + 6]) + name = name.strip () - mapping = Mapping (size, rss, shared_clean, shared_dirty, private_clean, private_dirty, permissions, name) - self.mappings.append (mapping) + mapping = Mapping (size, rss, shared_clean, shared_dirty, private_clean, private_dirty, permissions, name) + self.mappings.append (mapping) - num_lines -= 7 - line_idx += 7 + num_lines -= 7 + line_idx += 7 - # Parses a line of the form "foo: 42 kB" and returns an integer for the "42" field - def parse_smaps_size_line (self, line): - # Rss: 8 kB - fields = line.split () - return int(fields[1]) + # Parses a line of the form "foo: 42 kB" and returns an integer for the "42" field + def parse_smaps_size_line (self, line): + # Rss: 8 kB + fields = line.split () + return int(fields[1]) class Mapping: - def __init__ (self, size, rss, shared_clean, shared_dirty, private_clean, private_dirty, permissions, name): - self.size = size - self.rss = rss - self.shared_clean = shared_clean - self.shared_dirty = shared_dirty - self.private_clean = private_clean - self.private_dirty = private_dirty - self.permissions = permissions - self.name = name + def __init__ (self, size, rss, shared_clean, shared_dirty, private_clean, private_dirty, permissions, name): + self.size = size + self.rss = rss + self.shared_clean = shared_clean + self.shared_dirty = shared_dirty + self.private_clean = private_clean + self.private_dirty = private_dirty + self.permissions = permissions + self.name = name # Parse /proc/PID/maps file to get the clean memory usage by process, # we avoid lines with backed-files class ProcMaps: - - clean_size = 0 - - def __init__(self, pid): - mapfile = "/proc/%s/maps" % pid + + clean_size = 0 + + def __init__(self, pid): + mapfile = "/proc/%s/maps" % pid - try: - infile = open(mapfile, "r") - except: - print "Error trying " + mapfile - return None - - sum = 0 - to_data_do = { - "[anon]": self.parse_size_line, - "[heap]": self.parse_size_line - } - - for line in infile: - arr = line.split() - - # Just parse writable mapped areas - if arr[1][1] != "w": - continue - - if len(arr) == 6: - # if we got a backed-file we skip this info - if os.path.isfile(arr[5]): - continue - else: - line_size = to_data_do.get(arr[5], self.skip)(line) - sum += line_size - else: - line_size = self.parse_size_line(line) - sum += line_size - - infile.close() - self.clean_size = sum - - def skip(self, line): - return 0 - - # Parse a maps line and return the mapped size - def parse_size_line(self, line): - start, end = line.split()[0].split('-') - size = int(end, 16) - int(start, 16) - return size + try: + infile = open(mapfile, "r") + except: + print "Error trying " + mapfile + return None + + sum = 0 + to_data_do = { + "[anon]": self.parse_size_line, + "[heap]": self.parse_size_line + } + + for line in infile: + arr = line.split() + + # Just parse writable mapped areas + if arr[1][1] != "w": + continue + + if len(arr) == 6: + # if we got a backed-file we skip this info + if os.path.isfile(arr[5]): + continue + else: + line_size = to_data_do.get(arr[5], self.skip)(line) + sum += line_size + else: + line_size = self.parse_size_line(line) + sum += line_size + + infile.close() + self.clean_size = sum + + def skip(self, line): + return 0 + + # Parse a maps line and return the mapped size + def parse_size_line(self, line): + start, end = line.split()[0].split('-') + size = int(end, 16) - int(start, 16) + return size diff --git a/shell/console/terminal.py b/shell/console/terminal.py index 6a92661..038c36d 100644 --- a/shell/console/terminal.py +++ b/shell/console/terminal.py @@ -3,141 +3,141 @@ import vte import pango class Terminal(gtk.HBox): - def __init__(self): - gtk.HBox.__init__(self, False, 4) - - self._vte = vte.Terminal() - self._configure_vte() - self._vte.set_size(30, 5) - self._vte.set_size_request(200, 450) - self._vte.show() - self.pack_start(self._vte) - - self._scrollbar = gtk.VScrollbar(self._vte.get_adjustment()) - self._scrollbar.show() - self.pack_start(self._scrollbar, False, False, 0) - - self._vte.connect("child-exited", lambda term: term.fork_command()) - - self._vte.fork_command() - - def _configure_vte(self): - self._vte.set_font(pango.FontDescription('Monospace 10')) - self._vte.set_colors(gtk.gdk.color_parse ('#AAAAAA'), - gtk.gdk.color_parse ('#000000'), - []) - self._vte.set_cursor_blinks(False) - self._vte.set_audible_bell(False) - self._vte.set_scrollback_lines(100) - self._vte.set_allow_bold(True) - self._vte.set_scroll_on_keystroke(False) - self._vte.set_scroll_on_output(False) - self._vte.set_emulation('xterm') - self._vte.set_visible_bell(False) - - def on_gconf_notification(self, client, cnxn_id, entry, what): - self.reconfigure_vte() - - def on_vte_button_press(self, term, event): - if event.button == 3: - self.do_popup(event) - return True - - def on_vte_popup_menu(self, term): - pass + def __init__(self): + gtk.HBox.__init__(self, False, 4) + + self._vte = vte.Terminal() + self._configure_vte() + self._vte.set_size(30, 5) + self._vte.set_size_request(200, 450) + self._vte.show() + self.pack_start(self._vte) + + self._scrollbar = gtk.VScrollbar(self._vte.get_adjustment()) + self._scrollbar.show() + self.pack_start(self._scrollbar, False, False, 0) + + self._vte.connect("child-exited", lambda term: term.fork_command()) + + self._vte.fork_command() + + def _configure_vte(self): + self._vte.set_font(pango.FontDescription('Monospace 10')) + self._vte.set_colors(gtk.gdk.color_parse ('#AAAAAA'), + gtk.gdk.color_parse ('#000000'), + []) + self._vte.set_cursor_blinks(False) + self._vte.set_audible_bell(False) + self._vte.set_scrollback_lines(100) + self._vte.set_allow_bold(True) + self._vte.set_scroll_on_keystroke(False) + self._vte.set_scroll_on_output(False) + self._vte.set_emulation('xterm') + self._vte.set_visible_bell(False) + + def on_gconf_notification(self, client, cnxn_id, entry, what): + self.reconfigure_vte() + + def on_vte_button_press(self, term, event): + if event.button == 3: + self.do_popup(event) + return True + + def on_vte_popup_menu(self, term): + pass class Multiple: - - page_number = 0 - - def __init__(self): - self.notebook = gtk.Notebook() - self.add_new_terminal() - - open_terminal = gtk.Button('Open a new terminal') - open_terminal.connect("clicked", self.add_new_terminal) - open_terminal.show() - - self.notebook.show() - - self.main_vbox = gtk.VBox(False, 3) - self.main_vbox.pack_start(open_terminal, True, True, 2) - self.main_vbox.pack_start(self.notebook, True, True, 2) - - self.main_vbox.show_all() - - # Remove a page from the notebook - def close_terminal(self, button, child): - page = self.notebook.page_num(child) - - if page != -1: - self.notebook.remove_page(page) - - - pages = self.notebook.get_n_pages() - if pages <= 0: - self.page_number = 0 - self.add_new_terminal() - - # Need to refresh the widget -- - # This forces the widget to redraw itself. - self.notebook.queue_draw_area(0, 0, -1, -1) - - def add_icon_to_button(self, button): - iconBox = gtk.HBox(False, 0) - image = gtk.Image() - image.set_from_stock(gtk.STOCK_CLOSE, gtk.ICON_SIZE_MENU) - gtk.Button.set_relief(button, gtk.RELIEF_NONE) - - settings = gtk.Widget.get_settings (button) - (w,h) = gtk.icon_size_lookup_for_settings (settings, gtk.ICON_SIZE_MENU) - gtk.Widget.set_size_request (button, w + 4, h + 4) - image.show() - iconBox.pack_start(image, True, False, 0) - button.add(iconBox) - iconBox.show() - - def add_new_terminal(self, *arguments, **keywords): - self.page_number += 1 - - terminal = Terminal() - terminal.show() - - eventBox = self.create_custom_tab("Term %d" % self.page_number, terminal) - self.notebook.append_page(terminal, eventBox) - - # Set the new page - pages = gtk.Notebook.get_n_pages(self.notebook) - self.notebook.set_current_page(pages - 1) - return True - - def create_custom_tab(self, text, child): - eventBox = gtk.EventBox() - tabBox = gtk.HBox(False, 2) - tabLabel = gtk.Label(text) - - tabButton = gtk.Button() - tabButton.connect('clicked', self.close_terminal, child) - - # Add a picture on a button - self.add_icon_to_button(tabButton) - iconBox = gtk.HBox(False, 0) - - eventBox.show() - tabButton.show() - tabLabel.show() - - tabBox.pack_start(tabLabel, False) - tabBox.pack_start(tabButton, False) - - tabBox.show_all() - eventBox.add(tabBox) - - return eventBox + + page_number = 0 + + def __init__(self): + self.notebook = gtk.Notebook() + self.add_new_terminal() + + open_terminal = gtk.Button('Open a new terminal') + open_terminal.connect("clicked", self.add_new_terminal) + open_terminal.show() + + self.notebook.show() + + self.main_vbox = gtk.VBox(False, 3) + self.main_vbox.pack_start(open_terminal, True, True, 2) + self.main_vbox.pack_start(self.notebook, True, True, 2) + + self.main_vbox.show_all() + + # Remove a page from the notebook + def close_terminal(self, button, child): + page = self.notebook.page_num(child) + + if page != -1: + self.notebook.remove_page(page) + + + pages = self.notebook.get_n_pages() + if pages <= 0: + self.page_number = 0 + self.add_new_terminal() + + # Need to refresh the widget -- + # This forces the widget to redraw itself. + self.notebook.queue_draw_area(0, 0, -1, -1) + + def add_icon_to_button(self, button): + iconBox = gtk.HBox(False, 0) + image = gtk.Image() + image.set_from_stock(gtk.STOCK_CLOSE, gtk.ICON_SIZE_MENU) + gtk.Button.set_relief(button, gtk.RELIEF_NONE) + + settings = gtk.Widget.get_settings (button) + (w,h) = gtk.icon_size_lookup_for_settings (settings, gtk.ICON_SIZE_MENU) + gtk.Widget.set_size_request (button, w + 4, h + 4) + image.show() + iconBox.pack_start(image, True, False, 0) + button.add(iconBox) + iconBox.show() + + def add_new_terminal(self, *arguments, **keywords): + self.page_number += 1 + + terminal = Terminal() + terminal.show() + + eventBox = self.create_custom_tab("Term %d" % self.page_number, terminal) + self.notebook.append_page(terminal, eventBox) + + # Set the new page + pages = gtk.Notebook.get_n_pages(self.notebook) + self.notebook.set_current_page(pages - 1) + return True + + def create_custom_tab(self, text, child): + eventBox = gtk.EventBox() + tabBox = gtk.HBox(False, 2) + tabLabel = gtk.Label(text) + + tabButton = gtk.Button() + tabButton.connect('clicked', self.close_terminal, child) + + # Add a picture on a button + self.add_icon_to_button(tabButton) + iconBox = gtk.HBox(False, 0) + + eventBox.show() + tabButton.show() + tabLabel.show() + + tabBox.pack_start(tabLabel, False) + tabBox.pack_start(tabButton, False) + + tabBox.show_all() + eventBox.add(tabBox) + + return eventBox class Interface: - def __init__(self): - multiple = Multiple() - self.widget = multiple.main_vbox -
\ No newline at end of file + def __init__(self): + multiple = Multiple() + self.widget = multiple.main_vbox +
\ No newline at end of file diff --git a/shell/model/BuddyModel.py b/shell/model/BuddyModel.py index 651e911..8e175e7 100644 --- a/shell/model/BuddyModel.py +++ b/shell/model/BuddyModel.py @@ -21,122 +21,122 @@ import gobject _NOT_PRESENT_COLOR = "#888888,#BBBBBB" class BuddyModel(gobject.GObject): - __gsignals__ = { - 'appeared': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])), - 'disappeared': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])), - 'color-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, - ([gobject.TYPE_PYOBJECT])), - 'icon-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, - ([])), - 'current-activity-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, - ([gobject.TYPE_PYOBJECT])) - } - - def __init__(self, name=None, buddy=None): - if name and buddy: - raise RuntimeError("Must specify only _one_ of name or buddy.") - - gobject.GObject.__init__(self) - - self._ba_handler = None - self._pc_handler = None - self._dis_handler = None - self._bic_handler = None - self._cac_handler = None - - self._pservice = PresenceService.get_instance() - - self._buddy = None - - # If given just a name, try to get the buddy from the PS first - if not buddy: - self._name = name - # FIXME: use public key, not name - buddy = self._pservice.get_buddy_by_name(self._name) - - # If successful, copy properties from the PS buddy object - if buddy: - self.__update_buddy(buddy) - else: - # Otherwise, connect to the PS's buddy-appeared signal and - # wait for the buddy to appear - self._ba_handler = self._pservice.connect('buddy-appeared', - self.__buddy_appeared_cb) - self._name = name - # Set color to 'inactive'/'disconnected' - self.__set_color_from_string(_NOT_PRESENT_COLOR) - - def __set_color_from_string(self, color_string): - self._color = IconColor(color_string) - - def get_name(self): - return self._name - - def get_color(self): - return self._color - - def get_buddy(self): - return self._buddy - - def is_present(self): - if self._buddy: - return True - return False - - def get_current_activity(self): - if self._buddy: - return self._buddy.get_current_activity() - return None - - def __update_buddy(self, buddy): - if not buddy: - raise ValueError("Buddy cannot be None.") - - self._buddy = buddy - self._name = self._buddy.get_name() - self.__set_color_from_string(self._buddy.get_color()) - - self._pc_handler = self._buddy.connect('property-changed', self.__buddy_property_changed_cb) - self._dis_handler = self._buddy.connect('disappeared', self.__buddy_disappeared_cb) - self._bic_handler = self._buddy.connect('icon-changed', self.__buddy_icon_changed_cb) - self._cac_handler = self._buddy.connect('current-activity-changed', self.__buddy_current_activity_changed_cb) - - def __buddy_appeared_cb(self, pservice, buddy): - # FIXME: use public key rather than buddy name - if self._buddy or buddy.get_name() != self._name: - return - - if self._ba_handler: - # Once we have the buddy, we no longer need to - # monitor buddy-appeared events - self._pservice.disconnect(self._ba_handler) - self._ba_handler = None - - self.__update_buddy(buddy) - self.emit('appeared') - - def __buddy_property_changed_cb(self, buddy, keys): - if not self._buddy: - return - if 'color' in keys: - self.__set_color_from_string(self._buddy.get_color()) - self.emit('color-changed', self.get_color()) - - def __buddy_disappeared_cb(self, buddy): - if buddy != self._buddy: - return - self._buddy.disconnect(self._pc_handler) - self._buddy.disconnect(self._dis_handler) - self._buddy.disconnect(self._bic_handler) - self._buddy.disconnect(self._cac_handler) - self.__set_color_from_string(_NOT_PRESENT_COLOR) - self.emit('disappeared') - self._buddy = None - - def __buddy_icon_changed_cb(self, buddy): - self.emit('icon-changed') - - def __buddy_current_activity_changed_cb(self, buddy, activity=None): - if not self._buddy: - return - self.emit('current-activity-changed', activity) + __gsignals__ = { + 'appeared': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])), + 'disappeared': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])), + 'color-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + ([gobject.TYPE_PYOBJECT])), + 'icon-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + ([])), + 'current-activity-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + ([gobject.TYPE_PYOBJECT])) + } + + def __init__(self, name=None, buddy=None): + if name and buddy: + raise RuntimeError("Must specify only _one_ of name or buddy.") + + gobject.GObject.__init__(self) + + self._ba_handler = None + self._pc_handler = None + self._dis_handler = None + self._bic_handler = None + self._cac_handler = None + + self._pservice = PresenceService.get_instance() + + self._buddy = None + + # If given just a name, try to get the buddy from the PS first + if not buddy: + self._name = name + # FIXME: use public key, not name + buddy = self._pservice.get_buddy_by_name(self._name) + + # If successful, copy properties from the PS buddy object + if buddy: + self.__update_buddy(buddy) + else: + # Otherwise, connect to the PS's buddy-appeared signal and + # wait for the buddy to appear + self._ba_handler = self._pservice.connect('buddy-appeared', + self.__buddy_appeared_cb) + self._name = name + # Set color to 'inactive'/'disconnected' + self.__set_color_from_string(_NOT_PRESENT_COLOR) + + def __set_color_from_string(self, color_string): + self._color = IconColor(color_string) + + def get_name(self): + return self._name + + def get_color(self): + return self._color + + def get_buddy(self): + return self._buddy + + def is_present(self): + if self._buddy: + return True + return False + + def get_current_activity(self): + if self._buddy: + return self._buddy.get_current_activity() + return None + + def __update_buddy(self, buddy): + if not buddy: + raise ValueError("Buddy cannot be None.") + + self._buddy = buddy + self._name = self._buddy.get_name() + self.__set_color_from_string(self._buddy.get_color()) + + self._pc_handler = self._buddy.connect('property-changed', self.__buddy_property_changed_cb) + self._dis_handler = self._buddy.connect('disappeared', self.__buddy_disappeared_cb) + self._bic_handler = self._buddy.connect('icon-changed', self.__buddy_icon_changed_cb) + self._cac_handler = self._buddy.connect('current-activity-changed', self.__buddy_current_activity_changed_cb) + + def __buddy_appeared_cb(self, pservice, buddy): + # FIXME: use public key rather than buddy name + if self._buddy or buddy.get_name() != self._name: + return + + if self._ba_handler: + # Once we have the buddy, we no longer need to + # monitor buddy-appeared events + self._pservice.disconnect(self._ba_handler) + self._ba_handler = None + + self.__update_buddy(buddy) + self.emit('appeared') + + def __buddy_property_changed_cb(self, buddy, keys): + if not self._buddy: + return + if 'color' in keys: + self.__set_color_from_string(self._buddy.get_color()) + self.emit('color-changed', self.get_color()) + + def __buddy_disappeared_cb(self, buddy): + if buddy != self._buddy: + return + self._buddy.disconnect(self._pc_handler) + self._buddy.disconnect(self._dis_handler) + self._buddy.disconnect(self._bic_handler) + self._buddy.disconnect(self._cac_handler) + self.__set_color_from_string(_NOT_PRESENT_COLOR) + self.emit('disappeared') + self._buddy = None + + def __buddy_icon_changed_cb(self, buddy): + self.emit('icon-changed') + + def __buddy_current_activity_changed_cb(self, buddy, activity=None): + if not self._buddy: + return + self.emit('current-activity-changed', activity) diff --git a/shell/model/Friends.py b/shell/model/Friends.py index ab1935b..36c443f 100644 --- a/shell/model/Friends.py +++ b/shell/model/Friends.py @@ -24,61 +24,61 @@ from sugar import env import logging class Friends(gobject.GObject): - __gsignals__ = { - 'friend-added': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, ([object])), - 'friend-removed': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, ([str])), - } - - def __init__(self): - gobject.GObject.__init__(self) - - self._friends = {} - self._path = os.path.join(env.get_profile_path(), 'friends') - - self.load() - - def has_buddy(self, buddy): - return self._friends.has_key(buddy.get_name()) - - def add_friend(self, buddy_info): - self._friends[buddy_info.get_name()] = buddy_info - self.emit('friend-added', buddy_info) - - def make_friend(self, buddy): - if not self.has_buddy(buddy): - self.add_friend(BuddyModel(buddy=buddy)) - self.save() - - def remove(self, buddy_info): - del self._friends[buddy_info.get_name()] - self.save() - self.emit('friend-removed', buddy_info.get_name()) - - def __iter__(self): - return self._friends.values().__iter__() - - def load(self): - cp = ConfigParser() - - try: - success = cp.read([self._path]) - if success: - for name in cp.sections(): - buddy = BuddyModel(name) - self.add_friend(buddy) - except Exception, exc: - logging.error("Error parsing friends file: %s" % exc) - - def save(self): - cp = ConfigParser() - - for friend in self: - section = friend.get_name() - cp.add_section(section) - cp.set(section, 'color', friend.get_color().to_string()) - - fileobject = open(self._path, 'w') - cp.write(fileobject) - fileobject.close() + __gsignals__ = { + 'friend-added': (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, ([object])), + 'friend-removed': (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, ([str])), + } + + def __init__(self): + gobject.GObject.__init__(self) + + self._friends = {} + self._path = os.path.join(env.get_profile_path(), 'friends') + + self.load() + + def has_buddy(self, buddy): + return self._friends.has_key(buddy.get_name()) + + def add_friend(self, buddy_info): + self._friends[buddy_info.get_name()] = buddy_info + self.emit('friend-added', buddy_info) + + def make_friend(self, buddy): + if not self.has_buddy(buddy): + self.add_friend(BuddyModel(buddy=buddy)) + self.save() + + def remove(self, buddy_info): + del self._friends[buddy_info.get_name()] + self.save() + self.emit('friend-removed', buddy_info.get_name()) + + def __iter__(self): + return self._friends.values().__iter__() + + def load(self): + cp = ConfigParser() + + try: + success = cp.read([self._path]) + if success: + for name in cp.sections(): + buddy = BuddyModel(name) + self.add_friend(buddy) + except Exception, exc: + logging.error("Error parsing friends file: %s" % exc) + + def save(self): + cp = ConfigParser() + + for friend in self: + section = friend.get_name() + cp.add_section(section) + cp.set(section, 'color', friend.get_color().to_string()) + + fileobject = open(self._path, 'w') + cp.write(fileobject) + fileobject.close() diff --git a/shell/model/Invites.py b/shell/model/Invites.py index bc947a9..7bc0af0 100644 --- a/shell/model/Invites.py +++ b/shell/model/Invites.py @@ -17,38 +17,38 @@ import gobject class Invite: - def __init__(self, issuer, bundle_id, activity_id): - self._issuer = issuer - self._activity_id = activity_id - self._bundle_id = bundle_id + def __init__(self, issuer, bundle_id, activity_id): + self._issuer = issuer + self._activity_id = activity_id + self._bundle_id = bundle_id - def get_activity_id(self): - return self._activity_id + def get_activity_id(self): + return self._activity_id - def get_bundle_id(self): - return self._bundle_id + def get_bundle_id(self): + return self._bundle_id class Invites(gobject.GObject): - __gsignals__ = { - 'invite-added': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, ([object])), - 'invite-removed': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, ([object])), - } + __gsignals__ = { + 'invite-added': (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, ([object])), + 'invite-removed': (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, ([object])), + } - def __init__(self): - gobject.GObject.__init__(self) + def __init__(self): + gobject.GObject.__init__(self) - self._list = [] + self._list = [] - def add_invite(self, issuer, bundle_id, activity_id): - invite = Invite(issuer, bundle_id, activity_id) - self._list.append(invite) - self.emit('invite-added', invite) + def add_invite(self, issuer, bundle_id, activity_id): + invite = Invite(issuer, bundle_id, activity_id) + self._list.append(invite) + self.emit('invite-added', invite) - def remove_invite(self, invite): - self._list.remove(invite) - self.emit('invite-removed', invite) + def remove_invite(self, invite): + self._list.remove(invite) + self.emit('invite-removed', invite) - def __iter__(self): - return self._list.__iter__() + def __iter__(self): + return self._list.__iter__() diff --git a/shell/model/MeshModel.py b/shell/model/MeshModel.py index 0ecf2b8..5ab36e9 100644 --- a/shell/model/MeshModel.py +++ b/shell/model/MeshModel.py @@ -21,137 +21,137 @@ from sugar.presence import PresenceService from model.BuddyModel import BuddyModel class ActivityModel: - def __init__(self, activity, bundle, service): - self._service = service - self._activity = activity - - def get_id(self): - return self._activity.get_id() - - def get_icon_name(self): - return bundle.get_icon() - - def get_color(self): - return IconColor(self._activity.get_color()) - - def get_service(self): - return self._service + def __init__(self, activity, bundle, service): + self._service = service + self._activity = activity + + def get_id(self): + return self._activity.get_id() + + def get_icon_name(self): + return bundle.get_icon() + + def get_color(self): + return IconColor(self._activity.get_color()) + + def get_service(self): + return self._service class MeshModel(gobject.GObject): - __gsignals__ = { - 'activity-added': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])), - 'activity-removed': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])), - 'buddy-added': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])), - 'buddy-moved': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT, - gobject.TYPE_PYOBJECT])), - 'buddy-removed': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])) - } - - def __init__(self, bundle_registry): - gobject.GObject.__init__(self) - - self._activities = {} - self._buddies = {} - self._bundle_registry = bundle_registry - - self._pservice = PresenceService.get_instance() - self._pservice.connect("service-appeared", - self._service_appeared_cb) - self._pservice.connect('activity-disappeared', - self._activity_disappeared_cb) - self._pservice.connect("buddy-appeared", - self._buddy_appeared_cb) - self._pservice.connect("buddy-disappeared", - self._buddy_disappeared_cb) - - # Add any buddies the PS knows about already - for buddy in self._pservice.get_buddies(): - self._buddy_appeared_cb(self._pservice, buddy) - - for service in self._pservice.get_services(): - self._check_service(service) - - def get_activities(self): - return self._activities.values() - - def get_buddies(self): - return self._buddies.values() - - def _buddy_activity_changed_cb(self, buddy, cur_activity): - if not self._buddies.has_key(buddy.get_name()): - return - buddy_model = self._buddies[buddy.get_name()] - if cur_activity == None: - self.emit('buddy-moved', buddy_model, None) - else: - self._notify_buddy_change(buddy_model, cur_activity) - - def _notify_buddy_change(self, buddy_model, cur_activity): - if self._activities.has_key(cur_activity.get_id()): - activity_model = self._activities[cur_activity.get_id()] - self.emit('buddy-moved', buddy_model, activity_model) - - def _buddy_appeared_cb(self, pservice, buddy): - model = BuddyModel(buddy=buddy) - if self._buddies.has_key(model.get_name()): - del model - return - - model.connect('current-activity-changed', - self._buddy_activity_changed_cb) - self._buddies[model.get_name()] = model - self.emit('buddy-added', model) - - cur_activity = buddy.get_current_activity() - if cur_activity: - self._notify_buddy_change(model, cur_activity) - - def _buddy_disappeared_cb(self, pservice, buddy): - if not self._buddies.has_key(buddy.get_name()): - return - self.emit('buddy-removed', buddy) - del self._buddies[buddy.get_name()] - - def _service_appeared_cb(self, pservice, service): - self._check_service(service) - - def _check_service(self, service): - if self._bundle_registry.get_bundle(service.get_type()) != None: - activity_id = service.get_activity_id() - if not self.has_activity(activity_id): - activity = self._pservice.get_activity(activity_id) - if activity != None: - self.add_activity(activity, service) - - def has_activity(self, activity_id): - return self._activities.has_key(activity_id) - - def get_activity(self, activity_id): - if self.has_activity(activity_id): - return self._activities[activity_id] - else: - return None - - def add_activity(self, activity, service): - bundle = self._bundle_registry.get_bundle(service.get_type()) - model = ActivityModel(activity, bundle, service) - self._activities[model.get_id()] = model - self.emit('activity-added', model) - - for buddy in self._pservice.get_buddies(): - cur_activity = buddy.get_current_activity() - name = buddy.get_name() - if cur_activity == activity and self._buddies.has_key(name): - buddy_model = self._buddies[name] - self.emit('buddy-moved', buddy_model, model) - - def _activity_disappeared_cb(self, pservice, activity): - if self._activities.has_key(activity.get_id()): - activity_model = self._activities[activity.get_id()] - self.emit('activity-removed', activity_model) - del self._activities[activity.get_id()] + __gsignals__ = { + 'activity-added': (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])), + 'activity-removed': (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])), + 'buddy-added': (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])), + 'buddy-moved': (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT, + gobject.TYPE_PYOBJECT])), + 'buddy-removed': (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])) + } + + def __init__(self, bundle_registry): + gobject.GObject.__init__(self) + + self._activities = {} + self._buddies = {} + self._bundle_registry = bundle_registry + + self._pservice = PresenceService.get_instance() + self._pservice.connect("service-appeared", + self._service_appeared_cb) + self._pservice.connect('activity-disappeared', + self._activity_disappeared_cb) + self._pservice.connect("buddy-appeared", + self._buddy_appeared_cb) + self._pservice.connect("buddy-disappeared", + self._buddy_disappeared_cb) + + # Add any buddies the PS knows about already + for buddy in self._pservice.get_buddies(): + self._buddy_appeared_cb(self._pservice, buddy) + + for service in self._pservice.get_services(): + self._check_service(service) + + def get_activities(self): + return self._activities.values() + + def get_buddies(self): + return self._buddies.values() + + def _buddy_activity_changed_cb(self, buddy, cur_activity): + if not self._buddies.has_key(buddy.get_name()): + return + buddy_model = self._buddies[buddy.get_name()] + if cur_activity == None: + self.emit('buddy-moved', buddy_model, None) + else: + self._notify_buddy_change(buddy_model, cur_activity) + + def _notify_buddy_change(self, buddy_model, cur_activity): + if self._activities.has_key(cur_activity.get_id()): + activity_model = self._activities[cur_activity.get_id()] + self.emit('buddy-moved', buddy_model, activity_model) + + def _buddy_appeared_cb(self, pservice, buddy): + model = BuddyModel(buddy=buddy) + if self._buddies.has_key(model.get_name()): + del model + return + + model.connect('current-activity-changed', + self._buddy_activity_changed_cb) + self._buddies[model.get_name()] = model + self.emit('buddy-added', model) + + cur_activity = buddy.get_current_activity() + if cur_activity: + self._notify_buddy_change(model, cur_activity) + + def _buddy_disappeared_cb(self, pservice, buddy): + if not self._buddies.has_key(buddy.get_name()): + return + self.emit('buddy-removed', buddy) + del self._buddies[buddy.get_name()] + + def _service_appeared_cb(self, pservice, service): + self._check_service(service) + + def _check_service(self, service): + if self._bundle_registry.get_bundle(service.get_type()) != None: + activity_id = service.get_activity_id() + if not self.has_activity(activity_id): + activity = self._pservice.get_activity(activity_id) + if activity != None: + self.add_activity(activity, service) + + def has_activity(self, activity_id): + return self._activities.has_key(activity_id) + + def get_activity(self, activity_id): + if self.has_activity(activity_id): + return self._activities[activity_id] + else: + return None + + def add_activity(self, activity, service): + bundle = self._bundle_registry.get_bundle(service.get_type()) + model = ActivityModel(activity, bundle, service) + self._activities[model.get_id()] = model + self.emit('activity-added', model) + + for buddy in self._pservice.get_buddies(): + cur_activity = buddy.get_current_activity() + name = buddy.get_name() + if cur_activity == activity and self._buddies.has_key(name): + buddy_model = self._buddies[name] + self.emit('buddy-moved', buddy_model, model) + + def _activity_disappeared_cb(self, pservice, activity): + if self._activities.has_key(activity.get_id()): + activity_model = self._activities[activity.get_id()] + self.emit('activity-removed', activity_model) + del self._activities[activity.get_id()] diff --git a/shell/model/Owner.py b/shell/model/Owner.py index 7d83ab2..49386a9 100644 --- a/shell/model/Owner.py +++ b/shell/model/Owner.py @@ -31,90 +31,90 @@ from model.Invites import Invites PRESENCE_SERVICE_TYPE = "_presence_olpc._tcp" class ShellOwner(object): - """Class representing the owner of this machine/instance. This class - runs in the shell and serves up the buddy icon and other stuff. It's the - server portion of the Owner, paired with the client portion in Buddy.py.""" - def __init__(self): - self._nick = profile.get_nick_name() - user_dir = env.get_profile_path() - - self._icon = None - self._icon_hash = "" - for fname in os.listdir(user_dir): - if not fname.startswith("buddy-icon."): - continue - fd = open(os.path.join(user_dir, fname), "r") - self._icon = fd.read() - if self._icon: - # Get the icon's hash - import md5, binascii - digest = md5.new(self._icon).digest() - self._icon_hash = util.printable_hash(digest) - fd.close() - break - - self._pservice = PresenceService.get_instance() - - self._invites = Invites() - - self._last_activity_update = time.time() - self._pending_activity_update_timer = None - self._pending_activity_update = None - - def get_invites(self): - return self._invites - - def get_name(self): - return self._nick - - def announce(self): - # Create and announce our presence - color = profile.get_color() - props = {'color': color.to_string(), 'icon-hash': self._icon_hash} - self._service = self._pservice.register_service(self._nick, - PRESENCE_SERVICE_TYPE, properties=props) - logging.debug("Owner '%s' using port %d" % (self._nick, self._service.get_port())) - self._icon_stream = Stream.Stream.new_from_service(self._service) - self._icon_stream.register_reader_handler(self._handle_buddy_icon_request, "get_buddy_icon") - self._icon_stream.register_reader_handler(self._handle_invite, "invite") - - def _handle_buddy_icon_request(self): - """XMLRPC method, return the owner's icon encoded with base64.""" - if self._icon: - return base64.b64encode(self._icon) - return "" - - def _handle_invite(self, issuer, bundle_id, activity_id): - """XMLRPC method, called when the owner is invited to an activity.""" - self._invites.add_invite(issuer, bundle_id, activity_id) - return '' - - def __update_advertised_current_activity_cb(self): - self._last_activity_update = time.time() - self._pending_activity_update_timer = None - if self._pending_activity_update: - logging.debug("*** Updating current activity to %s" % self._pending_activity_update) - self._service.set_published_value('curact', dbus.String(self._pending_activity_update)) - return False - - def set_current_activity(self, activity_id): - """Update our presence service with the latest activity, but no - more frequently than every 30 seconds""" - self._pending_activity_update = activity_id - # If there's no pending update, we must not have updated it in the - # last 30 seconds (except for the initial update, hence we also check - # for the last update) - if not self._pending_activity_update_timer or time.time() - self._last_activity_update > 30: - self.__update_advertised_current_activity_cb() - return - - # If we have a pending update already, we have nothing left to do - if self._pending_activity_update_timer: - return - - # Otherwise, we start a timer to update the activity at the next - # interval, which should be 30 seconds from the last update, or if that - # is in the past already, then now - next = 30 - max(30, time.time() - self._last_activity_update) - self._pending_activity_update_timer = gobject.timeout_add(next * 1000, - self.__update_advertised_current_activity_cb) + """Class representing the owner of this machine/instance. This class + runs in the shell and serves up the buddy icon and other stuff. It's the + server portion of the Owner, paired with the client portion in Buddy.py.""" + def __init__(self): + self._nick = profile.get_nick_name() + user_dir = env.get_profile_path() + + self._icon = None + self._icon_hash = "" + for fname in os.listdir(user_dir): + if not fname.startswith("buddy-icon."): + continue + fd = open(os.path.join(user_dir, fname), "r") + self._icon = fd.read() + if self._icon: + # Get the icon's hash + import md5, binascii + digest = md5.new(self._icon).digest() + self._icon_hash = util.printable_hash(digest) + fd.close() + break + + self._pservice = PresenceService.get_instance() + + self._invites = Invites() + + self._last_activity_update = time.time() + self._pending_activity_update_timer = None + self._pending_activity_update = None + + def get_invites(self): + return self._invites + + def get_name(self): + return self._nick + + def announce(self): + # Create and announce our presence + color = profile.get_color() + props = {'color': color.to_string(), 'icon-hash': self._icon_hash} + self._service = self._pservice.register_service(self._nick, + PRESENCE_SERVICE_TYPE, properties=props) + logging.debug("Owner '%s' using port %d" % (self._nick, self._service.get_port())) + self._icon_stream = Stream.Stream.new_from_service(self._service) + self._icon_stream.register_reader_handler(self._handle_buddy_icon_request, "get_buddy_icon") + self._icon_stream.register_reader_handler(self._handle_invite, "invite") + + def _handle_buddy_icon_request(self): + """XMLRPC method, return the owner's icon encoded with base64.""" + if self._icon: + return base64.b64encode(self._icon) + return "" + + def _handle_invite(self, issuer, bundle_id, activity_id): + """XMLRPC method, called when the owner is invited to an activity.""" + self._invites.add_invite(issuer, bundle_id, activity_id) + return '' + + def __update_advertised_current_activity_cb(self): + self._last_activity_update = time.time() + self._pending_activity_update_timer = None + if self._pending_activity_update: + logging.debug("*** Updating current activity to %s" % self._pending_activity_update) + self._service.set_published_value('curact', dbus.String(self._pending_activity_update)) + return False + + def set_current_activity(self, activity_id): + """Update our presence service with the latest activity, but no + more frequently than every 30 seconds""" + self._pending_activity_update = activity_id + # If there's no pending update, we must not have updated it in the + # last 30 seconds (except for the initial update, hence we also check + # for the last update) + if not self._pending_activity_update_timer or time.time() - self._last_activity_update > 30: + self.__update_advertised_current_activity_cb() + return + + # If we have a pending update already, we have nothing left to do + if self._pending_activity_update_timer: + return + + # Otherwise, we start a timer to update the activity at the next + # interval, which should be 30 seconds from the last update, or if that + # is in the past already, then now + next = 30 - max(30, time.time() - self._last_activity_update) + self._pending_activity_update_timer = gobject.timeout_add(next * 1000, + self.__update_advertised_current_activity_cb) diff --git a/shell/model/ShellModel.py b/shell/model/ShellModel.py index d2d6e9d..95ed344 100644 --- a/shell/model/ShellModel.py +++ b/shell/model/ShellModel.py @@ -24,45 +24,45 @@ from model.Owner import ShellOwner from sugar import env class ShellModel: - def __init__(self): - self._current_activity = None + def __init__(self): + self._current_activity = None - self._bundle_registry = BundleRegistry() + self._bundle_registry = BundleRegistry() - PresenceService.start() - self._pservice = PresenceService.get_instance() + PresenceService.start() + self._pservice = PresenceService.get_instance() - self._owner = ShellOwner() - self._owner.announce() + self._owner = ShellOwner() + self._owner.announce() - self._friends = Friends() - self._mesh = MeshModel(self._bundle_registry) + self._friends = Friends() + self._mesh = MeshModel(self._bundle_registry) - path = os.path.expanduser('~/Activities') - self._bundle_registry.add_search_path(path) + path = os.path.expanduser('~/Activities') + self._bundle_registry.add_search_path(path) - for path in env.get_data_dirs(): - bundles_path = os.path.join(path, 'activities') - self._bundle_registry.add_search_path(bundles_path) + for path in env.get_data_dirs(): + bundles_path = os.path.join(path, 'activities') + self._bundle_registry.add_search_path(bundles_path) - def get_bundle_registry(self): - return self._bundle_registry + def get_bundle_registry(self): + return self._bundle_registry - def get_mesh(self): - return self._mesh + def get_mesh(self): + return self._mesh - def get_friends(self): - return self._friends + def get_friends(self): + return self._friends - def get_invites(self): - return self._owner.get_invites() + def get_invites(self): + return self._owner.get_invites() - def get_owner(self): - return self._owner + def get_owner(self): + return self._owner - def set_current_activity(self, activity_id): - self._current_activity = activity_id - self._owner.set_current_activity(activity_id) + def set_current_activity(self, activity_id): + self._current_activity = activity_id + self._owner.set_current_activity(activity_id) - def get_current_activity(self): - return self._current_activity + def get_current_activity(self): + return self._current_activity diff --git a/shell/view/ActivityHost.py b/shell/view/ActivityHost.py index a7e177d..f87b65b 100644 --- a/shell/view/ActivityHost.py +++ b/shell/view/ActivityHost.py @@ -27,122 +27,122 @@ from sugar.chat import ActivityChat import OverlayWindow class ActivityChatWindow(gtk.Window): - def __init__(self, gdk_window, chat_widget): - gtk.Window.__init__(self) + def __init__(self, gdk_window, chat_widget): + gtk.Window.__init__(self) - self.realize() - self.set_decorated(False) - self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG) - self.window.set_accept_focus(True) - self.window.set_transient_for(gdk_window) - self.set_position(gtk.WIN_POS_CENTER_ALWAYS) - self.set_default_size(600, 450) + self.realize() + self.set_decorated(False) + self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG) + self.window.set_accept_focus(True) + self.window.set_transient_for(gdk_window) + self.set_position(gtk.WIN_POS_CENTER_ALWAYS) + self.set_default_size(600, 450) - self.add(chat_widget) + self.add(chat_widget) class ActivityHost: - def __init__(self, shell_model, window): - self._window = window - self._xid = window.get_xid() - self._pservice = PresenceService.get_instance() - - bus = dbus.SessionBus() - proxy_obj = bus.get_object(Activity.get_service_name(self._xid), - Activity.get_object_path(self._xid)) - - self._activity = dbus.Interface(proxy_obj, Activity.ACTIVITY_INTERFACE) - self._id = self._activity.get_id() - self._type = self._activity.get_type() - self._gdk_window = gtk.gdk.window_foreign_new(self._xid) - - registry = shell_model.get_bundle_registry() - info = registry.get_bundle(self._type) - self._icon_name = info.get_icon() - - try: - self._overlay_window = OverlayWindow.OverlayWindow(self._gdk_window) - win = self._overlay_window.window - except RuntimeError: - self._overlay_window = None - win = self._gdk_window - - self._chat_widget = ActivityChat.ActivityChat(self) - self._chat_window = ActivityChatWindow(win, self._chat_widget) - - self._frame_was_visible = False - - def get_id(self): - return self._id - - def get_title(self): - return self._window.get_name() - - def get_xid(self): - return self._xid - - def get_icon_name(self): - return self._icon_name - - def get_icon_color(self): - activity = self._pservice.get_activity(self._id) - if activity != None: - return IconColor(activity.get_color()) - else: - return profile.get_color() - - def share(self): - self._activity.share() - self._chat_widget.share() - - def invite(self, buddy): - if not self.get_shared(): - self.share() - - issuer = self._pservice.get_owner().get_name() - service = buddy.get_service_of_type("_presence_olpc._tcp") - stream = Stream.Stream.new_from_service(service, start_reader=False) - writer = stream.new_writer(service) - writer.custom_request("invite", None, None, issuer, - self._type, self._id) - - def get_shared(self): - return self._activity.get_shared() - - def get_type(self): - return self._type - - def present(self): - self._window.activate(gtk.get_current_event_time()) - - def close(self): - self._window.close(gtk.get_current_event_time()) - - def show_dialog(self, dialog): - dialog.show() - dialog.window.set_transient_for(self._gdk_window) - - def chat_show(self, frame_was_visible): - if self._overlay_window: - self._overlay_window.show_all() - self._chat_window.show_all() - self._frame_was_visible = frame_was_visible - - def chat_hide(self): - self._chat_window.hide() - if self._overlay_window: - self._overlay_window.hide() - wasvis = self._frame_was_visible - self._frame_was_visible = False - return wasvis - - def is_chat_visible(self): - return self._chat_window.get_property('visible') - - def set_active(self, active): - if not active: - self.chat_hide() - self._frame_was_visible = False - - def destroy(self): - self._chat_window.destroy() - self._frame_was_visible = False + def __init__(self, shell_model, window): + self._window = window + self._xid = window.get_xid() + self._pservice = PresenceService.get_instance() + + bus = dbus.SessionBus() + proxy_obj = bus.get_object(Activity.get_service_name(self._xid), + Activity.get_object_path(self._xid)) + + self._activity = dbus.Interface(proxy_obj, Activity.ACTIVITY_INTERFACE) + self._id = self._activity.get_id() + self._type = self._activity.get_type() + self._gdk_window = gtk.gdk.window_foreign_new(self._xid) + + registry = shell_model.get_bundle_registry() + info = registry.get_bundle(self._type) + self._icon_name = info.get_icon() + + try: + self._overlay_window = OverlayWindow.OverlayWindow(self._gdk_window) + win = self._overlay_window.window + except RuntimeError: + self._overlay_window = None + win = self._gdk_window + + self._chat_widget = ActivityChat.ActivityChat(self) + self._chat_window = ActivityChatWindow(win, self._chat_widget) + + self._frame_was_visible = False + + def get_id(self): + return self._id + + def get_title(self): + return self._window.get_name() + + def get_xid(self): + return self._xid + + def get_icon_name(self): + return self._icon_name + + def get_icon_color(self): + activity = self._pservice.get_activity(self._id) + if activity != None: + return IconColor(activity.get_color()) + else: + return profile.get_color() + + def share(self): + self._activity.share() + self._chat_widget.share() + + def invite(self, buddy): + if not self.get_shared(): + self.share() + + issuer = self._pservice.get_owner().get_name() + service = buddy.get_service_of_type("_presence_olpc._tcp") + stream = Stream.Stream.new_from_service(service, start_reader=False) + writer = stream.new_writer(service) + writer.custom_request("invite", None, None, issuer, + self._type, self._id) + + def get_shared(self): + return self._activity.get_shared() + + def get_type(self): + return self._type + + def present(self): + self._window.activate(gtk.get_current_event_time()) + + def close(self): + self._window.close(gtk.get_current_event_time()) + + def show_dialog(self, dialog): + dialog.show() + dialog.window.set_transient_for(self._gdk_window) + + def chat_show(self, frame_was_visible): + if self._overlay_window: + self._overlay_window.show_all() + self._chat_window.show_all() + self._frame_was_visible = frame_was_visible + + def chat_hide(self): + self._chat_window.hide() + if self._overlay_window: + self._overlay_window.hide() + wasvis = self._frame_was_visible + self._frame_was_visible = False + return wasvis + + def is_chat_visible(self): + return self._chat_window.get_property('visible') + + def set_active(self, active): + if not active: + self.chat_hide() + self._frame_was_visible = False + + def destroy(self): + self._chat_window.destroy() + self._frame_was_visible = False diff --git a/shell/view/BuddyIcon.py b/shell/view/BuddyIcon.py index f8f1013..38f8277 100644 --- a/shell/view/BuddyIcon.py +++ b/shell/view/BuddyIcon.py @@ -18,41 +18,41 @@ from sugar.graphics.menuicon import MenuIcon from view.BuddyMenu import BuddyMenu class BuddyIcon(MenuIcon): - def __init__(self, shell, menu_shell, buddy): - MenuIcon.__init__(self, menu_shell, icon_name='stock-buddy', - color=buddy.get_color()) - - self._shell = shell - self._buddy = buddy - self._buddy.connect('appeared', self._buddy_presence_change_cb) - self._buddy.connect('disappeared', self._buddy_presence_change_cb) - self._buddy.connect('color-changed', self._buddy_presence_change_cb) - - def _buddy_presence_change_cb(self, buddy, color=None): - # Update the icon's color when the buddy comes and goes - self.set_property('color', buddy.get_color()) - - def set_popup_distance(self, distance): - self._popup_distance = distance - - def create_menu(self): - menu = BuddyMenu(self._shell, self._buddy) - menu.connect('action', self._popup_action_cb) - return menu - - def _popup_action_cb(self, popup, action): - self.popdown() - - friends = self._shell.get_model().get_friends() - if action == BuddyMenu.ACTION_REMOVE_FRIEND: - friends.remove(self._buddy) - - ps_buddy = self._buddy.get_buddy() - if ps_buddy == None: - return - - if action == BuddyMenu.ACTION_INVITE: - activity = self._shell.get_current_activity() - activity.invite(ps_buddy) - elif action == BuddyMenu.ACTION_MAKE_FRIEND: - friends.make_friend(ps_buddy) + def __init__(self, shell, menu_shell, buddy): + MenuIcon.__init__(self, menu_shell, icon_name='stock-buddy', + color=buddy.get_color()) + + self._shell = shell + self._buddy = buddy + self._buddy.connect('appeared', self._buddy_presence_change_cb) + self._buddy.connect('disappeared', self._buddy_presence_change_cb) + self._buddy.connect('color-changed', self._buddy_presence_change_cb) + + def _buddy_presence_change_cb(self, buddy, color=None): + # Update the icon's color when the buddy comes and goes + self.set_property('color', buddy.get_color()) + + def set_popup_distance(self, distance): + self._popup_distance = distance + + def create_menu(self): + menu = BuddyMenu(self._shell, self._buddy) + menu.connect('action', self._popup_action_cb) + return menu + + def _popup_action_cb(self, popup, action): + self.popdown() + + friends = self._shell.get_model().get_friends() + if action == BuddyMenu.ACTION_REMOVE_FRIEND: + friends.remove(self._buddy) + + ps_buddy = self._buddy.get_buddy() + if ps_buddy == None: + return + + if action == BuddyMenu.ACTION_INVITE: + activity = self._shell.get_current_activity() + activity.invite(ps_buddy) + elif action == BuddyMenu.ACTION_MAKE_FRIEND: + friends.make_friend(ps_buddy) diff --git a/shell/view/BuddyMenu.py b/shell/view/BuddyMenu.py index f330234..069aa6a 100644 --- a/shell/view/BuddyMenu.py +++ b/shell/view/BuddyMenu.py @@ -25,73 +25,73 @@ from sugar.presence import PresenceService _ICON_SIZE = 75 class BuddyMenu(Menu): - ACTION_MAKE_FRIEND = 0 - ACTION_INVITE = 1 - ACTION_REMOVE_FRIEND = 2 - - def __init__(self, shell, buddy): - self._buddy = buddy - self._shell = shell - - icon_item = None - pixbuf = self._get_buddy_icon_pixbuf() - if pixbuf: - scaled_pixbuf = pixbuf.scale_simple(_ICON_SIZE, _ICON_SIZE, - gtk.gdk.INTERP_BILINEAR) - del pixbuf - icon_item = hippo.CanvasImage(pixbuf=scaled_pixbuf) - - Menu.__init__(self, buddy.get_name(), icon_item) - - self._buddy.connect('icon-changed', self.__buddy_icon_changed_cb) - - owner = shell.get_model().get_owner() - if buddy.get_name() != owner.get_name(): - self._add_actions() - - def _get_buddy_icon_pixbuf(self): - buddy_object = self._buddy.get_buddy() - if not buddy_object: - return None - - pixbuf = None - icon_data = buddy_object.get_icon() - icon_data_string = "" - for item in icon_data: - if item < 0: - item = item + 128 - icon_data_string += chr(item) - pbl = gtk.gdk.PixbufLoader() - pbl.write(icon_data_string) - try: - pbl.close() - pixbuf = pbl.get_pixbuf() - except gobject.GError: - pass - del pbl - return pixbuf - - def _add_actions(self): - shell_model = self._shell.get_model() - pservice = PresenceService.get_instance() - - friends = shell_model.get_friends() - if friends.has_buddy(self._buddy): - icon = CanvasIcon(icon_name='stock-remove') - self.add_action(icon, BuddyMenu.ACTION_REMOVE_FRIEND) - else: - icon = CanvasIcon(icon_name='stock-add') - self.add_action(icon, BuddyMenu.ACTION_MAKE_FRIEND) - - activity_id = shell_model.get_current_activity() - if activity_id != None: - activity_ps = pservice.get_activity(activity_id) - - # FIXME check that the buddy is not in the activity already - - icon = CanvasIcon(icon_name='stock-invite') - self.add_action(icon, BuddyMenu.ACTION_INVITE) - - def __buddy_icon_changed_cb(self, buddy): - pass + ACTION_MAKE_FRIEND = 0 + ACTION_INVITE = 1 + ACTION_REMOVE_FRIEND = 2 + + def __init__(self, shell, buddy): + self._buddy = buddy + self._shell = shell + + icon_item = None + pixbuf = self._get_buddy_icon_pixbuf() + if pixbuf: + scaled_pixbuf = pixbuf.scale_simple(_ICON_SIZE, _ICON_SIZE, + gtk.gdk.INTERP_BILINEAR) + del pixbuf + icon_item = hippo.CanvasImage(pixbuf=scaled_pixbuf) + + Menu.__init__(self, buddy.get_name(), icon_item) + + self._buddy.connect('icon-changed', self.__buddy_icon_changed_cb) + + owner = shell.get_model().get_owner() + if buddy.get_name() != owner.get_name(): + self._add_actions() + + def _get_buddy_icon_pixbuf(self): + buddy_object = self._buddy.get_buddy() + if not buddy_object: + return None + + pixbuf = None + icon_data = buddy_object.get_icon() + icon_data_string = "" + for item in icon_data: + if item < 0: + item = item + 128 + icon_data_string += chr(item) + pbl = gtk.gdk.PixbufLoader() + pbl.write(icon_data_string) + try: + pbl.close() + pixbuf = pbl.get_pixbuf() + except gobject.GError: + pass + del pbl + return pixbuf + + def _add_actions(self): + shell_model = self._shell.get_model() + pservice = PresenceService.get_instance() + + friends = shell_model.get_friends() + if friends.has_buddy(self._buddy): + icon = CanvasIcon(icon_name='stock-remove') + self.add_action(icon, BuddyMenu.ACTION_REMOVE_FRIEND) + else: + icon = CanvasIcon(icon_name='stock-add') + self.add_action(icon, BuddyMenu.ACTION_MAKE_FRIEND) + + activity_id = shell_model.get_current_activity() + if activity_id != None: + activity_ps = pservice.get_activity(activity_id) + + # FIXME check that the buddy is not in the activity already + + icon = CanvasIcon(icon_name='stock-invite') + self.add_action(icon, BuddyMenu.ACTION_INVITE) + + def __buddy_icon_changed_cb(self, buddy): + pass diff --git a/shell/view/ClipboardIcon.py b/shell/view/ClipboardIcon.py index 429fc99..41f3e09 100644 --- a/shell/view/ClipboardIcon.py +++ b/shell/view/ClipboardIcon.py @@ -5,34 +5,34 @@ from sugar.clipboard import ClipboardService class ClipboardIcon(MenuIcon): - def __init__(self, menu_shell, name, file_name): - MenuIcon.__init__(self, menu_shell, icon_name='activity-xbook') - self._name = name - self._file_name = file_name - self._percent = 0 - self.connect('activated', self._icon_activated_cb) - self._menu = None - - def create_menu(self): - self._menu = ClipboardMenu(self._name, self._percent) - self._menu.connect('action', self._popup_action_cb) - return self._menu + def __init__(self, menu_shell, name, file_name): + MenuIcon.__init__(self, menu_shell, icon_name='activity-xbook') + self._name = name + self._file_name = file_name + self._percent = 0 + self.connect('activated', self._icon_activated_cb) + self._menu = None + + def create_menu(self): + self._menu = ClipboardMenu(self._name, self._percent) + self._menu.connect('action', self._popup_action_cb) + return self._menu - def set_percent(self, percent): - self._percent = percent - if self._menu: - self._menu.set_percent(percent) + def set_percent(self, percent): + self._percent = percent + if self._menu: + self._menu.set_percent(percent) - def _icon_activated_cb(self, icon): - if self._percent == 100: - activity = ActivityFactory.create("org.laptop.sugar.Xbook") - activity.execute("open_document", [self._file_name]) + def _icon_activated_cb(self, icon): + if self._percent == 100: + activity = ActivityFactory.create("org.laptop.sugar.Xbook") + activity.execute("open_document", [self._file_name]) - def _popup_action_cb(self, popup, action): - self.popdown() - - if action == ClipboardMenu.ACTION_STOP_DOWNLOAD: - raise "Stopping downloads still not implemented." - elif action == ClipboardMenu.ACTION_DELETE: - cb_service = ClipboardService.get_instance() - cb_service.delete_object(self._file_name) + def _popup_action_cb(self, popup, action): + self.popdown() + + if action == ClipboardMenu.ACTION_STOP_DOWNLOAD: + raise "Stopping downloads still not implemented." + elif action == ClipboardMenu.ACTION_DELETE: + cb_service = ClipboardService.get_instance() + cb_service.delete_object(self._file_name) diff --git a/shell/view/ClipboardMenu.py b/shell/view/ClipboardMenu.py index 44ca798..625c897 100644 --- a/shell/view/ClipboardMenu.py +++ b/shell/view/ClipboardMenu.py @@ -9,48 +9,48 @@ from sugar.graphics import style class ClipboardMenuItem(ClipboardBubble): - def __init__(self, percent = 0, stylesheet="clipboard.Bubble"): - ClipboardBubble.__init__(self, percent = percent) - style.apply_stylesheet(self, stylesheet) + def __init__(self, percent = 0, stylesheet="clipboard.Bubble"): + ClipboardBubble.__init__(self, percent = percent) + style.apply_stylesheet(self, stylesheet) class ClipboardMenu(Menu): - ACTION_DELETE = 0 - ACTION_SHARE = 1 - ACTION_STOP_DOWNLOAD = 2 - - def __init__(self, name, percent): - Menu.__init__(self, name) - - self._progress_bar = ClipboardMenuItem(percent) - self._root.append(self._progress_bar) - - #icon = CanvasIcon(icon_name='stock-share-mesh') - #self.add_action(icon, ClipboardMenu.ACTION_SHARE) - - self._remove_icon = None - self._stop_icon = None - - self._create_icons(percent) - - def _create_icons(self, percent): - if percent == 100: - if not self._remove_icon: - self._remove_icon = CanvasIcon(icon_name='stock-remove') - self.add_action(self._remove_icon, ClipboardMenu.ACTION_DELETE) - - if self._stop_icon: - self.remove_action(self._stop_icon) - self._stop_icon = None - else: - if not self._stop_icon: - self._stop_icon = CanvasIcon(icon_name='stock-close') - self.add_action(self._stop_icon, ClipboardMenu.ACTION_STOP_DOWNLOAD) + ACTION_DELETE = 0 + ACTION_SHARE = 1 + ACTION_STOP_DOWNLOAD = 2 + + def __init__(self, name, percent): + Menu.__init__(self, name) + + self._progress_bar = ClipboardMenuItem(percent) + self._root.append(self._progress_bar) + + #icon = CanvasIcon(icon_name='stock-share-mesh') + #self.add_action(icon, ClipboardMenu.ACTION_SHARE) + + self._remove_icon = None + self._stop_icon = None + + self._create_icons(percent) + + def _create_icons(self, percent): + if percent == 100: + if not self._remove_icon: + self._remove_icon = CanvasIcon(icon_name='stock-remove') + self.add_action(self._remove_icon, ClipboardMenu.ACTION_DELETE) + + if self._stop_icon: + self.remove_action(self._stop_icon) + self._stop_icon = None + else: + if not self._stop_icon: + self._stop_icon = CanvasIcon(icon_name='stock-close') + self.add_action(self._stop_icon, ClipboardMenu.ACTION_STOP_DOWNLOAD) - if self._remove_icon: - self.remove_action(self._remove_icon) - self._remove_icon = None - - def set_percent(self, percent): - self._progress_bar.set_property('percent', percent) - self._create_icons(percent) + if self._remove_icon: + self.remove_action(self._remove_icon) + self._remove_icon = None + + def set_percent(self, percent): + self._progress_bar.set_property('percent', percent) + self._create_icons(percent) diff --git a/shell/view/FirstTimeDialog.py b/shell/view/FirstTimeDialog.py index 267a661..0ae82ef 100644 --- a/shell/view/FirstTimeDialog.py +++ b/shell/view/FirstTimeDialog.py @@ -24,47 +24,47 @@ from sugar.graphics.iconcolor import IconColor from sugar import env class FirstTimeDialog(gtk.Dialog): - def __init__(self): - gtk.Dialog.__init__(self) + def __init__(self): + gtk.Dialog.__init__(self) - label = gtk.Label(_('Nick Name:')) - label.set_alignment(0.0, 0.5) - self.vbox.pack_start(label) - label.show() + label = gtk.Label(_('Nick Name:')) + label.set_alignment(0.0, 0.5) + self.vbox.pack_start(label) + label.show() - self._entry = gtk.Entry() - self._entry.connect('changed', self._entry_changed_cb) - self._entry.connect('activate', self._entry_activated_cb) - self.vbox.pack_start(self._entry) - self._entry.show() + self._entry = gtk.Entry() + self._entry.connect('changed', self._entry_changed_cb) + self._entry.connect('activate', self._entry_activated_cb) + self.vbox.pack_start(self._entry) + self._entry.show() - self._ok = gtk.Button(None, gtk.STOCK_OK) - self._ok.set_sensitive(False) - self.vbox.pack_start(self._ok) - self._ok.connect('clicked', self._ok_button_clicked_cb) - self._ok.show() + self._ok = gtk.Button(None, gtk.STOCK_OK) + self._ok.set_sensitive(False) + self.vbox.pack_start(self._ok) + self._ok.connect('clicked', self._ok_button_clicked_cb) + self._ok.show() - def _entry_changed_cb(self, entry): - valid = (len(entry.get_text()) > 0) - self._ok.set_sensitive(valid) + def _entry_changed_cb(self, entry): + valid = (len(entry.get_text()) > 0) + self._ok.set_sensitive(valid) - def _entry_activated_cb(self, entry): - self._create_buddy_section() - - def _ok_button_clicked_cb(self, button): - self._create_buddy_section() - - def _create_buddy_section(self): - cp = ConfigParser() + def _entry_activated_cb(self, entry): + self._create_buddy_section() + + def _ok_button_clicked_cb(self, button): + self._create_buddy_section() + + def _create_buddy_section(self): + cp = ConfigParser() - section = 'Buddy' - cp.add_section(section) - cp.set(section, 'NickName', self._entry.get_text()) - cp.set(section, 'Color', IconColor().to_string()) + section = 'Buddy' + cp.add_section(section) + cp.set(section, 'NickName', self._entry.get_text()) + cp.set(section, 'Color', IconColor().to_string()) - config_path = os.path.join(env.get_profile_path(), 'config') - fileobject = open(config_path, 'w') - cp.write(fileobject) - fileobject.close() + config_path = os.path.join(env.get_profile_path(), 'config') + fileobject = open(config_path, 'w') + cp.write(fileobject) + fileobject.close() - self.destroy() + self.destroy() diff --git a/shell/view/OverlayWindow.py b/shell/view/OverlayWindow.py index 93719a7..7980a1d 100644 --- a/shell/view/OverlayWindow.py +++ b/shell/view/OverlayWindow.py @@ -19,32 +19,32 @@ import cairo class OverlayWindow(gtk.Window): - def __init__(self, lower_window): - gtk.Window.__init__(self) - - colormap = self.get_screen().get_rgba_colormap() - colormap=None - if not colormap: - raise RuntimeError("The window manager doesn't support compositing.") - self.set_colormap(colormap) - - self.realize() - - self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG) - self.window.set_accept_focus(False) - self.window.set_transient_for(lower_window) - - self.set_decorated(False) - self.set_position(gtk.WIN_POS_CENTER_ALWAYS) - self.set_default_size(gtk.gdk.screen_width(), gtk.gdk.screen_height()) - self.set_app_paintable(True) - - self.connect('expose-event', self._expose_cb) - - def _expose_cb(self, widget, event): - cr = widget.window.cairo_create() - cr.set_source_rgba(0.0, 0.0, 0.0, 0.4) # Transparent - cr.set_operator(cairo.OPERATOR_SOURCE) - cr.paint() - return False + def __init__(self, lower_window): + gtk.Window.__init__(self) + + colormap = self.get_screen().get_rgba_colormap() + colormap=None + if not colormap: + raise RuntimeError("The window manager doesn't support compositing.") + self.set_colormap(colormap) + + self.realize() + + self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG) + self.window.set_accept_focus(False) + self.window.set_transient_for(lower_window) + + self.set_decorated(False) + self.set_position(gtk.WIN_POS_CENTER_ALWAYS) + self.set_default_size(gtk.gdk.screen_width(), gtk.gdk.screen_height()) + self.set_app_paintable(True) + + self.connect('expose-event', self._expose_cb) + + def _expose_cb(self, widget, event): + cr = widget.window.cairo_create() + cr.set_source_rgba(0.0, 0.0, 0.0, 0.4) # Transparent + cr.set_operator(cairo.OPERATOR_SOURCE) + cr.paint() + return False diff --git a/shell/view/Shell.py b/shell/view/Shell.py index 585f480..9166cef 100644 --- a/shell/view/Shell.py +++ b/shell/view/Shell.py @@ -31,206 +31,206 @@ from _sugar import KeyGrabber import sugar class Shell(gobject.GObject): - __gsignals__ = { - 'activity-opened': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])), - 'activity-changed': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])), - 'activity-closed': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])) - } - - def __init__(self, model): - gobject.GObject.__init__(self) - - self._model = model - self._hosts = {} - self._screen = wnck.screen_get_default() - self._current_host = None - - style.load_stylesheet(view.stylesheet) - - self._dcon_manager = DCONManager() - - self._key_grabber = KeyGrabber() - self._key_grabber.connect('key-pressed', - self.__global_key_pressed_cb) - self._key_grabber.connect('key-released', - self.__global_key_released_cb) - self._key_grabber.grab('F1') - self._key_grabber.grab('F2') - self._key_grabber.grab('F3') - self._key_grabber.grab('F4') - self._key_grabber.grab('F5') - self._key_grabber.grab('F6') - self._key_grabber.grab('F7') - self._key_grabber.grab('F8') - self._key_grabber.grab('0xDC') # Camera key - self._key_grabber.grab('0xE0') # Overlay key - self._key_grabber.grab('0x93') # Frame key - - # For non-OLPC machines - self._key_grabber.grab('<shft><alt>F9') - self._key_grabber.grab('<shft><alt>F10') - self._key_grabber.grab('<shft><alt>F11') - - self._home_window = HomeWindow(self) - self._home_window.show() - self.set_zoom_level(sugar.ZOOM_HOME) - - self._screen.connect('window-opened', self.__window_opened_cb) - self._screen.connect('window-closed', self.__window_closed_cb) - self._screen.connect('active-window-changed', - self.__active_window_changed_cb) - - self._frame = Frame(self) - self._frame.show_and_hide(3) - - def _open_terminal_cb(self): - self.start_activity('org.sugar.Terminal') - return False - - def __global_key_pressed_cb(self, grabber, key): - if key == 'F1': - self.set_zoom_level(sugar.ZOOM_MESH) - elif key == 'F2': - self.set_zoom_level(sugar.ZOOM_FRIENDS) - elif key == 'F3': - self.set_zoom_level(sugar.ZOOM_HOME) - elif key == 'F4': - self.set_zoom_level(sugar.ZOOM_ACTIVITY) - elif key == 'F5': - self._dcon_manager.decrease_brightness() - elif key == 'F6': - self._dcon_manager.increase_brightness() - elif key == 'F7': - self._dcon_manager.set_mode(DCONManager.COLOR_MODE) - elif key == 'F8': - self._dcon_manager.set_mode(DCONManager.BLACK_AND_WHITE_MODE) - elif key == '<shft><alt>F9': - self._frame.notify_key_press() - elif key == '<shft><alt>F10': - self.toggle_chat_visibility() - elif key == '<shft><alt>F11': - gobject.idle_add(self._open_terminal_cb) - elif key == '0xDC': # Camera key - pass - elif key == '0xE0': # Overlay key - self.toggle_chat_visibility() - elif key == '0x93': # Frame key - self._frame.notify_key_press() - - def __global_key_released_cb(self, grabber, key): - if key == '<shft><alt>F9': - self._frame.notify_key_release() - elif key == '0x93': - self._frame.notify_key_release() - - def __window_opened_cb(self, screen, window): - if window.get_window_type() == wnck.WINDOW_NORMAL: - activity_host = ActivityHost(self.get_model(), window) - self._hosts[activity_host.get_xid()] = activity_host - self.emit('activity-opened', activity_host) - - def __active_window_changed_cb(self, screen): - window = screen.get_active_window() - if not window or window.get_window_type() != wnck.WINDOW_NORMAL: - return - if not self._hosts.has_key(window.get_xid()): - return - - activity_host = self._hosts[window.get_xid()] - current = self._model.get_current_activity() - if activity_host.get_id() == current: - return - - self._set_current_activity(activity_host) - - def __window_closed_cb(self, screen, window): - if window.get_window_type() != wnck.WINDOW_NORMAL: - return - - if not self._hosts.has_key(window.get_xid()): - return - - host = self._hosts[window.get_xid()] - host.destroy() - - self.emit('activity-closed', host) - del self._hosts[window.get_xid()] - - if len(self._hosts) == 0: - self._set_current_activity(None) - - def _set_current_activity(self, host): - if host: - self._model.set_current_activity(host.get_id()) - else: - self._model.set_current_activity(None) - - if self._current_host: - self._current_host.set_active(False) - - self._current_host = host - - if self._current_host: - self._current_host.set_active(True) - - self.emit('activity-changed', host) - - def get_model(self): - return self._model - - def join_activity(self, bundle_id, activity_id): - pservice = PresenceService.get_instance() - - activity = self._get_activity(activity_id) - if activity: - activity.present() - else: - activity_ps = pservice.get_activity(activity_id) - - if activity_ps: - activity = ActivityFactory.create(bundle_id) - activity.join(activity_ps.object_path()) - else: - logging.error('Cannot start activity.') - - def start_activity(self, activity_type): - activity = ActivityFactory.create(activity_type) - activity.execute('test', []) - return activity - - def set_zoom_level(self, level): - if level == sugar.ZOOM_ACTIVITY: - self._screen.toggle_showing_desktop(False) - else: - self._screen.toggle_showing_desktop(True) - self._home_window.set_zoom_level(level) - - def get_current_activity(self): - activity_id = self._model.get_current_activity() - if activity_id: - return self._get_activity(activity_id) - else: - return None - - def _get_activity(self, activity_id): - for host in self._hosts.values(): - if host.get_id() == activity_id: - return host - return None - - def toggle_chat_visibility(self): - act = self.get_current_activity() - if not act: - return - is_visible = self._frame.is_visible() - if act.is_chat_visible(): - frame_was_visible = act.chat_hide() - if not frame_was_visible: - self._frame.do_slide_out() - else: - if not is_visible: - self._frame.do_slide_in() - act.chat_show(is_visible) + __gsignals__ = { + 'activity-opened': (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])), + 'activity-changed': (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])), + 'activity-closed': (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])) + } + + def __init__(self, model): + gobject.GObject.__init__(self) + + self._model = model + self._hosts = {} + self._screen = wnck.screen_get_default() + self._current_host = None + + style.load_stylesheet(view.stylesheet) + + self._dcon_manager = DCONManager() + + self._key_grabber = KeyGrabber() + self._key_grabber.connect('key-pressed', + self.__global_key_pressed_cb) + self._key_grabber.connect('key-released', + self.__global_key_released_cb) + self._key_grabber.grab('F1') + self._key_grabber.grab('F2') + self._key_grabber.grab('F3') + self._key_grabber.grab('F4') + self._key_grabber.grab('F5') + self._key_grabber.grab('F6') + self._key_grabber.grab('F7') + self._key_grabber.grab('F8') + self._key_grabber.grab('0xDC') # Camera key + self._key_grabber.grab('0xE0') # Overlay key + self._key_grabber.grab('0x93') # Frame key + + # For non-OLPC machines + self._key_grabber.grab('<shft><alt>F9') + self._key_grabber.grab('<shft><alt>F10') + self._key_grabber.grab('<shft><alt>F11') + + self._home_window = HomeWindow(self) + self._home_window.show() + self.set_zoom_level(sugar.ZOOM_HOME) + + self._screen.connect('window-opened', self.__window_opened_cb) + self._screen.connect('window-closed', self.__window_closed_cb) + self._screen.connect('active-window-changed', + self.__active_window_changed_cb) + + self._frame = Frame(self) + self._frame.show_and_hide(3) + + def _open_terminal_cb(self): + self.start_activity('org.sugar.Terminal') + return False + + def __global_key_pressed_cb(self, grabber, key): + if key == 'F1': + self.set_zoom_level(sugar.ZOOM_MESH) + elif key == 'F2': + self.set_zoom_level(sugar.ZOOM_FRIENDS) + elif key == 'F3': + self.set_zoom_level(sugar.ZOOM_HOME) + elif key == 'F4': + self.set_zoom_level(sugar.ZOOM_ACTIVITY) + elif key == 'F5': + self._dcon_manager.decrease_brightness() + elif key == 'F6': + self._dcon_manager.increase_brightness() + elif key == 'F7': + self._dcon_manager.set_mode(DCONManager.COLOR_MODE) + elif key == 'F8': + self._dcon_manager.set_mode(DCONManager.BLACK_AND_WHITE_MODE) + elif key == '<shft><alt>F9': + self._frame.notify_key_press() + elif key == '<shft><alt>F10': + self.toggle_chat_visibility() + elif key == '<shft><alt>F11': + gobject.idle_add(self._open_terminal_cb) + elif key == '0xDC': # Camera key + pass + elif key == '0xE0': # Overlay key + self.toggle_chat_visibility() + elif key == '0x93': # Frame key + self._frame.notify_key_press() + + def __global_key_released_cb(self, grabber, key): + if key == '<shft><alt>F9': + self._frame.notify_key_release() + elif key == '0x93': + self._frame.notify_key_release() + + def __window_opened_cb(self, screen, window): + if window.get_window_type() == wnck.WINDOW_NORMAL: + activity_host = ActivityHost(self.get_model(), window) + self._hosts[activity_host.get_xid()] = activity_host + self.emit('activity-opened', activity_host) + + def __active_window_changed_cb(self, screen): + window = screen.get_active_window() + if not window or window.get_window_type() != wnck.WINDOW_NORMAL: + return + if not self._hosts.has_key(window.get_xid()): + return + + activity_host = self._hosts[window.get_xid()] + current = self._model.get_current_activity() + if activity_host.get_id() == current: + return + + self._set_current_activity(activity_host) + + def __window_closed_cb(self, screen, window): + if window.get_window_type() != wnck.WINDOW_NORMAL: + return + + if not self._hosts.has_key(window.get_xid()): + return + + host = self._hosts[window.get_xid()] + host.destroy() + + self.emit('activity-closed', host) + del self._hosts[window.get_xid()] + + if len(self._hosts) == 0: + self._set_current_activity(None) + + def _set_current_activity(self, host): + if host: + self._model.set_current_activity(host.get_id()) + else: + self._model.set_current_activity(None) + + if self._current_host: + self._current_host.set_active(False) + + self._current_host = host + + if self._current_host: + self._current_host.set_active(True) + + self.emit('activity-changed', host) + + def get_model(self): + return self._model + + def join_activity(self, bundle_id, activity_id): + pservice = PresenceService.get_instance() + + activity = self._get_activity(activity_id) + if activity: + activity.present() + else: + activity_ps = pservice.get_activity(activity_id) + + if activity_ps: + activity = ActivityFactory.create(bundle_id) + activity.join(activity_ps.object_path()) + else: + logging.error('Cannot start activity.') + + def start_activity(self, activity_type): + activity = ActivityFactory.create(activity_type) + activity.execute('test', []) + return activity + + def set_zoom_level(self, level): + if level == sugar.ZOOM_ACTIVITY: + self._screen.toggle_showing_desktop(False) + else: + self._screen.toggle_showing_desktop(True) + self._home_window.set_zoom_level(level) + + def get_current_activity(self): + activity_id = self._model.get_current_activity() + if activity_id: + return self._get_activity(activity_id) + else: + return None + + def _get_activity(self, activity_id): + for host in self._hosts.values(): + if host.get_id() == activity_id: + return host + return None + + def toggle_chat_visibility(self): + act = self.get_current_activity() + if not act: + return + is_visible = self._frame.is_visible() + if act.is_chat_visible(): + frame_was_visible = act.chat_hide() + if not frame_was_visible: + self._frame.do_slide_out() + else: + if not is_visible: + self._frame.do_slide_in() + act.chat_show(is_visible) diff --git a/shell/view/dconmanager.py b/shell/view/dconmanager.py index 2cf40b5..2db626a 100644 --- a/shell/view/dconmanager.py +++ b/shell/view/dconmanager.py @@ -21,23 +21,23 @@ DCON_MANAGER_SERVICE = 'org.laptop.DCONManager' DCON_MANAGER_OBJECT_PATH = '/org/laptop/DCONManager' class DCONManager(object): - COLOR_MODE = 0 - BLACK_AND_WHITE_MODE = 1 + COLOR_MODE = 0 + BLACK_AND_WHITE_MODE = 1 - def __init__(self): - bus = dbus.SystemBus() - proxy = bus.get_object(DCON_MANAGER_SERVICE, DCON_MANAGER_OBJECT_PATH) - self._service = dbus.Interface(proxy, DCON_MANAGER_INTERFACE) + def __init__(self): + bus = dbus.SystemBus() + proxy = bus.get_object(DCON_MANAGER_SERVICE, DCON_MANAGER_OBJECT_PATH) + self._service = dbus.Interface(proxy, DCON_MANAGER_INTERFACE) - def set_mode(self, mode): - self._service.set_mode(mode) + def set_mode(self, mode): + self._service.set_mode(mode) - def increase_brightness(self): - level = self._service.get_backlight_level() - if level >= 0: - self._service.set_backlight_level(level + 1) + def increase_brightness(self): + level = self._service.get_backlight_level() + if level >= 0: + self._service.set_backlight_level(level + 1) - def decrease_brightness(self): - level = self._service.get_backlight_level() - if level >= 0: - self._service.set_backlight_level(level - 1) + def decrease_brightness(self): + level = self._service.get_backlight_level() + if level >= 0: + self._service.set_backlight_level(level - 1) diff --git a/shell/view/frame/ActivitiesBox.py b/shell/view/frame/ActivitiesBox.py index 2e3a75a..aa96585 100644 --- a/shell/view/frame/ActivitiesBox.py +++ b/shell/view/frame/ActivitiesBox.py @@ -22,80 +22,80 @@ from sugar.presence import PresenceService from sugar.graphics import style class ActivityItem(CanvasIcon): - def __init__(self, activity): - icon_name = activity.get_icon() - CanvasIcon.__init__(self, icon_name=icon_name) - style.apply_stylesheet(self, 'frame.ActivityIcon') - self._activity = activity + def __init__(self, activity): + icon_name = activity.get_icon() + CanvasIcon.__init__(self, icon_name=icon_name) + style.apply_stylesheet(self, 'frame.ActivityIcon') + self._activity = activity - def get_bundle_id(self): - return self._activity.get_service_name() + def get_bundle_id(self): + return self._activity.get_service_name() class InviteItem(CanvasIcon): - def __init__(self, activity, invite): - CanvasIcon.__init__(self, icon_name=activity.get_icon()) + def __init__(self, activity, invite): + CanvasIcon.__init__(self, icon_name=activity.get_icon()) - style.apply_stylesheet(self, 'frame.ActivityIcon') - self.props.color = activity.get_color() + style.apply_stylesheet(self, 'frame.ActivityIcon') + self.props.color = activity.get_color() - self._invite = invite + self._invite = invite - def get_activity_id(self): - return self._invite.get_activity_id() + def get_activity_id(self): + return self._invite.get_activity_id() - def get_bundle_id(self): - return self._invite.get_bundle_id() + def get_bundle_id(self): + return self._invite.get_bundle_id() - def get_invite(self): - return self._invite + def get_invite(self): + return self._invite class ActivitiesBox(hippo.CanvasBox): - def __init__(self, shell): - hippo.CanvasBox.__init__(self, orientation=hippo.ORIENTATION_HORIZONTAL) - - self._shell = shell - self._shell_model = self._shell.get_model() - self._invite_to_item = {} - self._invites = self._shell_model.get_invites() - - for bundle in self._shell_model.get_bundle_registry(): - if bundle.get_show_launcher(): - self.add_activity(bundle) - - for invite in self._invites: - self.add_invite(invite) - self._invites.connect('invite-added', self._invite_added_cb) - self._invites.connect('invite-removed', self._invite_removed_cb) - - def _activity_clicked_cb(self, icon): - self._shell.start_activity(icon.get_bundle_id()) - - def _invite_clicked_cb(self, icon): - self._invites.remove_invite(icon.get_invite()) - self._shell.join_activity(icon.get_bundle_id(), - icon.get_activity_id()) - - def _invite_added_cb(self, invites, invite): - self.add_invite(invite) - - def _invite_removed_cb(self, invites, invite): - self.remove_invite(invite) - - def add_activity(self, activity): - item = ActivityItem(activity) - item.connect('activated', self._activity_clicked_cb) - self.append(item, 0) - - def add_invite(self, invite): - mesh = self._shell_model.get_mesh() - activity = mesh.get_activity(invite.get_activity_id()) - if activity: - item = InviteItem(activity, invite) - item.connect('activated', self._invite_clicked_cb) - self.append(item, 0) - - self._invite_to_item[invite] = item - - def remove_invite(self, invite): - self.remove(self._invite_to_item[invite]) - del self._invite_to_item[invite] + def __init__(self, shell): + hippo.CanvasBox.__init__(self, orientation=hippo.ORIENTATION_HORIZONTAL) + + self._shell = shell + self._shell_model = self._shell.get_model() + self._invite_to_item = {} + self._invites = self._shell_model.get_invites() + + for bundle in self._shell_model.get_bundle_registry(): + if bundle.get_show_launcher(): + self.add_activity(bundle) + + for invite in self._invites: + self.add_invite(invite) + self._invites.connect('invite-added', self._invite_added_cb) + self._invites.connect('invite-removed', self._invite_removed_cb) + + def _activity_clicked_cb(self, icon): + self._shell.start_activity(icon.get_bundle_id()) + + def _invite_clicked_cb(self, icon): + self._invites.remove_invite(icon.get_invite()) + self._shell.join_activity(icon.get_bundle_id(), + icon.get_activity_id()) + + def _invite_added_cb(self, invites, invite): + self.add_invite(invite) + + def _invite_removed_cb(self, invites, invite): + self.remove_invite(invite) + + def add_activity(self, activity): + item = ActivityItem(activity) + item.connect('activated', self._activity_clicked_cb) + self.append(item, 0) + + def add_invite(self, invite): + mesh = self._shell_model.get_mesh() + activity = mesh.get_activity(invite.get_activity_id()) + if activity: + item = InviteItem(activity, invite) + item.connect('activated', self._invite_clicked_cb) + self.append(item, 0) + + self._invite_to_item[invite] = item + + def remove_invite(self, invite): + self.remove(self._invite_to_item[invite]) + del self._invite_to_item[invite] diff --git a/shell/view/frame/ClipboardBox.py b/shell/view/frame/ClipboardBox.py index 849c7e0..82dccb6 100644 --- a/shell/view/frame/ClipboardBox.py +++ b/shell/view/frame/ClipboardBox.py @@ -7,36 +7,36 @@ from view.ClipboardIcon import ClipboardIcon from sugar.clipboard import ClipboardService class ClipboardBox(hippo.CanvasBox): - - def __init__(self, frame, menu_shell): - hippo.CanvasBox.__init__(self) - self._frame = frame - self._menu_shell = menu_shell - self._icons = {} - - cb_service = ClipboardService.get_instance() - cb_service.connect('object-added', self._object_added_cb) - cb_service.connect('object-deleted', self._object_deleted_cb) - cb_service.connect('object-state-changed', self._object_state_changed_cb) + + def __init__(self, frame, menu_shell): + hippo.CanvasBox.__init__(self) + self._frame = frame + self._menu_shell = menu_shell + self._icons = {} + + cb_service = ClipboardService.get_instance() + cb_service.connect('object-added', self._object_added_cb) + cb_service.connect('object-deleted', self._object_deleted_cb) + cb_service.connect('object-state-changed', self._object_state_changed_cb) - def _object_added_cb(self, cb_service, name, mimeType, fileName): - icon = ClipboardIcon(self._menu_shell, name, fileName) - style.apply_stylesheet(icon, 'frame.BuddyIcon') - self.append(icon) - self._icons[fileName] = icon - - if not self._frame.is_visible(): - self._frame.show_and_hide(0.1) - - logging.debug('ClipboardBox: ' + fileName + ' was added.') + def _object_added_cb(self, cb_service, name, mimeType, fileName): + icon = ClipboardIcon(self._menu_shell, name, fileName) + style.apply_stylesheet(icon, 'frame.BuddyIcon') + self.append(icon) + self._icons[fileName] = icon + + if not self._frame.is_visible(): + self._frame.show_and_hide(0.1) + + logging.debug('ClipboardBox: ' + fileName + ' was added.') - def _object_deleted_cb(self, cb_service, fileName): - icon = self._icons[fileName] - self.remove(icon) - del self._icons[fileName] - logging.debug('ClipboardBox: ' + fileName + ' was deleted.') + def _object_deleted_cb(self, cb_service, fileName): + icon = self._icons[fileName] + self.remove(icon) + del self._icons[fileName] + logging.debug('ClipboardBox: ' + fileName + ' was deleted.') - def _object_state_changed_cb(self, cb_service, fileName, percent): - icon = self._icons[fileName] - icon.set_percent(percent) - logging.debug('ClipboardBox: ' + fileName + ' state was changed.') + def _object_state_changed_cb(self, cb_service, fileName, percent): + icon = self._icons[fileName] + icon.set_percent(percent) + logging.debug('ClipboardBox: ' + fileName + ' state was changed.') diff --git a/shell/view/frame/Frame.py b/shell/view/frame/Frame.py index 37f28cb..c865219 100644 --- a/shell/view/frame/Frame.py +++ b/shell/view/frame/Frame.py @@ -32,268 +32,268 @@ from sugar.graphics.grid import Grid from sugar.graphics.menushell import MenuShell class EventFrame(gobject.GObject): - __gsignals__ = { - 'enter-edge': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, ([])), - 'enter-corner': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, ([])), - 'leave': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, ([])) - } - - HOVER_NONE = 0 - HOVER_CORNER = 1 - HOVER_EDGE = 2 - - def __init__(self): - gobject.GObject.__init__(self) - - self._windows = [] - self._hover = EventFrame.HOVER_NONE - self._active = False - - invisible = self._create_invisible(0, 0, gtk.gdk.screen_width(), 1) - self._windows.append(invisible) - - invisible = self._create_invisible(0, 0, 1, gtk.gdk.screen_height()) - self._windows.append(invisible) - - invisible = self._create_invisible(gtk.gdk.screen_width() - 1, 0, - gtk.gdk.screen_width(), - gtk.gdk.screen_height()) - self._windows.append(invisible) - - invisible = self._create_invisible(0, gtk.gdk.screen_height() - 1, - gtk.gdk.screen_width(), - gtk.gdk.screen_height()) - self._windows.append(invisible) - - screen = wnck.screen_get_default() - screen.connect('active-window-changed', - self._active_window_changed_cb) - - def _create_invisible(self, x, y, width, height): - invisible = gtk.Invisible() - invisible.connect('motion-notify-event', self._motion_notify_cb) - invisible.connect('enter-notify-event', self._enter_notify_cb) - invisible.connect('leave-notify-event', self._leave_notify_cb) - - invisible.realize() - invisible.window.set_events(gtk.gdk.POINTER_MOTION_MASK | - gtk.gdk.ENTER_NOTIFY_MASK | - gtk.gdk.LEAVE_NOTIFY_MASK) - invisible.window.move_resize(x, y, width, height) - - return invisible - - def _enter_notify_cb(self, widget, event): - self._notify_enter(event.x, event.y) - - def _motion_notify_cb(self, widget, event): - self._notify_enter(event.x, event.y) - - def _notify_enter(self, x, y): - screen_w = gtk.gdk.screen_width() - screen_h = gtk.gdk.screen_height() - - if (x == 0 and y == 0) or \ - (x == 0 and y == screen_h - 1) or \ - (x == screen_w - 1 and y == 0) or \ - (x == screen_w - 1 and y == screen_h - 1): - if self._hover != EventFrame.HOVER_CORNER: - self._hover = EventFrame.HOVER_CORNER - self.emit('enter-corner') - else: - if self._hover != EventFrame.HOVER_EDGE: - self._hover = EventFrame.HOVER_EDGE - self.emit('enter-edge') - - def _leave_notify_cb(self, widget, event): - self._hover = EventFrame.HOVER_NONE - if self._active: - self.emit('leave') - - def show(self): - self._active = True - for window in self._windows: - window.show() - - def hide(self): - self._active = False - for window in self._windows: - window.hide() - - def _active_window_changed_cb(self, screen): - for window in self._windows: - window.window.raise_() + __gsignals__ = { + 'enter-edge': (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, ([])), + 'enter-corner': (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, ([])), + 'leave': (gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, ([])) + } + + HOVER_NONE = 0 + HOVER_CORNER = 1 + HOVER_EDGE = 2 + + def __init__(self): + gobject.GObject.__init__(self) + + self._windows = [] + self._hover = EventFrame.HOVER_NONE + self._active = False + + invisible = self._create_invisible(0, 0, gtk.gdk.screen_width(), 1) + self._windows.append(invisible) + + invisible = self._create_invisible(0, 0, 1, gtk.gdk.screen_height()) + self._windows.append(invisible) + + invisible = self._create_invisible(gtk.gdk.screen_width() - 1, 0, + gtk.gdk.screen_width(), + gtk.gdk.screen_height()) + self._windows.append(invisible) + + invisible = self._create_invisible(0, gtk.gdk.screen_height() - 1, + gtk.gdk.screen_width(), + gtk.gdk.screen_height()) + self._windows.append(invisible) + + screen = wnck.screen_get_default() + screen.connect('active-window-changed', + self._active_window_changed_cb) + + def _create_invisible(self, x, y, width, height): + invisible = gtk.Invisible() + invisible.connect('motion-notify-event', self._motion_notify_cb) + invisible.connect('enter-notify-event', self._enter_notify_cb) + invisible.connect('leave-notify-event', self._leave_notify_cb) + + invisible.realize() + invisible.window.set_events(gtk.gdk.POINTER_MOTION_MASK | + gtk.gdk.ENTER_NOTIFY_MASK | + gtk.gdk.LEAVE_NOTIFY_MASK) + invisible.window.move_resize(x, y, width, height) + + return invisible + + def _enter_notify_cb(self, widget, event): + self._notify_enter(event.x, event.y) + + def _motion_notify_cb(self, widget, event): + self._notify_enter(event.x, event.y) + + def _notify_enter(self, x, y): + screen_w = gtk.gdk.screen_width() + screen_h = gtk.gdk.screen_height() + + if (x == 0 and y == 0) or \ + (x == 0 and y == screen_h - 1) or \ + (x == screen_w - 1 and y == 0) or \ + (x == screen_w - 1 and y == screen_h - 1): + if self._hover != EventFrame.HOVER_CORNER: + self._hover = EventFrame.HOVER_CORNER + self.emit('enter-corner') + else: + if self._hover != EventFrame.HOVER_EDGE: + self._hover = EventFrame.HOVER_EDGE + self.emit('enter-edge') + + def _leave_notify_cb(self, widget, event): + self._hover = EventFrame.HOVER_NONE + if self._active: + self.emit('leave') + + def show(self): + self._active = True + for window in self._windows: + window.show() + + def hide(self): + self._active = False + for window in self._windows: + window.hide() + + def _active_window_changed_cb(self, screen): + for window in self._windows: + window.window.raise_() class Frame: - INACTIVE = 0 - TEMPORARY = 1 - STICKY = 2 - HIDE_ON_LEAVE = 3 - AUTOMATIC = 4 + INACTIVE = 0 + TEMPORARY = 1 + STICKY = 2 + HIDE_ON_LEAVE = 3 + AUTOMATIC = 4 - def __init__(self, shell): - self._windows = [] - self._active_menus = 0 - self._shell = shell - self._mode = Frame.INACTIVE + def __init__(self, shell): + self._windows = [] + self._active_menus = 0 + self._shell = shell + self._mode = Frame.INACTIVE - self._timeline = Timeline(self) - self._timeline.add_tag('slide_in', 6, 12) - self._timeline.add_tag('before_slide_out', 36, 36) - self._timeline.add_tag('slide_out', 37, 42) + self._timeline = Timeline(self) + self._timeline.add_tag('slide_in', 6, 12) + self._timeline.add_tag('before_slide_out', 36, 36) + self._timeline.add_tag('slide_out', 37, 42) - self._event_frame = EventFrame() - self._event_frame.connect('enter-edge', self._enter_edge_cb) - self._event_frame.connect('enter-corner', self._enter_corner_cb) - self._event_frame.connect('leave', self._event_frame_leave_cb) - self._event_frame.show() + self._event_frame = EventFrame() + self._event_frame.connect('enter-edge', self._enter_edge_cb) + self._event_frame.connect('enter-corner', self._enter_corner_cb) + self._event_frame.connect('leave', self._event_frame_leave_cb) + self._event_frame.show() - grid = Grid() + grid = Grid() - # Top panel - [menu_shell, root] = self._create_panel(grid, 0, 0, 16, 1) - menu_shell.set_position(MenuShell.BOTTOM) + # Top panel + [menu_shell, root] = self._create_panel(grid, 0, 0, 16, 1) + menu_shell.set_position(MenuShell.BOTTOM) - box = ZoomBox(self._shell, menu_shell) + box = ZoomBox(self._shell, menu_shell) - [x, y] = grid.point(1, 0) - root.append(box, hippo.PACK_FIXED) - root.move(box, x, y) + [x, y] = grid.point(1, 0) + root.append(box, hippo.PACK_FIXED) + root.move(box, x, y) - tray = NotificationTray() - tray_box = hippo.CanvasBox(box_width=grid.dimension(1), - box_height=grid.dimension(1), - xalign=hippo.ALIGNMENT_END) + tray = NotificationTray() + tray_box = hippo.CanvasBox(box_width=grid.dimension(1), + box_height=grid.dimension(1), + xalign=hippo.ALIGNMENT_END) - tray_widget = hippo.CanvasWidget() - tray_widget.props.widget = tray - tray_box.append(tray_widget, gtk.EXPAND) + tray_widget = hippo.CanvasWidget() + tray_widget.props.widget = tray + tray_box.append(tray_widget, gtk.EXPAND) - [x, y] = grid.point(13, 0) - root.append(tray_box, hippo.PACK_FIXED) - root.move(tray_box, x, y) + [x, y] = grid.point(13, 0) + root.append(tray_box, hippo.PACK_FIXED) + root.move(tray_box, x, y) - box = OverlayBox(self._shell) + box = OverlayBox(self._shell) - [x, y] = grid.point(14, 0) - root.append(box, hippo.PACK_FIXED) - root.move(box, x, y) + [x, y] = grid.point(14, 0) + root.append(box, hippo.PACK_FIXED) + root.move(box, x, y) - shutdown_icon = ShutdownIcon(menu_shell) + shutdown_icon = ShutdownIcon(menu_shell) - [x, y] = grid.point(12, 0) - root.append(shutdown_icon, hippo.PACK_FIXED) - root.move(shutdown_icon, x, y) + [x, y] = grid.point(12, 0) + root.append(shutdown_icon, hippo.PACK_FIXED) + root.move(shutdown_icon, x, y) - # Bottom panel - [menu_shell, root] = self._create_panel(grid, 0, 11, 16, 1) - menu_shell.set_position(MenuShell.TOP) + # Bottom panel + [menu_shell, root] = self._create_panel(grid, 0, 11, 16, 1) + menu_shell.set_position(MenuShell.TOP) - box = ActivitiesBox(self._shell) - root.append(box, hippo.PACK_FIXED) + box = ActivitiesBox(self._shell) + root.append(box, hippo.PACK_FIXED) - [x, y] = grid.point(1, 0) - root.move(box, x, y) + [x, y] = grid.point(1, 0) + root.move(box, x, y) - # Right panel - [menu_shell, root] = self._create_panel(grid, 15, 1, 1, 10) - menu_shell.set_position(MenuShell.LEFT) + # Right panel + [menu_shell, root] = self._create_panel(grid, 15, 1, 1, 10) + menu_shell.set_position(MenuShell.LEFT) - box = FriendsBox(self._shell, menu_shell) - root.append(box) + box = FriendsBox(self._shell, menu_shell) + root.append(box) - # Left panel - [menu_shell, root] = self._create_panel(grid, 0, 1, 1, 10) + # Left panel + [menu_shell, root] = self._create_panel(grid, 0, 1, 1, 10) - box = ClipboardBox(self, menu_shell) - root.append(box) + box = ClipboardBox(self, menu_shell) + root.append(box) - def _create_panel(self, grid, x, y, width, height): - panel = PanelWindow() + def _create_panel(self, grid, x, y, width, height): + panel = PanelWindow() - panel.connect('enter-notify-event', self._enter_notify_cb) - panel.connect('leave-notify-event', self._leave_notify_cb) + panel.connect('enter-notify-event', self._enter_notify_cb) + panel.connect('leave-notify-event', self._leave_notify_cb) - menu_shell = panel.get_menu_shell() - menu_shell.connect('activated', self._menu_shell_activated_cb) - menu_shell.connect('deactivated', self._menu_shell_deactivated_cb) + menu_shell = panel.get_menu_shell() + menu_shell.connect('activated', self._menu_shell_activated_cb) + menu_shell.connect('deactivated', self._menu_shell_deactivated_cb) - [x, y, width, height] = grid.rectangle(x, y, width, height) + [x, y, width, height] = grid.rectangle(x, y, width, height) - panel.move(x, y) - panel.resize(width, height) + panel.move(x, y) + panel.resize(width, height) - self._windows.append(panel) + self._windows.append(panel) - return [panel.get_menu_shell(), panel.get_root()] + return [panel.get_menu_shell(), panel.get_root()] - def _menu_shell_activated_cb(self, menu_shell): - self._active_menus += 1 - self._timeline.goto('slide_in', True) + def _menu_shell_activated_cb(self, menu_shell): + self._active_menus += 1 + self._timeline.goto('slide_in', True) - def _menu_shell_deactivated_cb(self, menu_shell): - self._active_menus -= 1 - if self._mode != Frame.STICKY: - self._timeline.play('before_slide_out', 'slide_out') + def _menu_shell_deactivated_cb(self, menu_shell): + self._active_menus -= 1 + if self._mode != Frame.STICKY: + self._timeline.play('before_slide_out', 'slide_out') - def _enter_notify_cb(self, window, event): - self._timeline.goto('slide_in', True) + def _enter_notify_cb(self, window, event): + self._timeline.goto('slide_in', True) - def _leave_notify_cb(self, window, event): - # FIXME for some reason every click cause also a leave-notify - if event.state == gtk.gdk.BUTTON1_MASK: - return + def _leave_notify_cb(self, window, event): + # FIXME for some reason every click cause also a leave-notify + if event.state == gtk.gdk.BUTTON1_MASK: + return - if self._active_menus == 0 and \ - (self._mode == Frame.HIDE_ON_LEAVE or \ - self._mode == Frame.AUTOMATIC): - self._timeline.play('before_slide_out', 'slide_out') + if self._active_menus == 0 and \ + (self._mode == Frame.HIDE_ON_LEAVE or \ + self._mode == Frame.AUTOMATIC): + self._timeline.play('before_slide_out', 'slide_out') - def _enter_edge_cb(self, event_frame): - self._mode = Frame.HIDE_ON_LEAVE - self._timeline.play(None, 'slide_in') + def _enter_edge_cb(self, event_frame): + self._mode = Frame.HIDE_ON_LEAVE + self._timeline.play(None, 'slide_in') - def _enter_corner_cb(self, event_frame): - self._mode = Frame.HIDE_ON_LEAVE - self._timeline.play('slide_in', 'slide_in') + def _enter_corner_cb(self, event_frame): + self._mode = Frame.HIDE_ON_LEAVE + self._timeline.play('slide_in', 'slide_in') - def _event_frame_leave_cb(self, event_frame): - if self._mode != Frame.STICKY: - self._timeline.goto('slide_out', True) + def _event_frame_leave_cb(self, event_frame): + if self._mode != Frame.STICKY: + self._timeline.goto('slide_out', True) - def show_and_hide(self, seconds): - self._mode = Frame.AUTOMATIC - self._timeline.play() + def show_and_hide(self, seconds): + self._mode = Frame.AUTOMATIC + self._timeline.play() - def notify_key_press(self): - if self._timeline.on_tag('slide_in'): - self._timeline.play('before_slide_out', 'slide_out') - elif self._timeline.on_tag('before_slide_out'): - self._mode = Frame.TEMPORARY - else: - self._mode = Frame.STICKY - self._timeline.play('slide_in', 'slide_in') + def notify_key_press(self): + if self._timeline.on_tag('slide_in'): + self._timeline.play('before_slide_out', 'slide_out') + elif self._timeline.on_tag('before_slide_out'): + self._mode = Frame.TEMPORARY + else: + self._mode = Frame.STICKY + self._timeline.play('slide_in', 'slide_in') - def notify_key_release(self): - if self._mode == Frame.TEMPORARY: - self._timeline.play('before_slide_out', 'slide_out') + def notify_key_release(self): + if self._mode == Frame.TEMPORARY: + self._timeline.play('before_slide_out', 'slide_out') - def do_slide_in(self, current=0, n_frames=0): - if not self._windows[0].props.visible: - for panel in self._windows: - panel.show() - self._event_frame.hide() + def do_slide_in(self, current=0, n_frames=0): + if not self._windows[0].props.visible: + for panel in self._windows: + panel.show() + self._event_frame.hide() - def do_slide_out(self, current=0, n_frames=0): - if self._windows[0].props.visible: - for panel in self._windows: - panel.hide() - self._event_frame.show() + def do_slide_out(self, current=0, n_frames=0): + if self._windows[0].props.visible: + for panel in self._windows: + panel.hide() + self._event_frame.show() - def is_visible(self): - if self._windows[0].props.visible: - return True - return False + def is_visible(self): + if self._windows[0].props.visible: + return True + return False diff --git a/shell/view/frame/FriendsBox.py b/shell/view/frame/FriendsBox.py index 14f1290..cdc07ad 100644 --- a/shell/view/frame/FriendsBox.py +++ b/shell/view/frame/FriendsBox.py @@ -24,85 +24,85 @@ from view.BuddyIcon import BuddyIcon from model.BuddyModel import BuddyModel class FriendsBox(hippo.CanvasBox): - def __init__(self, shell, menu_shell): - hippo.CanvasBox.__init__(self) - self._shell = shell - self._menu_shell = menu_shell - self._activity_ps = None - self._joined_hid = -1 - self._left_hid = -1 - self._buddies = {} - - self._pservice = PresenceService.get_instance() - self._pservice.connect('activity-appeared', - self.__activity_appeared_cb) - - # Add initial activities the PS knows about - for activity in self._pservice.get_activities(): - self.__activity_appeared_cb(self._pservice, activity) - - shell.connect('activity-changed', self.__activity_changed_cb) - - def add_buddy(self, buddy): - if self._buddies.has_key(buddy.get_name()): - return - - model = BuddyModel(buddy=buddy) - icon = BuddyIcon(self._shell, self._menu_shell, model) - style.apply_stylesheet(icon, 'frame.BuddyIcon') - self.append(icon) - - self._buddies[buddy.get_name()] = icon - - def remove_buddy(self, buddy): - if not self._buddies.has_key(buddy.get_name()): - return - - self.remove(self._buddies[buddy.get_name()]) - - def clear(self): - for item in self.get_children(): - self.remove(item) - self._buddies = {} - - def __activity_appeared_cb(self, pservice, activity_ps): - activity = self._shell.get_current_activity() - if activity and activity_ps.get_id() == activity.get_id(): - self._set_activity_ps(activity_ps) - - def _set_activity_ps(self, activity_ps): - if self._activity_ps == activity_ps: - return - - if self._joined_hid > 0: - self._activity_ps.disconnect(self._joined_hid) - self._joined_hid = -1 - if self._left_hid > 0: - self._activity_ps.disconnect(self._left_hid) - self._left_hid = -1 - - self._activity_ps = activity_ps - - self.clear() - - if activity_ps != None: - for buddy in activity_ps.get_joined_buddies(): - self.add_buddy(buddy) - - self._joined_hid = activity_ps.connect( - 'buddy-joined', self.__buddy_joined_cb) - self._left_hid = activity_ps.connect( - 'buddy-left', self.__buddy_left_cb) - - def __activity_changed_cb(self, group, activity): - if activity: - ps = self._pservice.get_activity(activity.get_id()) - self._set_activity_ps(ps) - else: - self._set_activity_ps(None) - - def __buddy_joined_cb(self, activity, buddy): - self.add_buddy(buddy) - - def __buddy_left_cb(self, activity, buddy): - self.remove_buddy(buddy) + def __init__(self, shell, menu_shell): + hippo.CanvasBox.__init__(self) + self._shell = shell + self._menu_shell = menu_shell + self._activity_ps = None + self._joined_hid = -1 + self._left_hid = -1 + self._buddies = {} + + self._pservice = PresenceService.get_instance() + self._pservice.connect('activity-appeared', + self.__activity_appeared_cb) + + # Add initial activities the PS knows about + for activity in self._pservice.get_activities(): + self.__activity_appeared_cb(self._pservice, activity) + + shell.connect('activity-changed', self.__activity_changed_cb) + + def add_buddy(self, buddy): + if self._buddies.has_key(buddy.get_name()): + return + + model = BuddyModel(buddy=buddy) + icon = BuddyIcon(self._shell, self._menu_shell, model) + style.apply_stylesheet(icon, 'frame.BuddyIcon') + self.append(icon) + + self._buddies[buddy.get_name()] = icon + + def remove_buddy(self, buddy): + if not self._buddies.has_key(buddy.get_name()): + return + + self.remove(self._buddies[buddy.get_name()]) + + def clear(self): + for item in self.get_children(): + self.remove(item) + self._buddies = {} + + def __activity_appeared_cb(self, pservice, activity_ps): + activity = self._shell.get_current_activity() + if activity and activity_ps.get_id() == activity.get_id(): + self._set_activity_ps(activity_ps) + + def _set_activity_ps(self, activity_ps): + if self._activity_ps == activity_ps: + return + + if self._joined_hid > 0: + self._activity_ps.disconnect(self._joined_hid) + self._joined_hid = -1 + if self._left_hid > 0: + self._activity_ps.disconnect(self._left_hid) + self._left_hid = -1 + + self._activity_ps = activity_ps + + self.clear() + + if activity_ps != None: + for buddy in activity_ps.get_joined_buddies(): + self.add_buddy(buddy) + + self._joined_hid = activity_ps.connect( + 'buddy-joined', self.__buddy_joined_cb) + self._left_hid = activity_ps.connect( + 'buddy-left', self.__buddy_left_cb) + + def __activity_changed_cb(self, group, activity): + if activity: + ps = self._pservice.get_activity(activity.get_id()) + self._set_activity_ps(ps) + else: + self._set_activity_ps(None) + + def __buddy_joined_cb(self, activity, buddy): + self.add_buddy(buddy) + + def __buddy_left_cb(self, activity, buddy): + self.remove_buddy(buddy) diff --git a/shell/view/frame/PanelWindow.py b/shell/view/frame/PanelWindow.py index 14e72b1..8fd8145 100644 --- a/shell/view/frame/PanelWindow.py +++ b/shell/view/frame/PanelWindow.py @@ -20,28 +20,28 @@ import hippo from sugar.graphics.menushell import MenuShell class PanelWindow(gtk.Window): - def __init__(self): - gtk.Window.__init__(self) + def __init__(self): + gtk.Window.__init__(self) - self.set_decorated(False) - self.connect('realize', self._realize_cb) + self.set_decorated(False) + self.connect('realize', self._realize_cb) - canvas = hippo.Canvas() + canvas = hippo.Canvas() - self._bg = hippo.CanvasBox(background_color=0x414141ff) - canvas.set_root(self._bg) + self._bg = hippo.CanvasBox(background_color=0x414141ff) + canvas.set_root(self._bg) - self.add(canvas) - canvas.show() + self.add(canvas) + canvas.show() - self._menu_shell = MenuShell(canvas) + self._menu_shell = MenuShell(canvas) - def get_menu_shell(self): - return self._menu_shell + def get_menu_shell(self): + return self._menu_shell - def get_root(self): - return self._bg + def get_root(self): + return self._bg - def _realize_cb(self, widget): - self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG) - self.window.set_accept_focus(False) + def _realize_cb(self, widget): + self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG) + self.window.set_accept_focus(False) diff --git a/shell/view/frame/ZoomBox.py b/shell/view/frame/ZoomBox.py index 45c76cd..ed7e0a1 100644 --- a/shell/view/frame/ZoomBox.py +++ b/shell/view/frame/ZoomBox.py @@ -23,98 +23,98 @@ from sugar.graphics import style import sugar class ActivityMenu(Menu): - ACTION_SHARE = 1 - ACTION_CLOSE = 2 + ACTION_SHARE = 1 + ACTION_CLOSE = 2 - def __init__(self, activity_host): - Menu.__init__(self, activity_host.get_title()) + def __init__(self, activity_host): + Menu.__init__(self, activity_host.get_title()) - if not activity_host.get_shared(): - self._add_mesh_action() + if not activity_host.get_shared(): + self._add_mesh_action() - self._add_close_action() + self._add_close_action() - def _add_mesh_action(self): - icon = CanvasIcon(icon_name='stock-share-mesh') - self.add_action(icon, ActivityMenu.ACTION_SHARE) + def _add_mesh_action(self): + icon = CanvasIcon(icon_name='stock-share-mesh') + self.add_action(icon, ActivityMenu.ACTION_SHARE) - def _add_close_action(self): - icon = CanvasIcon(icon_name='stock-close') - self.add_action(icon, ActivityMenu.ACTION_CLOSE) + def _add_close_action(self): + icon = CanvasIcon(icon_name='stock-close') + self.add_action(icon, ActivityMenu.ACTION_CLOSE) class ActivityIcon(MenuIcon): - def __init__(self, shell, menu_shell, activity_host): - self._shell = shell - self._activity_host = activity_host + def __init__(self, shell, menu_shell, activity_host): + self._shell = shell + self._activity_host = activity_host - icon_name = activity_host.get_icon_name() - icon_color = activity_host.get_icon_color() + icon_name = activity_host.get_icon_name() + icon_color = activity_host.get_icon_color() - MenuIcon.__init__(self, menu_shell, icon_name=icon_name, - color=icon_color) + MenuIcon.__init__(self, menu_shell, icon_name=icon_name, + color=icon_color) - def create_menu(self): - menu = ActivityMenu(self._activity_host) - menu.connect('action', self._action_cb) - return menu + def create_menu(self): + menu = ActivityMenu(self._activity_host) + menu.connect('action', self._action_cb) + return menu - def _action_cb(self, menu, action): - self.popdown() + def _action_cb(self, menu, action): + self.popdown() - activity = self._shell.get_current_activity() - if activity == None: - return + activity = self._shell.get_current_activity() + if activity == None: + return - if action == ActivityMenu.ACTION_SHARE: - activity.share() - if action == ActivityMenu.ACTION_CLOSE: - activity.close() + if action == ActivityMenu.ACTION_SHARE: + activity.share() + if action == ActivityMenu.ACTION_CLOSE: + activity.close() class ZoomBox(hippo.CanvasBox): - def __init__(self, shell, menu_shell): - hippo.CanvasBox.__init__(self, orientation=hippo.ORIENTATION_HORIZONTAL) - - self._shell = shell - self._menu_shell = menu_shell - self._activity_icon = None - - icon = CanvasIcon(icon_name='stock-zoom-mesh') - style.apply_stylesheet(icon, 'frame.ZoomIcon') - icon.connect('activated', self._level_clicked_cb, sugar.ZOOM_MESH) - self.append(icon) - - icon = CanvasIcon(icon_name='stock-zoom-friends') - style.apply_stylesheet(icon, 'frame.ZoomIcon') - icon.connect('activated', self._level_clicked_cb, sugar.ZOOM_FRIENDS) - self.append(icon) - - icon = CanvasIcon(icon_name='stock-zoom-home') - style.apply_stylesheet(icon, 'frame.ZoomIcon') - icon.connect('activated', self._level_clicked_cb, sugar.ZOOM_HOME) - self.append(icon) - - icon = CanvasIcon(icon_name='stock-zoom-activity') - style.apply_stylesheet(icon, 'frame.ZoomIcon') - icon.connect('activated', self._level_clicked_cb, sugar.ZOOM_ACTIVITY) - self.append(icon) - - shell.connect('activity-changed', self._activity_changed_cb) - self._set_current_activity(shell.get_current_activity()) - - def _set_current_activity(self, activity): - if self._activity_icon: - self.remove(self._activity_icon) - - if activity: - icon = ActivityIcon(self._shell, self._menu_shell, activity) - style.apply_stylesheet(icon, 'frame.ZoomIcon') - self.append(icon, 0) - self._activity_icon = icon - else: - self._activity_icon = None - - def _activity_changed_cb(self, shell_model, activity): - self._set_current_activity(activity) - - def _level_clicked_cb(self, item, level): - self._shell.set_zoom_level(level) + def __init__(self, shell, menu_shell): + hippo.CanvasBox.__init__(self, orientation=hippo.ORIENTATION_HORIZONTAL) + + self._shell = shell + self._menu_shell = menu_shell + self._activity_icon = None + + icon = CanvasIcon(icon_name='stock-zoom-mesh') + style.apply_stylesheet(icon, 'frame.ZoomIcon') + icon.connect('activated', self._level_clicked_cb, sugar.ZOOM_MESH) + self.append(icon) + + icon = CanvasIcon(icon_name='stock-zoom-friends') + style.apply_stylesheet(icon, 'frame.ZoomIcon') + icon.connect('activated', self._level_clicked_cb, sugar.ZOOM_FRIENDS) + self.append(icon) + + icon = CanvasIcon(icon_name='stock-zoom-home') + style.apply_stylesheet(icon, 'frame.ZoomIcon') + icon.connect('activated', self._level_clicked_cb, sugar.ZOOM_HOME) + self.append(icon) + + icon = CanvasIcon(icon_name='stock-zoom-activity') + style.apply_stylesheet(icon, 'frame.ZoomIcon') + icon.connect('activated', self._level_clicked_cb, sugar.ZOOM_ACTIVITY) + self.append(icon) + + shell.connect('activity-changed', self._activity_changed_cb) + self._set_current_activity(shell.get_current_activity()) + + def _set_current_activity(self, activity): + if self._activity_icon: + self.remove(self._activity_icon) + + if activity: + icon = ActivityIcon(self._shell, self._menu_shell, activity) + style.apply_stylesheet(icon, 'frame.ZoomIcon') + self.append(icon, 0) + self._activity_icon = icon + else: + self._activity_icon = None + + def _activity_changed_cb(self, shell_model, activity): + self._set_current_activity(activity) + + def _level_clicked_cb(self, item, level): + self._shell.set_zoom_level(level) diff --git a/shell/view/frame/notificationtray.py b/shell/view/frame/notificationtray.py index 5fa5123..b304868 100644 --- a/shell/view/frame/notificationtray.py +++ b/shell/view/frame/notificationtray.py @@ -3,16 +3,16 @@ import gtk from _sugar import TrayManager class NotificationTray(gtk.HBox): - def __init__(self): - gtk.HBox.__init__(self) + def __init__(self): + gtk.HBox.__init__(self) - self._manager = TrayManager() - self._manager.connect('tray-icon-added', self._icon_added_cb) - self._manager.connect('tray-icon-removed', self._icon_removed_cb) - self._manager.manage_screen(gtk.gdk.screen_get_default()) + self._manager = TrayManager() + self._manager.connect('tray-icon-added', self._icon_added_cb) + self._manager.connect('tray-icon-removed', self._icon_removed_cb) + self._manager.manage_screen(gtk.gdk.screen_get_default()) - def _icon_added_cb(self, manager, icon): - self.pack_start(icon, False) + def _icon_added_cb(self, manager, icon): + self.pack_start(icon, False) - def _icon_removed_cb(self, manager, icon): - icon.destroy() + def _icon_removed_cb(self, manager, icon): + icon.destroy() diff --git a/shell/view/frame/overlaybox.py b/shell/view/frame/overlaybox.py index eaa1e5d..406173a 100644 --- a/shell/view/frame/overlaybox.py +++ b/shell/view/frame/overlaybox.py @@ -4,15 +4,15 @@ from sugar.graphics import style from sugar.graphics.canvasicon import CanvasIcon class OverlayBox(hippo.CanvasBox): - def __init__(self, shell): - hippo.CanvasBox.__init__(self, orientation=hippo.ORIENTATION_HORIZONTAL) + def __init__(self, shell): + hippo.CanvasBox.__init__(self, orientation=hippo.ORIENTATION_HORIZONTAL) - self._shell = shell + self._shell = shell - icon = CanvasIcon(icon_name='stock-chat') - style.apply_stylesheet(icon, 'frame.OverlayIcon') - icon.connect('activated', self._overlay_clicked_cb) - self.append(icon) + icon = CanvasIcon(icon_name='stock-chat') + style.apply_stylesheet(icon, 'frame.OverlayIcon') + icon.connect('activated', self._overlay_clicked_cb) + self.append(icon) - def _overlay_clicked_cb(self, item): - self._shell.toggle_chat_visibility() + def _overlay_clicked_cb(self, item): + self._shell.toggle_chat_visibility() diff --git a/shell/view/frame/shutdownicon.py b/shell/view/frame/shutdownicon.py index 520ba20..5814f72 100644 --- a/shell/view/frame/shutdownicon.py +++ b/shell/view/frame/shutdownicon.py @@ -21,24 +21,24 @@ from sugar.graphics.menu import Menu from sugar.graphics import style class ShutdownIcon(MenuIcon): - ACTION_SHUTDOWN = 2 + ACTION_SHUTDOWN = 2 - def __init__(self, menu_shell): - MenuIcon.__init__(self, menu_shell, icon_name='stock-close') - style.apply_stylesheet(self, 'menu.ActionIcon') + def __init__(self, menu_shell): + MenuIcon.__init__(self, menu_shell, icon_name='stock-close') + style.apply_stylesheet(self, 'menu.ActionIcon') - def create_menu(self): - menu = Menu() - menu.add_item('Shut Down', ShutdownIcon.ACTION_SHUTDOWN) - menu.connect('action', self._action_cb) - return menu + def create_menu(self): + menu = Menu() + menu.add_item('Shut Down', ShutdownIcon.ACTION_SHUTDOWN) + menu.connect('action', self._action_cb) + return menu - def _action_cb(self, menu, action): - self.popdown() + def _action_cb(self, menu, action): + self.popdown() - if action == ShutdownIcon.ACTION_SHUTDOWN: - bus = dbus.SystemBus() - proxy = bus.get_object('org.freedesktop.Hal', - '/org/freedesktop/Hal/devices/computer') - mgr = dbus.Interface(proxy, 'org.freedesktop.Hal.Device.SystemPowerManagement') - mgr.Shutdown() + if action == ShutdownIcon.ACTION_SHUTDOWN: + bus = dbus.SystemBus() + proxy = bus.get_object('org.freedesktop.Hal', + '/org/freedesktop/Hal/devices/computer') + mgr = dbus.Interface(proxy, 'org.freedesktop.Hal.Device.SystemPowerManagement') + mgr.Shutdown() diff --git a/shell/view/home/FriendView.py b/shell/view/home/FriendView.py index 2b5cf7c..6d24f76 100644 --- a/shell/view/home/FriendView.py +++ b/shell/view/home/FriendView.py @@ -23,67 +23,67 @@ from sugar.graphics import style from sugar.presence import PresenceService class FriendView(hippo.CanvasBox): - def __init__(self, shell, menu_shell, buddy, **kwargs): - hippo.CanvasBox.__init__(self, **kwargs) + def __init__(self, shell, menu_shell, buddy, **kwargs): + hippo.CanvasBox.__init__(self, **kwargs) - self._pservice = PresenceService.get_instance() + self._pservice = PresenceService.get_instance() - self._buddy = buddy - self._buddy_icon = BuddyIcon(shell, menu_shell, buddy) - style.apply_stylesheet(self._buddy_icon, 'friends.FriendIcon') - self.append(self._buddy_icon) + self._buddy = buddy + self._buddy_icon = BuddyIcon(shell, menu_shell, buddy) + style.apply_stylesheet(self._buddy_icon, 'friends.FriendIcon') + self.append(self._buddy_icon) - self._activity_icon = CanvasIcon() - style.apply_stylesheet(self._activity_icon, 'friends.ActivityIcon') - self._activity_icon_visible = False + self._activity_icon = CanvasIcon() + style.apply_stylesheet(self._activity_icon, 'friends.ActivityIcon') + self._activity_icon_visible = False - if self._buddy.is_present(): - self._buddy_appeared_cb(buddy) + if self._buddy.is_present(): + self._buddy_appeared_cb(buddy) - self._buddy.connect('current-activity-changed', self._buddy_activity_changed_cb) - self._buddy.connect('appeared', self._buddy_appeared_cb) - self._buddy.connect('disappeared', self._buddy_disappeared_cb) - self._buddy.connect('color-changed', self._buddy_color_changed_cb) + self._buddy.connect('current-activity-changed', self._buddy_activity_changed_cb) + self._buddy.connect('appeared', self._buddy_appeared_cb) + self._buddy.connect('disappeared', self._buddy_disappeared_cb) + self._buddy.connect('color-changed', self._buddy_color_changed_cb) - def _get_new_icon_name(self, activity): - # FIXME: do something better here; we probably need to use "flagship" - # services like mDNS where activities default services are marked - # somehow. - activity_registry = shell.get_model().get_bundle_registry() - for serv in activity.get_services(): - bundle = activity_registry.get_bundle(serv.get_type()) - if bundle: - return bundle.get_icon() - return None + def _get_new_icon_name(self, activity): + # FIXME: do something better here; we probably need to use "flagship" + # services like mDNS where activities default services are marked + # somehow. + activity_registry = shell.get_model().get_bundle_registry() + for serv in activity.get_services(): + bundle = activity_registry.get_bundle(serv.get_type()) + if bundle: + return bundle.get_icon() + return None - def _remove_activity_icon(self): - if self._activity_icon_visible: - self.remove(self._activity_icon) - self._activity_icon_visible = False + def _remove_activity_icon(self): + if self._activity_icon_visible: + self.remove(self._activity_icon) + self._activity_icon_visible = False - def _buddy_activity_changed_cb(self, buddy, activity=None): - if not activity: - self._remove_activity_icon() - return + def _buddy_activity_changed_cb(self, buddy, activity=None): + if not activity: + self._remove_activity_icon() + return - # FIXME: use some sort of "unknown activity" icon rather - # than hiding the icon? - name = self._get_new_icon_name(activity) - if name: - self._activity_icon.props.icon_name = name - self._activity_icon.props.color = buddy.get_color() - if not self._activity_icon_visible: - self.append(self._activity_icon, hippo.PACK_EXPAND) - self._activity_icon_visible = True - else: - self._remove_activity_icon() + # FIXME: use some sort of "unknown activity" icon rather + # than hiding the icon? + name = self._get_new_icon_name(activity) + if name: + self._activity_icon.props.icon_name = name + self._activity_icon.props.color = buddy.get_color() + if not self._activity_icon_visible: + self.append(self._activity_icon, hippo.PACK_EXPAND) + self._activity_icon_visible = True + else: + self._remove_activity_icon() - def _buddy_appeared_cb(self, buddy): - activity = self._buddy.get_current_activity() - self._buddy_activity_changed_cb(buddy, activity) + def _buddy_appeared_cb(self, buddy): + activity = self._buddy.get_current_activity() + self._buddy_activity_changed_cb(buddy, activity) - def _buddy_disappeared_cb(self, buddy): - self._buddy_activity_changed_cb(buddy, None) + def _buddy_disappeared_cb(self, buddy): + self._buddy_activity_changed_cb(buddy, None) - def _buddy_color_changed_cb(self, buddy, color): - self._activity_icon.props.color = buddy.get_color() + def _buddy_color_changed_cb(self, buddy, color): + self._activity_icon.props.color = buddy.get_color() diff --git a/shell/view/home/FriendsBox.py b/shell/view/home/FriendsBox.py index 28a745e..ec4aad6 100644 --- a/shell/view/home/FriendsBox.py +++ b/shell/view/home/FriendsBox.py @@ -25,42 +25,42 @@ from view.home.MyIcon import MyIcon from view.home.FriendView import FriendView class FriendsBox(SpreadBox, hippo.CanvasItem): - __gtype_name__ = 'SugarFriendsBox' - def __init__(self, shell, menu_shell): - SpreadBox.__init__(self, background_color=0xe2e2e2ff) + __gtype_name__ = 'SugarFriendsBox' + def __init__(self, shell, menu_shell): + SpreadBox.__init__(self, background_color=0xe2e2e2ff) - self._shell = shell - self._menu_shell = menu_shell - self._friends = {} + self._shell = shell + self._menu_shell = menu_shell + self._friends = {} - self._my_icon = MyIcon() - style.apply_stylesheet(self._my_icon, 'friends.MyIcon') - self.append(self._my_icon, hippo.PACK_FIXED) + self._my_icon = MyIcon() + style.apply_stylesheet(self._my_icon, 'friends.MyIcon') + self.append(self._my_icon, hippo.PACK_FIXED) - friends = self._shell.get_model().get_friends() + friends = self._shell.get_model().get_friends() - for friend in friends: - self.add_friend(friend) + for friend in friends: + self.add_friend(friend) - friends.connect('friend-added', self._friend_added_cb) - friends.connect('friend-removed', self._friend_removed_cb) + friends.connect('friend-added', self._friend_added_cb) + friends.connect('friend-removed', self._friend_removed_cb) - def add_friend(self, buddy_info): - icon = FriendView(self._shell, self._menu_shell, buddy_info) - self.add_item(icon) + def add_friend(self, buddy_info): + icon = FriendView(self._shell, self._menu_shell, buddy_info) + self.add_item(icon) - self._friends[buddy_info.get_name()] = icon + self._friends[buddy_info.get_name()] = icon - def _friend_added_cb(self, data_model, buddy_info): - self.add_friend(buddy_info) + def _friend_added_cb(self, data_model, buddy_info): + self.add_friend(buddy_info) - def _friend_removed_cb(self, data_model, name): - self.remove_item(self._friends[name]) - del self._friends[name] + def _friend_removed_cb(self, data_model, name): + self.remove_item(self._friends[name]) + del self._friends[name] - def do_allocate(self, width, height): - SpreadBox.do_allocate(self, width, height) + def do_allocate(self, width, height): + SpreadBox.do_allocate(self, width, height) - [icon_width, icon_height] = self._my_icon.get_allocation() - self.move(self._my_icon, (width - icon_width) / 2, - (height - icon_height) / 2) + [icon_width, icon_height] = self._my_icon.get_allocation() + self.move(self._my_icon, (width - icon_width) / 2, + (height - icon_height) / 2) diff --git a/shell/view/home/HomeBox.py b/shell/view/home/HomeBox.py index 146056b..a24402d 100644 --- a/shell/view/home/HomeBox.py +++ b/shell/view/home/HomeBox.py @@ -22,24 +22,24 @@ from sugar.graphics.grid import Grid from sugar.graphics import style class HomeBox(hippo.CanvasBox, hippo.CanvasItem): - __gtype_name__ = 'SugarHomeBox' + __gtype_name__ = 'SugarHomeBox' - def __init__(self, shell): - hippo.CanvasBox.__init__(self, background_color=0xe2e2e2ff, - yalign=2) + def __init__(self, shell): + hippo.CanvasBox.__init__(self, background_color=0xe2e2e2ff, + yalign=2) - grid = Grid() - donut = ActivitiesDonut(shell, box_width=grid.dimension(7), - box_height=grid.dimension(7)) - self.append(donut) + grid = Grid() + donut = ActivitiesDonut(shell, box_width=grid.dimension(7), + box_height=grid.dimension(7)) + self.append(donut) - self._my_icon = MyIcon() - style.apply_stylesheet(self._my_icon, 'home.MyIcon') - self.append(self._my_icon, hippo.PACK_FIXED) + self._my_icon = MyIcon() + style.apply_stylesheet(self._my_icon, 'home.MyIcon') + self.append(self._my_icon, hippo.PACK_FIXED) - def do_allocate(self, width, height): - hippo.CanvasBox.do_allocate(self, width, height) + def do_allocate(self, width, height): + hippo.CanvasBox.do_allocate(self, width, height) - [icon_width, icon_height] = self._my_icon.get_allocation() - self.move(self._my_icon, (width - icon_width) / 2, - (height - icon_height) / 2) + [icon_width, icon_height] = self._my_icon.get_allocation() + self.move(self._my_icon, (width - icon_width) / 2, + (height - icon_height) / 2) diff --git a/shell/view/home/HomeWindow.py b/shell/view/home/HomeWindow.py index e07c7d0..b450b8c 100644 --- a/shell/view/home/HomeWindow.py +++ b/shell/view/home/HomeWindow.py @@ -25,45 +25,45 @@ from view.home.HomeBox import HomeBox from view.home.FriendsBox import FriendsBox class HomeWindow(gtk.Window): - def __init__(self, shell): - gtk.Window.__init__(self) - self._shell = shell + def __init__(self, shell): + gtk.Window.__init__(self) + self._shell = shell - self.set_default_size(gtk.gdk.screen_width(), - gtk.gdk.screen_height()) + self.set_default_size(gtk.gdk.screen_width(), + gtk.gdk.screen_height()) - self.realize() - self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DESKTOP) + self.realize() + self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DESKTOP) - self._nb = gtk.Notebook() - self._nb.set_show_border(False) - self._nb.set_show_tabs(False) + self._nb = gtk.Notebook() + self._nb.set_show_border(False) + self._nb.set_show_tabs(False) - self.add(self._nb) - self._nb.show() + self.add(self._nb) + self._nb.show() - canvas = hippo.Canvas() - box = HomeBox(shell) - canvas.set_root(box) - self._nb.append_page(canvas) - canvas.show() + canvas = hippo.Canvas() + box = HomeBox(shell) + canvas.set_root(box) + self._nb.append_page(canvas) + canvas.show() - canvas = hippo.Canvas() - box = FriendsBox(shell, MenuShell(canvas)) - canvas.set_root(box) - self._nb.append_page(canvas) - canvas.show() + canvas = hippo.Canvas() + box = FriendsBox(shell, MenuShell(canvas)) + canvas.set_root(box) + self._nb.append_page(canvas) + canvas.show() - canvas = hippo.Canvas() - box = MeshBox(shell, MenuShell(canvas)) - canvas.set_root(box) - self._nb.append_page(canvas) - canvas.show() + canvas = hippo.Canvas() + box = MeshBox(shell, MenuShell(canvas)) + canvas.set_root(box) + self._nb.append_page(canvas) + canvas.show() - def set_zoom_level(self, level): - if level == sugar.ZOOM_HOME: - self._nb.set_current_page(0) - elif level == sugar.ZOOM_FRIENDS: - self._nb.set_current_page(1) - elif level == sugar.ZOOM_MESH: - self._nb.set_current_page(2) + def set_zoom_level(self, level): + if level == sugar.ZOOM_HOME: + self._nb.set_current_page(0) + elif level == sugar.ZOOM_FRIENDS: + self._nb.set_current_page(1) + elif level == sugar.ZOOM_MESH: + self._nb.set_current_page(2) diff --git a/shell/view/home/MeshBox.py b/shell/view/home/MeshBox.py index 1c61d1a..5ea4aef 100644 --- a/shell/view/home/MeshBox.py +++ b/shell/view/home/MeshBox.py @@ -25,116 +25,116 @@ from sugar.graphics.canvasicon import CanvasIcon from view.BuddyIcon import BuddyIcon class ActivityView(SnowflakeBox): - def __init__(self, shell, menu_shell, model): - SnowflakeBox.__init__(self) + def __init__(self, shell, menu_shell, model): + SnowflakeBox.__init__(self) - self._shell = shell - self._model = model - self._icons = {} + self._shell = shell + self._model = model + self._icons = {} - icon = CanvasIcon(icon_name=model.get_icon_name(), - color=model.get_color(), size=80) - icon.connect('activated', self._clicked_cb) - self.append(icon, hippo.PACK_FIXED) - self.set_root(icon) + icon = CanvasIcon(icon_name=model.get_icon_name(), + color=model.get_color(), size=80) + icon.connect('activated', self._clicked_cb) + self.append(icon, hippo.PACK_FIXED) + self.set_root(icon) - def has_buddy_icon(self, name): - return self._icons.has_key(name) + def has_buddy_icon(self, name): + return self._icons.has_key(name) - def add_buddy_icon(self, name, icon): - self._icons[name] = icon - self.append(icon, hippo.PACK_FIXED) + def add_buddy_icon(self, name, icon): + self._icons[name] = icon + self.append(icon, hippo.PACK_FIXED) - def remove_buddy_icon(self, name): - icon = self._icons[name] - self.remove(icon) - del self._icons[name] + def remove_buddy_icon(self, name): + icon = self._icons[name] + self.remove(icon) + del self._icons[name] - def _clicked_cb(self, item): - bundle_id = self._model.get_service().get_type() - self._shell.join_activity(bundle_id, self._model.get_id()) + def _clicked_cb(self, item): + bundle_id = self._model.get_service().get_type() + self._shell.join_activity(bundle_id, self._model.get_id()) class MeshBox(SpreadBox): - def __init__(self, shell, menu_shell): - SpreadBox.__init__(self, background_color=0xe2e2e2ff) + def __init__(self, shell, menu_shell): + SpreadBox.__init__(self, background_color=0xe2e2e2ff) - self._shell = shell - self._menu_shell = menu_shell - self._model = shell.get_model().get_mesh() - self._buddies = {} - self._activities = {} - self._buddy_to_activity = {} + self._shell = shell + self._menu_shell = menu_shell + self._model = shell.get_model().get_mesh() + self._buddies = {} + self._activities = {} + self._buddy_to_activity = {} - for buddy_model in self._model.get_buddies(): - self._add_alone_buddy(buddy_model) + for buddy_model in self._model.get_buddies(): + self._add_alone_buddy(buddy_model) - self._model.connect('buddy-added', self._buddy_added_cb) - self._model.connect('buddy-removed', self._buddy_removed_cb) - self._model.connect('buddy-moved', self._buddy_moved_cb) + self._model.connect('buddy-added', self._buddy_added_cb) + self._model.connect('buddy-removed', self._buddy_removed_cb) + self._model.connect('buddy-moved', self._buddy_moved_cb) - for activity_model in self._model.get_activities(): - self._add_activity(activity_model) + for activity_model in self._model.get_activities(): + self._add_activity(activity_model) - self._model.connect('activity-added', self._activity_added_cb) - self._model.connect('activity-removed', self._activity_removed_cb) + self._model.connect('activity-added', self._activity_added_cb) + self._model.connect('activity-removed', self._activity_removed_cb) - def _buddy_added_cb(self, model, buddy_model): - self._add_alone_buddy(buddy_model) + def _buddy_added_cb(self, model, buddy_model): + self._add_alone_buddy(buddy_model) - def _buddy_removed_cb(self, model, buddy_model): - self._remove_buddy(buddy_model) + def _buddy_removed_cb(self, model, buddy_model): + self._remove_buddy(buddy_model) - def _buddy_moved_cb(self, model, buddy_model, activity_model): - self._move_buddy(buddy_model, activity_model) + def _buddy_moved_cb(self, model, buddy_model, activity_model): + self._move_buddy(buddy_model, activity_model) - def _activity_added_cb(self, model, activity_model): - self._add_activity(activity_model) + def _activity_added_cb(self, model, activity_model): + self._add_activity(activity_model) - def _activity_removed_cb(self, model, activity_model): - self._remove_activity(activity_model) + def _activity_removed_cb(self, model, activity_model): + self._remove_activity(activity_model) - def _add_alone_buddy(self, buddy_model): - icon = BuddyIcon(self._shell, self._menu_shell, buddy_model) - icon.props.size = 80 - self.add_item(icon) + def _add_alone_buddy(self, buddy_model): + icon = BuddyIcon(self._shell, self._menu_shell, buddy_model) + icon.props.size = 80 + self.add_item(icon) - self._buddies[buddy_model.get_name()] = icon + self._buddies[buddy_model.get_name()] = icon - def _remove_alone_buddy(self, buddy_model): - icon = self._buddies[buddy_model.get_name()] - self.remove_item(icon) - del self._buddies[buddy_model.get_name()] + def _remove_alone_buddy(self, buddy_model): + icon = self._buddies[buddy_model.get_name()] + self.remove_item(icon) + del self._buddies[buddy_model.get_name()] - def _remove_buddy(self, buddy_model): - name = buddy_model.get_name() - if self._buddies.has_key(name): - self._remove_alone_buddy(buddy_model) - else: - for activity in self._activities.values(): - if activity.has_buddy_icon(name): - activity.remove_buddy_icon(name) + def _remove_buddy(self, buddy_model): + name = buddy_model.get_name() + if self._buddies.has_key(name): + self._remove_alone_buddy(buddy_model) + else: + for activity in self._activities.values(): + if activity.has_buddy_icon(name): + activity.remove_buddy_icon(name) - def _move_buddy(self, buddy_model, activity_model): - name = buddy_model.get_name() + def _move_buddy(self, buddy_model, activity_model): + name = buddy_model.get_name() - self._remove_buddy(buddy_model) + self._remove_buddy(buddy_model) - if activity_model == None: - self._add_alone_buddy(buddy_model) - else: - activity = self._activities[activity_model.get_id()] + if activity_model == None: + self._add_alone_buddy(buddy_model) + else: + activity = self._activities[activity_model.get_id()] - icon = BuddyIcon(self._shell, self._menu_shell, buddy_model) - icon.props.size = 60 - activity.add_buddy_icon(buddy_model.get_name(), icon) + icon = BuddyIcon(self._shell, self._menu_shell, buddy_model) + icon.props.size = 60 + activity.add_buddy_icon(buddy_model.get_name(), icon) - def _add_activity(self, activity_model): - icon = ActivityView(self._shell, self._menu_shell, activity_model) - self.add_item(icon) + def _add_activity(self, activity_model): + icon = ActivityView(self._shell, self._menu_shell, activity_model) + self.add_item(icon) - self._activities[activity_model.get_id()] = icon + self._activities[activity_model.get_id()] = icon - def _remove_activity(self, activity_model): - icon = self._activities[activity_model.get_id()] - self.remove_item(icon) - del self._activities[activity_model.get_id()] + def _remove_activity(self, activity_model): + icon = self._activities[activity_model.get_id()] + self.remove_item(icon) + del self._activities[activity_model.get_id()] diff --git a/shell/view/home/MyIcon.py b/shell/view/home/MyIcon.py index df59317..80e3a04 100644 --- a/shell/view/home/MyIcon.py +++ b/shell/view/home/MyIcon.py @@ -18,6 +18,6 @@ from sugar.graphics.canvasicon import CanvasIcon from sugar import profile class MyIcon(CanvasIcon): - def __init__(self): - CanvasIcon.__init__(self, icon_name='stock-buddy', - color=profile.get_color()) + def __init__(self): + CanvasIcon.__init__(self, icon_name='stock-buddy', + color=profile.get_color()) diff --git a/shell/view/home/activitiesdonut.py b/shell/view/home/activitiesdonut.py index f7d24fc..74f3bbb 100644 --- a/shell/view/home/activitiesdonut.py +++ b/shell/view/home/activitiesdonut.py @@ -21,100 +21,100 @@ from sugar.graphics.canvasicon import CanvasIcon from sugar.graphics import style class ActivitiesDonut(hippo.CanvasBox, hippo.CanvasItem): - __gtype_name__ = 'SugarActivitiesDonut' - def __init__(self, shell, **kwargs): - hippo.CanvasBox.__init__(self, **kwargs) + __gtype_name__ = 'SugarActivitiesDonut' + def __init__(self, shell, **kwargs): + hippo.CanvasBox.__init__(self, **kwargs) - self._activities = {} + self._activities = {} - shell.connect('activity_opened', self.__activity_opened_cb) - shell.connect('activity_closed', self.__activity_closed_cb) + shell.connect('activity_opened', self.__activity_opened_cb) + shell.connect('activity_closed', self.__activity_closed_cb) - def __activity_opened_cb(self, model, activity): - self._add_activity(activity) + def __activity_opened_cb(self, model, activity): + self._add_activity(activity) - def __activity_closed_cb(self, model, activity): - self._remove_activity(activity) - - def _remove_activity(self, activity): - icon = self._activities[activity.get_id()] - self.remove(icon) - del self._activities[activity.get_id()] + def __activity_closed_cb(self, model, activity): + self._remove_activity(activity) + + def _remove_activity(self, activity): + icon = self._activities[activity.get_id()] + self.remove(icon) + del self._activities[activity.get_id()] - def _add_activity(self, activity): - icon_name = activity.get_icon_name() - icon_color = activity.get_icon_color() + def _add_activity(self, activity): + icon_name = activity.get_icon_name() + icon_color = activity.get_icon_color() - icon = CanvasIcon(icon_name=icon_name, color=icon_color) - style.apply_stylesheet(icon, 'ring.ActivityIcon') - icon.connect('activated', self.__activity_icon_clicked_cb, activity) - self.append(icon, hippo.PACK_FIXED) + icon = CanvasIcon(icon_name=icon_name, color=icon_color) + style.apply_stylesheet(icon, 'ring.ActivityIcon') + icon.connect('activated', self.__activity_icon_clicked_cb, activity) + self.append(icon, hippo.PACK_FIXED) - self._activities[activity.get_id()] = icon + self._activities[activity.get_id()] = icon - self.emit_paint_needed(0, 0, -1, -1) + self.emit_paint_needed(0, 0, -1, -1) - def __activity_icon_clicked_cb(self, item, activity): - activity.present() + def __activity_icon_clicked_cb(self, item, activity): + activity.present() - def _get_angles(self, index): - angle = 2 * math.pi / 8 - return [index * angle, (index + 1) * angle] + def _get_angles(self, index): + angle = 2 * math.pi / 8 + return [index * angle, (index + 1) * angle] - def _get_radius(self): - [width, height] = self.get_allocation() - return min(width, height) / 2 + def _get_radius(self): + [width, height] = self.get_allocation() + return min(width, height) / 2 - def _get_inner_radius(self): - return self._get_radius() * 0.5 + def _get_inner_radius(self): + return self._get_radius() * 0.5 - def do_paint_below_children(self, cr, damaged_box): - [width, height] = self.get_allocation() + def do_paint_below_children(self, cr, damaged_box): + [width, height] = self.get_allocation() - cr.translate(width / 2, height / 2) + cr.translate(width / 2, height / 2) - radius = self._get_radius() + radius = self._get_radius() - cr.set_source_rgb(0xf1 / 255.0, 0xf1 / 255.0, 0xf1 / 255.0) - cr.arc(0, 0, radius, 0, 2 * math.pi) - cr.fill() + cr.set_source_rgb(0xf1 / 255.0, 0xf1 / 255.0, 0xf1 / 255.0) + cr.arc(0, 0, radius, 0, 2 * math.pi) + cr.fill() - angle_end = 0 - for i in range(0, len(self._activities)): - [angle_start, angle_end] = self._get_angles(i) + angle_end = 0 + for i in range(0, len(self._activities)): + [angle_start, angle_end] = self._get_angles(i) - cr.new_path() - cr.move_to(0, 0) - cr.line_to(radius * math.cos(angle_start), - radius * math.sin(angle_start)) - cr.arc(0, 0, radius, angle_start, angle_end) - cr.line_to(0, 0) + cr.new_path() + cr.move_to(0, 0) + cr.line_to(radius * math.cos(angle_start), + radius * math.sin(angle_start)) + cr.arc(0, 0, radius, angle_start, angle_end) + cr.line_to(0, 0) - cr.set_source_rgb(0xe2 / 255.0, 0xe2 / 255.0, 0xe2 / 255.0) - cr.set_line_width(4) - cr.stroke_preserve() + cr.set_source_rgb(0xe2 / 255.0, 0xe2 / 255.0, 0xe2 / 255.0) + cr.set_line_width(4) + cr.stroke_preserve() - cr.set_source_rgb(1, 1, 1) - cr.fill() + cr.set_source_rgb(1, 1, 1) + cr.fill() - cr.set_source_rgb(0xe2 / 255.0, 0xe2 / 255.0, 0xe2 / 255.0) - cr.arc(0, 0, self._get_inner_radius(), 0, 2 * math.pi) - cr.fill() + cr.set_source_rgb(0xe2 / 255.0, 0xe2 / 255.0, 0xe2 / 255.0) + cr.arc(0, 0, self._get_inner_radius(), 0, 2 * math.pi) + cr.fill() - def do_allocate(self, width, height): - hippo.CanvasBox.do_allocate(self, width, height) + def do_allocate(self, width, height): + hippo.CanvasBox.do_allocate(self, width, height) - radius = (self._get_inner_radius() + self._get_radius()) / 2 + radius = (self._get_inner_radius() + self._get_radius()) / 2 - i = 0 - for icon in self._activities.values(): - [angle_start, angle_end] = self._get_angles(i) - angle = angle_start + (angle_end - angle_start) / 2 + i = 0 + for icon in self._activities.values(): + [angle_start, angle_end] = self._get_angles(i) + angle = angle_start + (angle_end - angle_start) / 2 - [icon_width, icon_height] = icon.get_allocation() + [icon_width, icon_height] = icon.get_allocation() - x = int(radius * math.cos(angle)) - icon_width / 2 - y = int(radius * math.sin(angle)) - icon_height / 2 - self.move(icon, x + width / 2, y + height / 2) + x = int(radius * math.cos(angle)) - icon_width / 2 + y = int(radius * math.sin(angle)) - icon_height / 2 + self.move(icon, x + width / 2, y + height / 2) - i += 1 + i += 1 diff --git a/shell/view/stylesheet.py b/shell/view/stylesheet.py index 1870f9c..5b1c4c6 100644 --- a/shell/view/stylesheet.py +++ b/shell/view/stylesheet.py @@ -21,59 +21,59 @@ from sugar.graphics.iconcolor import IconColor from sugar.graphics import style frame_ActivityIcon = { - 'color' : IconColor('white'), - 'size' : style.standard_icon_size + 'color' : IconColor('white'), + 'size' : style.standard_icon_size } frame_ShutdownIcon = { - 'size' : style.standard_icon_size + 'size' : style.standard_icon_size } frame_OverlayIcon = { - 'size' : style.standard_icon_size + 'size' : style.standard_icon_size } frame_ZoomIcon = { - 'size' : style.standard_icon_size + 'size' : style.standard_icon_size } frame_BuddyIcon = { - 'size' : style.standard_icon_size + 'size' : style.standard_icon_size } home_MyIcon = { - 'size' : style.xlarge_icon_size + 'size' : style.xlarge_icon_size } ring_ActivityIcon = { - 'size' : style.medium_icon_size + 'size' : style.medium_icon_size } friends_MyIcon = { - 'size' : style.large_icon_size + 'size' : style.large_icon_size } friends_FriendIcon = { - 'size' : style.large_icon_size + 'size' : style.large_icon_size } friends_ActivityIcon = { - 'size' : style.standard_icon_size + 'size' : style.standard_icon_size } clipboard_bubble = { - 'fill-color' : 0x646464FF, - 'stroke-color' : 0x646464FF, - 'progress-color': 0x333333FF, - 'spacing' : style.space_unit, - 'padding' : style.space_unit * 1.5 + 'fill-color' : 0x646464FF, + 'stroke-color' : 0x646464FF, + 'progress-color': 0x333333FF, + 'spacing' : style.space_unit, + 'padding' : style.space_unit * 1.5 } clipboard_menu_item_title = { - 'xalign': hippo.ALIGNMENT_START, - 'padding-left': 5, - 'color' : 0xFFFFFFFF, - 'font' : style.get_font_description('Bold', 1.2) + 'xalign': hippo.ALIGNMENT_START, + 'padding-left': 5, + 'color' : 0xFFFFFFFF, + 'font' : style.get_font_description('Bold', 1.2) } style.register_stylesheet("clipboard.Bubble", clipboard_bubble) |