Mercurial > addons > weechat-scripts > weechat-notification-script
annotate notification.py @ 1:ba1005429c76
Reset the status icon if the notification is closed
author | Guido Berhoerster <guido+weechat@berhoerster.name> |
---|---|
date | Tue, 10 Mar 2015 11:30:05 +0100 |
parents | dfe10c951e21 |
children |
rev | line source |
---|---|
0
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
1 # |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
2 # Copyright (C) 2014 Guido Berhoerster <guido+weechat@berhoerster.name> |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
3 # |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
4 # This program is free software: you can redistribute it and/or modify |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
5 # it under the terms of the GNU General Public License version 3 as |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
6 # published by the Free Software Foundation. |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
7 # |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
8 # This program is distributed in the hope that it will be useful, |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
11 # GNU General Public License for more details. |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
12 # |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
13 # You should have received a copy of the GNU General Public License |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
14 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
15 # |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
16 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
17 import os |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
18 import sys |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
19 import time |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
20 import re |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
21 import select |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
22 import signal |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
23 import errno |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
24 import fcntl |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
25 import cgi |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
26 import multiprocessing |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
27 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
28 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
29 SCRIPT_NAME = 'notification' |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
30 APPLICATION = 'Weechat' |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
31 VERSION = '1' |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
32 AUTHOR = 'Guido Berhoerster' |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
33 COPYRIGHT = '(C) 2014 Guido Berhoerster' |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
34 SUBTITLE = 'Notification Plugin for Weechat' |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
35 HOMEPAGE = 'https://code.guido-berhoerster.org/addons/weechat-scripts/weechat-notification-script/' |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
36 EMAIL = 'guido+weechat@berhoerster.name' |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
37 DESCRIPTION = 'Notifies of a number of events through desktop notifications ' \ |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
38 'and an optional status icon' |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
39 DEFAULT_SETTINGS = { |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
40 'status_icon': ('weechat', 'path or name of the status icon'), |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
41 'notification_icon': ('weechat', 'path or name of the icon shown in ' |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
42 'notifications'), |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
43 'preferred_toolkit': ('', 'preferred UI toolkit'), |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
44 'notify_on_displayed_only': ('on', 'only notify of messages that are ' |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
45 'actually displayed'), |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
46 'notify_on_privmsg': ('on', 'notify when receiving a private message'), |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
47 'notify_on_highlight': ('on', 'notify when a messages is highlighted'), |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
48 'notify_on_dcc_request': ('on', 'notify on DCC requests') |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
49 } |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
50 BUFFER_SIZE = 1024 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
51 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
52 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
53 class NetstringParser(object): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
54 """Netstring Stream Parser""" |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
55 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
56 IN_LENGTH = 0 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
57 IN_STRING = 1 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
58 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
59 def __init__(self, on_string_complete): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
60 self.on_string_complete = on_string_complete |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
61 self.length = 0 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
62 self.input_buffer = '' |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
63 self.state = self.IN_LENGTH |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
64 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
65 def parse(self, data): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
66 self.input_buffer += data |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
67 ret = True |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
68 while ret: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
69 if self.state == self.IN_LENGTH: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
70 ret = self.parse_length() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
71 else: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
72 ret = self.parse_string() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
73 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
74 def parse_length(self): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
75 length, delimiter, self.input_buffer = self.input_buffer.partition(':') |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
76 if not delimiter: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
77 return False |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
78 try: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
79 self.length = int(length) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
80 except ValueError: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
81 raise SyntaxError('Invalid length: %s' % length) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
82 self.state = self.IN_STRING |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
83 return True |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
84 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
85 def parse_string(self): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
86 input_buffer_len = len(self.input_buffer) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
87 if input_buffer_len < self.length + 1: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
88 return False |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
89 string = self.input_buffer[0:self.length] |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
90 if self.input_buffer[self.length] != ',': |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
91 raise SyntaxError('Missing delimiter') |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
92 self.input_buffer = self.input_buffer[self.length + 1:] |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
93 self.length = 0 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
94 self.state = self.IN_LENGTH |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
95 self.on_string_complete(string) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
96 return True |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
97 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
98 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
99 def netstring_encode(*args): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
100 return ''.join(['%d:%s,' % (len(element), element) for element in |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
101 args]) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
102 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
103 def netstring_decode(netstring): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
104 result = [] |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
105 def append_result(data): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
106 result.append(data) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
107 np = NetstringParser(append_result) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
108 np.parse(netstring) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
109 return result |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
110 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
111 def dispatch_weechat_callback(*args): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
112 return weechat_callbacks[args[0]](*args) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
113 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
114 def create_weechat_callback(method): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
115 global weechat_callbacks |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
116 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
117 method_id = str(id(method)) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
118 weechat_callbacks[method_id] = method |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
119 return method_id |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
120 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
121 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
122 class Notifier(object): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
123 """Simple notifier which discards all notifications, base class for all |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
124 other notifiers |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
125 """ |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
126 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
127 def __init__(self, icon): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
128 flags = fcntl.fcntl(sys.stdin, fcntl.F_GETFL) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
129 fcntl.fcntl(sys.stdin, fcntl.F_SETFL, flags | os.O_NONBLOCK) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
130 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
131 self.parser = NetstringParser(self.on_command_received) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
132 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
133 def on_command_received(self, raw_command): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
134 command_args = netstring_decode(raw_command) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
135 if len(command_args) > 1: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
136 command = command_args[0] |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
137 args = netstring_decode(command_args[1]) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
138 else: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
139 command = command_args[0] |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
140 args = [] |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
141 getattr(self, command)(*args) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
142 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
143 def notify(self, summary, message, icon): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
144 pass |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
145 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
146 def reset(self): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
147 pass |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
148 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
149 def run(self): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
150 poll = select.poll() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
151 poll.register(sys.stdin, select.POLLIN | select.POLLPRI) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
152 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
153 while True: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
154 try: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
155 events = poll.poll() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
156 except select.error as e: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
157 if e.args and e.args[0] == errno.EINTR: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
158 continue |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
159 else: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
160 raise e |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
161 for fd, event in events: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
162 if event & (select.POLLIN | select.POLLPRI): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
163 buffer_ = os.read(fd, BUFFER_SIZE) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
164 if buffer_ != '': |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
165 self.parser.parse(buffer_) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
166 if event & (select.POLLERR | select.POLLHUP | select.POLLNVAL): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
167 sys.exit(1) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
168 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
169 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
170 class Gtk2Notifier(Notifier): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
171 """GTK 2 notifier based on pygtk and pynotify""" |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
172 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
173 def __init__(self, icon): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
174 super(Gtk2Notifier, self).__init__(icon) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
175 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
176 pynotify.init(APPLICATION) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
177 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
178 gobject.io_add_watch(sys.stdin, gobject.IO_IN | gobject.IO_PRI, |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
179 self.on_input) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
180 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
181 if not icon: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
182 icon_name = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
183 icon_pixbuf = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
184 elif icon.startswith('/'): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
185 icon_name = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
186 try: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
187 icon_pixbuf = gtk.gdk.Pixbuf.new_from_file(icon) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
188 except gobject.GError: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
189 icon_pixbuf = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
190 else: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
191 icon_name = icon |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
192 icon_pixbuf = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
193 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
194 if icon_name or icon_pixbuf: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
195 self.status_icon = gtk.StatusIcon() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
196 self.status_icon.set_title(APPLICATION) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
197 self.status_icon.set_tooltip_text(APPLICATION) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
198 self.status_icon.connect('activate', self.on_activate) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
199 if icon_name: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
200 self.status_icon.set_from_icon_name(icon_name) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
201 elif icon_pixbuf: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
202 self.status_icon.set_from_pixbuf(icon_pixbuf) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
203 else: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
204 self.status_icon = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
205 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
206 def on_input(self, fd, cond): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
207 if cond & (gobject.IO_IN | gobject.IO_PRI): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
208 try: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
209 buffer_ = os.read(fd.fileno(), BUFFER_SIZE) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
210 if buffer_ != '': |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
211 self.parser.parse(buffer_) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
212 except EOFError: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
213 gtk.main_quit() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
214 return False |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
215 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
216 if cond & (gobject.IO_ERR | gobject.IO_HUP): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
217 gtk.main_quit() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
218 return False |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
219 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
220 return True |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
221 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
222 def on_activate(self, widget): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
223 self.reset() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
224 |
1
ba1005429c76
Reset the status icon if the notification is closed
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
0
diff
changeset
|
225 def on_notification_closed(self, notification): |
ba1005429c76
Reset the status icon if the notification is closed
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
0
diff
changeset
|
226 if notification.get_closed_reason() == 2: |
ba1005429c76
Reset the status icon if the notification is closed
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
0
diff
changeset
|
227 self.reset() |
ba1005429c76
Reset the status icon if the notification is closed
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
0
diff
changeset
|
228 |
0
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
229 def notify(self, summary, message, icon): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
230 if self.status_icon: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
231 self.status_icon.set_tooltip_text('%s: %s' % (APPLICATION, |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
232 summary)) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
233 self.status_icon.set_blinking(True) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
234 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
235 if icon and icon.startswith('/'): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
236 icon_name = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
237 try: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
238 icon_pixbuf = gtk.gdk.Pixbuf.new_from_file(icon) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
239 except gobject.GError: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
240 icon_pixbuf = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
241 else: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
242 icon_name = icon |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
243 icon_pixbuf = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
244 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
245 if 'body-markup' in pynotify.get_server_caps(): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
246 body = cgi.escape(message) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
247 else: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
248 body = message |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
249 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
250 notification = pynotify.Notification(summary, body, icon_name) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
251 if icon_pixbuf is not None: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
252 notification.set_image_from_pixbuf(icon_pixbuf) |
1
ba1005429c76
Reset the status icon if the notification is closed
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
0
diff
changeset
|
253 notification.connect('closed', self.on_notification_closed) |
0
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
254 notification.show() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
255 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
256 def reset(self): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
257 if self.status_icon: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
258 self.status_icon.set_tooltip_text(APPLICATION) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
259 self.status_icon.set_blinking(False) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
260 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
261 def run(self): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
262 gtk.main() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
263 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
264 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
265 class Gtk3Notifier(Notifier): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
266 """GTK3 notifier based on GObject Introspection Bindings for GTK 3 and |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
267 libnotify |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
268 """ |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
269 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
270 def __init__(self, icon): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
271 super(Gtk3Notifier, self).__init__(icon) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
272 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
273 Notify.init(APPLICATION) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
274 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
275 GLib.io_add_watch(sys.stdin, GLib.IO_IN | GLib.IO_PRI, self.on_input) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
276 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
277 if not icon: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
278 self.icon_name = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
279 self.icon_pixbuf = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
280 elif icon.startswith('/'): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
281 self.icon_name = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
282 try: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
283 self.icon_pixbuf = GdkPixbuf.Pixbuf.new_from_file(icon) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
284 except GLib.GError: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
285 self.icon_pixbuf = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
286 else: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
287 self.icon_name = icon |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
288 self.icon_pixbuf = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
289 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
290 if self.icon_name or self.icon_pixbuf: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
291 # create blank, fully transparent pixbuf in order to simulate |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
292 # blinking |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
293 self.blank_pixbuf = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
294 True, 8, 22, 22) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
295 self.blank_pixbuf.fill(0x00) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
296 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
297 self.blink_on = True |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
298 self.blink_timeout_id = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
299 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
300 self.status_icon = Gtk.StatusIcon.new() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
301 self.status_icon.set_title(APPLICATION) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
302 self.status_icon.set_tooltip_text(APPLICATION) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
303 self.status_icon.connect('activate', self.on_activate) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
304 self.update_icon() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
305 else: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
306 self.status_icon = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
307 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
308 def on_input(self, fd, cond): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
309 if cond & (GLib.IO_IN | GLib.IO_PRI): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
310 try: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
311 self.parser.parse(os.read(fd.fileno(), BUFFER_SIZE)) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
312 except EOFError: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
313 Gtk.main_quit() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
314 return False |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
315 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
316 if cond & (GLib.IO_ERR | GLib.IO_HUP): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
317 Gtk.main_quit() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
318 return False |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
319 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
320 return True |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
321 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
322 def on_activate(self, widget): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
323 self.reset() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
324 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
325 def update_icon(self): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
326 if not self.blink_on: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
327 self.status_icon.set_from_pixbuf(self.blank_pixbuf) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
328 elif self.icon_name: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
329 self.status_icon.set_from_icon_name(self.icon_name) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
330 elif self.icon_pixbuf: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
331 self.status_icon.set_from_pixbuf(self.icon_pixbuf) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
332 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
333 def on_blink_timeout(self): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
334 self.blink_on = not self.blink_on |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
335 self.update_icon() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
336 return True |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
337 |
1
ba1005429c76
Reset the status icon if the notification is closed
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
0
diff
changeset
|
338 def on_notification_closed(self, notification): |
ba1005429c76
Reset the status icon if the notification is closed
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
0
diff
changeset
|
339 if notification.get_closed_reason() == 2: |
ba1005429c76
Reset the status icon if the notification is closed
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
0
diff
changeset
|
340 self.reset() |
ba1005429c76
Reset the status icon if the notification is closed
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
0
diff
changeset
|
341 |
0
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
342 def notify(self, summary, message, icon): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
343 if self.status_icon: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
344 self.status_icon.set_tooltip_text('%s: %s' % (APPLICATION, |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
345 summary)) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
346 if self.blink_timeout_id is None: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
347 self.blink_timeout_id = GLib.timeout_add(500, |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
348 self.on_blink_timeout) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
349 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
350 if icon and icon.startswith('/'): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
351 icon_name = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
352 try: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
353 icon_pixbuf = GdkPixbuf.Pixbuf.new_from_file(icon) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
354 except GLib.GError: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
355 icon_pixbuf = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
356 else: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
357 icon_name = icon |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
358 icon_pixbuf = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
359 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
360 if 'body-markup' in Notify.get_server_caps(): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
361 body = cgi.escape(message) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
362 else: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
363 body = message |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
364 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
365 notification = Notify.Notification.new(summary, body, icon_name) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
366 if icon_pixbuf is not None: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
367 notification.set_image_from_pixbuf(icon_pixbuf) |
1
ba1005429c76
Reset the status icon if the notification is closed
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
0
diff
changeset
|
368 notification.connect('closed', self.on_notification_closed) |
0
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
369 notification.show() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
370 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
371 def reset(self): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
372 if self.status_icon: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
373 self.status_icon.set_tooltip_text(APPLICATION) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
374 if self.blink_timeout_id is not None: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
375 GLib.source_remove(self.blink_timeout_id) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
376 self.blink_timeout_id = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
377 self.blink_on = True |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
378 self.update_icon() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
379 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
380 def run(self): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
381 Gtk.main() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
382 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
383 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
384 class Qt4Notifier(Notifier): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
385 """Qt 4 notifier""" |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
386 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
387 def __init__(self, icon): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
388 super(Qt4Notifier, self).__init__(icon) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
389 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
390 signal.signal(signal.SIGINT, self.on_sigint) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
391 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
392 self.qapplication = QtGui.QApplication([]) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
393 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
394 self.readable_notifier = QtCore.QSocketNotifier(sys.stdin.fileno(), |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
395 QtCore.QSocketNotifier.Read) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
396 self.readable_notifier.activated.connect(self.on_input) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
397 self.readable_notifier.setEnabled(True) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
398 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
399 if not icon: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
400 self.icon = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
401 elif icon.startswith('/'): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
402 self.icon = QtGui.QIcon(icon) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
403 else: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
404 self.icon = QtGui.QIcon.fromTheme(icon) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
405 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
406 if self.icon: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
407 # create blank, fully transparent pixbuf in order to simulate |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
408 # blinking |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
409 self.blank_icon = QtGui.QIcon() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
410 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
411 self.blink_on = True |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
412 self.blinking_timer = QtCore.QTimer() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
413 self.blinking_timer.setInterval(500) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
414 self.blinking_timer.timeout.connect(self.on_blink_timeout) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
415 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
416 self.status_icon = QtGui.QSystemTrayIcon() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
417 self.status_icon.setToolTip(APPLICATION) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
418 self.update_icon() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
419 self.status_icon.setVisible(True) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
420 self.status_icon.activated.connect(self.on_activated) |
1
ba1005429c76
Reset the status icon if the notification is closed
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
0
diff
changeset
|
421 self.status_icon.messageClicked.connect(self.on_message_clicked) |
0
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
422 else: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
423 self.status_icon = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
424 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
425 def on_sigint(self, signo, frame): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
426 self.qapplication.exit(0) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
427 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
428 def on_input(self, fd): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
429 try: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
430 self.parser.parse(os.read(fd, BUFFER_SIZE)) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
431 except EOFError: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
432 self.qapplication.exit(1) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
433 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
434 def on_activated(self, reason): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
435 self.reset() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
436 |
1
ba1005429c76
Reset the status icon if the notification is closed
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
0
diff
changeset
|
437 def on_message_clicked(self): |
ba1005429c76
Reset the status icon if the notification is closed
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
0
diff
changeset
|
438 self.reset() |
ba1005429c76
Reset the status icon if the notification is closed
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
0
diff
changeset
|
439 |
0
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
440 def on_blink_timeout(self): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
441 self.blink_on = not self.blink_on |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
442 self.update_icon() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
443 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
444 def update_icon(self): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
445 if not self.blink_on: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
446 self.status_icon.setIcon(self.blank_icon) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
447 else: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
448 self.status_icon.setIcon(self.icon) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
449 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
450 def notify(self, summary, message, icon): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
451 if self.status_icon: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
452 self.status_icon.setToolTip('%s: %s' % (APPLICATION, |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
453 cgi.escape(summary))) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
454 self.blinking_timer.start() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
455 if self.status_icon.supportsMessages(): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
456 self.status_icon.showMessage(summary, message, |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
457 QtGui.QSystemTrayIcon.NoIcon) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
458 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
459 def reset(self): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
460 if self.status_icon: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
461 self.blinking_timer.stop() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
462 self.blink_on = True |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
463 self.update_icon() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
464 self.status_icon.setToolTip(APPLICATION) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
465 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
466 def run(self): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
467 sys.exit(self.qapplication.exec_()) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
468 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
469 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
470 class KDE4Notifier(Notifier): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
471 """KDE 4 notifier based on PyKDE4""" |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
472 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
473 def __init__(self, icon): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
474 super(KDE4Notifier, self).__init__(icon) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
475 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
476 signal.signal(signal.SIGINT, self.on_sigint) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
477 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
478 aboutData = kdecore.KAboutData(APPLICATION.lower(), '', |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
479 kdecore.ki18n(APPLICATION), VERSION, kdecore.ki18n(SUBTITLE), |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
480 kdecore.KAboutData.License_GPL_V3, kdecore.ki18n(COPYRIGHT), |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
481 kdecore.ki18n (''), HOMEPAGE, EMAIL) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
482 kdecore.KCmdLineArgs.init(aboutData) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
483 self.kapplication = kdeui.KApplication() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
484 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
485 self.readable_notifier = QtCore.QSocketNotifier(sys.stdin.fileno(), |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
486 QtCore.QSocketNotifier.Read) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
487 self.readable_notifier.activated.connect(self.on_input) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
488 self.readable_notifier.setEnabled(True) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
489 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
490 if not icon: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
491 icon_qicon = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
492 icon_name = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
493 elif icon.startswith('/'): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
494 icon_qicon = QtGui.QIcon(icon) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
495 icon_name = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
496 else: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
497 icon_qicon = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
498 icon_name = icon |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
499 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
500 if icon_name or icon_pixmap: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
501 self.status_notifier = kdeui.KStatusNotifierItem(self.kapplication) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
502 self.status_notifier.setCategory( |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
503 kdeui.KStatusNotifierItem.Communications) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
504 if icon_name: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
505 self.status_notifier.setIconByName(icon_name) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
506 self.status_notifier.setToolTip(icon_name, APPLICATION, |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
507 SUBTITLE) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
508 else: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
509 self.status_notifier.setIconByPixmap(icon_qicon) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
510 self.status_notifier.setToolTip(icon_qicon, APPLICATION, |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
511 SUBTITLE) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
512 self.status_notifier.setStandardActionsEnabled(False) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
513 self.status_notifier.setStatus(kdeui.KStatusNotifierItem.Active) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
514 self.status_notifier.setTitle(APPLICATION) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
515 self.status_notifier.activateRequested.connect( |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
516 self.on_activate_requested) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
517 else: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
518 self.status_notifier = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
519 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
520 def on_sigint(self, signo, frame): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
521 self.kapplication.exit(0) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
522 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
523 def on_input(self, fd): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
524 try: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
525 self.parser.parse(os.read(fd, BUFFER_SIZE)) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
526 except EOFError: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
527 self.kapplication.exit(1) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
528 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
529 def on_activate_requested(self, active, pos): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
530 self.reset() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
531 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
532 def notify(self, summary, message, icon): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
533 if self.status_notifier: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
534 self.status_notifier.setToolTipSubTitle(cgi.escape(summary)) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
535 self.status_notifier.setStatus( |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
536 kdeui.KStatusNotifierItem.NeedsAttention) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
537 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
538 if icon: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
539 if icon.startswith('/'): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
540 pixmap = QtGui.QPixmap.load(icon) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
541 else: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
542 pixmap = kdeui.KIcon(icon).pixmap(kdeui.KIconLoader.SizeHuge, |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
543 kdeui.KIconLoader.SizeHuge) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
544 else: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
545 pixmap = QtGui.QPixmap() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
546 kdeui.KNotification.event(kdeui.KNotification.Notification, summary, |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
547 cgi.escape(message), pixmap) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
548 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
549 def reset(self): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
550 if self.status_notifier: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
551 self.status_notifier.setStatus(kdeui.KStatusNotifierItem.Active) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
552 self.status_notifier.setToolTipTitle(APPLICATION) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
553 self.status_notifier.setToolTipSubTitle(SUBTITLE) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
554 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
555 def run(self): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
556 sys.exit(self.kapplication.exec_()) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
557 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
558 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
559 class NotificationProxy(object): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
560 """Proxy object for interfacing with the notifier process""" |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
561 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
562 def __init__(self, preferred_toolkit, status_icon): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
563 self.script_file = os.path.realpath(__file__) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
564 self._status_icon = status_icon |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
565 self._preferred_toolkit = preferred_toolkit |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
566 self.notifier_process_hook = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
567 self.spawn_timer_hook = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
568 self.next_spawn_time = 0.0 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
569 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
570 self.spawn_notifier_process() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
571 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
572 @property |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
573 def status_icon(self): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
574 return self._status_icon |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
575 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
576 @status_icon.setter |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
577 def status_icon(self, value): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
578 self._status_icon = value |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
579 self.terminate_notifier_process() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
580 self.spawn_notifier_process() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
581 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
582 @property |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
583 def preferred_toolkit(self): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
584 return self._preferred_toolkit |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
585 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
586 @preferred_toolkit.setter |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
587 def preferred_toolkit(self, value): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
588 self._preferred_toolkit = value |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
589 self.terminate_notifier_process() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
590 self.spawn_notifier_process() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
591 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
592 def on_notifier_process_event(self, data, command, return_code, output, |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
593 error_output): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
594 if return_code != weechat.WEECHAT_HOOK_PROCESS_RUNNING: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
595 if return_code == weechat.WEECHAT_HOOK_PROCESS_ERROR: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
596 error = '%sfailed to run notifier' % weechat.prefix("error") |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
597 else: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
598 error = '%snotifier exited with exit status %d' % \ |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
599 (weechat.prefix("error"), return_code) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
600 if output: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
601 error += '\nstdout:%s' % output |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
602 if error_output: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
603 error += '\nstderr:%s' % error_output |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
604 weechat.prnt('', error) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
605 self.notifier_process_hook = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
606 self.spawn_notifier_process() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
607 return weechat.WEECHAT_RC_OK |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
608 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
609 def on_spawn_timer(self, data, remaining): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
610 self.spawn_timer_hook = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
611 if not self.notifier_process_hook: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
612 self.spawn_notifier_process() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
613 return weechat.WEECHAT_RC_OK |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
614 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
615 def spawn_notifier_process(self): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
616 if self.notifier_process_hook or self.spawn_timer_hook: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
617 return |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
618 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
619 # do not try to respawn a notifier more than once every ten seconds |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
620 now = time.time() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
621 if long(self.next_spawn_time - now) > 0: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
622 self.spawn_timer_hook = \ |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
623 weechat.hook_timer(long((self.next_spawn_time - now) * |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
624 1000), 0, 1, 'dispatch_weechat_callback', |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
625 create_weechat_callback(self.on_spawn_timer)) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
626 return |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
627 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
628 self.next_spawn_time = now + 10 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
629 self.notifier_process_hook = \ |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
630 weechat.hook_process_hashtable(sys.executable, {'arg1': |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
631 self.script_file, 'arg2': self.preferred_toolkit, 'arg3': |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
632 self.status_icon, 'stdin': '1'}, 0, |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
633 'dispatch_weechat_callback', |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
634 create_weechat_callback(self.on_notifier_process_event)) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
635 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
636 def terminate_notifier_process(self): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
637 if self.spawn_timer_hook: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
638 weechat.unhook(self.spawn_timer_hook) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
639 self.spawn_timer_hook = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
640 if self.notifier_process_hook: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
641 weechat.unhook(self.notifier_process_hook) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
642 self.notifier_process_hook = None |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
643 self.next_spawn_time = 0.0 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
644 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
645 def send(self, command, *args): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
646 if self.notifier_process_hook: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
647 if args: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
648 weechat.hook_set(self.notifier_process_hook, 'stdin', |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
649 netstring_encode(netstring_encode(command, |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
650 netstring_encode(*args)))) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
651 else: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
652 weechat.hook_set(self.notifier_process_hook, 'stdin', |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
653 netstring_encode(netstring_encode(command))) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
654 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
655 def notify(self, summary, message, icon): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
656 self.send('notify', summary, message, icon) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
657 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
658 def reset(self): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
659 self.send('reset') |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
660 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
661 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
662 class NotificationPlugin(object): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
663 """Weechat plugin""" |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
664 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
665 def __init__(self): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
666 self.DCC_SEND_RE = re.compile(r':(?P<sender>\S+) PRIVMSG \S+ :' |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
667 r'\x01DCC SEND (?P<filename>\S+) \d+ \d+ (?P<size>\d+)') |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
668 self.DCC_CHAT_RE = re.compile(r':(?P<sender>\S+) PRIVMSG \S+ :' |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
669 r'\x01DCC CHAT ') |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
670 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
671 weechat.register(SCRIPT_NAME, AUTHOR, VERSION, 'GPL3', DESCRIPTION, '', |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
672 '') |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
673 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
674 for option, (value, description) in DEFAULT_SETTINGS.iteritems(): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
675 if not weechat.config_is_set_plugin(option): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
676 weechat.config_set_plugin(option, value) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
677 weechat.config_set_desc_plugin(option, '%s (default: "%s")' % |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
678 (description, value)) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
679 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
680 self.notification_proxy = NotificationProxy( |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
681 weechat.config_get_plugin('preferred_toolkit'), |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
682 weechat.config_get_plugin('status_icon')) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
683 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
684 weechat.hook_print('', 'irc_privmsg', '', 1, |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
685 'dispatch_weechat_callback', |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
686 create_weechat_callback(self.on_message)) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
687 weechat.hook_signal('key_pressed', 'dispatch_weechat_callback', |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
688 create_weechat_callback(self.on_key_pressed)) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
689 weechat.hook_signal('irc_dcc', 'dispatch_weechat_callback', |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
690 create_weechat_callback(self.on_dcc)) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
691 weechat.hook_config('plugins.var.python.%s.*' % SCRIPT_NAME, |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
692 'dispatch_weechat_callback', |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
693 create_weechat_callback(self.on_config_changed)) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
694 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
695 def on_message(self, data, buffer, date, tags, displayed, highlight, |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
696 prefix, message): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
697 if weechat.config_get_plugin('notify_on_displayed_only') == 'on' and \ |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
698 int(displayed) != 1: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
699 return weechat.WEECHAT_RC_OK |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
700 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
701 formatted_date = time.strftime('%H:%M', time.localtime(float(date))) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
702 if 'notify_private' in tags.split(',') and \ |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
703 weechat.config_get_plugin('notify_on_privmsg') == 'on': |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
704 summary = 'Private message from %s at %s' % (prefix, |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
705 formatted_date) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
706 self.notification_proxy.notify(summary, message, |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
707 weechat.config_get_plugin('notification_icon')) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
708 elif int(highlight) == 1 and \ |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
709 weechat.config_get_plugin('notify_on_highlight') == 'on': |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
710 summary = 'Highlighted message from %s at %s' % (prefix, |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
711 formatted_date) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
712 self.notification_proxy.notify(summary, message, |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
713 weechat.config_get_plugin('notification_icon')) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
714 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
715 return weechat.WEECHAT_RC_OK |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
716 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
717 def on_dcc(self, data, signal, signal_data): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
718 if weechat.config_get_plugin('notify_on_dcc') != 'on': |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
719 return weechat.WEECHAT_RC_OK |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
720 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
721 matches = self.DCC_SEND_RE.match(signal_data) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
722 if matches: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
723 summary = 'DCC send request from %s' % matches.group('sender') |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
724 message = 'Filname: %s, Size: %d bytes' % \ |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
725 (matches.group('filename'), int(matches.group('size'))) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
726 self.notification_proxy.notify(summary, message, |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
727 weechat.config_get_plugin('notification_icon')) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
728 return weechat.WEECHAT_RC_OK |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
729 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
730 matches = self.DCC_CHAT_RE.match(signal_data) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
731 if matches: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
732 summary = 'DCC chat request from %s' % matches.group('sender') |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
733 message = '' |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
734 self.notification_proxy.notify(summary, message, |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
735 weechat.config_get_plugin('notification_icon')) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
736 return weechat.WEECHAT_RC_OK |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
737 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
738 return weechat.WEECHAT_RC_OK |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
739 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
740 def on_key_pressed(self, data, signal, signal_data): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
741 self.notification_proxy.reset() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
742 return weechat.WEECHAT_RC_OK |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
743 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
744 def on_config_changed(self, data, option, value): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
745 if option.endswith('.preferred_toolkit'): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
746 self.notification_proxy.preferred_toolkit = value |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
747 elif option.endswith('.status_icon'): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
748 self.notification_proxy.status_icon = value |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
749 return weechat.WEECHAT_RC_OK |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
750 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
751 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
752 def import_modules(modules): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
753 for module_name, fromlist in modules: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
754 if fromlist: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
755 module = __import__(module_name, fromlist=fromlist) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
756 for identifier in fromlist: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
757 globals()[identifier] = getattr(module, identifier) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
758 else: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
759 globals()[module_name] = __import__(module_name) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
760 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
761 def try_import_modules(modules): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
762 try: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
763 import_modules(modules) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
764 except ImportError: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
765 sys.exit(1) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
766 sys.exit(0) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
767 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
768 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
769 if __name__ == '__main__': |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
770 if sys.argv[0] == '__weechat_plugin__': |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
771 # running as Weechat plugin |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
772 import weechat |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
773 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
774 weechat_callbacks = {} |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
775 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
776 plugin = NotificationPlugin() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
777 elif len(sys.argv) == 3: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
778 # running as the notifier process |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
779 preferred_toolkit = sys.argv[1] |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
780 icon = sys.argv[2] |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
781 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
782 # required modules for each toolkit |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
783 toolkits_modules = { |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
784 'gtk3': [ |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
785 ('gi.repository', [ |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
786 'GLib', |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
787 'GdkPixbuf', |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
788 'Gtk', |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
789 'Notify' |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
790 ]) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
791 ], |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
792 'gtk2': [ |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
793 ('pygtk', []), |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
794 ('gobject', []), |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
795 ('gtk', []), |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
796 ('pynotify', []) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
797 ], |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
798 'qt4': [ |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
799 ('PyQt4', [ |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
800 'QtGui', |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
801 'QtCore' |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
802 ]) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
803 ], |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
804 'kde4': [ |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
805 ('PyQt4', [ |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
806 'QtGui', |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
807 'QtCore' |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
808 ]), |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
809 ('PyKDE4', [ |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
810 'kdecore', |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
811 'kdeui' |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
812 ]) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
813 ], |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
814 '': [] |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
815 } |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
816 available_toolkits = [] |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
817 selected_toolkit = '' |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
818 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
819 # find available toolkits by spawning a process for each toolkit which |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
820 # tries to import all required modules and returns an exit status of 1 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
821 # in case of an import error |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
822 for toolkit in toolkits_modules: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
823 process = multiprocessing.Process(target=try_import_modules, |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
824 args=(toolkits_modules[toolkit],)) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
825 process.start() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
826 process.join(3) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
827 if process.is_alive(): |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
828 process.terminate() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
829 process.join() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
830 if process.exitcode == 0: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
831 available_toolkits.append(toolkit) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
832 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
833 # select toolkit based on either explicit preference or the |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
834 # availability of modules and the used desktop environment |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
835 if preferred_toolkit: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
836 if preferred_toolkit in available_toolkits: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
837 selected_toolkit = preferred_toolkit |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
838 else: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
839 if 'KDE_FULL_SESSION' in os.environ: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
840 # preferred order if running KDE4 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
841 toolkits = ['kde4', 'qt4', 'gtk3', 'gtk2'] |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
842 else: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
843 # preferred order for all other desktop environments |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
844 toolkits = ['gtk3', 'gtk2', 'qt4', 'kde4'] |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
845 for toolkit in toolkits: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
846 if toolkit in available_toolkits: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
847 selected_toolkit = toolkit |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
848 break |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
849 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
850 # import required toolkit modules |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
851 import_modules(toolkits_modules[selected_toolkit]) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
852 |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
853 # run selected notifier |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
854 if selected_toolkit == 'gtk3': |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
855 notifier = Gtk3Notifier(icon) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
856 elif selected_toolkit == 'gtk2': |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
857 notifier = Gtk2Notifier(icon) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
858 elif selected_toolkit == 'qt4': |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
859 notifier = Qt4Notifier(icon) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
860 elif selected_toolkit == 'kde4': |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
861 notifier = KDE4Notifier(icon) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
862 else: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
863 notifier = Notifier(icon) |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
864 notifier.run() |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
865 else: |
dfe10c951e21
Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff
changeset
|
866 sys.exit(1) |