bigboard r7249 - in trunk: . bigboard/stocks/files bigboard/stocks/workspaces
- From: otaylor svn gnome org
- To: svn-commits-list gnome org
- Subject: bigboard r7249 - in trunk: . bigboard/stocks/files bigboard/stocks/workspaces
- Date: Mon, 4 Feb 2008 18:27:02 +0000 (GMT)
Author: otaylor
Date: Mon Feb 4 18:27:02 2008
New Revision: 7249
URL: http://svn.gnome.org/viewvc/bigboard?rev=7249&view=rev
Log:
main.py: When loading images from files, keep a mtime cache so we can
detect changes (to thumnails)
FileStock.py: On a recent-files change, don't recreate everything
(creating flashing), just redo local files that changed and add new
ones.
Modified:
trunk/bigboard/stocks/files/FilesStock.py
trunk/bigboard/stocks/workspaces/WorkspacesStock.py
trunk/main.py
Modified: trunk/bigboard/stocks/files/FilesStock.py
==============================================================================
--- trunk/bigboard/stocks/files/FilesStock.py (original)
+++ trunk/bigboard/stocks/files/FilesStock.py Mon Feb 4 18:27:02 2008
@@ -77,6 +77,7 @@
return self._source_key
def create_icon_link(self, themed=False):
+ _logger.debug("Creating icon link for %s" % (self.get_image_name(),))
link = IconLink(self.get_name(), themed=themed)
link.img.set_property('image-name', self.get_image_name())
link.link.connect("activated", lambda *args: self.emit('activated', link))
@@ -84,26 +85,48 @@
return link
class LocalFile(File):
- def __init__(self, bookmark_child):
+ def __init__(self, url, bookmark_child):
super(LocalFile, self).__init__()
- attrs = xml_get_attrs(bookmark_child, ['href', 'modified', 'visited'])
- self._url = attrs['href'].encode('utf-8')
+
+ self._url = url
+ self._source_key = 'files'
+ self._name = urllib.unquote(os.path.basename(url))
+ self._full_name = url
+ self._is_valid = True
+
+ self._access_time = -1
+ self.update(bookmark_child)
+
+ def update(self, bookmark_child):
+ attrs = xml_get_attrs(bookmark_child, [ 'modified', 'visited'])
+
+ changed = False
+
# google.parse_timestamp() just parses an RFC 3339 format timestamp,
# which 'modified' and 'visited' timestamps here use as well.
# We'll need to move that function to some more generic file.
modified = google.parse_timestamp(attrs['modified'])
visited = google.parse_timestamp(attrs['visited'])
- self._access_time = max(modified, visited)
- self._name = urllib.unquote(os.path.basename(self._url))
- self._full_name = self._url
- self._source_key = 'files'
- self._is_valid = True
- uri = gnomevfs.URI(self._url)
- if uri.is_local:
- self.__update_async(self.__on_async_update)
- else:
- self._is_valid = True
- self._image_name = gtk.STOCK_FILE
+
+ access_time = max(modified, visited)
+ if (self._access_time != access_time):
+ self._access_time = access_time
+
+ # We redo sniffing and thumbnailing each time the access time
+ # changes (and also initially). Really we should only do it
+ # when modified changed.
+
+ uri = gnomevfs.URI(self._url)
+ if uri.is_local:
+ self.__update_async(self.__on_async_update)
+ else:
+ self._is_valid = True
+ self._image_name = gtk.STOCK_FILE
+
+ changed = True
+
+ if changed:
+ self.emit("changed")
def __on_async_update(self, results):
_logger.debug("got async results: %s", results)
@@ -466,14 +489,27 @@
f = open(self.__recentf_path, 'r')
doc = xml.dom.minidom.parse(f)
- self.__remove_files_for_key('files')
+ old_files = {}
+ for f in self.__files:
+ if f.get_source_key() == 'files':
+ old_files[f.get_url()] = f
+
# we sort the list of files after we add them, so reversing doesn't
# really matter anymore
- for child in reversed(xml_query(doc.documentElement, 'bookmark*')):
- local_file = LocalFile(child)
- local_file.connect("changed", self.__on_local_file_changed)
- local_file.connect('activated', self.__on_file_activated)
- self.__files.append(local_file)
+ for child in reversed(xml_query(doc.documentElement, 'bookmark*')):
+ attrs = xml_get_attrs(child, ['href'])
+ url = attrs['href'].encode('utf-8')
+ if url in old_files:
+ old_file = old_files[url]
+ del old_files[url]
+ old_file.update(child)
+ else:
+ local_file = LocalFile(url, child)
+ local_file.connect("changed", self.__on_local_file_changed)
+ local_file.connect('activated', self.__on_file_activated)
+ self.__files.append(local_file)
+
+ self.__files = filter(lambda f: f.get_url() not in old_files, self.__files)
self.__files.sort(compare_by_date)
self.__refresh_files()
Modified: trunk/bigboard/stocks/workspaces/WorkspacesStock.py
==============================================================================
--- trunk/bigboard/stocks/workspaces/WorkspacesStock.py (original)
+++ trunk/bigboard/stocks/workspaces/WorkspacesStock.py Mon Feb 4 18:27:02 2008
@@ -188,6 +188,16 @@
screen.connect('active-window-changed', self.__on_active_window_changed)
screen.connect('window-stacking-changed', self.__on_window_stacking_changed)
screen.connect('showing-desktop-changed', self.__on_showing_desktop_changed)
+
+ self.connect('button-press-event', self.__on_button_press_event)
+
+ self.right_click_menu = gtk.Menu()
+ right_click_menuitem = gtk.MenuItem(label="_Settings", use_underline=True)
+ right_click_menuitem.connect('activate', self.__on_show_settings)
+ self.right_click_menu.append(right_click_menuitem)
+ right_click_menuitem.show()
+
+ self.dialog = None
def redraw(self):
self.emit_paint_needed(0, 0, -1, -1)
@@ -283,6 +293,21 @@
box.connect('button-press-event', switch_viewspace, viewspace)
return box
+ def __on_button_press_event(self, _, event):
+ # Right click?
+ if event.button == 3:
+ # Somehow event.time seems to be broken
+ self.right_click_menu.popup(None, None, None, event.button, gtk.get_current_event_time())
+ return True
+ return False
+
+ def __on_show_settings(self, _):
+ if (self.dialog):
+ self.dialog.present()
+ else:
+ self.dialog = WorkspacesConfigurationDialog()
+ self.dialog.show()
+
class WorkspacesStock(Stock):
"""Shows all workspaces."""
@@ -295,3 +320,56 @@
def get_content(self, size):
return self._box
+
+class WorkspacesConfigurationDialog(gtk.Window):
+ def __init__(self):
+ gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
+ self.set_title('Workspace configuration')
+
+ self.screen = wnck.screen_get_default()
+ self.screen.force_update()
+
+ vbox = gtk.VBox()
+
+ settinghbox = gtk.HBox()
+ settinglabel = gtk.Label("Number of workspaces:")
+ settinghbox.pack_start(settinglabel)
+ self.adjustment = gtk.Adjustment(self.screen.get_workspace_count(), 1, 100, 1, 2, 0)
+ self.adjustment.connect('value-changed', self.__on_value_changed)
+ self.old_value = self.screen.get_workspace_count()
+ self.spinbutton = gtk.SpinButton(self.adjustment, 1, 0)
+ settinghbox.pack_end(self.spinbutton)
+ vbox.pack_start(settinghbox)
+
+ buttonhbox = gtk.HButtonBox()
+ okbutton = gtk.Button(stock=gtk.STOCK_OK)
+ okbutton.connect('pressed', self.__on_ok_pressed)
+ buttonhbox.pack_end(okbutton)
+ cancelbutton = gtk.Button(stock=gtk.STOCK_CANCEL)
+ cancelbutton.connect('pressed', self.__on_cancel_pressed)
+ buttonhbox.pack_end(cancelbutton)
+
+ vbox.pack_end(buttonhbox)
+ vbox.pack_end(gtk.HSeparator())
+
+ self.add(vbox)
+ vbox.show_all()
+
+ self.connect('delete-event', self.__on_delete_event)
+
+ def __on_value_changed(self, adjustment):
+ self.screen.change_workspace_count(int(self.adjustment.get_value()))
+
+ def __on_cancel_pressed(self, button):
+ self.adjustment.set_value(self.old_value)
+ self.hide()
+
+ def __on_ok_pressed(self, button):
+ self.uninit()
+
+ def __on_delete_event(self, widget, event):
+ self.uninit()
+
+ def uninit(self):
+ self.old_value = self.screen.get_workspace_count()
+ self.hide()
Modified: trunk/main.py
==============================================================================
--- trunk/main.py (original)
+++ trunk/main.py Mon Feb 4 18:27:02 2008
@@ -815,22 +815,46 @@
pass
# TODO: figure out an algorithm for removing pixbufs from the cache
-_pixbufcache = {}
+_surfacecache = {}
+_mtimecache = {}
+def _get_mtime(filename):
+ try:
+ return os.stat(filename).st_mtime
+ except OSError:
+ return -1
+
def load_image_hook(img_name):
try:
- pixbuf = _pixbufcache[img_name]
+ surface = _surfacecache[img_name]
+ except KeyError, e:
+ surface = None
+
+ try:
+ mtime = _mtimecache[img_name]
+ new_mtime = _get_mtime(img_name)
+ if mtime != new_mtime:
+ surface = None
except KeyError, e:
- pixbuf = None
- if not pixbuf:
- if img_name.find(os.sep) >= 0:
- pixbuf = gtk.gdk.pixbuf_new_from_file(img_name)
- _logger.debug("loaded from file '%s': %s" % (img_name,pixbuf))
- else:
- theme = gtk.icon_theme_get_default()
- pixbuf = theme.load_icon(img_name, 60, gtk.ICON_LOOKUP_USE_BUILTIN)
- _logger.debug("loaded from icon theme '%s': %s" % (img_name,pixbuf))
- _pixbufcache[img_name] = pixbuf
- return hippo.cairo_surface_from_gdk_pixbuf(pixbuf)
+ pass
+
+ if not surface:
+ try:
+ if img_name.find(os.sep) >= 0:
+ pixbuf = gtk.gdk.pixbuf_new_from_file(img_name)
+ _logger.debug("loaded from file '%s': %s" % (img_name,pixbuf))
+ if pixbuf:
+ _mtimecache[img_name] = _get_mtime(img_name)
+ else:
+ theme = gtk.icon_theme_get_default()
+ pixbuf = theme.load_icon(img_name, 60, gtk.ICON_LOOKUP_USE_BUILTIN)
+ _logger.debug("loaded from icon theme '%s': %s" % (img_name,pixbuf))
+ except gobject.GError:
+ return None
+
+ surface = hippo.cairo_surface_from_gdk_pixbuf(pixbuf)
+ _surfacecache[img_name] = surface
+
+ return surface
def on_name_lost(*args):
name = str(args[0])
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]