Переполнение сообщения в пузыре уведомления

Я изучаю, как использовать gtk уведомления, и кажется, что любой выходной дисплей через пузырь уведомления имеет максимальный водосливный размер, вероятно, 10 строк или около этого. Так, если сообщение, которое я хочу показать, является больше, чем которые, оно подавлено. Там каким-либо путем является к принудительному отображению все сообщение ни с чем подавляемым?

Я использую notifyOSD, между прочим.

7
задан 21 July 2016 в 00:40

2 ответа

Я опубликовал это некоторое время назад на (сейчас) удаленном Q/A. Возможно, это полезно для вас.


Патч, позволяющий (очень) длинные сообщения

Патч, приведённый ниже, позволит вам получать уведомления столько, сколько требуется на вашем рабочем столе:

В случае (очень) длинных уведомлений, вместо этого:

enter image description here

вы увидите следующее:

enter image description here

Длительность сообщения автоматически устанавливается в размере длины текста.

Уведомления, отправляемые notify-osd (notify-send), ограничиваются примерно 120 символами.
Решение "прослушивает" отправленные сообщения, используя dbus-монитор . Если сообщение превышает 120 символов, оно принимает сообщения и использует "свое" окно сообщений для отображения уведомления, как показано выше.

Scripts

  1. Настройка существует из двух разделов; de "listen-" скрипт, который перехватывает уведомления:

    #!/bin/bash
    
    currdir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )".
    
    dbus-монитор "interface='org.freedesktop.Notifications'". |\
     grep --line-буферизованная "строка" |\
     grep --line-buffered -e method -e ":" -e '"" -e urgency -e notify -v |\.
     grep --line-буферизованная '.*(?=string)|(?<=string).*' -oPi |\.
     grep --line-buffered -v '^\s*$' |\
     ... я '{}' $currdir/message.
    

    Скопируйте скрипт в пустой файл и сохраните его как catch_notifs.sh

  2. Скрипт, создающий замену - уведомления:

    #!/usr/bin/env python3
    подпроцесс импорта
    импортные оs
    импортный гигант
    gi.require_version('Gtk', '3.0')
    из импорта gi.repository GObject, Gtk, Gdk, Pango.
    от импорта резьбы Нить
    время импорта
    импортные системы
    
    text = sys.argv[1]
    длина = len(текст)
    время показа = длина/20
    
    def get_screen():
     scr = [s.split("x") для s в subprocess.check_output([[].
     "xrandr"]).decode("utf-8").split() if "+0+0" in s][0].
     return int(scr[0]) -450
    
    класс Splash(Gtk.Window):
    
     Def __init__(self):
     Gtk.Window.__init__(self, title="splashtitle"))
     maingrid = Gtk.Grid()
     self.add(maingrid)
     maingrid.set_border_width(20)
     метка = Gtk.Label(текст)
     label.set_line_wrap(True)
     label.set_max_width_chars(45)
     label.modify_font(Pango.FontDescription('Ubuntu 11'))
     maingrid.attach(этикетка, 0, 0, 1, 1)
     self.stop = Thread(target=self.close_window)
     self.stop.start()
    
     def close_window(self):
     time.sleep(showtime)
     Gtk.main_quit()
    
    def splashwindow():
     window = Splash()
     window.set_decorated(False)
     window.set_resizable(False)
     window.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0,0,0,0,1)))
     window.modify_fg(Gtk.StateFlags.NORMAL, Gdk.color_parse("белый"))
     # window.set_opacity(0.8)
     window.move(get_screen(), 80)
     window.set_keep_above(True)
     window.show_all()
     window.set_default_size(200, 500)
     GObject.threads_init()
     Gtk.main()
    
    если len(text) > 120:
     подпроцесс.Popen(["pkill", "notify-osd"]).
     splashwindow()
    

    Скопируйте вышеуказанный сценарий в пустой файл, сохраните его как (точно!) сообщение (без расширения) и сделайте исполняемым.

  3. Храните оба сценария в одном и том же каталоге.
  4. Test-. выполнить скрипт командой (из терминального окна):

    /bin/bash /path/to/catch_notifs.sh
    

    (продолжайте работать)

    Вы можете протестировать установку, запустив (в другом терминале):

    notify-send '".
    
  5. Если все работает нормально, добавьте его в Приложения для запуска: Тире > Запуск приложений > Добавить. Добавить команду:

    /bin/bash /path/to/catch_notifs.sh
    

И она должна работать :)

10
ответ дан 23 November 2019 в 06:16

Как я отметил в комментариях, notify-osd не очень подходит для обширных сообщений, и вместо этого следует предпочесть zenity. Простой пример использования - диалог порождения zenity через subprocess.call([КОМАНДА, ВАРИАНТЫ])

import subprocess 

text="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."
command=['zenity', '--info', '--text="' +text + '"', '--width=250', '--height=300' ]
subprocess.call(command)

Очень простой пример. С помощью чего-то, что требует проверки статуса выхода, например, вопросы, вы можете захотеть использовать try - except - else structure

import subprocess 

text='Do you want to use Zenity?'
command=['zenity', '--question', 
         '--text="' +text + '"',
         '--width=250', '--height=300' ]


try:
    stdout = subprocess.check_call(command)

except subprocess.CalledProcessError:
    pass # if return sttus is non-zero, do something here

else:
    # if exit status was 0 , we do something here
    print "Yes, I want to use Zenity too"

Если вы хотите что-то более продвинутое, вероятно, рассмотрите возможность изучения одного из графических инструментов, таких как PyQt или Gtk.

4
ответ дан 23 November 2019 в 06:16

Другие вопросы по тегам:

Похожие вопросы: