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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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)