Ändringar i gtkmm-4.0 och glibmm-2.68
gtkmm-4.0 är en ny version av gtkmm-API:t som installeras parallellt med de äldre API:erna gtkmm-2.4 och gtkmm-3.0. Den senaste versionen av gtkmm-3.0-API:t är gtkmm 3.24. gtkmm 4 har inga större fundamentala skillnader mot gtkmm 3 men gör flera ändringar (både stora och små) som inte var möjliga att göra samtidigt som binär kompatibilitet behölls. Om du aldrig använt gtkmm-3.0-API:t kan du lugnt ignorera detta kapitel.
Biblioteket för gtkmm 4 kallas libgtkmm-4.0 snarare än libgtkmm-3.0 och installerar sina huvuden i en katalog med liknande version, så din pkg-config-kontroll ska fråga efter gtkmm-4.0 snarare än gtkmm-3.0.
gtkmm-4.0 används i kombination med glibmm-2.68, vilket ställer in den globala lokalen för ditt program. Det äldre glibmm-2.4 gör inte det, och gtkmm-3.0 gör det bara till viss del. Vad detta betyder är helt kort att om ditt gtkmm-3.0-program innehåller ett anrop till std::locale::global(std::locale("")) så kan du troligen ta bort det. Om du inte vill att glibmm eller gtkmm ska ställa in den globala lokalen åt dig så ska du lägga till ett anrop till Glib::set_init_to_users_preferred_locale(false) före anrop Glib::init() eller Gtk::Application::create().
Det finns massor av skillnader mellan gtkmm-3.0 och gtkmm-4.0. Följande listor är inte fullständiga.
Några nya klasser lades till i gtkmm 4 och glibmm 2.68:
Glib::ExtraClassInit och Gtk::Snapshot: Dessa klasser behövs endast för att skriva anpassade komponenter. Se avsnittet Anpassade komponenter.
Gtk::EventControllerKey, Gtk::EventControllerMotion, Gtk::EventControllerScroll och Gtk::GestureStylus
Gdk::Paintable, Gdk::Texture, Gtk::Picture och Gtk::WidgetPaintable
Gdk::Window har bytt namn till Gdk::Surface. (Gtk::Window behåller sitt namn.)
Gdk::DrawContext och Gdk::CairoContext är nya. Gdk::DrawingContext har tagits bort.
Gtk::Clipboard har ersatts av den nya Gdk::Clipboard.
Gdk::DragContext har delats upp i Gdk::Drag och Gdk::Drop.
Det har också skett flera ändringar till API:t, vilket du troligen kommer stöta på när du porterar kod som använt gtkmm-3.0 och glibmm-2.4. Här är en kort lista:
En C++17-kompilator krävs.
Gtk::Button, Gtk::ToolButton, Gtk::MenuItem och Gtk::Switch implementerar Gtk::Actionable-gränssnittet i stället för det borttagna Gtk::Activatable-gränssnittet.
Gtk::FontButton implementerar gränssnittet Gtk::FontChooser.
Gtk::Widget: De olika metoderna get_preferred_*_vfunc() har ersatts med measure_vfunc(). Denna ändring påverkar bara anpassade komponenter.
sigc::slots use the sigc::slot<R(Args...)> syntax. Example: sigc::slot<void(int, int)> instead of sigc::slot<void, int, int>.
Gtk::DrawingArea uses a draw function instead of the draw signal.
Glib::ArrayHandle, Glib::StringArrayHandle, Glib::ListHandle och Glib::SListHandle har tagits bort. De användes i glibmm-2.4, men används inte i gtkmm-3.0. Om du har använt dessa klasser kan du ersätta dem med en C++-standardbehållare som std::vector.
Gtk::Container har tagits bort.
Gtk::Widget::show_all() har tagits bort. Standardvärdet för Gtk::Widget::property_visible() har ändrats från false till true.
Alla händelsesignaler har tagits bort från Gtk::Widget. I de flesta fall kan du använda en av underklasserna för Gtk::EventController som ersättning. Använd till exempel Gtk::GestureMultiPress i stället för signal_button_press_event() och signal_button_release_event(), och Gtk::EventControllerKey i stället för signal_key_press_event() och signal_key_release_event().
Glib::RefPtr är ett alias för std::shared_ptr. Om du gör dina egna Glib::ObjectBase-härledda klasser med create()-metoder som returnerar en Glib::RefPtr så måste du använda Glib::make_refptr_for_instance() i dina create()-metoder.
Gtk::Box::pack_start() och Gtk::Box::pack_end() har tagits bort. Använd de nya Gtk::Box-metoderna append(), prepend(), insert_child_after() och insert_child_at_start().
Gtk::ButtonBox har tagits bort.
Gtk::RadioButton och Gtk::RadioButtonGroup har tagits bort. Använd Gtk::CheckButton eller Gtk::ToggleButton med set_group().
Alla föråldrade API:er togs bort i gtkmm 4.0 och glibmm 2.68, men det kommer göras nya föråldringar i framtida versioner.
Som ett första steg för att portera din källkod till gtkmm-4.0 bör du troligen säkerställa att ditt program går bygga med de föråldrade API:erna för gtkmm-3.0 och glibmm-2.4 inaktiverade, genom att definiera makrona GTKMM_DISABLE_DEPRECATED, GDKMM_DISABLE_DEPRECATED, GLIBMM_DISABLE_DEPRECATED och GIOMM_DISABLE_DEPRECATED. Det finns några autotools-makron som kan hjälpa till med detta genom att valfritt definiera dem vid byggtid. Se wikisidan för portering från gtkmm-2.4 till gtkmm-3.0 för mer detaljer.
Se även Migrera från GTK 3.x till GTK 4.