#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 🙂