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

Reply via email to