Date: Friday, August 28, 2020 @ 21:26:48 Author: eschwartz Revision: 691292
upgpkg: calibre 4.23.0-2: backport workaround for FS#67690 Added: calibre/trunk/Dont-subclass-QLineEdit-in-QDateEdit.patch Modified: calibre/trunk/PKGBUILD --------------------------------------------+ Dont-subclass-QLineEdit-in-QDateEdit.patch | 180 +++++++++++++++++++++++++++ PKGBUILD | 7 - 2 files changed, 186 insertions(+), 1 deletion(-) Added: Dont-subclass-QLineEdit-in-QDateEdit.patch =================================================================== --- Dont-subclass-QLineEdit-in-QDateEdit.patch (rev 0) +++ Dont-subclass-QLineEdit-in-QDateEdit.patch 2020-08-28 21:26:48 UTC (rev 691292) @@ -0,0 +1,180 @@ +From 4dac21286af92d34f526848c9e5597ca0960a300 Mon Sep 17 00:00:00 2001 +From: Kovid Goyal <[email protected]> +Date: Tue, 25 Aug 2020 18:34:09 +0530 +Subject: [PATCH 1/2] Dont subclass QLineEdit in QDateEdit + +This causes crashed on Linux with accessibility enabled. Fixes #1892646 [Mysterious crash in Qt since bug #1885004 when clicking "Edit Metadata"](https://bugs.launchpad.net/calibre/+bug/1892646) + +(cherry picked from commit 35f770955e07c4b39c5d694bc070d820ad4996d7) + +# Conflicts: +# src/calibre/gui2/widgets2.py +--- + src/calibre/gui2/widgets2.py | 70 +++++++++++++++++------------------- + 1 file changed, 33 insertions(+), 37 deletions(-) + +diff --git a/src/calibre/gui2/widgets2.py b/src/calibre/gui2/widgets2.py +index 7feef8a2ef..d06b40c2db 100644 +--- a/src/calibre/gui2/widgets2.py ++++ b/src/calibre/gui2/widgets2.py +@@ -9,10 +9,10 @@ import weakref + from PyQt5.Qt import ( + QApplication, QByteArray, QCalendarWidget, QCheckBox, QColor, QColorDialog, + QComboBox, QDate, QDateTime, QDateTimeEdit, QDialog, QDialogButtonBox, QFont, +- QFontInfo, QFontMetrics, QIcon, QKeySequence, QLabel, QLayout, QLineEdit, QMenu, ++ QFontInfo, QFontMetrics, QIcon, QKeySequence, QLabel, QLayout, QMenu, + QMimeData, QPalette, QPixmap, QPoint, QPushButton, QRect, QScrollArea, QSize, + QSizePolicy, QStyle, QStyledItemDelegate, Qt, QTabWidget, QTextBrowser, +- QToolButton, QUndoCommand, QUndoStack, QWidget, pyqtSignal, pyqtSlot ++ QToolButton, QUndoCommand, QUndoStack, QWidget, pyqtSignal + ) + + from calibre.ebooks.metadata import rating_to_stars +@@ -128,12 +128,13 @@ def access_key(k): + return '' + + +-def populate_standard_spinbox_context_menu(spinbox, menu, add_clear=False): ++def populate_standard_spinbox_context_menu(spinbox, menu, add_clear=False, use_self_for_copy_actions=False): + m = menu + le = spinbox.lineEdit() +- m.addAction(_('Cu&t') + access_key(QKeySequence.Cut), le.cut).setEnabled(not le.isReadOnly() and le.hasSelectedText()) +- m.addAction(_('&Copy') + access_key(QKeySequence.Copy), le.copy).setEnabled(le.hasSelectedText()) +- m.addAction(_('&Paste') + access_key(QKeySequence.Paste), le.paste).setEnabled(not le.isReadOnly()) ++ ca = spinbox if use_self_for_copy_actions else le ++ m.addAction(_('Cu&t') + access_key(QKeySequence.Cut), ca.cut).setEnabled(not le.isReadOnly() and le.hasSelectedText()) ++ m.addAction(_('&Copy') + access_key(QKeySequence.Copy), ca.copy).setEnabled(le.hasSelectedText()) ++ m.addAction(_('&Paste') + access_key(QKeySequence.Paste), ca.paste).setEnabled(not le.isReadOnly()) + m.addAction(_('Delete') + access_key(QKeySequence.Delete), le.del_).setEnabled(not le.isReadOnly() and le.hasSelectedText()) + m.addSeparator() + m.addAction(_('Select &all') + access_key(QKeySequence.SelectAll), spinbox.selectAll) +@@ -557,25 +558,6 @@ def to_plain_text(self): + return ans.rstrip('\0') + + +-class LineEditForDateTimeEdit(QLineEdit): +- +- date_time_pasted = pyqtSignal(object) +- date_time_copied = pyqtSignal(object) +- MIME_TYPE = 'application/x-calibre-datetime-value' +- +- @pyqtSlot() +- def copy(self): +- self.date_time_copied.emit(self.selectedText()) +- +- @pyqtSlot() +- def paste(self): +- md = QApplication.instance().clipboard().mimeData() +- if md.hasFormat(self.MIME_TYPE): +- self.date_time_pasted.emit(QDateTime.fromString(md.data(self.MIME_TYPE).data().decode('ascii'), Qt.ISODate)) +- else: +- QLineEdit.paste(self) +- +- + class CalendarWidget(QCalendarWidget): + + def showEvent(self, ev): +@@ -585,12 +567,10 @@ class CalendarWidget(QCalendarWidget): + + class DateTimeEdit(QDateTimeEdit): + ++ MIME_TYPE = 'application/x-calibre-datetime-value' ++ + def __init__(self, parent=None): + QDateTimeEdit.__init__(self, parent) +- le = LineEditForDateTimeEdit(self) +- self.setLineEdit(le) +- le.date_time_pasted.connect(self.date_time_pasted, type=Qt.QueuedConnection) +- le.date_time_copied.connect(self.date_time_copied, type=Qt.QueuedConnection) + self.setMinimumDateTime(UNDEFINED_QDATETIME) + self.setCalendarPopup(True) + self.cw = CalendarWidget(self) +@@ -598,14 +578,27 @@ class DateTimeEdit(QDateTimeEdit): + self.setCalendarWidget(self.cw) + self.setSpecialValueText(_('Undefined')) + +- def date_time_copied(self, text): ++ @property ++ def mime_data_for_copy(self): + md = QMimeData() +- md.setText(text or self.dateTime().toString()) +- md.setData(LineEditForDateTimeEdit.MIME_TYPE, self.dateTime().toString(Qt.ISODate).encode('ascii')) ++ md.setText(self.dateTime().toString()) ++ md.setData(self.MIME_TYPE, self.dateTime().toString(Qt.ISODate).encode('ascii')) ++ return md ++ ++ def copy(self): ++ QApplication.instance().clipboard().setMimeData(self.mime_data_for_copy) ++ ++ def cut(self): ++ md = self.mime_data_for_copy ++ self.lineEdit().cut() + QApplication.instance().clipboard().setMimeData(md) + +- def date_time_pasted(self, qt_dt): +- self.setDateTime(qt_dt) ++ def paste(self): ++ md = QApplication.instance().clipboard().mimeData() ++ if md.hasFormat(self.MIME_TYPE): ++ self.setDateTime(QDateTime.fromString(md.data(self.MIME_TYPE).data().decode('ascii'), Qt.ISODate)) ++ else: ++ self.lineEdit().paste() + + def create_context_menu(self): + m = QMenu(self) +@@ -614,7 +607,7 @@ class DateTimeEdit(QDateTimeEdit): + m.addAction(_('Set date to today') + '\t' + QKeySequence(Qt.Key_Equal).toString(QKeySequence.NativeText), + self.today_date) + m.addSeparator() +- populate_standard_spinbox_context_menu(self, m) ++ populate_standard_spinbox_context_menu(self, m, use_self_for_copy_actions=True) + return m + + def contextMenuEvent(self, ev): +@@ -635,10 +628,13 @@ class DateTimeEdit(QDateTimeEdit): + self.today_date() + ev.accept() + elif ev.matches(QKeySequence.Copy): +- self.lineEdit().copy() ++ self.copy() ++ ev.accept() ++ elif ev.matches(QKeySequence.Cut): ++ self.cut() + ev.accept() + elif ev.matches(QKeySequence.Paste): +- self.lineEdit().paste() ++ self.paste() + ev.accept() + else: + return QDateTimeEdit.keyPressEvent(self, ev) +-- +2.28.0 + + +From 187eb99396d550e15ef4db2db47d08921d49875f Mon Sep 17 00:00:00 2001 +From: Kovid Goyal <[email protected]> +Date: Tue, 25 Aug 2020 18:43:10 +0530 +Subject: [PATCH 2/2] Copy should only copy selected text if there is any + +(cherry picked from commit 69a9ffadf523b871ec3eb4b645ef83ed6fd1a908) +--- + src/calibre/gui2/widgets2.py | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/calibre/gui2/widgets2.py b/src/calibre/gui2/widgets2.py +index d06b40c2db..facd910151 100644 +--- a/src/calibre/gui2/widgets2.py ++++ b/src/calibre/gui2/widgets2.py +@@ -581,7 +581,8 @@ class DateTimeEdit(QDateTimeEdit): + @property + def mime_data_for_copy(self): + md = QMimeData() +- md.setText(self.dateTime().toString()) ++ text = self.lineEdit().selectedText() ++ md.setText(text or self.dateTime().toString()) + md.setData(self.MIME_TYPE, self.dateTime().toString(Qt.ISODate).encode('ascii')) + return md + +-- +2.28.0 + Modified: PKGBUILD =================================================================== --- PKGBUILD 2020-08-28 20:57:21 UTC (rev 691291) +++ PKGBUILD 2020-08-28 21:26:48 UTC (rev 691292) @@ -9,7 +9,7 @@ pkgbase=calibre pkgname=('calibre' 'calibre-common' 'calibre-python3') pkgver=4.23.0 -pkgrel=1 +pkgrel=2 pkgdesc="Ebook management application" arch=('x86_64') url="https://calibre-ebook.com/" @@ -27,14 +27,17 @@ checkdepends=('xorg-server-xvfb') source=("https://download.calibre-ebook.com/${pkgver}/calibre-${pkgver}.tar.xz" "https://calibre-ebook.com/signatures/${pkgbase}-${pkgver}.tar.xz.sig" + "Dont-subclass-QLineEdit-in-QDateEdit.patch" "0001-De-vendor-pychm.patch" "calibre-alternatives.sh") sha256sums=('16de51473cf0e336f946a57251a1e4f4fbba1f857f17d8fc14aa132e7eb59518' 'SKIP' + 'fb451d9d845a291412f8c26d1f39699d56c70d955b128f32aeed223aedcbadf3' 'f7b829aea1d33818808cbeeb9a295e18e49edf619a5bc89b8315c88f56ce4d25' '940cc7081d0a64ba363bb0e1a1d8e0563c676458f90db845f2fbdd4195c075b3') b2sums=('3a950ac2b3aade547bb686cc99b963357e76b5931049ecb4a5e09ddaf1db26c74fa3b4ebd74e42d83f68c5c9827c534c0247a3c6a9b000641a778cfe5ac33599' 'SKIP' + '886e66191f63959b8bcc8b2de2b7c431260100f9f3b54dc0e5b7dbeae4ea908fda0d8dc75e1aa990edde79ae29d5ecd4d5a91a204914c208d0b40fa1cbdb2cf0' 'c35181c70084813772c4d593311b48b3e3bcc3b4e9e8ee58112b9beab2bbc0de1ee22aafc3d06cfd812f87a2e91292f7b7f1dc5f522c55440f415b6b265d5671' '543df218dfd2d4152a941ab57118d69bf4c6927e8020ee53c9a8b38efe9c89f032dc6385207e134cc9f69bfdc9cbcf63cd92fa6ea1647cbd534c5a511a5d1e91') validpgpkeys=('3CE1780F78DD88DF45194FD706BC317B515ACE7C') # Kovid Goyal (New longer key) <[email protected]> @@ -58,6 +61,8 @@ # devendor pychm now, from the py3 building branch: # https://github.com/kovidgoyal/calibre/commit/959b7e3fafff5faad6ae59263f825b23c7563dd4 patch -p1 -i ../0001-De-vendor-pychm.patch + # FS#67690 backport workaround for https://bugreports.qt.io/browse/QTBUG-86232 + patch -p1 -i ../Dont-subclass-QLineEdit-in-QDateEdit.patch cd resources
