Как вы подключаете прослушиватели событий к GtkAda Builder?

#ada #gtkada

#ada #gtkada

Вопрос:

При использовании GtkAda.Builder в GtkAda 20.1 я не могу понять, как собирать данные о событиях.

 with Gtk.Widget;                       use Gtk.Widget;
with Gtk.Main;                         use Gtk.Main;
with Gtkada.Builder;                   use Gtkada.Builder;
with Glib.Error;                       use Glib.Error;
with Callbacks;
with Glib;                             use type Glib.Guint;

with Ada.Text_IO;
procedure Main is

   Builder : Gtkada_Builder;
   Error   : aliased GError;
   Err_Num : Glib.Guint;

begin
   Init;

   Gtk_New (Builder);
   Err_Num := Add_From_File (Builder, "data/main_window.glade", Error'Access);

   if Err_Num = 0 then
      Ada.Text_IO.Put_Line ("Error : " amp; Get_Message (Error));
      Error_Free (Error);
      return;
   end if;

   Register_Handler
     (Builder      => Builder,
      Handler_Name => "on_main_window_destroy",
      Handler      => Callbacks.Main_Window_Destroy'Access);  -- Works fine
   Register_Handler
     (Builder => Builder,
      Handler_Name => "on_key_pressed",
      Handler      => Callbacks.Key_Pressed'Access);   -- but wait

   Show_All (Gtk_Widget(Get_Object (Builder, "main_window")));
   Main;

   Unref (Builder);
end Main;


package Callbacks is
   procedure Main_Window_Destroy
     (Object : access Gtkada_Builder_Record'Class);

   function Key_Pressed
     (Object : access Gtkada_Builder_Record'Class) 
      return Boolean;
      -- how do I get a Gdk.Event.Gdk_Event_Key from this????
end Callbacks;

  

Как показано в примере, GtkAda_Builder будет обращаться только к двум прототипам для обратных вызовов, процедуре или функции, оба из которых принимают Builder в качестве аргумента. Как мне использовать это для проверки события, которое сработало в случае события key_press? Или событие отрисовки, если на то пошло? В testgtkada или где-либо еще, что я нашел, нет примеров, которые имеют дело с этим, и я не могу понять, как это сделать. Это просто игрушечный класс?

Ответ №1:

Если вы хотите получить данные из события клавиатуры в GtkAda (и в GTK тоже), вам нужно подключить функцию напрямую к выбранному виджету, а не с помощью вызовов Glade (например Main_Window_Destroy ). Glade позволяет передавать только дополнительные данные в подпрограмму, но нет способа получить что-либо, связанное с событием (например, нажатие / отпускание клавиатуры, движение мыши или даже новый размер виджета после изменения размера).

Например, если вы хотите обрабатывать нажатие клавиши в Main_Window виджете, код должен выглядеть так:

 On_Key_Press_Event(Main_Window, My_Key_Pressed'Access);
  

И затем шоу обратного вызова выглядит так:

 function My_Key_Pressed
 (Self: access Gtk_Widget_Record'Class; Event: Gdk.Event.Gdk_Event_Key)
  return Boolean is
begin
   return True;
end My_Key_Pressed;
  

Редактировать: Первый абзац, лучшее разъяснение, почему пример кода из вопроса не работает.

Комментарии:

1. Я понимаю ваш ответ, но тогда возникает вопрос: зачем вообще использовать Glade и GtkBuilder? Кажется, я вообще не должен подавать никаких сигналов в Glade и вручную устанавливать все соединения, что полностью уничтожает любое преимущество использования builder framework.

2. @Jlotty — из моего собственного опыта: Glade и GtkBuilder в основном полезны на этапе проектирования пользовательского интерфейса. Позже, вероятно, лучшим вариантом будет преобразовать все в обычный код. К сожалению, эти ограничения возможностей в Glade являются ограничениями в GTK, а не в GtkAda. Честно говоря, одна из причин, по которой я перестал использовать GTK 🙂