Control: tags -1 patch
I am including a debdiff with a complete patch set, based on yours. This is going to be uploaded as NMU to DELAYED/10.
diff -Nru groundhog-1.4/debian/changelog groundhog-1.4/debian/changelog --- groundhog-1.4/debian/changelog 2022-12-26 15:04:45.000000000 +0100 +++ groundhog-1.4/debian/changelog 2026-01-28 23:51:46.000000000 +0100 @@ -1,3 +1,12 @@ +groundhog (1.4-11.1) unstable; urgency=medium + + * Non-maintainer upload + * Drop non-existing Homepage + * Drop watch file + * Port to GTK-3 (Closes: #967461) + + -- Bastian Germann <[email protected]> Wed, 28 Jan 2026 23:51:46 +0100 + groundhog (1.4-11) unstable; urgency=low * Remove embedded copy of AM_PATH_GLIB_2_0 (Closes: #943660) diff -Nru groundhog-1.4/debian/control groundhog-1.4/debian/control --- groundhog-1.4/debian/control 2022-12-26 14:53:06.000000000 +0100 +++ groundhog-1.4/debian/control 2026-01-28 23:51:39.000000000 +0100 @@ -4,12 +4,10 @@ Maintainer: Ying-Chun Liu (PaulLiu) <[email protected]> Build-Depends: debhelper-compat (= 12), gettext, - libgtk2.0-dev, + libgtk-3-dev, liblockfile-dev, libtool, - quilt Standards-Version: 3.9.7 -Homepage: http://home-2.consunet.nl/~cb007736/groundhog.html Package: groundhog Architecture: any diff -Nru groundhog-1.4/debian/copyright groundhog-1.4/debian/copyright --- groundhog-1.4/debian/copyright 2016-03-15 09:16:41.000000000 +0100 +++ groundhog-1.4/debian/copyright 2026-01-28 23:51:46.000000000 +0100 @@ -22,7 +22,7 @@ Files: m4/* Copyright: 2001-2002 Free Software Foundation, Inc. -License: +License: GPL with Autoconf exception This file is free software, distributed under the terms of the GNU General Public License. As a special exception to the GNU General Public License, this file may be distributed as part of a program @@ -31,14 +31,14 @@ Files: m4/gettext.m4 m4/lcmessage.m4 m4/progtest.m4 Copyright: 1995-2002 Free Software Foundation, Inc. -License: +License: GPL with Autoconf-not-public-domain exception This file is free software, distributed under the terms of the GNU General Public License. As a special exception to the GNU General Public License, this file may be distributed as part of a program that contains a configuration script generated by Autoconf, under the same distribution terms as the rest of that program. . - This file can can be used in projects which are not available under + This file can be used in projects which are not available under the GNU General Public License or the GNU Library General Public License but which still want to provide support for the GNU gettext functionality. diff -Nru groundhog-1.4/debian/patches/configure.in.patch groundhog-1.4/debian/patches/configure.in.patch --- groundhog-1.4/debian/patches/configure.in.patch 2016-03-15 05:47:31.000000000 +0100 +++ groundhog-1.4/debian/patches/configure.in.patch 2026-01-28 23:04:47.000000000 +0100 @@ -1,9 +1,13 @@ Index: groundhog-1.4/configure.in =================================================================== ---- groundhog-1.4.orig/configure.in 2008-03-10 01:10:49.000000000 +0800 -+++ groundhog-1.4/configure.in 2008-03-10 01:11:19.000000000 +0800 -@@ -8,7 +8,7 @@ - GTK_REQUIRED_VERSION=$GLIB_REQUIRED_VERSION +--- groundhog-1.4.orig/configure.in ++++ groundhog-1.4/configure.in +@@ -5,10 +5,10 @@ AM_INIT_AUTOMAKE(groundhog, 1.4) + AM_CONFIG_HEADER(config.h) + + GLIB_REQUIRED_VERSION=2.0.0 +-GTK_REQUIRED_VERSION=$GLIB_REQUIRED_VERSION ++GTK_REQUIRED_VERSION=3.0.0 dnl Add the languages which your application supports here. -ALL_LINGUAS="nl fr" @@ -11,7 +15,16 @@ AM_GNU_GETTEXT dnl Set PACKAGE_LOCALE_DIR in config.h. -@@ -67,7 +67,7 @@ +@@ -40,7 +40,7 @@ AM_PATH_GLIB_2_0($GLIB_REQUIRED_VERSION, + AC_MSG_ERROR(Test for GLIB failed. See the file 'INSTALL' for help.), + gobject) + +-AM_PATH_GTK_2_0($GTK_REQUIRED_VERSION,, ++AM_PATH_GTK_3_0($GTK_REQUIRED_VERSION,, + AC_MSG_ERROR(Test for GTK failed. See the file 'INSTALL' for help.)) + + dnl Checks for libraries. +@@ -67,7 +67,7 @@ if test "x$GCC" = "xyes"; then fi changequote([,])dnl diff -Nru groundhog-1.4/debian/patches/fix-highscore-segfault.patch groundhog-1.4/debian/patches/fix-highscore-segfault.patch --- groundhog-1.4/debian/patches/fix-highscore-segfault.patch 1970-01-01 01:00:00.000000000 +0100 +++ groundhog-1.4/debian/patches/fix-highscore-segfault.patch 2026-01-28 23:51:46.000000000 +0100 @@ -0,0 +1,30 @@ +Author: Bastian Germann +Subject: Fix array bounds issues in highscore_tab +Index: groundhog-1.4/src/highscore_tab.h +=================================================================== +--- groundhog-1.4.orig/src/highscore_tab.h ++++ groundhog-1.4/src/highscore_tab.h +@@ -24,8 +24,8 @@ + class ScoreList; + + class HighScoreTab { +- GtkWidget* _names[10]; +- GtkWidget* _seconds[10]; ++ GtkWidget* _names[11]; ++ GtkWidget* _seconds[11]; + + void FillOneScore(int index, const char* name, const char* seconds); + protected: +Index: groundhog-1.4/src/highscore_tab.cc +=================================================================== +--- groundhog-1.4.orig/src/highscore_tab.cc ++++ groundhog-1.4/src/highscore_tab.cc +@@ -26,7 +26,7 @@ using namespace std; + + HighScoreTab::HighScoreTab(GtkWidget* notebook, const char* tab_name) + { +- GtkWidget* table = gtk_table_new(10, 3, TRUE); ++ GtkWidget* table = gtk_table_new(11, 3, TRUE); + + // Create header + GtkWidget* label = gtk_label_new(_("Rank")); diff -Nru groundhog-1.4/debian/patches/gtk2_menu_drop.patch groundhog-1.4/debian/patches/gtk2_menu_drop.patch --- groundhog-1.4/debian/patches/gtk2_menu_drop.patch 1970-01-01 01:00:00.000000000 +0100 +++ groundhog-1.4/debian/patches/gtk2_menu_drop.patch 2026-01-28 23:51:46.000000000 +0100 @@ -0,0 +1,25 @@ +--- groundhog-1.4.orig/src/game.cc ++++ groundhog-1.4/src/game.cc +@@ -45,22 +45,6 @@ using namespace std; + + Game* Game::_instance = 0; + +-GtkItemFactoryEntry Game::_menu_items[] = { +- {"/_File", 0, 0, 0, "<Branch>"}, +- {"/File/_New...", "<control>N", (GtkItemFactoryCallback) Game::OnNew, 0, +- "<StockItem>", GROUNDHOG_STOCK_NEW}, +- {"/File/Show _Highscore...", 0, +- (GtkItemFactoryCallback) Game::OnShowHighscore, 0, "<StockItem>", +- GROUNDHOG_STOCK_HIGHSCORE}, +- {"/File/_Preferences...", 0, (GtkItemFactoryCallback) Game::OnOptions, +- 0, "<StockItem>", GTK_STOCK_PREFERENCES}, +- {"/File/sep1", 0, 0, 0, "<Separator>"}, +- {"/File/_Quit", "<control>Q", (GtkItemFactoryCallback) Game::OnQuit, +- 0, "<StockItem>", GTK_STOCK_QUIT}, +- {"/_Help", 0, 0, 0, "<LastBranch>"}, +- {"/Help/_About...", 0, (GtkItemFactoryCallback) Game::OnAbout, 0, 0} +-}; +- + Game::Game(int argc, char** argv) + { + _mode = Game::Intermediate; diff -Nru groundhog-1.4/debian/patches/port_to_gtk3_complete.patch groundhog-1.4/debian/patches/port_to_gtk3_complete.patch --- groundhog-1.4/debian/patches/port_to_gtk3_complete.patch 1970-01-01 01:00:00.000000000 +0100 +++ groundhog-1.4/debian/patches/port_to_gtk3_complete.patch 2026-01-28 23:51:46.000000000 +0100 @@ -0,0 +1,318 @@ +Author: Bastian Germann +Subject: Complete GTK3 port + +Complete the GTK3 port by: +* Replacing GtkItemFactory with manual menu construction +* Replacing deprecated gtk_toolbar_append_item with GtkToolButton +* Loading icons directly from pixbuf instead of using icon names +* Correcting GtkGrid layout in about dialog +* Adding icons to menu items +* Replacing deprecated box constructors (gtk_vbox_new, gtk_hbox_new) +* Removing deprecated GtkHandleBox +* Fixing EnableTooltips implementation for GTK3 +Index: groundhog-1.4/src/about_dialog.cc +=================================================================== +--- groundhog-1.4.orig/src/about_dialog.cc ++++ groundhog-1.4/src/about_dialog.cc +@@ -21,6 +21,7 @@ + #include "about_dialog.h" + #include "icons.h" + #include "intl.h" ++#include "pixmaps/groundhog.xpm" + + AboutDialog::AboutDialog() : Dialog(_("About Groundhog")) + { +@@ -28,20 +29,22 @@ AboutDialog::AboutDialog() : Dialog(_("A + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(_window))), table, TRUE, TRUE, + 10); + gtk_grid_set_row_spacing(GTK_GRID(table), 10); +- +- // Create groundhog icon. +- GtkWidget* icon = gtk_image_new_from_icon_name(GROUNDHOG_STOCK_ABOUT, +- GTK_ICON_SIZE_DIALOG); +- gtk_grid_attach(GTK_GRID(table), icon, 0, 1, 1, 2); ++ gtk_grid_set_column_homogeneous(GTK_GRID(table), TRUE); + + GtkWidget* label = gtk_label_new( + "Groundhog " + VERSION + "\nCopyright (C) 1998-2002 by Maurits Rijk\n" + "[email protected]"); +- gtk_grid_attach(GTK_GRID(table), label, 0, 1, 0, 1); ++ gtk_grid_attach(GTK_GRID(table), label, 0, 0, 1, 1); + gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER); + ++ // Create groundhog icon. ++ GdkPixbuf* pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)groundhog_xpm); ++ GtkWidget* icon = gtk_image_new_from_pixbuf(pixbuf); ++ g_object_unref(pixbuf); ++ gtk_grid_attach(GTK_GRID(table), icon, 0, 1, 1, 1); ++ + label = gtk_label_new(" Released under the GNU General Public License "); +- gtk_grid_attach(GTK_GRID(table), label, 0, 1, 2, 3); ++ gtk_grid_attach(GTK_GRID(table), label, 0, 2, 1, 1); + } +Index: groundhog-1.4/src/game.cc +=================================================================== +--- groundhog-1.4.orig/src/game.cc ++++ groundhog-1.4/src/game.cc +@@ -40,6 +40,8 @@ using namespace std; + #include "pocket.h" + #include "solved_dialog.h" + #include "tube_pair.h" ++#include "pixmaps/new.xpm" ++#include "pixmaps/highscore.xpm" + + Game* Game::_instance = 0; + +@@ -82,56 +84,114 @@ Game::Game(int argc, char** argv) + g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(Game::OnQuit), 0); + gtk_widget_realize(window); + +- GtkWidget* main_vbox = gtk_vbox_new(FALSE, 1); ++ GtkWidget* main_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 1); + gtk_container_set_border_width(GTK_CONTAINER(main_vbox), 1); + gtk_container_add(GTK_CONTAINER(window), main_vbox); + +- int nmenu_items = sizeof(_menu_items) / sizeof(_menu_items[0]); +- +- GtkItemFactory* factory; ++ // Create menu bar + GtkAccelGroup* accel_group = gtk_accel_group_new(); +- +- factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<main>", accel_group); +- +-#ifdef ENABLE_NLS +- gtk_item_factory_set_translate_func(factory, Game::MenuTranslate, +- (void*) "<main>", NULL); +-#endif +- +- gtk_item_factory_create_items(factory, nmenu_items, _menu_items, 0); + gtk_window_add_accel_group(GTK_WINDOW(window), accel_group); +- +- GtkWidget* menubar = gtk_item_factory_get_widget(factory, "<main>"); ++ ++ GtkWidget* menubar = gtk_menu_bar_new(); ++ ++ // File menu ++ GtkWidget* file_menu = gtk_menu_new(); ++ GtkWidget* file_item = gtk_menu_item_new_with_mnemonic(_("_File")); ++ gtk_menu_item_set_submenu(GTK_MENU_ITEM(file_item), file_menu); ++ gtk_menu_shell_append(GTK_MENU_SHELL(menubar), file_item); ++ ++ // New menu item with icon ++ GtkWidget* new_item_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6); ++ GdkPixbuf* new_menu_pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)new_xpm); ++ GdkPixbuf* new_menu_scaled = gdk_pixbuf_scale_simple(new_menu_pixbuf, 16, 16, GDK_INTERP_BILINEAR); ++ GtkWidget* new_menu_icon = gtk_image_new_from_pixbuf(new_menu_scaled); ++ g_object_unref(new_menu_pixbuf); ++ g_object_unref(new_menu_scaled); ++ GtkWidget* new_label = gtk_label_new_with_mnemonic(_("_New...")); ++ gtk_box_pack_start(GTK_BOX(new_item_box), new_menu_icon, FALSE, FALSE, 0); ++ gtk_box_pack_start(GTK_BOX(new_item_box), new_label, TRUE, TRUE, 0); ++ GtkWidget* new_item = gtk_menu_item_new(); ++ gtk_container_add(GTK_CONTAINER(new_item), new_item_box); ++ g_signal_connect(G_OBJECT(new_item), "activate", G_CALLBACK(Game::OnNew), 0); ++ gtk_widget_add_accelerator(new_item, "activate", accel_group, GDK_KEY_n, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); ++ gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), new_item); ++ ++ // Highscore menu item with icon ++ GtkWidget* highscore_item_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6); ++ GdkPixbuf* highscore_menu_pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)highscore_xpm); ++ GdkPixbuf* highscore_menu_scaled = gdk_pixbuf_scale_simple(highscore_menu_pixbuf, 16, 16, GDK_INTERP_BILINEAR); ++ GtkWidget* highscore_menu_icon = gtk_image_new_from_pixbuf(highscore_menu_scaled); ++ g_object_unref(highscore_menu_pixbuf); ++ g_object_unref(highscore_menu_scaled); ++ GtkWidget* highscore_label = gtk_label_new_with_mnemonic(_("Show _Highscore...")); ++ gtk_box_pack_start(GTK_BOX(highscore_item_box), highscore_menu_icon, FALSE, FALSE, 0); ++ gtk_box_pack_start(GTK_BOX(highscore_item_box), highscore_label, TRUE, TRUE, 0); ++ GtkWidget* highscore_item = gtk_menu_item_new(); ++ gtk_container_add(GTK_CONTAINER(highscore_item), highscore_item_box); ++ g_signal_connect(G_OBJECT(highscore_item), "activate", G_CALLBACK(Game::OnShowHighscore), 0); ++ gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), highscore_item); ++ ++ // Preferences menu item with icon ++ GtkWidget* prefs_item_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6); ++ GtkWidget* prefs_menu_icon = gtk_image_new_from_icon_name("gtk-preferences", GTK_ICON_SIZE_MENU); ++ GtkWidget* prefs_label = gtk_label_new_with_mnemonic(_("_Preferences...")); ++ gtk_box_pack_start(GTK_BOX(prefs_item_box), prefs_menu_icon, FALSE, FALSE, 0); ++ gtk_box_pack_start(GTK_BOX(prefs_item_box), prefs_label, TRUE, TRUE, 0); ++ GtkWidget* prefs_item = gtk_menu_item_new(); ++ gtk_container_add(GTK_CONTAINER(prefs_item), prefs_item_box); ++ g_signal_connect(G_OBJECT(prefs_item), "activate", G_CALLBACK(Game::OnOptions), 0); ++ gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), prefs_item); ++ ++ GtkWidget* sep = gtk_separator_menu_item_new(); ++ gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), sep); ++ ++ // Quit menu item with icon ++ GtkWidget* quit_item_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6); ++ GtkWidget* quit_menu_icon = gtk_image_new_from_icon_name("application-exit", GTK_ICON_SIZE_MENU); ++ GtkWidget* quit_label = gtk_label_new_with_mnemonic(_("_Quit")); ++ gtk_box_pack_start(GTK_BOX(quit_item_box), quit_menu_icon, FALSE, FALSE, 0); ++ gtk_box_pack_start(GTK_BOX(quit_item_box), quit_label, TRUE, TRUE, 0); ++ GtkWidget* quit_item = gtk_menu_item_new(); ++ gtk_container_add(GTK_CONTAINER(quit_item), quit_item_box); ++ g_signal_connect(G_OBJECT(quit_item), "activate", G_CALLBACK(Game::OnQuit), 0); ++ gtk_widget_add_accelerator(quit_item, "activate", accel_group, GDK_KEY_q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); ++ gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), quit_item); ++ ++ // Help menu ++ GtkWidget* help_menu = gtk_menu_new(); ++ GtkWidget* help_item = gtk_menu_item_new_with_mnemonic(_("_Help")); ++ gtk_menu_item_set_submenu(GTK_MENU_ITEM(help_item), help_menu); ++ gtk_menu_shell_append(GTK_MENU_SHELL(menubar), help_item); ++ ++ GtkWidget* about_item = gtk_menu_item_new_with_mnemonic(_("_About...")); ++ g_signal_connect(G_OBJECT(about_item), "activate", G_CALLBACK(Game::OnAbout), 0); ++ gtk_menu_shell_append(GTK_MENU_SHELL(help_menu), about_item); + gtk_box_pack_start(GTK_BOX(main_vbox), menubar, FALSE, TRUE, 0); + + // Create toolbar +- GtkWidget* handlebox = gtk_handle_box_new(); +- gtk_box_pack_start(GTK_BOX(main_vbox), handlebox, FALSE, FALSE, 5); +- + _toolbar = gtk_toolbar_new(); + gtk_toolbar_set_style(GTK_TOOLBAR(_toolbar), GTK_TOOLBAR_ICONS); + gtk_orientable_set_orientation(GTK_ORIENTABLE(_toolbar), + GTK_ORIENTATION_HORIZONTAL); + gtk_container_set_border_width(GTK_CONTAINER(_toolbar), 5); +- gtk_container_add(GTK_CONTAINER(handlebox), _toolbar); +- +- // Create icons +- +- GtkWidget *iconw; ++ gtk_box_pack_start(GTK_BOX(main_vbox), _toolbar, FALSE, FALSE, 5); + +- iconw = gtk_image_new_from_stock(GROUNDHOG_STOCK_NEW, +- GTK_ICON_SIZE_LARGE_TOOLBAR); +- (void) gtk_toolbar_append_item(GTK_TOOLBAR(_toolbar), +- N_("New"), _("Start new game"), +- N_("Private"), iconw, +- G_CALLBACK(Game::OnNew), 0); +- +- iconw = gtk_image_new_from_stock(GROUNDHOG_STOCK_HIGHSCORE, +- GTK_ICON_SIZE_LARGE_TOOLBAR); +- gtk_toolbar_append_item(GTK_TOOLBAR(_toolbar), +- N_("Highscore"), _("Show highscore"), +- N_("Private"), iconw, +- G_CALLBACK(Game::OnShowHighscore), 0); ++ // Create toolbar buttons ++ GdkPixbuf* new_pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)new_xpm); ++ GtkWidget* new_icon = gtk_image_new_from_pixbuf(new_pixbuf); ++ g_object_unref(new_pixbuf); ++ GtkToolItem* new_button = gtk_tool_button_new(new_icon, N_("New")); ++ gtk_widget_set_tooltip_text(GTK_WIDGET(new_button), _("Start new game")); ++ g_signal_connect(G_OBJECT(new_button), "clicked", G_CALLBACK(Game::OnNew), 0); ++ gtk_toolbar_insert(GTK_TOOLBAR(_toolbar), new_button, -1); ++ ++ GdkPixbuf* highscore_pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)highscore_xpm); ++ GtkWidget* highscore_icon = gtk_image_new_from_pixbuf(highscore_pixbuf); ++ g_object_unref(highscore_pixbuf); ++ GtkToolItem* highscore_button = gtk_tool_button_new(highscore_icon, N_("Highscore")); ++ gtk_widget_set_tooltip_text(GTK_WIDGET(highscore_button), _("Show highscore")); ++ g_signal_connect(G_OBJECT(highscore_button), "clicked", G_CALLBACK(Game::OnShowHighscore), 0); ++ gtk_toolbar_insert(GTK_TOOLBAR(_toolbar), highscore_button, -1); + + // Create play field + GtkWidget* hbox = gtk_hbox_new(FALSE, 1); +@@ -146,7 +206,7 @@ Game::Game(int argc, char** argv) + gtk_container_set_border_width(GTK_CONTAINER(_table), 10); + gtk_container_add(GTK_CONTAINER(_frame), _table); + +- GtkWidget* vbox = gtk_vbox_new(FALSE, 1); ++ GtkWidget* vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 1); + gtk_container_add(GTK_CONTAINER(hbox), vbox); + + // Create '#moves' label +@@ -175,12 +235,6 @@ Game::Game(int argc, char** argv) + gtk_widget_show_all(window); + } + +-gchar* +-Game::MenuTranslate(const gchar *path, gpointer data) +-{ +- return _(path); +-} +- + gboolean + Game::DeleteEvent(GtkWidget* widget, GdkEvent* event, gpointer data) + { +@@ -358,11 +412,7 @@ Game::OnOptions(GtkWidget *widget, gpoin + void + Game::EnableTooltips(bool enable) + { +- gtk_toolbar_set_tooltips(GTK_TOOLBAR(_toolbar), enable); +- if (enable) +- gtk_tooltips_enable(_tooltips); +- else +- gtk_tooltips_disable(_tooltips); ++ gtk_widget_set_has_tooltip(_toolbar, enable); + } + + void +Index: groundhog-1.4/src/game.h +=================================================================== +--- groundhog-1.4.orig/src/game.h ++++ groundhog-1.4/src/game.h +@@ -32,7 +32,6 @@ class Game { + static gboolean DeleteEvent(GtkWidget* widget, GdkEvent* event, + gpointer data); + static void GoCB(GtkWidget *widget, gpointer data); +- static gchar* MenuTranslate(const gchar *path, gpointer data); + static gint Timeout(gpointer data); + void MoveBalls(); + void DisplayMoves(); +@@ -74,7 +73,6 @@ private: + int _nr_of_moves; + int _seconds; + static Game* _instance; +- static GtkItemFactoryEntry _menu_items[]; + GtkWidget* _toolbar; + GtkWidget* _frame; + GtkWidget* _table; +--- groundhog-1.4.orig/src/solved_dialog.cc ++++ groundhog-1.4/src/solved_dialog.cc +@@ -28,7 +28,7 @@ + SetSize(200, 100); + + _label = gtk_label_new(""); +- gtk_box_pack_start(GTK_BOX(GTK_DIALOG(_window)->vbox), _label, TRUE, TRUE, ++ gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(_window))), _label, TRUE, TRUE, + 10); + } + +@@ -40,5 +40,5 @@ + + ost << _(" Game solved in ") << moves << _(" moves!") << std::ends; + info = ost.str(); +- gtk_label_set(GTK_LABEL(_label), info.c_str()); ++ gtk_label_set_text(GTK_LABEL(_label), info.c_str()); + } +--- groundhog-1.4.orig/src/options_dialog.cc ++++ groundhog-1.4/src/options_dialog.cc +@@ -23,12 +23,12 @@ + OptionsDialog::OptionsDialog(Game* game) : Dialog(_("Preferences")), + _game(game) + { +- GtkWidget* box = gtk_hbox_new(FALSE, 1);; +- gtk_container_border_width(GTK_CONTAINER(box), 10); +- gtk_box_pack_start(GTK_BOX(GTK_DIALOG(_window)->vbox), box, TRUE, TRUE, 10); ++ GtkWidget* box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1);; ++ gtk_container_set_border_width(GTK_CONTAINER(box), 10); ++ gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(_window))), box, TRUE, TRUE, 10); + _tooltips = gtk_check_button_new_with_mnemonic(_("_Show Tooltips")); + gtk_container_add(GTK_CONTAINER(box), _tooltips); +- gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(_tooltips), TRUE); ++ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(_tooltips), TRUE); + + AddCancelButton(); + } +@@ -36,6 +36,6 @@ OptionsDialog::OptionsDialog(Game* game) + void + OptionsDialog::OnOk() + { +- _game->EnableTooltips((GTK_TOGGLE_BUTTON(_tooltips)->active) ++ _game->EnableTooltips(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(_tooltips)) + ? true : false); + } diff -Nru groundhog-1.4/debian/patches/port_to_gtk3.patch groundhog-1.4/debian/patches/port_to_gtk3.patch --- groundhog-1.4/debian/patches/port_to_gtk3.patch 1970-01-01 01:00:00.000000000 +0100 +++ groundhog-1.4/debian/patches/port_to_gtk3.patch 2026-01-28 23:05:52.000000000 +0100 @@ -0,0 +1,295 @@ +Index: groundhog-1.4/src/dialog.h +=================================================================== +--- groundhog-1.4.orig/src/dialog.h ++++ groundhog-1.4/src/dialog.h +@@ -32,7 +32,7 @@ protected: + virtual void OnOk() {} + + void SetSize(gint width, gint height) { +- gtk_widget_set_usize(GTK_WIDGET(_window), width, height);} ++ gtk_widget_set_size_request(GTK_WIDGET(_window), width, height);} + void AddCancelButton(); + public: + Dialog(const char* title); +Index: groundhog-1.4/src/about_dialog.cc +=================================================================== +--- groundhog-1.4.orig/src/about_dialog.cc ++++ groundhog-1.4/src/about_dialog.cc +@@ -24,24 +24,24 @@ + + AboutDialog::AboutDialog() : Dialog(_("About Groundhog")) + { +- GtkWidget* table = gtk_table_new(3, 1, FALSE); +- gtk_box_pack_start(GTK_BOX(GTK_DIALOG(_window)->vbox), table, TRUE, TRUE, ++ GtkWidget* table = gtk_grid_new(); ++ gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(_window))), table, TRUE, TRUE, + 10); +- gtk_table_set_row_spacings(GTK_TABLE(table), 10); ++ gtk_grid_set_row_spacing(GTK_GRID(table), 10); + + // Create groundhog icon. +- GtkWidget* icon = gtk_image_new_from_stock(GROUNDHOG_STOCK_ABOUT, ++ GtkWidget* icon = gtk_image_new_from_icon_name(GROUNDHOG_STOCK_ABOUT, + GTK_ICON_SIZE_DIALOG); +- gtk_table_attach_defaults(GTK_TABLE(table), icon, 0, 1, 1, 2); ++ gtk_grid_attach(GTK_GRID(table), icon, 0, 1, 1, 2); + + GtkWidget* label = gtk_label_new( + "Groundhog " + VERSION + "\nCopyright (C) 1998-2002 by Maurits Rijk\n" + "[email protected]"); +- gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1); ++ gtk_grid_attach(GTK_GRID(table), label, 0, 1, 0, 1); + gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER); + + label = gtk_label_new(" Released under the GNU General Public License "); +- gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 2, 3); ++ gtk_grid_attach(GTK_GRID(table), label, 0, 1, 2, 3); + } +Index: groundhog-1.4/src/dialog.cc +=================================================================== +--- groundhog-1.4.orig/src/dialog.cc ++++ groundhog-1.4/src/dialog.cc +@@ -49,8 +49,8 @@ void + Dialog::DoDialog() + { + +- if (GTK_WIDGET_VISIBLE(_window)) +- gdk_window_raise(_window->window); ++ if (gtk_widget_get_visible(_window)) ++ gdk_window_raise(gtk_widget_get_window(_window)); + else + gtk_widget_show_all(_window); + } +Index: groundhog-1.4/src/game.cc +=================================================================== +--- groundhog-1.4.orig/src/game.cc ++++ groundhog-1.4/src/game.cc +@@ -82,11 +82,8 @@ Game::Game(int argc, char** argv) + g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(Game::OnQuit), 0); + gtk_widget_realize(window); + +- // Set tooltips support +- _tooltips = gtk_tooltips_new(); +- + GtkWidget* main_vbox = gtk_vbox_new(FALSE, 1); +- gtk_container_border_width(GTK_CONTAINER(main_vbox), 1); ++ gtk_container_set_border_width(GTK_CONTAINER(main_vbox), 1); + gtk_container_add(GTK_CONTAINER(window), main_vbox); + + int nmenu_items = sizeof(_menu_items) / sizeof(_menu_items[0]); +@@ -113,9 +110,9 @@ Game::Game(int argc, char** argv) + + _toolbar = gtk_toolbar_new(); + gtk_toolbar_set_style(GTK_TOOLBAR(_toolbar), GTK_TOOLBAR_ICONS); +- gtk_toolbar_set_orientation(GTK_TOOLBAR(_toolbar), ++ gtk_orientable_set_orientation(GTK_ORIENTABLE(_toolbar), + GTK_ORIENTATION_HORIZONTAL); +- gtk_container_border_width(GTK_CONTAINER(_toolbar), 5); ++ gtk_container_set_border_width(GTK_CONTAINER(_toolbar), 5); + gtk_container_add(GTK_CONTAINER(handlebox), _toolbar); + + // Create icons +@@ -127,14 +124,14 @@ Game::Game(int argc, char** argv) + (void) gtk_toolbar_append_item(GTK_TOOLBAR(_toolbar), + N_("New"), _("Start new game"), + N_("Private"), iconw, +- GTK_SIGNAL_FUNC(Game::OnNew), 0); ++ G_CALLBACK(Game::OnNew), 0); + + iconw = gtk_image_new_from_stock(GROUNDHOG_STOCK_HIGHSCORE, + GTK_ICON_SIZE_LARGE_TOOLBAR); + gtk_toolbar_append_item(GTK_TOOLBAR(_toolbar), + N_("Highscore"), _("Show highscore"), + N_("Private"), iconw, +- GTK_SIGNAL_FUNC(Game::OnShowHighscore), 0); ++ G_CALLBACK(Game::OnShowHighscore), 0); + + // Create play field + GtkWidget* hbox = gtk_hbox_new(FALSE, 1); +@@ -146,7 +143,7 @@ Game::Game(int argc, char** argv) + + // create a 5x5 table + _table = gtk_table_new(7, 7, TRUE); +- gtk_container_border_width(GTK_CONTAINER(_table), 10); ++ gtk_container_set_border_width(GTK_CONTAINER(_table), 10); + gtk_container_add(GTK_CONTAINER(_frame), _table); + + GtkWidget* vbox = gtk_vbox_new(FALSE, 1); +@@ -193,7 +190,7 @@ Game::DeleteEvent(GtkWidget* widget, Gdk + void + Game::SetTooltip(GtkWidget* widget, const char* text) + { +- gtk_tooltips_set_tip(_tooltips, widget, text, NULL); ++ gtk_widget_set_tooltip_text(widget, text); + } + + void +@@ -204,7 +201,7 @@ Game::DisplayMoves() + + ost << _("Moves: ") << _nr_of_moves << std::ends; + info = ost.str(); +- gtk_label_set(GTK_LABEL(_moves), info.c_str()); ++ gtk_label_set_text(GTK_LABEL(_moves), info.c_str()); + } + + void +@@ -215,14 +212,14 @@ Game::DisplayTime() + + ost << _("Time: ") << _seconds << std::ends; + info = ost.str(); +- gtk_label_set(GTK_LABEL(_time), info.c_str()); ++ gtk_label_set_text(GTK_LABEL(_time), info.c_str()); + } + + void + Game::StopTime() + { + if (_timeout) +- gtk_timeout_remove(_timeout); ++ g_source_remove(_timeout); + } + + gint +@@ -304,7 +301,7 @@ Game::NewGame(int rows, int columns) + + gtk_widget_destroy(GTK_WIDGET(_table)); + _table = gtk_table_new(_rows + 2, _columns + 2, TRUE); +- gtk_container_border_width(GTK_CONTAINER(_table), 10); ++ gtk_container_set_border_width(GTK_CONTAINER(_table), 10); + gtk_container_add(GTK_CONTAINER(_frame), _table); + + (void) Construct(_columns, _rows, 1, 1); +@@ -313,7 +310,7 @@ Game::NewGame(int rows, int columns) + + Shuffle(); + StopTime(); +- _timeout = gtk_timeout_add(1000, Game::Timeout, this); ++ _timeout = g_timeout_add(1000, Game::Timeout, this); + gtk_widget_set_sensitive(_go, TRUE); + } + +@@ -371,7 +368,7 @@ Game::EnableTooltips(bool enable) + void + Game::OnQuit(GtkWidget *widget, gpointer data) + { +- gtk_exit(0); ++ exit(0); + } + + void +Index: groundhog-1.4/src/game.h +=================================================================== +--- groundhog-1.4.orig/src/game.h ++++ groundhog-1.4/src/game.h +@@ -81,7 +81,6 @@ private: + GtkWidget* _moves; + GtkWidget* _time; + GtkWidget* _go; +- GtkTooltips* _tooltips; + gint _timeout; + + SetOffBalls _balls; +Index: groundhog-1.4/src/highscore_dialog.cc +=================================================================== +--- groundhog-1.4.orig/src/highscore_dialog.cc ++++ groundhog-1.4/src/highscore_dialog.cc +@@ -23,8 +23,8 @@ + HighScoreDialog::HighScoreDialog() : Dialog(_("High scores")) + { + _notebook = gtk_notebook_new(); +- gtk_container_border_width(GTK_CONTAINER(_notebook), 10); +- gtk_box_pack_start(GTK_BOX(GTK_DIALOG(_window)->vbox), _notebook, TRUE, ++ gtk_container_set_border_width(GTK_CONTAINER(_notebook), 10); ++ gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(_window))), _notebook, TRUE, + TRUE, 10); + + _beginner = new HighScoreTab(_notebook, _("_Beginner")); +Index: groundhog-1.4/src/highscore_dialog.h +=================================================================== +--- groundhog-1.4.orig/src/highscore_dialog.h ++++ groundhog-1.4/src/highscore_dialog.h +@@ -31,7 +31,7 @@ class HighScoreDialog : public Dialog { + HighScoreTab* _expert; + + void ShowTab(gint page) { +- gtk_notebook_set_page(GTK_NOTEBOOK(_notebook), page);} ++ gtk_notebook_set_current_page(GTK_NOTEBOOK(_notebook), page);} + protected: + public: + HighScoreDialog(); +Index: groundhog-1.4/src/highscore_tab.cc +=================================================================== +--- groundhog-1.4.orig/src/highscore_tab.cc ++++ groundhog-1.4/src/highscore_tab.cc +@@ -61,8 +61,8 @@ HighScoreTab::HighScoreTab(GtkWidget* no + void + HighScoreTab::FillOneScore(int index, const char* name, const char* seconds) + { +- gtk_label_set(GTK_LABEL(_names[index]), name); +- gtk_label_set(GTK_LABEL(_seconds[index]), seconds); ++ gtk_label_set_text(GTK_LABEL(_names[index]), name); ++ gtk_label_set_text(GTK_LABEL(_seconds[index]), seconds); + } + + void +Index: groundhog-1.4/src/new_game_dialog.cc +=================================================================== +--- groundhog-1.4.orig/src/new_game_dialog.cc ++++ groundhog-1.4/src/new_game_dialog.cc +@@ -24,12 +24,12 @@ NewGameDialog::NewGameDialog(Game* game) + { + // Create 'size' frame. + GtkWidget* frame = gtk_frame_new(_("Size")); +- gtk_container_border_width(GTK_CONTAINER(frame), 10); +- gtk_box_pack_start(GTK_BOX(GTK_DIALOG(_window)->vbox), frame, TRUE, TRUE, ++ gtk_container_set_border_width(GTK_CONTAINER(frame), 10); ++ gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(_window))), frame, TRUE, TRUE, + 10); + + GtkWidget* table = gtk_table_new(6, 2, FALSE); +- gtk_container_border_width(GTK_CONTAINER(table), 10); ++ gtk_container_set_border_width(GTK_CONTAINER(table), 10); + gtk_container_add(GTK_CONTAINER(frame), table); + + gtk_table_set_row_spacings(GTK_TABLE(table), 5); +@@ -41,7 +41,7 @@ NewGameDialog::NewGameDialog(Game* game) + _intermediate = gtk_radio_button_new_with_mnemonic_from_widget( + GTK_RADIO_BUTTON(_beginner), _("_Intermediate (5x5)")); + gtk_table_attach_defaults(GTK_TABLE(table), _intermediate, 0, 1, 1, 2); +- gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(_intermediate), TRUE); ++ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(_intermediate), TRUE); + + _expert = gtk_radio_button_new_with_mnemonic_from_widget( + GTK_RADIO_BUTTON(_intermediate), _("_Expert (9x9)")); +@@ -61,12 +61,12 @@ NewGameDialog::NewGameDialog(Game* game) + gtk_table_attach_defaults(GTK_TABLE(table), _row_label, 0, 1, 5, 6); + + _columns = gtk_spin_button_new_with_range(2, 10, 1); +- gtk_entry_set_editable(GTK_ENTRY(_columns), FALSE); ++ gtk_editable_set_editable(GTK_EDITABLE(_columns), FALSE); + gtk_table_attach_defaults(GTK_TABLE(table), _columns, 1, 2, 4, 5); + gtk_label_set_mnemonic_widget(GTK_LABEL(_column_label), _columns); + + _rows = gtk_spin_button_new_with_range(2, 10, 1); +- gtk_entry_set_editable(GTK_ENTRY(_rows), FALSE); ++ gtk_editable_set_editable(GTK_EDITABLE(_rows), FALSE); + gtk_table_attach_defaults(GTK_TABLE(table), _rows, 1, 2, 5, 6); + gtk_label_set_mnemonic_widget(GTK_LABEL(_row_label), _rows); + +Index: groundhog-1.4/src/new_highscore_dialog.cc +=================================================================== +--- groundhog-1.4.orig/src/new_highscore_dialog.cc ++++ groundhog-1.4/src/new_highscore_dialog.cc +@@ -29,8 +29,8 @@ NewHighScoreDialog::NewHighScoreDialog(G + Dialog(_("New Highscore")), _game(game) + { + GtkWidget* table = gtk_table_new(2, 2, FALSE); +- gtk_container_border_width(GTK_CONTAINER(table), 10); +- gtk_box_pack_start(GTK_BOX(GTK_DIALOG(_window)->vbox), table, TRUE, TRUE, ++ gtk_container_set_border_width(GTK_CONTAINER(table), 10); ++ gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(_window))), table, TRUE, TRUE, + 10); + gtk_table_set_row_spacings(GTK_TABLE(table), 10); + gtk_table_set_col_spacings(GTK_TABLE(table), 5); diff -Nru groundhog-1.4/debian/patches/series groundhog-1.4/debian/patches/series --- groundhog-1.4/debian/patches/series 2016-03-15 05:47:31.000000000 +0100 +++ groundhog-1.4/debian/patches/series 2026-01-28 23:51:46.000000000 +0100 @@ -13,3 +13,7 @@ solved_dialog.cc.patch new_highscore_dialog.cc.patch tube_pair.cc.patch +port_to_gtk3.patch +port_to_gtk3_complete.patch +fix-highscore-segfault.patch +gtk2_menu_drop.patch diff -Nru groundhog-1.4/debian/source/include-binaries groundhog-1.4/debian/source/include-binaries --- groundhog-1.4/debian/source/include-binaries 1970-01-01 01:00:00.000000000 +0100 +++ groundhog-1.4/debian/source/include-binaries 2026-01-28 23:51:46.000000000 +0100 @@ -0,0 +1,17 @@ +src/about_dialog.o +src/ball.o +src/dialog.o +src/element.o +src/game.o +src/highscore.o +src/highscore_dialog.o +src/highscore_tab.o +src/icons.o +src/main.o +src/new_game_dialog.o +src/new_highscore_dialog.o +src/pocket.o +src/score.o +src/solved_dialog.o +src/tube.o +src/tube_pair.o diff -Nru groundhog-1.4/debian/watch groundhog-1.4/debian/watch --- groundhog-1.4/debian/watch 2016-03-15 05:47:31.000000000 +0100 +++ groundhog-1.4/debian/watch 1970-01-01 01:00:00.000000000 +0100 @@ -1,4 +0,0 @@ -# Site Directory Pattern Version Script -version=3 -http://home-2.consunet.nl/~cb007736/groundhog.html \ - groundhog-([\d+\.]+|\d+)\.tar\.gz

