summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbdunahu <bdunahu@operationnull.com>2026-03-03 13:49:11 -0500
committerNguyễn Gia Phong <cnx@loang.net>2026-04-02 13:09:56 +0900
commit7c8cb33b980c4bc93fdf67e36a0eaf05d94ea833 (patch)
tree2b61c07d27c921c4b34b3f43dadb8a78222f5472
parentbd0bba7440dfd1074da63e68fd8f3890eef3ec5b (diff)
gnu: nheko: Apply patch to render message replies properly.
* gnu/packages/patches/nheko-0-12-1-fix-rendering-replies.patch: New file. * gnu/packages/messaging.scm (nheko)[source]: Apply it. * gnu/local.mk: (dist_patch_DATA): Register it. Change-Id: I262b8054e9ef6365450c8f89a69d60e4200f996f Merges: https://codeberg.org/guix/guix/pulls/6853 Signed-off-by: Nguyễn Gia Phong <cnx@loang.net>
-rw-r--r--gnu/local.mk1
-rw-r--r--gnu/packages/messaging.scm6
-rw-r--r--gnu/packages/patches/nheko-0-12-1-fix-rendering-replies.patch290
3 files changed, 296 insertions, 1 deletions
diff --git a/gnu/local.mk b/gnu/local.mk
index 22f86c64fc2..d22961f84eb 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1975,6 +1975,7 @@ dist_patch_DATA = \
%D%/packages/patches/netsurf-y2038-tests.patch \
%D%/packages/patches/netsurf-longer-test-timeout.patch \
%D%/packages/patches/nhc98-c-update.patch \
+ %D%/packages/patches/nheko-0-12-1-fix-rendering-replies.patch \
%D%/packages/patches/nix-dont-build-html-doc.diff \
%D%/packages/patches/nfs4-acl-tools-0.3.7-fixpaths.patch \
%D%/packages/patches/network-manager-plugin-ownership.patch \
diff --git a/gnu/packages/messaging.scm b/gnu/packages/messaging.scm
index d299005cce7..4e8e43b08d6 100644
--- a/gnu/packages/messaging.scm
+++ b/gnu/packages/messaging.scm
@@ -2356,7 +2356,11 @@ for the Matrix protocol. It is built on to of @code{Boost.Asio}.")
(sha256
(base32 "098jqccwsfbqkdpnhbych2rd076385wb51fx9qyjfiddidxv2mas"))
(modules '((guix build utils)))
- (snippet '(delete-file-recursively "third_party"))))
+ (snippet '(delete-file-recursively "third_party"))
+ ;; Release 0.12.1 has a major bug which prevents replies
+ ;; from rendering: https://github.com/Nheko-Reborn/nheko/issues/1944
+ ;; TODO: revaluate for future versions.
+ (patches (search-patches "nheko-0-12-1-fix-rendering-replies.patch"))))
(arguments
(list
#:tests? #f ;no test target
diff --git a/gnu/packages/patches/nheko-0-12-1-fix-rendering-replies.patch b/gnu/packages/patches/nheko-0-12-1-fix-rendering-replies.patch
new file mode 100644
index 00000000000..326e7b52854
--- /dev/null
+++ b/gnu/packages/patches/nheko-0-12-1-fix-rendering-replies.patch
@@ -0,0 +1,290 @@
+From 2769642d3c7bd3c0d830b2f18ef6b3bf6a710bf4 Mon Sep 17 00:00:00 2001
+From: Nicolas Werner <nicolas.werner@hotmail.de>
+Date: Sun, 14 Sep 2025 23:43:20 +0200
+Subject: [PATCH] Fix most reply rendering issues with qt 6.9.2
+
+---
+ resources/qml/TimelineBubbleMessageStyle.qml | 31 ++++----
+ resources/qml/TimelineDefaultMessageStyle.qml | 32 ++++-----
+ resources/qml/TopBar.qml | 2 +-
+ resources/qml/delegates/Reply.qml | 70 ++++++++++---------
+ 4 files changed, 65 insertions(+), 70 deletions(-)
+
+diff --git a/resources/qml/TimelineBubbleMessageStyle.qml b/resources/qml/TimelineBubbleMessageStyle.qml
+index 560cb1338..722718bc4 100644
+--- a/resources/qml/TimelineBubbleMessageStyle.qml
++++ b/resources/qml/TimelineBubbleMessageStyle.qml
+@@ -210,9 +210,10 @@ TimelineEvent {
+
+ AbstractButton {
+ id: replyRow
+- visible: wrapper.reply
++ visible: wrapper.replyTo
++
++ leftPadding: Nheko.paddingSmall + 4
+
+- height: replyLine.height
+ anchors.left: parent.left
+ anchors.right: parent.right
+
+@@ -225,19 +226,7 @@ TimelineEvent {
+ cursorShape: Qt.PointingHandCursor
+ }
+
+- contentItem: Row {
+- id: replyRowLay
+-
+- spacing: Nheko.paddingSmall
+-
+- Rectangle {
+- id: replyLine
+- height: Math.min( wrapper.reply?.height, timelineView.height / 10) + Nheko.paddingSmall + replyUserButton.height
+- color: replyRow.userColor
+- width: 4
+- }
+-
+- Column {
++ contentItem: Column {
+ spacing: 0
+
+ id: replyCol
+@@ -247,7 +236,7 @@ TimelineEvent {
+
+ contentItem: Label {
+ id: userName_
+- text: wrapper.reply?.userName ?? ''
++ text: wrapper.reply?.userName ?? 'missing name'
+ color: replyRow.userColor
+ textFormat: Text.RichText
+ width: wrapper.maxWidth
+@@ -259,12 +248,20 @@ TimelineEvent {
+ replyUserButton,
+ wrapper.reply,
+ ]
+- }
+ }
+
+ background: Rectangle {
+ //width: replyRow.implicitContentWidth
+ color: Qt.tint(palette.base, Qt.hsla(replyRow.userColor.hslHue, 0.5, replyRow.userColor.hslLightness, 0.1))
++ Rectangle {
++ anchors.top: parent.top
++ anchors.bottom: parent.bottom
++ anchors.left: parent.left
++
++ id: replyLine
++ color: replyRow.userColor
++ width: 4
++ }
+ }
+
+ onClicked: {
+diff --git a/resources/qml/TimelineDefaultMessageStyle.qml b/resources/qml/TimelineDefaultMessageStyle.qml
+index 2bc0171a8..49454ac0b 100644
+--- a/resources/qml/TimelineDefaultMessageStyle.qml
++++ b/resources/qml/TimelineDefaultMessageStyle.qml
+@@ -192,9 +192,9 @@ TimelineEvent {
+
+ AbstractButton {
+ id: replyRow
+- visible: wrapper.reply
++ visible: wrapper.replyTo
+
+- height: replyLine.height
++ leftPadding: Nheko.paddingSmall + 4
+
+ property color userColor: TimelineManager.userColor(wrapper.reply?.userId ?? '', palette.base)
+
+@@ -205,19 +205,7 @@ TimelineEvent {
+ cursorShape: Qt.PointingHandCursor
+ }
+
+- contentItem: Row {
+- id: replyRowLay
+-
+- spacing: Nheko.paddingSmall
+-
+- Rectangle {
+- id: replyLine
+- height: Math.min( wrapper.reply?.height, timelineView.height / 10) + Nheko.paddingSmall + replyUserButton.height
+- color: replyRow.userColor
+- width: 4
+- }
+-
+- Column {
++ contentItem: Column {
+ spacing: 0
+
+ id: replyCol
+@@ -227,7 +215,7 @@ TimelineEvent {
+
+ contentItem: Label {
+ id: userName_
+- text: wrapper.reply?.userName ?? ''
++ text: wrapper.reply?.userName ?? 'missing name'
+ color: replyRow.userColor
+ textFormat: Text.RichText
+ width: wrapper.maxWidth
+@@ -239,12 +227,20 @@ TimelineEvent {
+ replyUserButton,
+ wrapper.reply,
+ ]
+- }
+ }
+
+ background: Rectangle {
+- //width: replyRow.implicitContentWidth
+ color: Qt.tint(palette.base, Qt.hsla(replyRow.userColor.hslHue, 0.5, replyRow.userColor.hslLightness, 0.1))
++
++ Rectangle {
++ anchors.top: parent.top
++ anchors.bottom: parent.bottom
++ anchors.left: parent.left
++
++ id: replyLine
++ color: replyRow.userColor
++ width: 4
++ }
+ }
+
+ onClicked: {
+diff --git a/resources/qml/TopBar.qml b/resources/qml/TopBar.qml
+index 900e59e8b..cd20e94ec 100644
+--- a/resources/qml/TopBar.qml
++++ b/resources/qml/TopBar.qml
+@@ -330,7 +330,7 @@ Pane {
+ ImageButton {
+ id: deletePinButton
+
+- Layout.alignment: Qt.AlignTop | Qt.AlignLeft
++ Layout.alignment: Qt.AlignTop | Qt.AlignRight
+ Layout.preferredHeight: 16
+ Layout.preferredWidth: 16
+ ToolTip.text: qsTr("Unpin")
+diff --git a/resources/qml/delegates/Reply.qml b/resources/qml/delegates/Reply.qml
+index 7ee2a0a14..77cad0f0a 100644
+--- a/resources/qml/delegates/Reply.qml
++++ b/resources/qml/delegates/Reply.qml
+@@ -5,6 +5,7 @@
+ import QtQuick
+ import QtQuick.Controls
+ import QtQuick.Window
++import QtQuick.Layouts
+ import im.nheko
+ import "../"
+
+@@ -21,7 +22,11 @@ AbstractButton {
+ property string userId: eventId ? room.dataById(eventId, Room.UserId, "") : ""
+ property string userName: eventId ? room.dataById(eventId, Room.UserName, "") : ""
+ implicitHeight: replyContainer.height
+- implicitWidth: replyContainer.implicitWidth
++ implicitWidth: replyContainer.implicitWidth + leftPadding + rightPadding
++
++ leftPadding: 4 + Nheko.paddingSmall
++ rightPadding: Nheko.paddingSmall
++
+ required property int maxWidth
+ property bool limitHeight: false
+
+@@ -31,14 +36,14 @@ AbstractButton {
+ }
+
+ onClicked: {
+- let link = reply.child.linkAt != undefined && reply.child.linkAt(pressX-colorline.width, pressY - userName_.implicitHeight);
++ let link = timelineEvent.main.linkAt != undefined && timelineEvent.main.linkAt(pressX-colorline.width, pressY - userName_.implicitHeight);
+ if (link) {
+ Nheko.openLink(link)
+ } else {
+ room.showEvent(r.eventId)
+ }
+ }
+- onPressAndHold: replyContextMenu.show(reply.child.copyText, reply.child.linkAt(pressX-colorline.width, pressY - userName_.implicitHeight), r.eventId)
++ onPressAndHold: replyContextMenu.show(timelineEvent.main.copyText, timelineEvent.main.linkAt(pressX-colorline.width, pressY - userName_.implicitHeight), r.eventId)
+
+ contentItem: TimelineEvent {
+ id: timelineEvent
+@@ -51,49 +56,36 @@ AbstractButton {
+ maxWidth: r.maxWidth
+ limitAsReply: r.limitHeight
+
+- //height: replyContainer.implicitHeight
+- data: Row {
++ data: Column {
+ id: replyContainer
+-
+- spacing: Nheko.paddingSmall
++ spacing: 0
+
+ clip: r.limitHeight
+
+ height: r.limitHeight ? Math.min( timelineEvent.main?.height, timelineView.height / 10) + Nheko.paddingSmall + usernameBtn.height : undefined
+
+- Rectangle {
+- id: colorline
+-
+- width: 4
+- height: content.height
+-
+- color: TimelineManager.userColor(r.userId, palette.base)
+- }
+-
+- Column {
+- id: content
+- spacing: 0
++ // FIXME: I have no idea, why this name doesn't render in the reply popup on Qt 6.9.2
++ AbstractButton {
++ id: usernameBtn
+
+- AbstractButton {
+- id: usernameBtn
++ visible: r.eventId
+
+-
+- contentItem: Label {
+- id: userName_
+- text: r.userName
+- color: r.userColor
+- textFormat: Text.RichText
+- width: timelineEvent.main?.width
+- }
+- onClicked: room.openUserProfile(r.userId)
++ contentItem: Label {
++ visible: r.eventId
++ id: userName_
++ text: r.userName
++ color: r.userColor
++ textFormat: Text.RichText
++ width: timelineEvent.main?.width
+ }
+-
+- data: [
+- usernameBtn, timelineEvent.main,
+- ]
++ onClicked: room.openUserProfile(r.userId)
+ }
+
++ data: [
++ usernameBtn, timelineEvent.main,
++ ]
+ }
++
+ }
+
+ background: Rectangle {
+@@ -103,6 +95,16 @@ AbstractButton {
+ property color userColor: TimelineManager.userColor(r.userId, palette.base)
+ property color bgColor: palette.base
+ color: Qt.tint(bgColor, Qt.hsla(userColor.hslHue, 0.5, userColor.hslLightness, 0.1))
++
++ Rectangle {
++ anchors.top: parent.top
++ anchors.bottom: parent.bottom
++ anchors.left: parent.left
++
++ id: colorline
++ color: backgroundItem.userColor
++ width: 4
++ }
+ }
+
+ }