diff options
author | Tomeu Vizoso <tomeu@tomeuvizoso.net> | 2008-09-03 17:06:31 (GMT) |
---|---|---|
committer | Tomeu Vizoso <tomeu@tomeuvizoso.net> | 2008-09-03 17:06:31 (GMT) |
commit | 23dfd1416e3f0396bbd9104e1a2edea7337d37d9 (patch) | |
tree | 61412dea1224e8e0748244eb7868085cf3cd322a /palettes.py | |
parent | cdac72a7af74bece599936efd2f2de7f8eff0152 (diff) |
#8256 Only put image in the clipboard when the image has been completely written
Diffstat (limited to 'palettes.py')
-rw-r--r-- | palettes.py | 54 |
1 files changed, 40 insertions, 14 deletions
diff --git a/palettes.py b/palettes.py index efab5fb..bae47a5 100644 --- a/palettes.py +++ b/palettes.py @@ -20,6 +20,7 @@ import urlparse from gettext import gettext as _ import gtk +import xpcom from xpcom import components from xpcom.components import interfaces @@ -134,7 +135,6 @@ class ImagePalette(Palette): Palette.__init__(self) self._url = url - self._temp_file = None self.props.primary_text = title self.props.secondary_text = url @@ -148,12 +148,6 @@ class ImagePalette(Palette): menu_item.show() def __copy_activate_cb(self, menu_item): - clipboard = gtk.Clipboard() - clipboard.set_with_data([('text/uri-list', 0, 0)], - self.__clipboard_get_func_cb, - self.__clipboard_clear_func_cb) - - def __clipboard_get_func_cb(self, clipboard, selection_data, info, data): file_name = os.path.basename(urlparse.urlparse(self._url).path) if '.' in file_name: base_name, extension = file_name.split('.') @@ -163,10 +157,10 @@ class ImagePalette(Palette): extension = '' temp_path = os.path.join(activity.get_activity_root(), 'instance') - fd, self._temp_file = tempfile.mkstemp(dir=temp_path, prefix=base_name, + fd, temp_file = tempfile.mkstemp(dir=temp_path, prefix=base_name, suffix=extension) os.close(fd) - os.chmod(self._temp_file, 0664) + os.chmod(temp_file, 0664) cls = components.classes['@mozilla.org/network/io-service;1'] io_service = cls.getService(interfaces.nsIIOService) @@ -174,17 +168,49 @@ class ImagePalette(Palette): cls = components.classes['@mozilla.org/file/local;1'] target_file = cls.createInstance(interfaces.nsILocalFile) - target_file.initWithPath(self._temp_file) + target_file.initWithPath(temp_file) cls = components.classes[ \ '@mozilla.org/embedding/browser/nsWebBrowserPersist;1'] persist = cls.createInstance(interfaces.nsIWebBrowserPersist) persist.persistFlags = 1 # PERSIST_FLAGS_FROM_CACHE + listener = xpcom.server.WrapObject(_ImageProgressListener(temp_file), + interfaces.nsIWebProgressListener) + persist.progressListener = listener persist.saveURI(uri, None, None, None, None, target_file) - selection_data.set_uris(['file://' + self._temp_file]) +class _ImageProgressListener(object): + _com_interfaces_ = interfaces.nsIWebProgressListener - def __clipboard_clear_func_cb(self, clipboard, data): - if os.path.exists(self._temp_file): - os.remove(self._temp_file) + def __init__(self, temp_file): + self._temp_file = temp_file + + def onLocationChange(self, webProgress, request, location): + pass + + def onProgressChange(self, webProgress, request, curSelfProgress, + maxSelfProgress, curTotalProgress, maxTotalProgress): + pass + + def onSecurityChange(self, webProgress, request, state): + pass + + def onStatusChange(self, webProgress, request, status, message): + pass + + def onStateChange(self, webProgress, request, stateFlags, status): + if stateFlags & interfaces.nsIWebProgressListener.STATE_IS_REQUEST and \ + stateFlags & interfaces.nsIWebProgressListener.STATE_STOP: + clipboard = gtk.Clipboard() + clipboard.set_with_data([('text/uri-list', 0, 0)], + _clipboard_get_func_cb, + _clipboard_clear_func_cb, + self._temp_file) + +def _clipboard_get_func_cb(clipboard, selection_data, info, temp_file): + selection_data.set_uris(['file://' + temp_file]) + +def _clipboard_clear_func_cb(clipboard, temp_file): + if os.path.exists(temp_file): + os.remove(temp_file) |