Преобразование GdkX11Window в класс терминала VTE в событии фокуса

Мне нужно получить фокус GTK+ в событии на терминале (VTE), но событие возвращает EventFocus, который содержит ссылку Gtk.Window:

http://www.valadoc.org/gdk-3.0/Gdk.EventFocus.html

Как я могу получить терминал из ссылки на окно? Я не могу перепечатать его, похоже, это контейнер. Но я не могу найти, какой метод вызвать, чтобы получить Терминал.

  Terminal terminal = new Terminal();
  // ...
  terminal.focus_in_event.connect((event) =>
  {
    the_terminal = event.window; // DOES NOT WORK > invalid cast from `GdkX11Window' to `Terminal'
    return false;
  });

Спасибо, что указали, что мне это не нужно. Да, мой настоящий код:

for (int i = 0; i < terminal.length; i++) {
  this.terminal[i].focus_in_event.connect((event) =>
  {
    GLib.stdout.printf("Focus event terminal %p\n", this.terminal[i]);
    return false;
  });
}

К сожалению, он всегда печатает null :-(

Спасибо!


person lzap    schedule 24.03.2012    source источник


Ответы (1)


Я не уверен, что есть простой способ преобразовать Gdk.Window в Gtk.Widget, поскольку не все виджеты обязательно имеют связанное окно GDK. Насколько я понимаю, нет веских причин пытаться извлечь терминал из файла event. В контексте обратного вызова вы можете просто сослаться на внешнюю переменную terminal, и Vala поднимет ее в обратный вызов.

Terminal terminal = new Terminal();
// ...
terminal.focus_in_event.connect((event) =>
{
  terminal.queue_draw();
  return false;
});
person apmasell    schedule 24.03.2012
comment
Да, но моя проблема в том, что у меня есть куча (массив) терминалов, поэтому я подключаюсь в цикле: foreach (терминал t в терминалах). И когда я пытаюсь использовать там переменную t, вала кричит. Я думал, что могу использовать замыкания, но, видимо, не могу. - person lzap; 24.03.2012