Merge lp:~mk-fraggod/screenkey/screenkey into lp:screenkey

Proposed by Mike Kazantsev
Status: Approved
Approved by: Pablo SEMINARIO
Approved revision: 52
Proposed branch: lp:~mk-fraggod/screenkey/screenkey
Merge into: lp:screenkey
Diff against target: 179 lines (+85/-12)
1 file modified
Screenkey/screenkey.py (+85/-12)
To merge this branch: bzr merge lp:~mk-fraggod/screenkey/screenkey
Reviewer Review Type Date Requested Status
Pablo SEMINARIO Approve
Review via email: mp+162516@code.launchpad.net

Description of the change

Use RGBA palette and cairo to create semi-transparent (0.7) background if compositing for the screen is enabled, as per bug #1159855.

To post a comment you must log in.
Revision history for this message
Pablo SEMINARIO (pabluk) wrote :

Good work, thanks Mike

review: Approve
lp:~mk-fraggod/screenkey/screenkey updated
53. By Mike Kazantsev

Make opacity value configurable in preferences dialog

54. By Mike Kazantsev

Cleanup of leftover debug logging line, simplier options init

Unmerged revisions

54. By Mike Kazantsev

Cleanup of leftover debug logging line, simplier options init

53. By Mike Kazantsev

Make opacity value configurable in preferences dialog

52. By Mike Kazantsev

Add support for transparency under compositing window managers.

For non-compositing wm's, XShape can be used, but not implemented here.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'Screenkey/screenkey.py'
--- Screenkey/screenkey.py 2012-02-14 20:16:23 +0000
+++ Screenkey/screenkey.py 2013-05-05 12:09:26 +0000
@@ -18,6 +18,7 @@
18import gtk18import gtk
19import gobject19import gobject
20import glib20import glib
21import cairo
21import pango22import pango
22import pickle23import pickle
23from threading import Timer24from threading import Timer
@@ -62,14 +63,18 @@
62 self.timer = None63 self.timer = None
63 self.logger = logger64 self.logger = logger
6465
66 default_options = {
67 'timeout': 2.5,
68 'position': POS_BOTTOM,
69 'size': SIZE_MEDIUM,
70 'opacity': 0.7,
71 'mode': MODE_NORMAL,
72 }
73
65 self.options = self.load_state()74 self.options = self.load_state()
66 if not self.options:75 for key, value in default_options.items():
67 self.options = {76 if key not in self.options:
68 'timeout': 2.5,77 self.options[key] = value
69 'position': POS_BOTTOM,
70 'size': SIZE_MEDIUM,
71 'mode': MODE_NORMAL,
72 }
7378
74 if not nodetach:79 if not nodetach:
75 self.logger.debug("Detach from the parent.")80 self.logger.debug("Detach from the parent.")
@@ -83,9 +88,9 @@
83 self.set_property('accept-focus', False)88 self.set_property('accept-focus', False)
84 self.set_property('focus-on-map', False)89 self.set_property('focus-on-map', False)
85 self.set_position(gtk.WIN_POS_CENTER)90 self.set_position(gtk.WIN_POS_CENTER)
86 bgcolor = gtk.gdk.color_parse("black")91
87 self.modify_bg(gtk.STATE_NORMAL, bgcolor)92 self.bgcolor = gtk.gdk.color_parse("black")
88 self.set_opacity(0.7)93 self.modify_bg(gtk.STATE_NORMAL, self.bgcolor)
8994
90 gobject.signal_new("text-changed", gtk.Label, 95 gobject.signal_new("text-changed", gtk.Label,
91 gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ())96 gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ())
@@ -96,6 +101,15 @@
96 self.label.show()101 self.label.show()
97 self.add(self.label)102 self.add(self.label)
98103
104 self.compositing = self.is_composited()
105 if self.compositing:
106 # Use cairo and rgba palette
107 self.set_app_paintable(True)
108 self.connect("screen_changed", self.on_screen_changed)
109 self.connect("expose_event", self.on_expose)
110 self.set_screen_colormap()
111 # XShape extension can be used otherwise, not implemented yet
112
99 self.screen_width = gtk.gdk.screen_width() 113 self.screen_width = gtk.gdk.screen_width()
100 self.screen_height = gtk.gdk.screen_height() 114 self.screen_height = gtk.gdk.screen_height()
101 self.set_window_size(self.options['size'])115 self.set_window_size(self.options['size'])
@@ -159,13 +173,14 @@
159173
160 self.connect("delete-event", self.quit)174 self.connect("delete-event", self.quit)
161175
176
162 def quit(self, widget, data=None):177 def quit(self, widget, data=None):
163 self.listenkbd.stop()178 self.listenkbd.stop()
164 gtk.main_quit()179 gtk.main_quit()
165180
166 def load_state(self):181 def load_state(self):
167 """Load stored options"""182 """Load stored options"""
168 options = None183 options = {}
169 try:184 try:
170 f = open(self.STATE_FILE, 'r')185 f = open(self.STATE_FILE, 'r')
171 try:186 try:
@@ -190,6 +205,29 @@
190 except IOError:205 except IOError:
191 self.logger.debug("Cannot open %s." % self.STATE_FILE)206 self.logger.debug("Cannot open %s." % self.STATE_FILE)
192207
208 def set_screen_colormap(self):
209 screen = self.get_screen()
210 rgba = screen.get_rgba_colormap()
211 if rgba is None:
212 self.set_colormap(screen.get_rgb_colormap())
213 self.compositing = False
214 else:
215 self.set_colormap(rgba)
216 self.compositing = True
217
218 def set_opacity(self, setting, region=None):
219 ctx = self.window.cairo_create()
220 if region:
221 ctx.region(region)
222 else:
223 ctx.paint()
224 ctx.set_operator(cairo.OPERATOR_SOURCE)
225 ctx.set_source_rgba(self.bgcolor.red_float,
226 self.bgcolor.green_float,
227 self.bgcolor.blue_float,
228 setting)
229 ctx.fill()
230
193 def set_window_size(self, setting):231 def set_window_size(self, setting):
194 """Set window and label size."""232 """Set window and label size."""
195 window_width = self.screen_width233 window_width = self.screen_width
@@ -264,6 +302,16 @@
264 self.logger.debug("Screenkey disabled.")302 self.logger.debug("Screenkey disabled.")
265 self.listenkbd.stop()303 self.listenkbd.stop()
266304
305 def on_screen_changed(self, widget, from_screen):
306 # Used only with compositing
307 self.set_screen_colormap()
308
309 def on_expose(self, widget, event):
310 # Used only with compositing
311 if not self.compositing:
312 return
313 self.set_opacity(self.options['opacity'], gtk.gdk.region_rectangle(event.area))
314
267 def on_preferences_dialog(self, widget, data=None):315 def on_preferences_dialog(self, widget, data=None):
268 prefs = gtk.Dialog(APP_NAME, None, 316 prefs = gtk.Dialog(APP_NAME, None,
269 gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, 317 gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
@@ -280,6 +328,10 @@
280 self.set_window_size(self.options['size'])328 self.set_window_size(self.options['size'])
281 self.logger.debug("Window size changed.")329 self.logger.debug("Window size changed.")
282330
331 def on_sb_opacity_changed(widget, data=None):
332 self.options['opacity'] = widget.get_value() / 100.0
333 self.logger.debug("Opacity value changed.")
334
283 def on_cbox_modes_changed(widget, data=None):335 def on_cbox_modes_changed(widget, data=None):
284 index = widget.get_active()336 index = widget.get_active()
285 if index >= 0:337 if index >= 0:
@@ -321,7 +373,7 @@
321 frm_time.add(hbox_time)373 frm_time.add(hbox_time)
322 frm_time.show_all()374 frm_time.show_all()
323375
324 frm_aspect = gtk.Frame(_("<b>Aspect</b>"))376 frm_aspect = gtk.Frame(_("<b>Display</b>"))
325 frm_aspect.set_border_width(4)377 frm_aspect.set_border_width(4)
326 frm_aspect.get_label_widget().set_use_markup(True)378 frm_aspect.get_label_widget().set_use_markup(True)
327 frm_aspect.set_shadow_type(gtk.SHADOW_NONE)379 frm_aspect.set_shadow_type(gtk.SHADOW_NONE)
@@ -357,8 +409,29 @@
357 hbox2_aspect.pack_start(cbox_sizes, expand=False, 409 hbox2_aspect.pack_start(cbox_sizes, expand=False,
358 fill=False, padding=4)410 fill=False, padding=4)
359411
412 hbox3_aspect = gtk.HBox()
413
414 lbl_opacity1 = gtk.Label(_("Opacity"))
415 lbl_opacity2 = gtk.Label(_("%"))
416
417 sb_opacity = gtk.SpinButton(digits=1)
418 sb_opacity.set_increments(10, 25)
419 sb_opacity.set_range(0, 100)
420 sb_opacity.set_numeric(True)
421 sb_opacity.set_update_policy(gtk.UPDATE_IF_VALID)
422 sb_opacity.set_value(self.options['opacity'] * 100)
423 sb_opacity.connect("value-changed", on_sb_opacity_changed)
424
425 hbox3_aspect.pack_start(lbl_opacity1, expand=False,
426 fill=False, padding=6)
427 hbox3_aspect.pack_start(sb_opacity, expand=False,
428 fill=False, padding=4)
429 hbox3_aspect.pack_start(lbl_opacity2, expand=False,
430 fill=False, padding=4)
431
360 vbox_aspect.pack_start(hbox1_aspect)432 vbox_aspect.pack_start(hbox1_aspect)
361 vbox_aspect.pack_start(hbox2_aspect)433 vbox_aspect.pack_start(hbox2_aspect)
434 vbox_aspect.pack_start(hbox3_aspect)
362 frm_aspect.add(vbox_aspect)435 frm_aspect.add(vbox_aspect)
363436
364 frm_kbd = gtk.Frame(_("<b>Keys</b>"))437 frm_kbd = gtk.Frame(_("<b>Keys</b>"))

Subscribers

People subscribed via source and target branches