From 1483703aa02e5ca1e25254da8c89ea514a414374 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 30 Jun 2010 23:21:59 -0600 Subject: [PATCH] Set correct LD_LIBRARY_PATH onlinux before launching urls --- src/calibre/__init__.py | 7 ------ src/calibre/gui2/__init__.py | 28 ++++++++++++++++----- src/calibre/gui2/actions.py | 25 +++++++----------- src/calibre/gui2/book_details.py | 6 ++--- src/calibre/gui2/dialogs/book_info.py | 13 +++++----- src/calibre/gui2/dialogs/config/__init__.py | 11 ++++---- src/calibre/gui2/dialogs/user_profiles.py | 6 ++--- src/calibre/gui2/ui.py | 8 +++--- src/calibre/gui2/update.py | 6 ++--- src/calibre/gui2/viewer/main.py | 6 ++--- 10 files changed, 60 insertions(+), 56 deletions(-) diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index 285b2d35b4..92ee2ca6d2 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -342,13 +342,6 @@ def detect_ncpus(): return ans -def launch(path_or_url): - from PyQt4.QtCore import QUrl - from PyQt4.QtGui import QDesktopServices - if os.path.exists(path_or_url): - path_or_url = 'file:'+path_or_url - QDesktopServices.openUrl(QUrl(path_or_url)) - relpath = os.path.relpath _spat = re.compile(r'^the\s+|^a\s+|^an\s+', re.IGNORECASE) def english_sort(x, y): diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index f286402a37..9face1d9e9 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -1,18 +1,18 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' """ The GUI """ -import os +import os, sys from threading import RLock -from PyQt4.QtCore import QVariant, QFileInfo, QObject, SIGNAL, QBuffer, Qt, QSize, \ +from PyQt4.Qt import QVariant, QFileInfo, QObject, SIGNAL, QBuffer, Qt, QSize, \ QByteArray, QTranslator, QCoreApplication, QThread, \ - QEvent, QTimer, pyqtSignal, QDate -from PyQt4.QtGui import QFileDialog, QMessageBox, QPixmap, QFileIconProvider, \ - QIcon, QApplication, QDialog, QPushButton + QEvent, QTimer, pyqtSignal, QDate, QDesktopServices, \ + QFileDialog, QMessageBox, QPixmap, QFileIconProvider, \ + QIcon, QApplication, QDialog, QPushButton, QUrl ORG_NAME = 'KovidsBrain' APP_UID = 'libprs500' -from calibre import islinux, iswindows, isosx, isfreebsd +from calibre.constants import islinux, iswindows, isosx, isfreebsd, isfrozen from calibre.utils.config import Config, ConfigProxy, dynamic, JSONConfig from calibre.utils.localization import set_qt_translator from calibre.ebooks.metadata.meta import get_metadata, metadata_from_formats @@ -579,6 +579,22 @@ class Application(QApplication): _store_app = None +def open_url(qurl): + paths = os.environ.get('LD_LIBRARY_PATH', + '').split(os.pathsep) + paths = [x for x in paths if x] + if isfrozen and islinux and paths: + npaths = [x for x in paths if x != sys.frozen_path] + os.environ['LD_LIBRARY_PATH'] = os.pathsep.join(npaths) + QDesktopServices.openUrl(qurl) + if isfrozen and islinux and paths: + os.environ['LD_LIBRARY_PATH'] = os.pathsep.join(paths) + + +def open_local_file(path): + url = QUrl.fromLocalFile(path) + open_url(url) + def is_ok_to_use_qt(): global gui_thread, _store_app if (islinux or isfreebsd) and ':' not in os.environ.get('DISPLAY', ''): diff --git a/src/calibre/gui2/actions.py b/src/calibre/gui2/actions.py index 5dde2f745b..f36df397f9 100644 --- a/src/calibre/gui2/actions.py +++ b/src/calibre/gui2/actions.py @@ -5,17 +5,18 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import shutil, os, datetime, sys, time +import shutil, os, datetime, time from functools import partial from PyQt4.Qt import QInputDialog, pyqtSignal, QModelIndex, QThread, Qt, \ - SIGNAL, QPixmap, QTimer, QDesktopServices, QUrl, QDialog + SIGNAL, QPixmap, QTimer, QDialog from calibre import strftime from calibre.ptempfile import PersistentTemporaryFile from calibre.utils.config import prefs, dynamic from calibre.gui2 import error_dialog, Dispatcher, gprefs, choose_files, \ - choose_dir, warning_dialog, info_dialog, question_dialog, config + choose_dir, warning_dialog, info_dialog, question_dialog, config, \ + open_local_file from calibre.ebooks.BeautifulSoup import BeautifulSoup, Tag, NavigableString from calibre.utils.filenames import ascii_filename from calibre.gui2.widgets import IMAGE_EXTENSIONS @@ -25,7 +26,7 @@ from calibre.gui2.dialogs.tag_list_editor import TagListEditor from calibre.gui2.tools import convert_single_ebook, convert_bulk_ebook, \ fetch_scheduled_recipe, generate_catalog from calibre.constants import preferred_encoding, filesystem_encoding, \ - isosx, isfrozen, islinux + isosx from calibre.gui2.dialogs.choose_format import ChooseFormatDialog from calibre.ebooks import BOOK_EXTENSIONS from calibre.gui2.dialogs.confirm_delete import confirm @@ -920,7 +921,7 @@ class SaveToDiskAction(object): # {{{ _('Could not save some books') + ', ' + _('Click the show details button to see which ones.'), u'\n\n'.join(failures), show=True) - QDesktopServices.openUrl(QUrl.fromLocalFile(path)) + open_local_file(path) def books_saved(self, job): if job.failed: @@ -1186,15 +1187,7 @@ class ViewAction(object): # {{{ self.job_manager.launch_gui_app(viewer, kwargs=dict(args=args)) else: - paths = os.environ.get('LD_LIBRARY_PATH', - '').split(os.pathsep) - paths = [x for x in paths if x] - if isfrozen and islinux and paths: - npaths = [x for x in paths if x != sys.frozen_path] - os.environ['LD_LIBRARY_PATH'] = os.pathsep.join(npaths) - QDesktopServices.openUrl(QUrl.fromLocalFile(name))#launch(name) - if isfrozen and islinux and paths: - os.environ['LD_LIBRARY_PATH'] = os.pathsep.join(paths) + open_local_file(name) time.sleep(2) # User feedback finally: self.unsetCursor() @@ -1240,11 +1233,11 @@ class ViewAction(object): # {{{ return for row in rows: path = self.library_view.model().db.abspath(row.row()) - QDesktopServices.openUrl(QUrl.fromLocalFile(path)) + open_local_file(path) def view_folder_for_id(self, id_): path = self.library_view.model().db.abspath(id_, index_is_id=True) - QDesktopServices.openUrl(QUrl.fromLocalFile(path)) + open_local_file(path) def view_book(self, triggered): rows = self.current_view().selectionModel().selectedRows() diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index 4deadbc857..f08dd09429 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -9,14 +9,14 @@ import os, collections from PyQt4.Qt import QLabel, QPixmap, QSize, QWidget, Qt, pyqtSignal, \ QVBoxLayout, QScrollArea, QPropertyAnimation, QEasingCurve, \ - QSizePolicy, QPainter, QRect, pyqtProperty, QDesktopServices, QUrl + QSizePolicy, QPainter, QRect, pyqtProperty from calibre import fit_image, prepare_string_for_xml from calibre.gui2.widgets import IMAGE_EXTENSIONS from calibre.ebooks import BOOK_EXTENSIONS from calibre.constants import preferred_encoding from calibre.library.comments import comments_to_html -from calibre.gui2 import config +from calibre.gui2 import config, open_local_file # render_rows(data) {{{ WEIGHTS = collections.defaultdict(lambda : 100) @@ -294,7 +294,7 @@ class BookDetails(QWidget): # {{{ id_, fmt = val.split(':') self.view_specific_format.emit(int(id_), fmt) elif typ == 'devpath': - QDesktopServices.openUrl(QUrl.fromLocalFile(val)) + open_local_file(val) def mouseReleaseEvent(self, ev): diff --git a/src/calibre/gui2/dialogs/book_info.py b/src/calibre/gui2/dialogs/book_info.py index 20ddfae0b4..9770ef864f 100644 --- a/src/calibre/gui2/dialogs/book_info.py +++ b/src/calibre/gui2/dialogs/book_info.py @@ -5,11 +5,11 @@ __docformat__ = 'restructuredtext en' import textwrap, os, re -from PyQt4.QtCore import QCoreApplication, SIGNAL, QModelIndex, QUrl, QTimer, Qt -from PyQt4.QtGui import QDialog, QPixmap, QGraphicsScene, QIcon, QDesktopServices +from PyQt4.QtCore import QCoreApplication, SIGNAL, QModelIndex, QTimer, Qt +from PyQt4.QtGui import QDialog, QPixmap, QGraphicsScene, QIcon from calibre.gui2.dialogs.book_info_ui import Ui_BookInfo -from calibre.gui2 import dynamic +from calibre.gui2 import dynamic, open_local_file from calibre import fit_image from calibre.library.comments import comments_to_html @@ -49,12 +49,12 @@ class BookInfo(QDialog, Ui_BookInfo): def open_book_path(self, path): if os.sep in unicode(path): - QDesktopServices.openUrl(QUrl.fromLocalFile(path)) + open_local_file(path) else: format = unicode(path) path = self.view.model().db.format_abspath(self.current_row, format) if path is not None: - QDesktopServices.openUrl(QUrl.fromLocalFile(path)) + open_local_file(path) def next(self): @@ -123,6 +123,7 @@ class BookInfo(QDialog, Ui_BookInfo): for key in info.keys(): if key == 'id': continue txt = info[key] - txt = u'
\n'.join(textwrap.wrap(txt, 120)) + if key != _('Path'): + txt = u'
\n'.join(textwrap.wrap(txt, 120)) rows += u'%s:%s'%(key, txt) self.text.setText(u''+rows+'
') diff --git a/src/calibre/gui2/dialogs/config/__init__.py b/src/calibre/gui2/dialogs/config/__init__.py index f17c0083ec..144d8f8586 100644 --- a/src/calibre/gui2/dialogs/config/__init__.py +++ b/src/calibre/gui2/dialogs/config/__init__.py @@ -4,7 +4,7 @@ __copyright__ = '2008, Kovid Goyal ' import os, re, time, textwrap, copy, sys from PyQt4.Qt import QDialog, QListWidgetItem, QIcon, \ - QDesktopServices, QVBoxLayout, QLabel, QPlainTextEdit, \ + QVBoxLayout, QLabel, QPlainTextEdit, \ QStringListModel, QAbstractItemModel, QFont, \ SIGNAL, QThread, Qt, QSize, QVariant, QUrl, \ QModelIndex, QAbstractTableModel, \ @@ -15,8 +15,9 @@ from calibre.constants import iswindows, isosx from calibre.gui2.dialogs.config.config_ui import Ui_Dialog from calibre.gui2.dialogs.config.create_custom_column import CreateCustomColumn from calibre.gui2 import choose_dir, error_dialog, config, gprefs, \ - ALL_COLUMNS, NONE, info_dialog, choose_files, \ - warning_dialog, ResizableDialog, question_dialog + open_url, open_local_file, \ + ALL_COLUMNS, NONE, info_dialog, choose_files, \ + warning_dialog, ResizableDialog, question_dialog from calibre.utils.config import prefs from calibre.ebooks import BOOK_EXTENSIONS from calibre.ebooks.oeb.iterator import is_supported @@ -512,7 +513,7 @@ class ConfigDialog(ResizableDialog, Ui_Dialog): def open_config_dir(self): from calibre.utils.config import config_dir - QDesktopServices.openUrl(QUrl.fromLocalFile(config_dir)) + open_local_file(config_dir) def create_symlinks(self): from calibre.utils.osx_symlinks import create_symlinks @@ -805,7 +806,7 @@ class ConfigDialog(ResizableDialog, Ui_Dialog): self.stop.setEnabled(False) def test_server(self): - QDesktopServices.openUrl(QUrl('http://127.0.0.1:'+str(self.port.value()))) + open_url(QUrl('http://127.0.0.1:'+str(self.port.value()))) def compact(self, toggled): d = CheckIntegrity(self.db, self) diff --git a/src/calibre/gui2/dialogs/user_profiles.py b/src/calibre/gui2/dialogs/user_profiles.py index 7b26fea0ae..16f5d383ed 100644 --- a/src/calibre/gui2/dialogs/user_profiles.py +++ b/src/calibre/gui2/dialogs/user_profiles.py @@ -3,13 +3,13 @@ __copyright__ = '2008, Kovid Goyal ' import time, os -from PyQt4.Qt import SIGNAL, QUrl, QDesktopServices, QAbstractListModel, Qt, \ +from PyQt4.Qt import SIGNAL, QUrl, QAbstractListModel, Qt, \ QVariant, QInputDialog from calibre.web.feeds.recipes import compile_recipe from calibre.web.feeds.news import AutomaticNewsRecipe from calibre.gui2.dialogs.user_profiles_ui import Ui_Dialog -from calibre.gui2 import error_dialog, question_dialog, \ +from calibre.gui2 import error_dialog, question_dialog, open_url, \ choose_files, ResizableDialog, NONE from calibre.gui2.widgets import PythonHighlighter from calibre.ptempfile import PersistentTemporaryFile @@ -135,7 +135,7 @@ class UserProfiles(ResizableDialog, Ui_Dialog): url.addQueryItem('subject', subject) url.addQueryItem('body', body) url.addQueryItem('attachment', pt.name) - QDesktopServices.openUrl(url) + open_url(url) def current_changed(self, current, previous): diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index 16a754fab7..756e375e23 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -12,9 +12,9 @@ __docformat__ = 'restructuredtext en' import collections, os, sys, textwrap, time from Queue import Queue, Empty from threading import Thread -from PyQt4.Qt import Qt, SIGNAL, QObject, QUrl, QTimer, \ +from PyQt4.Qt import Qt, SIGNAL, QObject, QTimer, \ QPixmap, QMenu, QIcon, pyqtSignal, \ - QDialog, QDesktopServices, \ + QDialog, \ QSystemTrayIcon, QApplication, QKeySequence, QAction, \ QMessageBox, QHelpEvent @@ -23,7 +23,7 @@ from calibre.constants import __version__, __appname__, isosx from calibre.ptempfile import PersistentTemporaryFile from calibre.utils.config import prefs, dynamic from calibre.utils.ipc.server import Server -from calibre.gui2 import error_dialog, GetMetadata, \ +from calibre.gui2 import error_dialog, GetMetadata, open_local_file, \ gprefs, max_available_height, config, info_dialog from calibre.gui2.cover_flow import CoverFlowMixin from calibre.gui2.widgets import ProgressIndicator @@ -572,7 +572,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceMixin, ToolbarMixin, # {{{ pt = PersistentTemporaryFile('_donate.htm') pt.write(HTML.encode('utf-8')) pt.close() - QDesktopServices.openUrl(QUrl.fromLocalFile(pt.name)) + open_local_file(pt.name) def confirm_quit(self): diff --git a/src/calibre/gui2/update.py b/src/calibre/gui2/update.py index 9dcd4d9084..84168d17b5 100644 --- a/src/calibre/gui2/update.py +++ b/src/calibre/gui2/update.py @@ -3,13 +3,13 @@ __copyright__ = '2008, Kovid Goyal ' import traceback -from PyQt4.Qt import QThread, pyqtSignal, QDesktopServices, QUrl, Qt +from PyQt4.Qt import QThread, pyqtSignal, Qt, QUrl import mechanize from calibre.constants import __appname__, __version__, iswindows, isosx from calibre import browser from calibre.utils.config import prefs -from calibre.gui2 import config, dynamic, question_dialog +from calibre.gui2 import config, dynamic, question_dialog, open_url URL = 'http://status.calibre-ebook.com/latest' @@ -64,7 +64,7 @@ class UpdateMixin(object): 'ge?')%(__appname__, version)): url = 'http://calibre-ebook.com/download_'+\ ('windows' if iswindows else 'osx' if isosx else 'linux') - QDesktopServices.openUrl(QUrl(url)) + open_url(QUrl(url)) dynamic.set('update to version %s'%version, False) diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py index fca3586f9d..ec88c3f886 100644 --- a/src/calibre/gui2/viewer/main.py +++ b/src/calibre/gui2/viewer/main.py @@ -6,7 +6,7 @@ from functools import partial from threading import Thread from PyQt4.Qt import QApplication, Qt, QIcon, QTimer, SIGNAL, QByteArray, \ - QDesktopServices, QDoubleSpinBox, QLabel, QTextBrowser, \ + QDoubleSpinBox, QLabel, QTextBrowser, \ QPainter, QBrush, QColor, QStandardItemModel, QPalette, \ QStandardItem, QUrl, QRegExpValidator, QRegExp, QLineEdit, \ QToolButton, QMenu, QInputDialog, QAction, QKeySequence @@ -17,7 +17,7 @@ from calibre.gui2.viewer.bookmarkmanager import BookmarkManager from calibre.gui2.widgets import ProgressIndicator from calibre.gui2.main_window import MainWindow from calibre.gui2 import Application, ORG_NAME, APP_UID, choose_files, \ - info_dialog, error_dialog + info_dialog, error_dialog, open_url from calibre.ebooks.oeb.iterator import EbookIterator from calibre.ebooks import DRMError from calibre.constants import islinux, isfreebsd @@ -472,7 +472,7 @@ class EbookViewer(MainWindow, Ui_EbookViewer): elif frag: self.view.scroll_to(frag) else: - QDesktopServices.openUrl(url) + open_url(url) def load_started(self): self.open_progress_indicator(_('Loading flow...'))