Search code examples
gnome-shellgnome-shell-extensionsgjs

Showing more than one line of the notification description in the notification tray using an extension


I am currently designing an extension to make the notifications in the notification section of the calendar expendable. The goal is to make the noficiation expand like the initial notification on the desktop does. I have changed the type of notification added to the noficiation tray to class NotificationBanner from class NotificationMessage. I am currently using a work-around to make this work, this is what my expand function looks like:

expand(animate) {
        this.expanded = true;
        this._actionBin.visible = this._actionBin.get_n_children() > 0;
        if (this._bodyStack.get_n_children() < 2) {
            this._expandedLabel = new MessageList.URLHighlighter(this._bodyText,
                true, this._useBodyMarkup);
            this.setExpandedBody(this._expandedLabel);
        }
        if (animate) {
            if (!this.clickedByButton && !this.forceExpansion) {
                // This is the usual way notifications are expanded, using the layout manager
                this._bodyStack.ease_property('@layout.expansion', 1, {
                    progress_mode: Clutter.AnimationMode.EASE_OUT_QUAD,
                    duration: MessageTray.ANIMATION_TIME,
                });
            }
            else if (this.forceExpansion || this.clickedByButton) {
                // When auto expanding or clicked by button, change height of body 
                oldHeight = this.bodyLabel.get_height();
                const lines = Math.ceil(this._bodyText.length / 54);
                this.bodyLabel.set_height(lines * this.bodyLabel.get_height());
            }
            this._actionBin.scale_y = 0;
            this._actionBin.ease({
                scale_y: 1,
                duration: MessageTray.ANIMATION_TIME,
                mode: Clutter.AnimationMode.EASE_OUT_QUAD,
            });
        } else {
            this._bodyStack.layout_manager.expansion = 1;
            this._actionBin.scale_y = 1;
        }
        this.emit('expanded');
    }

As you can see, I have 2 options for this extension: Force expand all notifications or make the user use a button to expand. The current solution is not elegant, it simply changes the height of the notification label which manages the body. Furhermore, the notification body still shows the three dots, implying that the body is still not expanded. I believe this to be an issue with the layout manager, since the proper way to expand is to set message._bodyStack.layout_manager.expansion to 1. That does not work in the case of expanding a message in the notification tray. Is anyone familiar with the layout manager or can help me find a different solution? Here is an image of what my current solution looks like: Image of an automatically expanded notification in the notification tray due to the extension (note the three dots at the end of the first line being still there)


Solution

  • Okay I have found a solution, it is not related to the layout manager. The value of the message message.bodyLabel.clutter_text.ellipsize is set to 3, which is the main cause of the dots appearing on the notification. Setting this value to 0 solves this problem. I would have still loved to find a more elegant approach to displaying the body, but this will do.