Merge lp:~rakete/eidete/scratching-my-itches into lp:eidete

Proposed by Andreas Raster
Status: Merged
Merge reported by: Tom Beckmann
Merged at revision: not available
Proposed branch: lp:~rakete/eidete/scratching-my-itches
Merge into: lp:eidete
Diff against target: 614 lines (+232/-90)
5 files modified
src/Widgets/end_dialog.vala (+5/-3)
src/Widgets/keyview.vala (+111/-15)
src/Widgets/selectionarea.vala (+15/-12)
src/eidete.vala (+88/-57)
src/keycapture.c (+13/-3)
To merge this branch: bzr merge lp:~rakete/eidete/scratching-my-itches
Reviewer Review Type Date Requested Status
Tom Beckmann (community) Approve
Review via email: mp+99500@code.launchpad.net

Description of the change

Focusing to stop recording wouldn't work, a missing save-dialog, missing keys in keyviews and some problems with the selectionarea were fixed.

- it now stops recording and shows the pause menu if you focus the keyview or the selectionarea, those are always the ones compiz focuses first when I alt-tab into eidete to stop recording

- contractor prevents a useable save-dialog for me on oneiric, I am not sure why. I made a hack so it will show up regardless and let me save the file. It works although save-dialog complains. I am not sure if that should be merged, rather contractor should be fixed I guess.

- I added some missing key captions in keyview, and I changed keycapture.c so it uses XkbKeycodeToKeysym, which can lookup the correct Keysym according to shift state. So now shifted key names are shown correctly.

- the previous selectionarea had the problem that the area within the rectangle wasn't actually the area that was recorded, it recorded the area of the window including the handles. The handles prevented correct placement at the edges of the screen. I made a new selectionarea fixing those issues.

(sorry for proposing this twice)

To post a comment you must log in.
Revision history for this message
Tom Beckmann (tombeckmann) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/Widgets/end_dialog.vala'
2--- src/Widgets/end_dialog.vala 2012-01-05 19:27:20 +0000
3+++ src/Widgets/end_dialog.vala 2012-03-27 11:57:47 +0000
4@@ -90,10 +90,12 @@
5 t.get_cursor (out path, null);
6 try{
7 Process.spawn_command_line_async (c[int.parse (path.to_string ())].lookup ("Exec"));
8- }catch (Error e){error (e.message);}
9- Gtk.main_quit ();
10+ }catch (Error e){
11+ print(e.message);
12+ Gtk.main_quit ();
13+ }
14 });
15- }else{
16+ } else {
17 export.clicked.connect ( () => {
18 var source = File.new_for_path (app.settings.destination);
19 var file = new FileChooserDialog (_("Save"), null, FileChooserAction.SAVE, Stock.OK, ResponseType.OK);
20
21=== modified file 'src/Widgets/keyview.vala'
22--- src/Widgets/keyview.vala 2012-03-23 14:54:41 +0000
23+++ src/Widgets/keyview.vala 2012-03-27 11:57:47 +0000
24@@ -11,14 +11,16 @@
25 public bool shift;
26 public bool alt;
27 public bool super;
28+ public bool iso_level3_shift;
29 public int count;
30
31- public Key (string key, bool ctrl, bool shift, bool alt, bool super){
32+ public Key (string key, bool ctrl, bool shift, bool alt, bool super, bool iso_level3_shift){
33 this.key = key;
34 this.ctrl = ctrl;
35 this.shift = shift;
36 this.alt = alt;
37 this.super = super;
38+ this.iso_level3_shift = iso_level3_shift;
39 this.count = 1;
40 }
41 }
42@@ -35,6 +37,7 @@
43 private bool shift;
44 private bool alt;
45 private bool super;
46+ private bool iso_level3_shift;
47
48 private int screen_h;
49
50@@ -57,9 +60,15 @@
51
52 ctx.set_source_rgba (1.0, 1.0, 1.0, 1.0);
53
54- int [] sizes = {0, 30, 45, 50, 65};
55+ int [] sizes = {0, 30, 45, 55, 60};
56 print ("%i\n", keys.peek_nth (i).key.length);
57- ctx.set_font_size (key_size- sizes[keys.peek_nth (i).key.length]);
58+
59+ if( keys.peek_nth (i).key.length >= sizes.length ) {
60+ ctx.set_font_size (key_size - sizes[sizes.length - 1]);
61+ } else {
62+ ctx.set_font_size (key_size - sizes[keys.peek_nth (i).key.length]);
63+ }
64+
65 ctx.move_to (key_size - 40, screen_h - (i+1)*key_size-20);
66 ctx.show_text (keys.peek_nth (i).key);
67
68@@ -70,21 +79,25 @@
69 }
70 ctx.set_font_size (12);
71 if (keys.peek_nth (i).super){
72- ctx.move_to (5, screen_h - (i+1)*key_size-50);
73+ ctx.move_to (5, screen_h - (i+1)*key_size-52);
74 ctx.show_text ("Super");
75 }
76 if (keys.peek_nth (i).ctrl){
77- ctx.move_to (5, screen_h - (i+1)*key_size-35);
78+ ctx.move_to (5, screen_h - (i+1)*key_size-37);
79 ctx.show_text ("Ctrl");
80 }
81 if (keys.peek_nth (i).shift){
82- ctx.move_to (5, screen_h - (i+1)*key_size-20);
83+ ctx.move_to (5, screen_h - (i+1)*key_size-22);
84 ctx.show_text ("Shift");
85 }
86 if (keys.peek_nth (i).alt){
87- ctx.move_to (5, screen_h - (i+1)*key_size-5);
88+ ctx.move_to (5, screen_h - (i+1)*key_size-7);
89 ctx.show_text ("Alt");
90 }
91+ if (keys.peek_nth (i).iso_level3_shift){
92+ ctx.move_to (5, screen_h - (i+1)*key_size-12);
93+ ctx.show_text ("AltGr");
94+ }
95 }
96
97 return base.draw (ctx);
98@@ -100,21 +113,31 @@
99 public KeyView (){
100 this.key_size = 75;
101 this.fade_duration = 2000;
102-
103+
104+ this.stick ();
105 this.set_keep_above (true);
106- this.stick ();
107- this.type_hint = Gdk.WindowTypeHint.SPLASHSCREEN;
108+ this.deletable = false;
109+ this.resizable = false;
110+ this.set_has_resize_grip (false);
111 this.skip_pager_hint = true;
112 this.skip_taskbar_hint = true;
113+
114+ this.type_hint = Gdk.WindowTypeHint.SPLASHSCREEN;
115+ this.events = Gdk.EventMask.BUTTON_MOTION_MASK | Gdk.EventMask.BUTTON1_MOTION_MASK |
116+ Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.BUTTON_RELEASE_MASK ;
117+
118+ this.realize();
119
120- this.keys = new Queue<Key> ();
121+ Cairo.RectangleInt rect = {0, 0, 1, 1};
122+ this.get_window ().input_shape_combine_region (new Cairo.Region.rectangle (rect), 0, 0);
123
124 this.enter_notify_event.connect ( () => {
125- Cairo.RectangleInt rect = {0, 0, 1, 1};
126 this.get_window ().input_shape_combine_region (new Cairo.Region.rectangle (rect), 0, 0);
127 return true;
128 });
129
130+ this.keys = new Queue<Key> ();
131+
132 //setup the key background
133 key_bg = new Cairo.ImageSurface (Cairo.Format.ARGB32, key_size, key_size);
134 var ctx = new Cairo.Context (key_bg);
135@@ -155,6 +178,10 @@
136 this.super = false;
137 this.queue_draw ();
138 return;
139+ case "ISO_Level3_Shift":
140+ this.iso_level3_shift = false;
141+ this.queue_draw ();
142+ return;
143 }
144 }else{
145 string res = keyvalue;
146@@ -179,18 +206,28 @@
147 this.super = true;
148 this.queue_draw ();
149 return;
150+ case "ISO_Level3_Shift":
151+ this.iso_level3_shift = true;
152+ this.queue_draw ();
153+ return;
154 case "Escape":
155 res = "Esc"; break;
156 case "Return":
157 res = "⏎"; break;
158 case "Delete":
159 res = "Del"; break;
160+ case "Insert":
161+ res = "Ins"; break;
162 case "comma":
163 res = ","; break;
164 case "period":
165 res = "."; break;
166 case "minus":
167 res = "-"; break;
168+ case "plus":
169+ res = "+"; break;
170+ case "Tab":
171+ res = "Tab"; break;
172 case "BackSpace":
173 res = "⌫"; break;
174 case "Left":
175@@ -203,6 +240,64 @@
176 res = "▼"; break;
177 case "space":
178 res = " "; break;
179+ case "backslash":
180+ res = "\\"; break;
181+ case "bracketleft":
182+ res = "["; break;
183+ case "bracketright":
184+ res = "]"; break;
185+ case "braceleft":
186+ res = "{"; break;
187+ case "braceright":
188+ res = "}"; break;
189+ case "apostrophe":
190+ res = "'"; break;
191+ case "asciitilde":
192+ res = "~"; break;
193+ case "grave":
194+ res = "`"; break;
195+ case "bar":
196+ res = "|"; break;
197+ case "ampersand":
198+ res = "&"; break;
199+ case "parenleft":
200+ res = "("; break;
201+ case "parenright":
202+ res = ")"; break;
203+ case "less":
204+ res = "<"; break;
205+ case "greater":
206+ res = ">"; break;
207+ case "equal":
208+ res = "="; break;
209+ case "exclam":
210+ res = "!"; break;
211+ case "quotedbl":
212+ res = "\""; break;
213+ case "numbersign":
214+ res = "\""; break;
215+ case "dollar":
216+ res = "$"; break;
217+ case "slash":
218+ res = "/"; break;
219+ case "asterisk":
220+ res = "*"; break;
221+ case "colon":
222+ res = ":"; break;
223+ case "semicolon":
224+ res = ";"; break;
225+ case "underscore":
226+ res = "_"; break;
227+ case "Next":
228+ res = "Pg▲"; break;
229+ case "Prior":
230+ res = "Pg▼"; break;
231+ case "asciicircum":
232+ res = "^"; break;
233+ case "at":
234+ res = "@"; break;
235+ case "question":
236+ res = "?"; break;
237 default:
238 if (keyvalue.length > 9)
239 res = keyvalue.substring (0, 9);
240@@ -212,12 +307,13 @@
241 if ((!keys.is_empty ()) &&
242 (keys.peek_head ().key == res) &&
243 (keys.peek_head ().ctrl == ctrl) &&
244- (keys.peek_head ().shift == shift) &&
245- (keys.peek_head ().alt == alt)){
246+ (keys.peek_head ().shift == shift) &&
247+ (keys.peek_head ().alt == alt) &&
248+ (keys.peek_head ().iso_level3_shift == iso_level3_shift)){
249 keys.peek_head ().count ++;
250 this.queue_draw ();
251 }else{
252- var key = new Key (res, ctrl, shift, alt, super);
253+ var key = new Key (res, ctrl, shift, alt, super, iso_level3_shift);
254 if (!released){
255 keys.push_head (key);
256 if (keys.length+2 > (screen_h / key_size))
257
258=== modified file 'src/Widgets/selectionarea.vala'
259--- src/Widgets/selectionarea.vala 2012-03-23 15:01:29 +0000
260+++ src/Widgets/selectionarea.vala 2012-03-27 11:57:47 +0000
261@@ -94,24 +94,28 @@
262 public override bool draw (Cairo.Context ctx){
263 int w = this.get_allocated_width ();
264 int h = this.get_allocated_height ();
265- int r = 12;
266+ int r = 16;
267 if (!discrete){
268- pos = {{r,r},{w/2,r},{w-r,r},{w-r,h/2},{w-r,h-r},{w/2,h-r},{r,h-r},{r,h/2}};
269+ pos = {{1, 1}, // upper left
270+ {w/2, 1}, // upper midpoint
271+ {w-1, 1}, // upper right
272+ {w-1, h/2}, // right midpoint
273+ {w-1, h-1}, // lower right
274+ {w/2, h-1}, // lower midpoint
275+ {1, h-1}, // lower left
276+ {1, h/2}}; // left midpoint
277+
278
279- ctx.rectangle (r+1, r, w-2*r, h-2*r);
280+ ctx.rectangle (0, 0, w, h);
281 ctx.set_source_rgba (0.1, 0.1, 0.1, 0.2);
282 ctx.fill ();
283
284 for (var i=0;i<8;i++){
285- ctx.arc (pos[i,0], pos[i,1], r, 0.0, 2 * 3.14);
286- ctx.set_source_rgb (1.0, 1.0, 1.0);
287+ ctx.arc (pos[i,0], pos[i,1], r, 0.0, 2*3.14);
288+ ctx.set_source_rgb (0.7, 0.7, 0.7);
289 ctx.fill ();
290- ctx.arc (pos[i,0], pos[i,1], r+1, 0.0, 2 * 3.14);
291- ctx.set_line_width (1.0);
292- ctx.set_source_rgba (0.0, 0.0, 0.0, 0.3);
293- ctx.stroke ();
294 }
295- ctx.rectangle (r, r, w-2*r, h-2*r);
296+ ctx.rectangle (0, 0, w, h);
297 ctx.set_source_rgb (1.0, 1.0, 1.0);
298 ctx.set_line_width (1.0);
299 ctx.stroke ();
300@@ -135,7 +139,7 @@
301 this.set_keep_above (true);
302 this.queue_draw ();
303 this.resize (w+6, h+6);
304- this.move (x, y-1);
305+ this.move (x-2, y-2);
306 this.deletable = false;
307
308 this.realize ();
309@@ -147,7 +151,6 @@
310 this.get_window ().input_shape_combine_region (new Cairo.Region.rectangle (rect), 0, 0);
311 return true;
312 });
313-
314 }
315 }
316 }
317
318=== modified file 'src/eidete.vala'
319--- src/eidete.vala 2012-03-23 14:57:45 +0000
320+++ src/eidete.vala 2012-03-27 11:57:47 +0000
321@@ -37,10 +37,9 @@
322 public int sy;
323 public int ex;
324 public int ey;
325- public int screen;
326+ public int monitor;
327 public bool audio;
328 public bool keyview;
329- public bool limits;
330 public string destination;
331 }
332
333@@ -83,12 +82,14 @@
334 public Grid pause_grid;
335 public Image pause_icon;
336 public Wnck.Window win;
337+ public Gdk.Screen screen;
338+ public Gdk.Rectangle monitor_rec;
339
340 public Settings settings;
341
342 public bool recording;
343 public bool typing_size;
344-
345+
346 public EideteApp (){
347 }
348
349@@ -226,16 +227,25 @@
350 about_bt.clicked.connect ( () => {
351 this.show_about (this.main_window);
352 });
353-
354- settings.screen = 0;
355+
356+ this.screen = Gdk.Screen.get_default();
357+ settings.monitor = 0;
358 monitors_combo.changed.connect ( () => {
359- settings.screen = int.parse (monitors_combo.active_id);
360+ settings.monitor = int.parse (monitors_combo.active_id);
361+ this.screen.get_monitor_geometry(settings.monitor, out this.monitor_rec);
362+ settings.sx = this.monitor_rec.x;
363+ settings.sy = this.monitor_rec.y;
364+ settings.ex = settings.sx + this.monitor_rec.width - 1;
365+ settings.ey = settings.sy + this.monitor_rec.height - 1;
366 });
367
368- settings.sx = 0;
369- settings.sy = 0;
370- settings.ex = 0;
371- settings.ey = 0;
372+ settings.monitor = int.parse (monitors_combo.active_id);
373+ this.screen.get_monitor_geometry(settings.monitor, out this.monitor_rec);
374+ settings.sx = this.monitor_rec.x;
375+ settings.sy = this.monitor_rec.y;
376+ settings.ex = settings.sx + this.monitor_rec.width - 1;
377+ settings.ey = settings.sy + this.monitor_rec.height - 1;
378+
379 recordingarea_combo.changed.connect ( () => {
380 if (recordingarea_combo.active_id != "full"){
381 selectionarea = new Eidete.Widgets.SelectionArea ();
382@@ -248,18 +258,25 @@
383 height.value = (int)h;
384 settings.sx = x;
385 settings.sy = y;
386- settings.ex = settings.sx+w;
387- settings.ey = settings.sy+h;
388- settings.limits = true;
389- }
390+ settings.ex = settings.sx+w-1;
391+ settings.ey = settings.sy+h-1;
392+ }
393+ });
394+ selectionarea.focus_in_event.connect( (ev) => {
395+ if (this.recording){
396+ this.main_window.deiconify();
397+ this.main_window.present();
398+ }
399+ return false;
400 });
401 }else{
402 selectionarea.destroy ();
403- settings.sx = 0;
404- settings.sy = 0;
405- settings.ex = 0;
406- settings.ey = 0;
407- settings.limits = false;
408+ settings.monitor = int.parse (monitors_combo.active_id);
409+ this.screen.get_monitor_geometry(settings.monitor, out this.monitor_rec);
410+ settings.sx = this.monitor_rec.x;
411+ settings.sy = this.monitor_rec.y;
412+ settings.ex = settings.sx + this.monitor_rec.width - 1;
413+ settings.ey = settings.sy + this.monitor_rec.height - 1;
414 width.set_sensitive (false);
415 height.set_sensitive (false);
416 }
417@@ -303,29 +320,40 @@
418
419 settings.destination = GLib.Environment.get_tmp_dir ()+
420 "/screencast"+new GLib.DateTime.now_local ().to_unix ().to_string ()+".webm";
421-
422-
423- ulong handle = 0;
424- handle = Wnck.Screen.get_default ().active_window_changed.connect ( () => {
425- this.win = Wnck.Screen.get_default ().get_active_window ();
426- this.win.state_changed.connect ( (changed_s, new_s) => {
427- if (recording && (new_s == 0)){
428- pipeline.set_state (State.PAUSED);
429- this.recording = false;
430- switch_to_paused (true);
431- }
432- });
433- Wnck.Screen.get_default ().disconnect (handle);
434- });
435-
436-
437- this.main_window.focus_in_event.connect ( (ev) => {
438- if (this.selectionarea != null && !this.selectionarea.not_visible){
439- //this.selectionarea.present ();
440- //this.main_window.present ();
441+
442+ // ulong handle = 0;
443+ // handle = Wnck.Screen.get_default().active_window_changed.connect ( () => {
444+ // this.win = Wnck.Screen.get_default().get_active_window ();
445+ // print("setting active window\n");
446+ // this.win.state_changed.connect ( (changed_s, new_s) => {
447+ // print("active window changed\n");
448+ // if (recording && (new_s == 0)){
449+ // pipeline.set_state (State.PAUSED);
450+ // this.recording = false;
451+ // switch_to_paused (true);
452+ // }
453+ // });
454+ // Wnck.Screen.get_default ().disconnect (handle);
455+ // });
456+
457+ // this.main_window.focus_in_event.connect ( (ev) => {
458+ // if (this.selectionarea != null && !this.selectionarea.not_visible){
459+ // //this.selectionarea.present ();
460+ // //this.main_window.present ();
461+ // }
462+ // return false;
463+ // });
464+
465+ this.main_window.visibility_notify_event.connect ( (ev) => {
466+ if (this.recording && ev.state == 0){
467+ print("pausing recording\n");
468+ pipeline.set_state (State.PAUSED);
469+ this.recording = false;
470+ switch_to_paused (true);
471 }
472 return false;
473 });
474+
475
476 this.main_window.destroy.connect ( () => {
477 if (pipeline != null)
478@@ -345,7 +373,7 @@
479 }
480 }
481
482- private void buid_pause_ui (){
483+ private void build_pause_ui (){
484 pause_grid = new Grid ();
485 pause_grid.margin = 12;
486
487@@ -380,7 +408,9 @@
488 /*
489 Events
490 */
491- cancel_bt.clicked.connect ( () => {this.main_window.destroy ();});
492+ cancel_bt.clicked.connect ( () => {
493+ this.main_window.destroy ();
494+ });
495
496 stop_bt.clicked.connect ( () => {
497 var end = new Eidete.Widgets.EndDialog (this);
498@@ -390,25 +420,25 @@
499
500 continue_bt.clicked.connect ( () => {
501 this.main_window.iconify ();
502+ this.pipeline.set_state (State.PLAYING);
503 this.recording = true;
504- this.pipeline.set_state (State.PLAYING);
505 switch_to_paused (false);
506 });
507 }
508
509 public void record (){
510- this.recording = true;
511-
512 if (settings.keyview){
513 keyview = new Eidete.Widgets.KeyView ();
514- if (settings.limits)
515- keyview.place (selectionarea.x+selectionarea.w,
516- selectionarea.y,
517- selectionarea.h);
518- else
519- keyview.place (Gdk.Screen.get_default ().get_width (),
520- 0,
521- Gdk.Screen.get_default ().get_height ());
522+ keyview.focus_in_event.connect((ev) => {
523+ if (this.recording){
524+ this.main_window.deiconify();
525+ this.main_window.present();
526+ }
527+ return false;
528+ });
529+ keyview.place (settings.ex,
530+ settings.sy,
531+ settings.ey - settings.sy);
532 keyview.show_all ();
533 }
534
535@@ -439,12 +469,12 @@
536
537 //configure
538 sink.set ("location", settings.destination);
539- videobin.get_by_name ("videosrc").set ("startx", this.settings.sx+2);
540- videobin.get_by_name ("videosrc").set ("starty", this.settings.sy+1);
541- videobin.get_by_name ("videosrc").set ("endx", this.settings.ex+1);
542+ videobin.get_by_name ("videosrc").set ("startx", this.settings.sx);
543+ videobin.get_by_name ("videosrc").set ("starty", this.settings.sy);
544+ videobin.get_by_name ("videosrc").set ("endx", this.settings.ex);
545 videobin.get_by_name ("videosrc").set ("endy", this.settings.ey);
546 videobin.get_by_name ("videosrc").set ("use-damage", false);
547- videobin.get_by_name ("videosrc").set ("screen-num", this.settings.screen);
548+ videobin.get_by_name ("videosrc").set ("screen-num", this.settings.monitor);
549
550 //videobin.get_by_name ("encoder").set ("mode", 1);
551 videobin.get_by_name ("encoder").set ("quality", 10.0);
552@@ -477,6 +507,7 @@
553 selectionarea.to_discrete ();
554
555 pipeline.set_state (State.PLAYING);
556+ this.recording = true;
557 }
558
559 private bool bus_message_cb (Gst.Bus bus, Message msg){
560@@ -503,7 +534,7 @@
561 this.main_window.title = _("Recording paused");
562 this.main_window.remove (pause_icon);
563 if (pause_grid == null)
564- this.buid_pause_ui ();
565+ this.build_pause_ui ();
566 this.main_window.add (pause_grid);
567 this.main_window.icon_name = "eidete";
568 this.app_icon = "eidete";
569
570=== modified file 'src/keycapture.c'
571--- src/keycapture.c 2012-01-02 22:50:13 +0000
572+++ src/keycapture.c 2012-03-27 11:57:47 +0000
573@@ -2,6 +2,7 @@
574 #include <glib.h>
575 #include <X11/Xproto.h>
576 #include <X11/Xlib.h>
577+#include <X11/XKBlib.h>
578 #include <X11/extensions/record.h> //libxtst-dev, Xtst
579 #include <gstreamer-0.10/gst/gst.h>
580 #include <gstreamer-0.10/gst/gstinterface.h>
581@@ -18,13 +19,22 @@
582
583 void key_pressed_cb(XPointer arg, XRecordInterceptData *d) {
584 if (d->category != XRecordFromServer) return;
585+
586+ xEvent* event = (xEvent*)d->data;
587+
588 unsigned char type = ((unsigned char*)d->data)[0] & 0x7F;
589 unsigned char detail = ((unsigned char*)d->data)[1];
590+ unsigned int shiftlevel = 0;
591+
592+ if( event->u.keyButtonPointer.state == 0 ||
593+ event->u.keyButtonPointer.state == 1 ) {
594+ shiftlevel = event->u.keyButtonPointer.state;
595+ }
596
597 if (type == KeyPress) {
598- g_signal_emit_by_name (arg, "captured", XKeysymToString (XKeycodeToKeysym (dpy, detail, 0)), FALSE);
599+ g_signal_emit_by_name (arg, "captured", XKeysymToString (XkbKeycodeToKeysym (dpy, detail, 0, shiftlevel)), FALSE);
600 }else if (type == KeyRelease){
601- g_signal_emit_by_name (arg, "captured", XKeysymToString (XKeycodeToKeysym (dpy, detail, 0)), TRUE);
602+ g_signal_emit_by_name (arg, "captured", XKeysymToString (XkbKeycodeToKeysym (dpy, detail, 0, shiftlevel)), TRUE);
603 }
604 }
605
606@@ -33,7 +43,7 @@
607 XRecordRange* rr;
608 dpy = XOpenDisplay (0);
609
610- XKeysymToString (XKeycodeToKeysym (dpy, 11, 1));
611+ XKeysymToString (XkbKeycodeToKeysym (dpy, 11, 1, 0));
612
613 if (!(rr = XRecordAllocRange())) {
614 fprintf(stderr, "XRecordAllocRange error\n");

Subscribers

People subscribed via source and target branches