annotate notification.py @ 0:dfe10c951e21

Initial revision
author Guido Berhoerster <guido+weechat@berhoerster.name>
date Tue, 10 Mar 2015 11:27:22 +0100
parents
children ba1005429c76
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
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
225 def notify(self, summary, message, icon):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
226 if self.status_icon:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
227 self.status_icon.set_tooltip_text('%s: %s' % (APPLICATION,
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
228 summary))
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
229 self.status_icon.set_blinking(True)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
230
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
231 if icon and icon.startswith('/'):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
232 icon_name = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
233 try:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
234 icon_pixbuf = gtk.gdk.Pixbuf.new_from_file(icon)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
235 except gobject.GError:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
236 icon_pixbuf = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
237 else:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
238 icon_name = icon
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
239 icon_pixbuf = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
240
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
241 if 'body-markup' in pynotify.get_server_caps():
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
242 body = cgi.escape(message)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
243 else:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
244 body = message
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
245
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
246 notification = pynotify.Notification(summary, body, icon_name)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
247 if icon_pixbuf is not None:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
248 notification.set_image_from_pixbuf(icon_pixbuf)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
249 notification.show()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
250
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
251 def reset(self):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
252 if self.status_icon:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
253 self.status_icon.set_tooltip_text(APPLICATION)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
254 self.status_icon.set_blinking(False)
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 run(self):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
257 gtk.main()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
258
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
259
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
260 class Gtk3Notifier(Notifier):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
261 """GTK3 notifier based on GObject Introspection Bindings for GTK 3 and
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
262 libnotify
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 def __init__(self, icon):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
266 super(Gtk3Notifier, self).__init__(icon)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
267
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
268 Notify.init(APPLICATION)
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 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
271
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
272 if not icon:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
273 self.icon_name = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
274 self.icon_pixbuf = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
275 elif icon.startswith('/'):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
276 self.icon_name = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
277 try:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
278 self.icon_pixbuf = GdkPixbuf.Pixbuf.new_from_file(icon)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
279 except GLib.GError:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
280 self.icon_pixbuf = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
281 else:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
282 self.icon_name = icon
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
283 self.icon_pixbuf = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
284
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
285 if self.icon_name or self.icon_pixbuf:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
286 # create blank, fully transparent pixbuf in order to simulate
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
287 # blinking
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
288 self.blank_pixbuf = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB,
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
289 True, 8, 22, 22)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
290 self.blank_pixbuf.fill(0x00)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
291
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
292 self.blink_on = True
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
293 self.blink_timeout_id = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
294
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
295 self.status_icon = Gtk.StatusIcon.new()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
296 self.status_icon.set_title(APPLICATION)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
297 self.status_icon.set_tooltip_text(APPLICATION)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
298 self.status_icon.connect('activate', self.on_activate)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
299 self.update_icon()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
300 else:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
301 self.status_icon = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
302
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
303 def on_input(self, fd, cond):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
304 if cond & (GLib.IO_IN | GLib.IO_PRI):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
305 try:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
306 self.parser.parse(os.read(fd.fileno(), BUFFER_SIZE))
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
307 except EOFError:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
308 Gtk.main_quit()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
309 return False
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
310
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
311 if cond & (GLib.IO_ERR | GLib.IO_HUP):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
312 Gtk.main_quit()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
313 return False
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
314
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
315 return True
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
316
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
317 def on_activate(self, widget):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
318 self.reset()
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 def update_icon(self):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
321 if not self.blink_on:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
322 self.status_icon.set_from_pixbuf(self.blank_pixbuf)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
323 elif self.icon_name:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
324 self.status_icon.set_from_icon_name(self.icon_name)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
325 elif self.icon_pixbuf:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
326 self.status_icon.set_from_pixbuf(self.icon_pixbuf)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
327
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
328 def on_blink_timeout(self):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
329 self.blink_on = not self.blink_on
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
330 self.update_icon()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
331 return True
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 notify(self, summary, message, icon):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
334 if self.status_icon:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
335 self.status_icon.set_tooltip_text('%s: %s' % (APPLICATION,
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
336 summary))
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
337 if self.blink_timeout_id is None:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
338 self.blink_timeout_id = GLib.timeout_add(500,
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
339 self.on_blink_timeout)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
340
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
341 if icon and icon.startswith('/'):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
342 icon_name = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
343 try:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
344 icon_pixbuf = GdkPixbuf.Pixbuf.new_from_file(icon)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
345 except GLib.GError:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
346 icon_pixbuf = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
347 else:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
348 icon_name = icon
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
349 icon_pixbuf = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
350
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
351 if 'body-markup' in Notify.get_server_caps():
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
352 body = cgi.escape(message)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
353 else:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
354 body = message
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
355
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
356 notification = Notify.Notification.new(summary, body, icon_name)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
357 if icon_pixbuf is not None:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
358 notification.set_image_from_pixbuf(icon_pixbuf)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
359 notification.show()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
360
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
361 def reset(self):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
362 if self.status_icon:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
363 self.status_icon.set_tooltip_text(APPLICATION)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
364 if self.blink_timeout_id is not None:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
365 GLib.source_remove(self.blink_timeout_id)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
366 self.blink_timeout_id = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
367 self.blink_on = True
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
368 self.update_icon()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
369
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
370 def run(self):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
371 Gtk.main()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
372
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
373
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
374 class Qt4Notifier(Notifier):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
375 """Qt 4 notifier"""
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
376
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
377 def __init__(self, icon):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
378 super(Qt4Notifier, self).__init__(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 signal.signal(signal.SIGINT, self.on_sigint)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
381
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
382 self.qapplication = QtGui.QApplication([])
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 self.readable_notifier = QtCore.QSocketNotifier(sys.stdin.fileno(),
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
385 QtCore.QSocketNotifier.Read)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
386 self.readable_notifier.activated.connect(self.on_input)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
387 self.readable_notifier.setEnabled(True)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
388
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
389 if not icon:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
390 self.icon = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
391 elif icon.startswith('/'):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
392 self.icon = QtGui.QIcon(icon)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
393 else:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
394 self.icon = QtGui.QIcon.fromTheme(icon)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
395
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
396 if self.icon:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
397 # create blank, fully transparent pixbuf in order to simulate
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
398 # blinking
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
399 self.blank_icon = QtGui.QIcon()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
400
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
401 self.blink_on = True
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
402 self.blinking_timer = QtCore.QTimer()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
403 self.blinking_timer.setInterval(500)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
404 self.blinking_timer.timeout.connect(self.on_blink_timeout)
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 self.status_icon = QtGui.QSystemTrayIcon()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
407 self.status_icon.setToolTip(APPLICATION)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
408 self.update_icon()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
409 self.status_icon.setVisible(True)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
410 self.status_icon.activated.connect(self.on_activated)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
411 else:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
412 self.status_icon = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
413
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
414 def on_sigint(self, signo, frame):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
415 self.qapplication.exit(0)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
416
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
417 def on_input(self, fd):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
418 try:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
419 self.parser.parse(os.read(fd, BUFFER_SIZE))
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
420 except EOFError:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
421 self.qapplication.exit(1)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
422
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
423 def on_activated(self, reason):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
424 self.reset()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
425
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
426 def on_blink_timeout(self):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
427 self.blink_on = not self.blink_on
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
428 self.update_icon()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
429
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
430 def update_icon(self):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
431 if not self.blink_on:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
432 self.status_icon.setIcon(self.blank_icon)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
433 else:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
434 self.status_icon.setIcon(self.icon)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
435
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
436 def notify(self, summary, message, icon):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
437 if self.status_icon:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
438 self.status_icon.setToolTip('%s: %s' % (APPLICATION,
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
439 cgi.escape(summary)))
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
440 self.blinking_timer.start()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
441 if self.status_icon.supportsMessages():
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
442 self.status_icon.showMessage(summary, message,
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
443 QtGui.QSystemTrayIcon.NoIcon)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
444
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
445 def reset(self):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
446 if self.status_icon:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
447 self.blinking_timer.stop()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
448 self.blink_on = True
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
449 self.update_icon()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
450 self.status_icon.setToolTip(APPLICATION)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
451
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
452 def run(self):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
453 sys.exit(self.qapplication.exec_())
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
454
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
455
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
456 class KDE4Notifier(Notifier):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
457 """KDE 4 notifier based on PyKDE4"""
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 __init__(self, icon):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
460 super(KDE4Notifier, self).__init__(icon)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
461
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
462 signal.signal(signal.SIGINT, self.on_sigint)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
463
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
464 aboutData = kdecore.KAboutData(APPLICATION.lower(), '',
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
465 kdecore.ki18n(APPLICATION), VERSION, kdecore.ki18n(SUBTITLE),
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
466 kdecore.KAboutData.License_GPL_V3, kdecore.ki18n(COPYRIGHT),
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
467 kdecore.ki18n (''), HOMEPAGE, EMAIL)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
468 kdecore.KCmdLineArgs.init(aboutData)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
469 self.kapplication = kdeui.KApplication()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
470
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
471 self.readable_notifier = QtCore.QSocketNotifier(sys.stdin.fileno(),
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
472 QtCore.QSocketNotifier.Read)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
473 self.readable_notifier.activated.connect(self.on_input)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
474 self.readable_notifier.setEnabled(True)
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 if not icon:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
477 icon_qicon = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
478 icon_name = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
479 elif icon.startswith('/'):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
480 icon_qicon = QtGui.QIcon(icon)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
481 icon_name = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
482 else:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
483 icon_qicon = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
484 icon_name = icon
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
485
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
486 if icon_name or icon_pixmap:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
487 self.status_notifier = kdeui.KStatusNotifierItem(self.kapplication)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
488 self.status_notifier.setCategory(
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
489 kdeui.KStatusNotifierItem.Communications)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
490 if icon_name:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
491 self.status_notifier.setIconByName(icon_name)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
492 self.status_notifier.setToolTip(icon_name, APPLICATION,
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
493 SUBTITLE)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
494 else:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
495 self.status_notifier.setIconByPixmap(icon_qicon)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
496 self.status_notifier.setToolTip(icon_qicon, APPLICATION,
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
497 SUBTITLE)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
498 self.status_notifier.setStandardActionsEnabled(False)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
499 self.status_notifier.setStatus(kdeui.KStatusNotifierItem.Active)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
500 self.status_notifier.setTitle(APPLICATION)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
501 self.status_notifier.activateRequested.connect(
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
502 self.on_activate_requested)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
503 else:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
504 self.status_notifier = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
505
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
506 def on_sigint(self, signo, frame):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
507 self.kapplication.exit(0)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
508
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
509 def on_input(self, fd):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
510 try:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
511 self.parser.parse(os.read(fd, BUFFER_SIZE))
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
512 except EOFError:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
513 self.kapplication.exit(1)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
514
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
515 def on_activate_requested(self, active, pos):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
516 self.reset()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
517
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
518 def notify(self, summary, message, icon):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
519 if self.status_notifier:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
520 self.status_notifier.setToolTipSubTitle(cgi.escape(summary))
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
521 self.status_notifier.setStatus(
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
522 kdeui.KStatusNotifierItem.NeedsAttention)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
523
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
524 if icon:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
525 if icon.startswith('/'):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
526 pixmap = QtGui.QPixmap.load(icon)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
527 else:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
528 pixmap = kdeui.KIcon(icon).pixmap(kdeui.KIconLoader.SizeHuge,
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
529 kdeui.KIconLoader.SizeHuge)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
530 else:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
531 pixmap = QtGui.QPixmap()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
532 kdeui.KNotification.event(kdeui.KNotification.Notification, summary,
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
533 cgi.escape(message), pixmap)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
534
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
535 def reset(self):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
536 if self.status_notifier:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
537 self.status_notifier.setStatus(kdeui.KStatusNotifierItem.Active)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
538 self.status_notifier.setToolTipTitle(APPLICATION)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
539 self.status_notifier.setToolTipSubTitle(SUBTITLE)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
540
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
541 def run(self):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
542 sys.exit(self.kapplication.exec_())
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
543
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
544
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
545 class NotificationProxy(object):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
546 """Proxy object for interfacing with the notifier process"""
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
547
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
548 def __init__(self, preferred_toolkit, status_icon):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
549 self.script_file = os.path.realpath(__file__)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
550 self._status_icon = status_icon
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
551 self._preferred_toolkit = preferred_toolkit
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
552 self.notifier_process_hook = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
553 self.spawn_timer_hook = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
554 self.next_spawn_time = 0.0
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
555
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
556 self.spawn_notifier_process()
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 @property
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
559 def status_icon(self):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
560 return self._status_icon
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 @status_icon.setter
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
563 def status_icon(self, value):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
564 self._status_icon = value
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
565 self.terminate_notifier_process()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
566 self.spawn_notifier_process()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
567
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
568 @property
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
569 def preferred_toolkit(self):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
570 return self._preferred_toolkit
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 @preferred_toolkit.setter
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
573 def preferred_toolkit(self, value):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
574 self._preferred_toolkit = value
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
575 self.terminate_notifier_process()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
576 self.spawn_notifier_process()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
577
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
578 def on_notifier_process_event(self, data, command, return_code, output,
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
579 error_output):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
580 if return_code != weechat.WEECHAT_HOOK_PROCESS_RUNNING:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
581 if return_code == weechat.WEECHAT_HOOK_PROCESS_ERROR:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
582 error = '%sfailed to run notifier' % weechat.prefix("error")
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
583 else:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
584 error = '%snotifier exited with exit status %d' % \
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
585 (weechat.prefix("error"), return_code)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
586 if output:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
587 error += '\nstdout:%s' % output
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
588 if error_output:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
589 error += '\nstderr:%s' % error_output
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
590 weechat.prnt('', error)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
591 self.notifier_process_hook = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
592 self.spawn_notifier_process()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
593 return weechat.WEECHAT_RC_OK
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
594
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
595 def on_spawn_timer(self, data, remaining):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
596 self.spawn_timer_hook = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
597 if not self.notifier_process_hook:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
598 self.spawn_notifier_process()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
599 return weechat.WEECHAT_RC_OK
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
600
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
601 def spawn_notifier_process(self):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
602 if self.notifier_process_hook or self.spawn_timer_hook:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
603 return
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
604
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
605 # 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
606 now = time.time()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
607 if long(self.next_spawn_time - now) > 0:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
608 self.spawn_timer_hook = \
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
609 weechat.hook_timer(long((self.next_spawn_time - now) *
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
610 1000), 0, 1, 'dispatch_weechat_callback',
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
611 create_weechat_callback(self.on_spawn_timer))
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
612 return
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
613
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
614 self.next_spawn_time = now + 10
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
615 self.notifier_process_hook = \
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
616 weechat.hook_process_hashtable(sys.executable, {'arg1':
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
617 self.script_file, 'arg2': self.preferred_toolkit, 'arg3':
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
618 self.status_icon, 'stdin': '1'}, 0,
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
619 'dispatch_weechat_callback',
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
620 create_weechat_callback(self.on_notifier_process_event))
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
621
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
622 def terminate_notifier_process(self):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
623 if self.spawn_timer_hook:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
624 weechat.unhook(self.spawn_timer_hook)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
625 self.spawn_timer_hook = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
626 if self.notifier_process_hook:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
627 weechat.unhook(self.notifier_process_hook)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
628 self.notifier_process_hook = None
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
629 self.next_spawn_time = 0.0
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
630
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
631 def send(self, command, *args):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
632 if self.notifier_process_hook:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
633 if args:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
634 weechat.hook_set(self.notifier_process_hook, 'stdin',
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
635 netstring_encode(netstring_encode(command,
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
636 netstring_encode(*args))))
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
637 else:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
638 weechat.hook_set(self.notifier_process_hook, 'stdin',
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
639 netstring_encode(netstring_encode(command)))
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
640
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
641 def notify(self, summary, message, icon):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
642 self.send('notify', summary, message, icon)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
643
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
644 def reset(self):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
645 self.send('reset')
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
646
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
647
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
648 class NotificationPlugin(object):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
649 """Weechat plugin"""
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
650
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
651 def __init__(self):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
652 self.DCC_SEND_RE = re.compile(r':(?P<sender>\S+) PRIVMSG \S+ :'
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
653 r'\x01DCC SEND (?P<filename>\S+) \d+ \d+ (?P<size>\d+)')
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
654 self.DCC_CHAT_RE = re.compile(r':(?P<sender>\S+) PRIVMSG \S+ :'
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
655 r'\x01DCC CHAT ')
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
656
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
657 weechat.register(SCRIPT_NAME, AUTHOR, VERSION, 'GPL3', DESCRIPTION, '',
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
658 '')
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
659
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
660 for option, (value, description) in DEFAULT_SETTINGS.iteritems():
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
661 if not weechat.config_is_set_plugin(option):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
662 weechat.config_set_plugin(option, value)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
663 weechat.config_set_desc_plugin(option, '%s (default: "%s")' %
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
664 (description, value))
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
665
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
666 self.notification_proxy = NotificationProxy(
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
667 weechat.config_get_plugin('preferred_toolkit'),
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
668 weechat.config_get_plugin('status_icon'))
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
669
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
670 weechat.hook_print('', 'irc_privmsg', '', 1,
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
671 'dispatch_weechat_callback',
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
672 create_weechat_callback(self.on_message))
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
673 weechat.hook_signal('key_pressed', 'dispatch_weechat_callback',
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
674 create_weechat_callback(self.on_key_pressed))
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
675 weechat.hook_signal('irc_dcc', 'dispatch_weechat_callback',
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
676 create_weechat_callback(self.on_dcc))
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
677 weechat.hook_config('plugins.var.python.%s.*' % SCRIPT_NAME,
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
678 'dispatch_weechat_callback',
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
679 create_weechat_callback(self.on_config_changed))
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
680
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
681 def on_message(self, data, buffer, date, tags, displayed, highlight,
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
682 prefix, message):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
683 if weechat.config_get_plugin('notify_on_displayed_only') == 'on' and \
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
684 int(displayed) != 1:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
685 return weechat.WEECHAT_RC_OK
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
686
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
687 formatted_date = time.strftime('%H:%M', time.localtime(float(date)))
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
688 if 'notify_private' in tags.split(',') and \
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
689 weechat.config_get_plugin('notify_on_privmsg') == 'on':
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
690 summary = 'Private message from %s at %s' % (prefix,
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
691 formatted_date)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
692 self.notification_proxy.notify(summary, message,
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
693 weechat.config_get_plugin('notification_icon'))
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
694 elif int(highlight) == 1 and \
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
695 weechat.config_get_plugin('notify_on_highlight') == 'on':
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
696 summary = 'Highlighted message from %s at %s' % (prefix,
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
697 formatted_date)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
698 self.notification_proxy.notify(summary, message,
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
699 weechat.config_get_plugin('notification_icon'))
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 return weechat.WEECHAT_RC_OK
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
702
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
703 def on_dcc(self, data, signal, signal_data):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
704 if weechat.config_get_plugin('notify_on_dcc') != 'on':
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
705 return weechat.WEECHAT_RC_OK
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
706
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
707 matches = self.DCC_SEND_RE.match(signal_data)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
708 if matches:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
709 summary = 'DCC send request from %s' % matches.group('sender')
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
710 message = 'Filname: %s, Size: %d bytes' % \
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
711 (matches.group('filename'), int(matches.group('size')))
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 return weechat.WEECHAT_RC_OK
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
715
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
716 matches = self.DCC_CHAT_RE.match(signal_data)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
717 if matches:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
718 summary = 'DCC chat request from %s' % matches.group('sender')
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
719 message = ''
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
720 self.notification_proxy.notify(summary, message,
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
721 weechat.config_get_plugin('notification_icon'))
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
722 return weechat.WEECHAT_RC_OK
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
723
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
724 return weechat.WEECHAT_RC_OK
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
725
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
726 def on_key_pressed(self, data, signal, signal_data):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
727 self.notification_proxy.reset()
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 def on_config_changed(self, data, option, value):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
731 if option.endswith('.preferred_toolkit'):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
732 self.notification_proxy.preferred_toolkit = value
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
733 elif option.endswith('.status_icon'):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
734 self.notification_proxy.status_icon = value
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
735 return weechat.WEECHAT_RC_OK
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
736
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 def import_modules(modules):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
739 for module_name, fromlist in modules:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
740 if fromlist:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
741 module = __import__(module_name, fromlist=fromlist)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
742 for identifier in fromlist:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
743 globals()[identifier] = getattr(module, identifier)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
744 else:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
745 globals()[module_name] = __import__(module_name)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
746
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
747 def try_import_modules(modules):
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
748 try:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
749 import_modules(modules)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
750 except ImportError:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
751 sys.exit(1)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
752 sys.exit(0)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
753
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
754
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
755 if __name__ == '__main__':
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
756 if sys.argv[0] == '__weechat_plugin__':
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
757 # running as Weechat plugin
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
758 import weechat
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
759
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
760 weechat_callbacks = {}
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
761
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
762 plugin = NotificationPlugin()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
763 elif len(sys.argv) == 3:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
764 # running as the notifier process
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
765 preferred_toolkit = sys.argv[1]
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
766 icon = sys.argv[2]
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 # required modules for each toolkit
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
769 toolkits_modules = {
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
770 'gtk3': [
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
771 ('gi.repository', [
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
772 'GLib',
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
773 'GdkPixbuf',
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
774 'Gtk',
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
775 'Notify'
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
776 ])
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
777 ],
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
778 'gtk2': [
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
779 ('pygtk', []),
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
780 ('gobject', []),
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
781 ('gtk', []),
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
782 ('pynotify', [])
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
783 ],
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
784 'qt4': [
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
785 ('PyQt4', [
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
786 'QtGui',
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
787 'QtCore'
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
788 ])
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
789 ],
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
790 'kde4': [
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
791 ('PyQt4', [
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
792 'QtGui',
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
793 'QtCore'
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
794 ]),
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
795 ('PyKDE4', [
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
796 'kdecore',
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
797 'kdeui'
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
798 ])
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
799 ],
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
800 '': []
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
801 }
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
802 available_toolkits = []
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
803 selected_toolkit = ''
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
804
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
805 # find available toolkits by spawning a process for each toolkit which
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
806 # 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
807 # in case of an import error
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
808 for toolkit in toolkits_modules:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
809 process = multiprocessing.Process(target=try_import_modules,
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
810 args=(toolkits_modules[toolkit],))
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
811 process.start()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
812 process.join(3)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
813 if process.is_alive():
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
814 process.terminate()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
815 process.join()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
816 if process.exitcode == 0:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
817 available_toolkits.append(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 # select toolkit based on either explicit preference or the
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
820 # availability of modules and the used desktop environment
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
821 if preferred_toolkit:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
822 if preferred_toolkit in available_toolkits:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
823 selected_toolkit = preferred_toolkit
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
824 else:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
825 if 'KDE_FULL_SESSION' in os.environ:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
826 # preferred order if running KDE4
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
827 toolkits = ['kde4', 'qt4', 'gtk3', 'gtk2']
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
828 else:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
829 # preferred order for all other desktop environments
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
830 toolkits = ['gtk3', 'gtk2', 'qt4', 'kde4']
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
831 for toolkit in toolkits:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
832 if toolkit in available_toolkits:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
833 selected_toolkit = toolkit
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
834 break
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
835
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
836 # import required toolkit modules
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
837 import_modules(toolkits_modules[selected_toolkit])
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
838
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
839 # run selected notifier
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
840 if selected_toolkit == 'gtk3':
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
841 notifier = Gtk3Notifier(icon)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
842 elif selected_toolkit == 'gtk2':
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
843 notifier = Gtk2Notifier(icon)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
844 elif selected_toolkit == 'qt4':
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
845 notifier = Qt4Notifier(icon)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
846 elif selected_toolkit == 'kde4':
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
847 notifier = KDE4Notifier(icon)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
848 else:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
849 notifier = Notifier(icon)
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
850 notifier.run()
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
851 else:
dfe10c951e21 Initial revision
Guido Berhoerster <guido+weechat@berhoerster.name>
parents:
diff changeset
852 sys.exit(1)