[Gd-chatter] r11535 - branches/opendylan-melange/gtk-duim
andreas at gwydiondylan.org
andreas at gwydiondylan.org
Wed Dec 12 03:25:57 CET 2007
Author: andreas
Date: Wed Dec 12 03:25:57 2007
New Revision: 11535
Modified:
branches/opendylan-melange/gtk-duim/gtk-keyboard.dylan
branches/opendylan-melange/gtk-duim/gtk-mirror.dylan
branches/opendylan-melange/gtk-duim/gtk-port.dylan
Log:
job: fd
* Support for keyboard events
* Focus for drawing areas
* Basic caret support
Modified: branches/opendylan-melange/gtk-duim/gtk-keyboard.dylan
==============================================================================
--- branches/opendylan-melange/gtk-duim/gtk-keyboard.dylan (original)
+++ branches/opendylan-melange/gtk-duim/gtk-keyboard.dylan Wed Dec 12 03:25:57 2007
@@ -9,157 +9,29 @@
/// GTK keyboard handling
-define method handle-gtk-key-press-event
- (sheet :: <sheet>, widget :: <GtkWidget>, event :: <GdkEventKey>)
- => (handled? :: <boolean>)
- handle-gtk-key-event(sheet, widget, event)
-end method handle-gtk-key-press-event;
-
-define method handle-gtk-key-release-event
- (sheet :: <sheet>, widget :: <GtkWidget>, event :: <GdkEventKey>)
- => (handled? :: <boolean>)
- handle-gtk-key-event(sheet, widget, event)
-end method handle-gtk-key-release-event;
-
define method handle-gtk-key-event
- (sheet :: <sheet>, widget :: <GtkWidget>, event :: <GdkEventKey>)
+ (sheet :: <sheet>, event :: <GdkEventKey>)
=> (handled? :: <boolean>)
- ignore(widget);
let _port = port(sheet);
when (_port)
- ignoring("handle-key-event");
- #f
- /*
- let keycode = event.x/keycode-value;
- let state = event.x/state-value;
- let modifiers = gtk-state->duim-state(_port, logand(state, $key-event-modifier-mask));
- let (keysym-modifiers, keysym)
- = xt/XtTranslateKeycode(_port.%display, keycode, state);
- let char = x-keysym->character(keysym, logand(state, $key-event-modifier-mask));
- let keysym = x-keysym->keysym(keysym);
- port-modifier-state(_port) := modifiers;
+ let char-codepoint = gdk-keyval-to-unicode(event.GdkEventkey-keyval);
+ let char = when (char-codepoint > 0) as(<character>, char-codepoint) end;
+ let class = if (event.GdkEventKey-type == $GDK-KEY-PRESS)
+ <key-press-event>
+ else
+ <key-release-event>
+ end;
+ // ---*** Some keyboard symbols don't have the expected name. Translate here.
+ let keysym = as(<symbol>, gdk-keyval-name(event.GdkEventkey-keyval));
+ // ---*** Yeah, modifiers are broken too.
+ let modifiers = 0;
distribute-event(_port,
- make(event-class,
+ make(class,
sheet: sheet,
key-name: keysym,
character: char,
modifier-state: modifiers));
#t
- */
end
end method handle-gtk-key-event;
-/*---*** No keyboard handling yet!
-define constant $x-keysym->character-table :: <object-table> = make(<table>);
-
-define constant $x-keysym->keysym-table :: <object-table> = make(<table>);
-
-define function initialize-character-table () => ()
- //--- Fill some stuff in here
-end function initialize-character-table;
-
-define function initialize-keysym-table () => ()
- let table :: <object-table> = $x-keysym->keysym-table;
- // Fill in the alphabetic characters
- for (code :: <integer> from as(<integer>, 'A') to as(<integer>, 'Z'))
- let keysym = make(<byte-string>, size: 1, fill: as(<character>, code));
- table[code] := as(<symbol>, keysym)
- end;
- for (code :: <integer> from as(<integer>, 'a') to as(<integer>, 'z'))
- let keysym = make(<byte-string>, size: 1, fill: as(<character>, code));
- table[code] := as(<symbol>, keysym)
- end;
- // Fill in the digit characters
- for (code :: <integer> from as(<integer>, '0') to as(<integer>, '9'))
- let keysym = make(<byte-string>, size: 1, fill: as(<character>, code));
- table[code] := as(<symbol>, keysym)
- end;
- // Fill in the symbols
- table[x/$XK-parenleft] := #"(";
- table[x/$XK-slash] := #"/";
- table[x/$XK-ampersand] := #"&";
- table[x/$XK-bracketleft] := #"[";
- table[x/$XK-numbersign] := #"#";
- table[x/$XK-percent] := #"%";
- table[x/$XK-braceleft] := #"{";
- table[x/$XK-bar] := #"|";
- table[x/$XK-at] := #"@";
- table[x/$XK-exclam] := #"!";
- table[x/$XK-parenright] := #")";
- table[x/$XK-minus] := #"-";
- table[x/$XK-underscore] := #"_";
- table[x/$XK-asciicircum] := #"^";
- table[x/$XK-quotedbl] := #"\"";
- table[x/$XK-apostrophe] := #"'";
- table[x/$XK-grave] := #"`";
- table[x/$XK-backslash] := #"\\";
- table[x/$XK-plus] := #"+";
- table[x/$XK-less] := #"<";
- table[x/$XK-colon] := #":";
- table[x/$XK-asterisk] := #"*";
- table[x/$XK-bracketright] := #"]";
- table[x/$XK-space] := #"space";
- table[x/$XK-semicolon] := #";";
- table[x/$XK-greater] := #">";
- table[x/$XK-question] := #"?";
- table[x/$XK-asciitilde] := #"~";
- table[x/$XK-comma] := #",";
- table[x/$XK-period] := #".";
- table[x/$XK-equal] := #"=";
- table[x/$XK-dollar] := #"$";
- table[x/$XK-return] := #"return";
- table[x/$XK-delete] := #"rubout";
- // table[x/$XK-osfDelete] := #"rubout";
- table[x/$XK-backspace] := #"backspace";
- table[x/$XK-tab] := #"tab";
- table[x/$XK-linefeed] := #"linefeed";
- table[x/$XK-escape] := #"escape";
-end function initialize-keysym-table;
-
-begin
- initialize-character-table();
- initialize-keysym-table();
-end;
-
-define constant $keysym-will-not-produce-character-mask :: <integer>
- = x/translate-to-modifiers-mask(#"mod1", #"mod2", #"mod3", #"mod4", #"mod5", #"control");
-
-define function x-keysym->character
- (keysym, modifiers :: <integer>) => (char :: false-or(<character>))
- when (zero?(logand(modifiers, $keysym-will-not-produce-character-mask)))
- let value = x/KeysymValue(keysym);
- let char = if (value >= 32 & value <= 126)
- as(<byte-character>, value)
- else
- gethash($x-keysym->character-table, value)
- end;
- char
- end
-end function x-keysym->character;
-
-define function x-keysym->keysym
- (keysym) => (keysym)
- let value = x/KeysymValue(keysym);
- gethash($x-keysym->keysym-table, value)
-end function x-keysym->keysym;
-
-
-/// Modifer maps
-
-define function initialize-modifier-map
- (x-display :: x/<Display>) => (modifier-map :: <simple-object-vector>)
- let map :: <simple-object-vector> = make(<vector>, size: 256, fill: 0);
- let shifts = vector(x/$XK-Shift-R, x/$XK-Shift-L);
- let controls = vector(x/$XK-Control-R, x/$XK-Control-L);
- let metas = vector(x/$XK-Meta-R, x/$XK-Meta-L, x/$XK-Alt-R, x/$XK-Alt-L);
- let supers = vector(x/$XK-Super-R, x/$XK-Super-L);
- let hypers = vector(x/$XK-Hyper-R, x/$XK-Hyper-L);
- //---*** FINISH THIS
- map
-end function initialize-modifier-map;
-
-define function x-state->duim-state
- (_port :: <gtk-port>, state :: <integer>) => (duim-state :: <integer>)
- _port.%modifier-map[logand(state, #o377)]
-end function x-state->duim-state;
-*/
Modified: branches/opendylan-melange/gtk-duim/gtk-mirror.dylan
==============================================================================
--- branches/opendylan-melange/gtk-duim/gtk-mirror.dylan (original)
+++ branches/opendylan-melange/gtk-duim/gtk-mirror.dylan Wed Dec 12 03:25:57 2007
@@ -322,12 +322,15 @@
define method do-make-gtk-mirror
(sheet :: <standard-repainting-mixin>)
=> (mirror :: <widget-mirror>)
- let widget = with-gdk-lock gtk-drawing-area-new() end;
-// gtk-drawing-area-size(widget, 200, 200);
- gtk-widget-set-size-request(widget, 200, 200);
- make(<drawing-area-mirror>,
- widget: widget,
- sheet: sheet);
+ with-gdk-lock
+ let widget = gtk-drawing-area-new();
+ // gtk-drawing-area-size(widget, 200, 200);
+ gtk-widget-set-size-request(widget, 200, 200);
+ widget. at can-focus := $true;
+ make(<drawing-area-mirror>,
+ widget: widget,
+ sheet: sheet);
+ end;
end method do-make-gtk-mirror;
define macro duim-g-signal-connect
@@ -378,14 +381,20 @@
next-method();
let widget = mirror-widget(mirror);
duim-g-signal-connect(sheet, #"expose-event") (widget, event) handle-gtk-expose-event(sheet, event) end;
- duim-g-signal-connect(sheet, #"button-press-event") (widget, event) handle-gtk-button-event(sheet, event) end;
+ duim-g-signal-connect(sheet, #"button-press-event") (widget, event)
+ gtk-widget-grab-focus(widget);
+ handle-gtk-button-event(sheet, event)
+ end;
duim-g-signal-connect(sheet, #"button-release-event") (widget, event) handle-gtk-button-event(sheet, event) end;
duim-g-signal-connect(sheet, #"motion-notify-event") (widget, event) handle-gtk-motion-event(sheet, event) end;
+ duim-g-signal-connect(sheet, #"key-press-event") (widget, event) handle-gtk-key-event(sheet, event) end;
+ duim-g-signal-connect(sheet, #"key-release-event") (widget, event) handle-gtk-key-event(sheet, event) end;
with-gdk-lock
gtk-widget-add-events(widget, $GDK-BUTTON-RELEASE-MASK);
gtk-widget-add-events(widget, $GDK-EXPOSURE-MASK);
gtk-widget-add-events(widget, $GDK-BUTTON-PRESS-MASK);
gtk-widget-add-events(widget, logior($GDK-POINTER-MOTION-MASK, $GDK-POINTER-MOTION-HINT-MASK));
+ gtk-widget-add-events(widget, logior($GDK-KEY-PRESS-MASK, $GDK-KEY-RELEASE-MASK));
end
end method install-event-handlers;
Modified: branches/opendylan-melange/gtk-duim/gtk-port.dylan
==============================================================================
--- branches/opendylan-melange/gtk-duim/gtk-port.dylan (original)
+++ branches/opendylan-melange/gtk-duim/gtk-port.dylan Wed Dec 12 03:25:57 2007
@@ -211,18 +211,14 @@
width: width | $caret-width,
height: height | (sheet-line-height(sheet) + sheet-line-spacing(sheet)))
end method make-caret;
-
define sealed method do-set-caret-position
(caret :: <gtk-caret>, x :: <integer>, y :: <integer>) => ()
- let transform = sheet-device-transform(caret-sheet(caret));
- with-device-coordinates (transform, x, y)
- ignoring("do-set-caret-position")
- end
+ ignoring("do-set-caret-position");
end method do-set-caret-position;
define sealed method do-set-caret-size
(caret :: <gtk-caret>, width :: <integer>, height :: <integer>) => ()
- ignoring("do-set-caret-size")
+ ignoring("do-set-caret-size");
end method do-set-caret-size;
define sealed method do-show-caret
@@ -230,8 +226,10 @@
ignore(tooltip?);
let sheet = caret-sheet(caret);
let widget = sheet & mirror-widget(sheet-mirror(sheet));
+ let (x, y) = caret-position(caret);
+ let (width, height) = caret-size(caret);
when (widget)
- ignoring("do-show-caret")
+ draw-rectangle(sheet-medium(sheet), x, y, x + width, y + height, filled?: #t);
end
end method do-show-caret;
@@ -241,7 +239,10 @@
let sheet = caret-sheet(caret);
let widget = sheet & mirror-widget(sheet-mirror(sheet));
when (widget)
- ignoring("do-hide-caret")
+ let (x, y) = caret-position(caret);
+ let (width, height) = caret-size(caret);
+ clear-box(sheet-medium(sheet), x, y, x + width, y + height);
+ // queue-repaint(sheet, make(<general-box>, left: x, right: x + width, top: y + height, bottom: y));
end
end method do-hide-caret;
More information about the chatter
mailing list