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
1=== modified file 'Screenkey/screenkey.py'
2--- Screenkey/screenkey.py 2012-02-14 20:16:23 +0000
3+++ Screenkey/screenkey.py 2013-05-05 12:09:26 +0000
4@@ -18,6 +18,7 @@
5 import gtk
6 import gobject
7 import glib
8+import cairo
9 import pango
10 import pickle
11 from threading import Timer
12@@ -62,14 +63,18 @@
13 self.timer = None
14 self.logger = logger
15
16+ default_options = {
17+ 'timeout': 2.5,
18+ 'position': POS_BOTTOM,
19+ 'size': SIZE_MEDIUM,
20+ 'opacity': 0.7,
21+ 'mode': MODE_NORMAL,
22+ }
23+
24 self.options = self.load_state()
25- if not self.options:
26- self.options = {
27- 'timeout': 2.5,
28- 'position': POS_BOTTOM,
29- 'size': SIZE_MEDIUM,
30- 'mode': MODE_NORMAL,
31- }
32+ for key, value in default_options.items():
33+ if key not in self.options:
34+ self.options[key] = value
35
36 if not nodetach:
37 self.logger.debug("Detach from the parent.")
38@@ -83,9 +88,9 @@
39 self.set_property('accept-focus', False)
40 self.set_property('focus-on-map', False)
41 self.set_position(gtk.WIN_POS_CENTER)
42- bgcolor = gtk.gdk.color_parse("black")
43- self.modify_bg(gtk.STATE_NORMAL, bgcolor)
44- self.set_opacity(0.7)
45+
46+ self.bgcolor = gtk.gdk.color_parse("black")
47+ self.modify_bg(gtk.STATE_NORMAL, self.bgcolor)
48
49 gobject.signal_new("text-changed", gtk.Label,
50 gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ())
51@@ -96,6 +101,15 @@
52 self.label.show()
53 self.add(self.label)
54
55+ self.compositing = self.is_composited()
56+ if self.compositing:
57+ # Use cairo and rgba palette
58+ self.set_app_paintable(True)
59+ self.connect("screen_changed", self.on_screen_changed)
60+ self.connect("expose_event", self.on_expose)
61+ self.set_screen_colormap()
62+ # XShape extension can be used otherwise, not implemented yet
63+
64 self.screen_width = gtk.gdk.screen_width()
65 self.screen_height = gtk.gdk.screen_height()
66 self.set_window_size(self.options['size'])
67@@ -159,13 +173,14 @@
68
69 self.connect("delete-event", self.quit)
70
71+
72 def quit(self, widget, data=None):
73 self.listenkbd.stop()
74 gtk.main_quit()
75
76 def load_state(self):
77 """Load stored options"""
78- options = None
79+ options = {}
80 try:
81 f = open(self.STATE_FILE, 'r')
82 try:
83@@ -190,6 +205,29 @@
84 except IOError:
85 self.logger.debug("Cannot open %s." % self.STATE_FILE)
86
87+ def set_screen_colormap(self):
88+ screen = self.get_screen()
89+ rgba = screen.get_rgba_colormap()
90+ if rgba is None:
91+ self.set_colormap(screen.get_rgb_colormap())
92+ self.compositing = False
93+ else:
94+ self.set_colormap(rgba)
95+ self.compositing = True
96+
97+ def set_opacity(self, setting, region=None):
98+ ctx = self.window.cairo_create()
99+ if region:
100+ ctx.region(region)
101+ else:
102+ ctx.paint()
103+ ctx.set_operator(cairo.OPERATOR_SOURCE)
104+ ctx.set_source_rgba(self.bgcolor.red_float,
105+ self.bgcolor.green_float,
106+ self.bgcolor.blue_float,
107+ setting)
108+ ctx.fill()
109+
110 def set_window_size(self, setting):
111 """Set window and label size."""
112 window_width = self.screen_width
113@@ -264,6 +302,16 @@
114 self.logger.debug("Screenkey disabled.")
115 self.listenkbd.stop()
116
117+ def on_screen_changed(self, widget, from_screen):
118+ # Used only with compositing
119+ self.set_screen_colormap()
120+
121+ def on_expose(self, widget, event):
122+ # Used only with compositing
123+ if not self.compositing:
124+ return
125+ self.set_opacity(self.options['opacity'], gtk.gdk.region_rectangle(event.area))
126+
127 def on_preferences_dialog(self, widget, data=None):
128 prefs = gtk.Dialog(APP_NAME, None,
129 gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
130@@ -280,6 +328,10 @@
131 self.set_window_size(self.options['size'])
132 self.logger.debug("Window size changed.")
133
134+ def on_sb_opacity_changed(widget, data=None):
135+ self.options['opacity'] = widget.get_value() / 100.0
136+ self.logger.debug("Opacity value changed.")
137+
138 def on_cbox_modes_changed(widget, data=None):
139 index = widget.get_active()
140 if index >= 0:
141@@ -321,7 +373,7 @@
142 frm_time.add(hbox_time)
143 frm_time.show_all()
144
145- frm_aspect = gtk.Frame(_("<b>Aspect</b>"))
146+ frm_aspect = gtk.Frame(_("<b>Display</b>"))
147 frm_aspect.set_border_width(4)
148 frm_aspect.get_label_widget().set_use_markup(True)
149 frm_aspect.set_shadow_type(gtk.SHADOW_NONE)
150@@ -357,8 +409,29 @@
151 hbox2_aspect.pack_start(cbox_sizes, expand=False,
152 fill=False, padding=4)
153
154+ hbox3_aspect = gtk.HBox()
155+
156+ lbl_opacity1 = gtk.Label(_("Opacity"))
157+ lbl_opacity2 = gtk.Label(_("%"))
158+
159+ sb_opacity = gtk.SpinButton(digits=1)
160+ sb_opacity.set_increments(10, 25)
161+ sb_opacity.set_range(0, 100)
162+ sb_opacity.set_numeric(True)
163+ sb_opacity.set_update_policy(gtk.UPDATE_IF_VALID)
164+ sb_opacity.set_value(self.options['opacity'] * 100)
165+ sb_opacity.connect("value-changed", on_sb_opacity_changed)
166+
167+ hbox3_aspect.pack_start(lbl_opacity1, expand=False,
168+ fill=False, padding=6)
169+ hbox3_aspect.pack_start(sb_opacity, expand=False,
170+ fill=False, padding=4)
171+ hbox3_aspect.pack_start(lbl_opacity2, expand=False,
172+ fill=False, padding=4)
173+
174 vbox_aspect.pack_start(hbox1_aspect)
175 vbox_aspect.pack_start(hbox2_aspect)
176+ vbox_aspect.pack_start(hbox3_aspect)
177 frm_aspect.add(vbox_aspect)
178
179 frm_kbd = gtk.Frame(_("<b>Keys</b>"))

Subscribers

People subscribed via source and target branches