Làm cách nào để sử dụng 'thông báo-gửi' để thay thế ngay một thông báo hiện có?


23

Khi tôi sử dụng notify-sendđể hiển thị thông báo trên máy tính để bàn, sau đó sử dụng lại để hiển thị thông báo khác, tôi nhận thấy rằng thông báo thứ hai chỉ hiển thị sau khi thông báo đầu tiên biến mất.

Có cách nào để notify-sendthay thế ngay một thông báo hiện có bằng một thông báo khác không?

Câu trả lời:


16

Bạn có thể, nhưng bạn phải sử dụng một libnotify vá để làm như vậy

notify-sendkhông có khả năng thay thế các thông báo hiện có trước khi chúng hết thời gian (hoặc biến mất). Đây là một lỗi đã biết . Tuy nhiên, một bình luận về báo cáo lỗi đã đăng một bản vá để sửa nó.

Cài đặt libnotify-bin đã vá từ PPA

Tôi đã tạo một phiên bản vá của gói libnotify-bin cho phép thay thế trong PPA của tôi. Hiện tại chỉ dành cho Ubuntu 12.04, nhưng nếu bạn cần nó cho bất kỳ bản phát hành nào được hỗ trợ khác, vui lòng gửi bình luận và tôi sẽ cố gắng hết sức để cung cấp.

Để cài đặt, mở một thiết bị đầu cuối và:

sudo apt-add-repository ppa: izx / askubfox
sudo apt-get cập nhật
sudo apt-get cài đặt libnotify-bin

Cách sử dụng các khả năng thay thế

Bản vá notify-sendbao gồm hai công tắc mới, -p(hoặc --print-id ) và -r(hoặc --replace-id ). Các --helpmô tả chúng như:

  -p, --print-id In ID thông báo.
  -r, --replace-id = REPLACE_ID ID của thông báo sẽ thay thế.
  • Với -p, mỗi cái notify-sendsẽ trả về một ID N (số / số nguyên).
  • Phát hành khác notify-sendvới -r Nsẽ thay thế thông báo trước đó ngay lập tức .
  • Ví dụ: đối với bash, bạn có thể lưu ID từ notify-send -p ...:

    NID=$(notify-send -p "MESSAGE-1")

    và sau đó thay thế nó bằng:

    notify-send -r $NID "MESSAGE-2"
  • Bạn có thể sử dụng đệ quy cả -p-r trong một tập lệnh, miễn là biến -r được khởi tạo thành 0 ở đầu.

  • Đây là một tập lệnh đơn giản hiển thị các thông báo đếm từ 0 đến 100 trong khoảng thời gian nửa giây:

    #! / bin / bash 
    NID = 0
    cho tôi trong {0..100..10}    làm       NID = $ (thông báo-gửi -p -r $ NID $ i)       ngủ 0,5    làm xong

Tôi nhận được 404 cho ppa.launchpad.net/izx/askubfox/ubfox/dists/trusty/main/ . Là kho lưu trữ này đã lỗi thời?
vp_arth

1
Bạn có thể sử dụng tập lệnh python của tôi hoạt động như notify-send: github.com/phuhl/notify-send.py
user3637541

11

Bạn có thể sử dụng gợi ý "đồng bộ" để tạo thông báo "xác nhận" sẽ thay thế thông báo xác nhận trước đó. Ví dụ:

notify-send "Message" -h string:x-canonical-private-synchronous:anything

Gợi ý "x-canonical-private-sync" được chỉ định trong tài liệu này . Để chỉ định một gợi ý, sử dụng -h type:name:value. Loại ở đây là string, tên là x-canonical-private-synchronous, và dường như giá trị có thể là bất cứ điều gì bạn muốn.

Vì vậy, nếu thông báo đầu tiên của bạn được tạo với gợi ý đó thông báo thứ hai cũng vậy, thông báo thứ hai sẽ ngay lập tức thay thế thông báo đầu tiên. (Xem Ảnh động và Độ dài trong tài liệu, trong cột để biết "bong bóng xác nhận".)


string:x-canonical-private-synchronous:anythingchính xác là những gì tôi cần. Cảm ơn câu trả lời này. Cũng để liên kết đến tài liệu
avk

Nó không hoạt động với Gnome ....
Johannes Lemonde

1
Điều này phần nào rõ ràng chỉ hoạt động trên Ubuntu.
bschlueter

10

X-ref:
Làm cách nào để buộc Thông báo mới trong thông báo-osd hiển thị mà không cần đợi thông báo trước đó thoát ra?

không có bản vá bạn chỉ có thể làm

#!/bin/bash

for i in {0..100..10}
    do
          killall notify-osd
          notify-send "testing" $i
          sleep 1
    done

Bookmark:
Làm cách nào để sử dụng 'notify-send' để thay thế ngay một thông báo hiện có?


Gửi một thông báo lỗi-osd (2592): Hoạt động không được phép. Điều đó nghĩa là gì?

Nó có thể có nghĩa là các đặc quyền không đủ yêu cầu:

sudo killall notify-osd

Gửi một lỗi notify-osd(2592): Operation not permitted. Điều đó nghĩa là gì?
VedVals

5

Tôi đã tạo một tập lệnh python đơn giản hoạt động gần giống như thông báo gửi nhưng có hỗ trợ --replaces-id.

thông báo

web: https://github.com/phuhl/notify-send.py

Một kịch bản python để gửi thông báo máy tính để bàn từ shell.

Trong khoảng

Libnotify là một phần của nhiều tập lệnh trong thế giới Linux. Nó sử dụng nhiều tính năng được chỉ định của Đặc tả thông báo máy tính để bàn và làm cho chúng có thể truy cập được vào các tập lệnh shell. Tuy nhiên, nó không cho phép thay thế một thông báo hiện có bằng replaces-id. Đây là một lỗi đã biết từ năm 2008 và có một bản vá từ năm 2012. Bản vá vẫn không được cập nhật mặc dù (2018).

Kịch bản python này sử dụng gói notify2 và hiển thị chức năng cho trình bao.

Sự khác nhau giữa notify-send.py và thông báo-gửi

  • Trong notify-send.py -h chương trình trợ giúp thay vì là tham số cho gợi ý. Đối với gợi ý sử dụng --hint.
  • Trong notify-send.py -r IDnotify-send.py --replaces-id ID tồn tại. Để thay thế một cuộc gọi thông báo notify-send.py bằng ID đã được thông báo trả về sẽ được thay thế.
  • notify-send.py trả về ID của thông báo vừa tạo.
  • notify-send.py --replaces-process NAMEtồn tại Mọi thông báo được tạo với cùng một TÊN sẽ thay thế mọi thông báo trước khi có cùng một TÊN. Nếu được gọi với tham số này notify-send.pycó thể chặn, tốt nhất nên được gọi bằng dấu &.

Cài đặt

Yêu cầu python3.

git clone https://github.com/phuhl/notify-send.py
cd notify-send.py
sudo pip install notify2
sudo python setup.py install

Sử dụng

$ notify-send.py -h
usage: notify-send.py [-h] [-u LEVEL] [-t TIME] [-a APP_NAME]
                  [-i ICON[,ICON...]] [-c TYPE[,TYPE...]]
                  [--hint TYPE:NAME:VALUE] [-r ID]
                  [--replaces-process NAME]
                  SUMMERY [BODY]

positional arguments:
      SUMMERY
      BODY

optional arguments:
      -h, --help        show this help message and exit
      -u LEVEL, --urgency LEVEL
                        Specifies the urgency level (low, normal, critical).
      -t TIME, --expire-time TIME
                        Specifies the timeout in milliseconds at which to
                        expire the notification.
      -a APP_NAME, --app-name APP_NAME
                        Specifies the app name for the icon
      -i ICON[,ICON...], --icon ICON[,ICON...]
                        Specifies an icon filename or stock icon to display.
      -c TYPE[,TYPE...], --category TYPE[,TYPE...]
                        Specifies the notification category.
      --hint TYPE:NAME:VALUE
                        Specifies basic extra data to pass. Valid typesare
                        int, double, string and byte.
      -r ID, --replaces-id ID
                        Specifies the id of the notification that should be
                        replaced.
     --replaces-process NAME
                        Specifies the name of a process that should take care
                        of replacing notifications for this process.

thông báo-gửi [.py] với tư cách là người dùng root

Để hiển thị thông báo, ngay cả khi libnotify hoặc

notify-send.py

được sử dụng từ người dùng root, hai tập lệnh này rất hữu ích.

#!/bin/bash
username=<your username here>
if [ "$(id -u)" != "1000" ] ; then
    sudo -u $username DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send.sh "$@"
else
    notify-send.sh "$@"
fi

Với notify-send.shnhư thế này:

#!/bin/bash
notify-send.py "$@" &

Xem thêm

Ngoài ra hãy xem daemon thông báo của tôi lấy cảm hứng từ Dunst , nhưng với một số cải tiến, bao gồm khả năng nền trong suốt và trung tâm thông báo lưu trữ thông báo.


Giải pháp này đã làm việc cho tôi trên Ubuntu 18.10. Không có giải pháp nào khác có vẻ hiệu quả như vậy.
Dreamcat4
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.