[Gambas-devel] Question about GB.CanRaise()

tobi tobias at ...692...
Fri May 25 20:16:34 CEST 2012


Hi,

I've been having trouble for some hours now. I seem to have managed to isolate the problem to a
misunderstanding of GB.CanRaise(), on my side.
There is a test project:

[.src/MMain.module]
--8<---------------
' Gambas module file

Public Sub Main()
  Object.Attach(Window, Me, "Window")
  Window.SetFocus()
End

Public Sub Window_Read()
  Dim iKey As Integer = Window.Read()

  Window.Print(Str$(iKey) & "\n\r")
  Window.Print("===")
  Window.Locate(0, IIf(Window.CursorY = Window.Height - 1, 0, -1))
  If iKey = Key["q"] Then Quit
End
--8<---------------

and I simply can't manage to get that Window_Read() event risen.
By using Object.Attach() above, I should be able to catch events from the Window. When I do
Window.SetFocus() some internal stuff happens which produces desired results. During component
initialisation, I begin watching the input queue of the program. If I press a key, I get into the
GB_WATCH_READ callback and begin debugging:

(gdb) break INPUT_callback
(gdb) r
[...] -> Keypress

Breakpoint 1, INPUT_callback (fd=0, flag=1, arg=0) at input.c:108
(gdb) list
[...]
109             WINDOW_raise_read(NULL);
[...]

(gdb) break WINDOW_raise_read
(gdb) c
Continuing.

Breakpoint 2, WINDOW_raise_read (_object=0x0) at c_window.c:639
(gdb) list
640             if (!_object)
641                     _object = focused;
642
643             if (_object && GB.CanRaise(GB.Parent(_object), EVENT_Read))
644			GB.Raise(_object, EVENT_Read, 0);
[...]
(gdb) break 643
Breakpoint 3 at 0xb76e8537: file c_window.c, line 643.
(gdb) c
Continuing.

Breakpoint 3, WINDOW_raise_read (_object=0x9ca1c84) at c_window.c:643
643             if (_object && GB.CanRaise(GB.Parent(_object), EVENT_Read))
(gdb)

You see that _object is non-NULL. It seems, consequently, that GB.CanRaise() returns false. I looked
up the macro OBJECT_has_events() used there:

(((OBJECT *)_object)->class->n_event != 0)

Then

(gdb) break GB_CanRaise
(gdb) c
Breakpoint 4, GB_CanRaise (object=0x8e15aac, event_id=1) at gbx_api.c:467
warning: Source file is more recent than executable.

(I think, I haven't compiled gbx3 yet since gb.jit...). However:

(gdb) print ((OBJECT *) object)->class->n_event
$1 = 0

There seems to lie the root of the whole problem... Sorry for being so verbose but I don't know what
kind of information might help.
What I expect is that I can intercept events from that module if I attach an event-rising object to
it. What have I gotten wrong?

Regards,
Tobi





More information about the Devel mailing list