[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