[med-svn] [Git][med-team/ltrsift][master] 2 commits: Port LTRsift from GTK+ 2 to GTK+ 3

Andreas Tille (@tille) gitlab at salsa.debian.org
Tue Oct 20 12:42:55 BST 2026



Andreas Tille pushed to branch master at Debian Med / ltrsift


Commits:
4bb3a3ec by Andreas Tille at 2026-10-20T13:22:06+02:00
Port LTRsift from GTK+ 2 to GTK+ 3

The GTK+ 2 development files are no longer available in Debian.
Update the build system to use GTK+ 3, adapt the custom widgets to
GTK+ 3 (GtkObject removal, GtkComboBoxText, dialog content area,
GtkWidget allocations and the draw signal) and use the renamed
key symbols.

Closes: #967603

- - - - -
a481fec9 by Andreas Tille at 2026-10-20T13:42:01+02:00
Add autopkgtest

exercise ltrsift_encode, and start the GUI under Xvfb to make sure the main loop keeps running.

- - - - -


8 changed files:

- + debian/README.test
- debian/changelog
- debian/control
- debian/ltrsift.docs
- + debian/patches/gtk3.patch
- debian/patches/series
- + debian/tests/control
- + debian/tests/run-unit-test


Changes:

=====================================
debian/README.test
=====================================
@@ -0,0 +1,8 @@
+Notes on how this package can be tested.
+────────────────────────────────────────
+
+This package can be tested by running the provided test:
+
+    sh run-unit-test
+
+in order to confirm its integrity.


=====================================
debian/changelog
=====================================
@@ -4,6 +4,8 @@ ltrsift (1.0.2-12) UNRELEASED; urgency=medium
   * d/watch: version=5
   * Standards-Version: 4.7.4 (routine-update)
   * Reflow Uploaders field (cme)
+  * Port from GTK+ 2 to GTK+ 3. Closes: #967603
+  * Add autopkgtest checking the GTK+ 3 port.
 
  -- Andreas Tille <tille at debian.org>  Tue, 20 Oct 2026 11:20:34 +0200
 


=====================================
debian/control
=====================================
@@ -8,7 +8,7 @@ Build-Depends:
  debhelper-compat (= 14),
  libgenometools0-dev,
  libglib2.0-dev,
- libgtk2.0-dev,
+ libgtk-3-dev,
 Vcs-Browser: https://salsa.debian.org/med-team/ltrsift
 Vcs-Git: https://salsa.debian.org/med-team/ltrsift.git
 Homepage: https://www.zbh.uni-hamburg.de/en/forschung/gi/software/ltrsift.html


=====================================
debian/ltrsift.docs
=====================================
@@ -1,2 +1,4 @@
 README
 VERSION
+debian/tests/run-unit-test
+debian/README.test


=====================================
debian/patches/gtk3.patch
=====================================
@@ -0,0 +1,517 @@
+Description: Port LTRsift from GTK+ 2 to GTK+ 3
+ The version 2 of the GTK+ toolkit is no longer available in Debian.
+Author: Andreas Tille <tille at debian.org>
+Assisted-by: opencode/deepseek-v4.1-flash-free
+Bug-Debian: https://bugs.debian.org/967603
+Last-Update: 2026-10-20
+---
+--- a/Makefile	2026-10-20 11:30:18.652000000 +0200
++++ b/Makefile	2026-10-20 11:34:00.512000000 +0200
+@@ -10,7 +10,7 @@
+             -I$(gt_prefix)/include/genometools -I$(GTDIR)/src
+ GT_FLAGS_STATIC := $(GT_FLAGS) `pkg-config --cflags --libs pango pangocairo`
+ GT_FLAGS += -lgenometools -L$(gt_prefix)/lib $(LDFLAGS)
+-GTK_FLAGS = `pkg-config --cflags --libs gtk+-2.0 gthread-2.0`
++GTK_FLAGS = `pkg-config --cflags --libs gtk+-3.0 gthread-2.0`
+ SOURCES := $(sort $(wildcard src/*.c))
+ OBJECTS := $(sort $(filter-out obj/src/ltrsift.o obj/src/ltrsift_encode.o, $(SOURCES:%.c=obj/%.o)))
+ 
+--- a/README	2026-10-20 11:21:18.000000000 +0200
++++ b/README	2026-10-20 11:34:00.512000000 +0200
+@@ -1,7 +1,7 @@
+ Prerequisites
+ -------------
+ 
+-LTRsift needs the GTK+ version 2 library to work. If you are on a Linux desktop
++LTRsift needs the GTK+ version 3 library to work. If you are on a Linux desktop
+ system (e.g. Ubuntu Linux, Red Hat, SuSE, ...), it is very likely that this
+ library is already installed.
+ On Mac OS X, however, it is not and needs to be installed. This can, for
+@@ -10,7 +10,7 @@
+ http://www.finkproject.org/download/srcdist.php.  After the self-update, the
+ command
+ 
+-$ fink install cairo gtk+2-dev
++$ fink install cairo gtk+3-dev
+ 
+ should suffice to build and install the required libraries. This will take
+ some time!
+--- a/src/gtk_blastn_params.c	2026-10-20 11:21:18.000000000 +0200
++++ b/src/gtk_blastn_params.c	2026-10-20 11:34:00.552000000 +0200
+@@ -390,7 +390,7 @@
+   gchar *param;
+   gpointer value;
+ 
+-  param = gtk_combo_box_get_active_text(combob);
++  param = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(combob));
+   if (g_strcmp0(param, "") == 0) {
+     gtk_widget_set_sensitive(blastpar->entry_blastvalues, FALSE);
+     gtk_widget_set_sensitive(blastpar->button_addblastparam, FALSE);
+@@ -418,7 +418,7 @@
+   const gchar *value;
+ 
+   key =
+-     gtk_combo_box_get_active_text(GTK_COMBO_BOX(blastpar->combob_blastparams));
++     gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(blastpar->combob_blastparams));
+   value = gtk_entry_get_text(GTK_ENTRY(blastpar->entry_blastvalues));
+   if ((g_strcmp0(key, BLASTN_NO_GREEDY) == 0) ||
+       (g_strcmp0(key, BLASTN_UNGAPPED) == 0))
+@@ -438,7 +438,7 @@
+   gchar *key;
+ 
+   key =
+-     gtk_combo_box_get_active_text(GTK_COMBO_BOX(blastpar->combob_blastparams));
++     gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(blastpar->combob_blastparams));
+   if (!g_hash_table_remove(blastpar->hasht_blastparams, (gconstpointer) key)) {
+     g_free(key);
+     return;
+@@ -464,7 +464,7 @@
+ {
+   GtkWidget *hbox, *vbox, *label, *tmpbox, *checkb, *hsep, *combob,
+             *align, *image, *button;
+-  GtkObject *adjust;
++  GtkAdjustment *adjust;
+ 
+   gtk_box_set_spacing(GTK_BOX(blastpar), 5);
+ 
+@@ -503,20 +503,20 @@
+   label = gtk_label_new("Select additional BLASTN parameter:");
+   gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+   gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 1);
+-  combob = blastpar->combob_blastparams = gtk_combo_box_new_text();
+-  gtk_combo_box_append_text(GTK_COMBO_BOX(combob), "");
+-  gtk_combo_box_append_text(GTK_COMBO_BOX(combob), BLASTN_STRAND);
+-  gtk_combo_box_append_text(GTK_COMBO_BOX(combob), BLASTN_CULLING);
+-  gtk_combo_box_append_text(GTK_COMBO_BOX(combob), BLASTN_BESTHIT_OVERH);
+-  gtk_combo_box_append_text(GTK_COMBO_BOX(combob), BLASTN_BESTHIT_SCORE);
+-  gtk_combo_box_append_text(GTK_COMBO_BOX(combob), BLASTN_MAXT_SEQS);
+-  gtk_combo_box_append_text(GTK_COMBO_BOX(combob), BLASTN_XDROP_UNG);
+-  gtk_combo_box_append_text(GTK_COMBO_BOX(combob), BLASTN_XDROP_GAP);
+-  gtk_combo_box_append_text(GTK_COMBO_BOX(combob), BLASTN_NO_GREEDY);
+-  gtk_combo_box_append_text(GTK_COMBO_BOX(combob), BLASTN_MIN_RAW);
+-  gtk_combo_box_append_text(GTK_COMBO_BOX(combob), BLASTN_UNGAPPED);
+-  gtk_combo_box_append_text(GTK_COMBO_BOX(combob), BLASTN_WINDOWS);
+-  gtk_combo_box_append_text(GTK_COMBO_BOX(combob), BLASTN_OFF_DIAG);
++  combob = blastpar->combob_blastparams = gtk_combo_box_text_new();
++  gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combob), "");
++  gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combob), BLASTN_STRAND);
++  gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combob), BLASTN_CULLING);
++  gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combob), BLASTN_BESTHIT_OVERH);
++  gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combob), BLASTN_BESTHIT_SCORE);
++  gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combob), BLASTN_MAXT_SEQS);
++  gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combob), BLASTN_XDROP_UNG);
++  gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combob), BLASTN_XDROP_GAP);
++  gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combob), BLASTN_NO_GREEDY);
++  gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combob), BLASTN_MIN_RAW);
++  gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combob), BLASTN_UNGAPPED);
++  gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combob), BLASTN_WINDOWS);
++  gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combob), BLASTN_OFF_DIAG);
+   g_signal_connect(G_OBJECT(combob), "changed",
+                    G_CALLBACK(combob_blast_changed), blastpar);
+   gtk_box_pack_start(GTK_BOX(vbox), combob, FALSE, FALSE, 1);
+@@ -709,7 +709,7 @@
+ GtkWidget* gtk_blastn_params_new()
+ {
+   GtkBlastnParams *blastpar;
+-  blastpar = gtk_type_new(GTK_BLASTN_PARAMS_TYPE);
++  blastpar = g_object_new(GTK_BLASTN_PARAMS_TYPE, NULL);
+   g_signal_connect(G_OBJECT(blastpar), "destroy",
+                    G_CALLBACK(gtk_blastn_params_destroy), NULL);
+   return GTK_WIDGET(blastpar);
+--- a/src/gtk_blastn_params_refseq.c	2026-10-20 11:21:18.000000000 +0200
++++ b/src/gtk_blastn_params_refseq.c	2026-10-20 11:34:00.552000000 +0200
+@@ -131,7 +131,7 @@
+ static void gtk_blastn_params_refseq_init(GtkBlastnParamsRefseq *blastparref)
+ {
+   GtkWidget *label, *button, *hbox, *hsep;
+-  GtkObject *adjust;
++  GtkAdjustment *adjust;
+ 
+   label = gtk_label_new("File containing reference sequences:");
+   gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+@@ -197,7 +197,7 @@
+ GtkWidget* gtk_blastn_params_refseq_new()
+ {
+   GtkBlastnParamsRefseq *blastparref;
+-  blastparref = gtk_type_new(GTK_BLASTN_PARAMS_REFSEQ_TYPE);
++  blastparref = g_object_new(GTK_BLASTN_PARAMS_REFSEQ_TYPE, NULL);
+   blastparref->last_dir = NULL;
+ 
+   return GTK_WIDGET(blastparref);
+--- a/src/gtk_label_close.c	2026-10-20 11:21:18.000000000 +0200
++++ b/src/gtk_label_close.c	2026-10-20 11:34:00.552000000 +0200
+@@ -98,7 +98,7 @@
+                                gpointer user_data)
+ {
+   GtkLabelClose *labelclose;
+-  labelclose = gtk_type_new(GTK_LABEL_CLOSE_TYPE);
++  labelclose = g_object_new(GTK_LABEL_CLOSE_TYPE, NULL);
+   gtk_label_set_text(GTK_LABEL(labelclose->label), text);
+   if (signal_func)
+     g_signal_connect(G_OBJECT(labelclose->button), "clicked",
+--- a/src/gtk_ltr_assistant.c	2026-10-20 11:21:18.000000000 +0200
++++ b/src/gtk_ltr_assistant.c	2026-10-20 11:34:00.552000000 +0200
+@@ -925,7 +925,7 @@
+   gchar *param;
+   gpointer value;
+ 
+-  param = gtk_combo_box_get_active_text(combob);
++  param = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(combob));
+   if (g_strcmp0(param, "") == 0) {
+     gtk_widget_set_sensitive(ltrassi->entry_lastvalues, FALSE);
+     gtk_widget_set_sensitive(ltrassi->button_addlastparam, FALSE);
+@@ -953,7 +953,7 @@
+   const gchar *value;
+ 
+   key =
+-      gtk_combo_box_get_active_text(GTK_COMBO_BOX(ltrassi->combob_lastparams));
++      gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(ltrassi->combob_lastparams));
+   value = gtk_entry_get_text(GTK_ENTRY(ltrassi->entry_lastvalues));
+   if ((g_strcmp0(key, BLASTN_NO_GREEDY) == 0) ||
+       (g_strcmp0(key, BLASTN_UNGAPPED) == 0))
+@@ -973,7 +973,7 @@
+   gchar *key;
+ 
+   key =
+-      gtk_combo_box_get_active_text(GTK_COMBO_BOX(ltrassi->combob_lastparams));
++      gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(ltrassi->combob_lastparams));
+   if (!g_hash_table_remove(ltrassi->hasht_lastparams, (gconstpointer) key)) {
+     g_free(key);
+     return;
+@@ -1066,7 +1066,7 @@
+   GtkTreeSelection *sel;
+   GtkCellRenderer *renderer;
+   GtkListStore *store;
+-  GtkObject *adjust;
++  GtkAdjustment *adjust;
+   gint i;
+ 
+   /* Introduction page */
+@@ -1217,9 +1217,9 @@
+   align = gtk_alignment_new(0.0, 0.5, 0.0, 0.0);
+   gtk_container_add(GTK_CONTAINER(align), label);
+ 
+-  combob = ltrassi->combob_lastparams = gtk_combo_box_new_text();
+-  gtk_combo_box_append_text(GTK_COMBO_BOX(combob), "");
+-  gtk_combo_box_append_text(GTK_COMBO_BOX(combob), BLASTN_OFF_DIAG);
++  combob = ltrassi->combob_lastparams = gtk_combo_box_text_new();
++  gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combob), "");
++  gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combob), BLASTN_OFF_DIAG);
+   g_signal_connect(G_OBJECT(combob), "changed",
+                    G_CALLBACK(combob_last_changed), ltrassi);
+   gtk_box_pack_start(GTK_BOX(vbox), combob, FALSE, FALSE, 1);
+@@ -1871,7 +1871,7 @@
+   GtkLTRAssistant *ltrassi;
+   gchar title[BUFSIZ];
+ 
+-  ltrassi = gtk_type_new(GTK_LTR_ASSISTANT_TYPE);
++  ltrassi = g_object_new(GTK_LTR_ASSISTANT_TYPE, NULL);
+   g_snprintf(title, BUFSIZ, LTRASSI_WINDOW_TITLE, GUI_NAME);
+   gtk_window_set_title(GTK_WINDOW(ltrassi), title);
+   gtk_assistant_set_forward_page_func(GTK_ASSISTANT(ltrassi),
+--- a/src/gtk_ltr_families.c	2026-10-20 11:21:18.000000000 +0200
++++ b/src/gtk_ltr_families.c	2026-10-20 11:34:00.572000000 +0200
+@@ -398,7 +398,6 @@
+                                         GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                         GTK_STOCK_OK, GTK_RESPONSE_OK,
+                                         NULL);
+-  gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE);
+   gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), GTK_RESPONSE_OK, FALSE);
+   label = gtk_label_new("Select features for classification");
+   list_view = gtk_tree_view_new();
+@@ -433,7 +432,7 @@
+   gtk_entry_set_text(GTK_ENTRY(entry), "newfam_");
+   gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 1);
+   gtk_box_pack_start(GTK_BOX(vbox), entry, FALSE, FALSE, 1);
+-  gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox), vbox);
++  gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), vbox, TRUE, TRUE, 0);
+ 
+   gtk_window_resize(GTK_WINDOW(dialog), 200, 350);
+   gtk_widget_show_all(dialog);
+@@ -786,45 +785,43 @@
+    gt_diagram_set_track_selector_func(ltrfams->diagram,
+                                       ltrsift_track_selector_func,
+                                       NULL);
+-  gtk_widget_queue_draw_area(a, 0, 0, a->allocation.width,
+-                             a->allocation.height);
++  gtk_widget_queue_draw_area(a, 0, 0,
++                             gtk_widget_get_allocated_width(a),
++                             gtk_widget_get_allocated_height(a));
+   gt_feature_index_delete(features);
+ }
+ 
+-static gboolean image_area_expose_event(GtkWidget *widget,
+-                                        GdkEventExpose *event,
+-                                        GtkLTRFamilies *ltrfams)
++static gboolean image_area_draw(GtkWidget *widget,
++                                cairo_t *cr,
++                                GtkLTRFamilies *ltrfams)
+ {
+-  cairo_t *cr;
+   GtCanvas *canvas = NULL;
+   GtLayout *l;
+   GtError *err;
+-  err = gt_error_new();
+   unsigned long height;
+-  int rval;
+-  if (!ltrfams->diagram || widget->allocation.width <= 30) return FALSE;
++  int rval, width;
++  err = gt_error_new();
++  width = gtk_widget_get_allocated_width(widget);
++  if (!ltrfams->diagram || width <= 30) {
++    gt_error_delete(err);
++    return FALSE;
++  }
+ 
+   /* render image */
+-  l = gt_layout_new(ltrfams->diagram, widget->allocation.width, ltrfams->style,
+-                    err);
+-  if (!l) return FALSE;
++  l = gt_layout_new(ltrfams->diagram, width, ltrfams->style, err);
++  if (!l) {
++    gt_error_delete(err);
++    return FALSE;
++  }
+   rval = gt_layout_get_height(l, &height, err);
+   gt_assert(rval == 0);
+-  gtk_layout_set_size(GTK_LAYOUT(widget),
+-                      widget->allocation.width,
+-                      height);
+-  cr = gdk_cairo_create(GTK_LAYOUT(widget)->bin_window);
+-  cairo_rectangle(cr, event->area.x, event->area.y, event->area.width,
+-                  event->area.height);
+-  cairo_clip(cr);
++  gtk_layout_set_size(GTK_LAYOUT(widget), width, height);
+   canvas = gt_canvas_cairo_context_new(ltrfams->style, cr, 0,
+-                                       widget->allocation.width, height, NULL,
+-                                       err);
++                                       width, height, NULL, err);
+   gt_assert(canvas);
+   gt_layout_sketch(l, canvas, err);
+   gt_layout_delete(l);
+   gt_canvas_delete(canvas);
+-  cairo_destroy(cr);
+   gt_error_delete(err);
+   return FALSE;
+ }
+@@ -944,7 +941,7 @@
+     return;
+   }
+   /* copy recieved data into new struct */
+-  memcpy(&tdata, sdata->data, sizeof (tdata));
++  memcpy(&tdata, gtk_selection_data_get_data(sdata), sizeof (tdata));
+ 
+   path = gtk_tree_model_get_path(model, &iter);
+   if (tdata->rowref &&
+@@ -1171,7 +1168,7 @@
+   gint had_err = 0;
+   gchar *param, query[BUFSIZ];
+ 
+-  param = gtk_combo_box_get_active_text(combob);
++  param = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(combob));
+   if (!param || (g_strcmp0(param, "") == 0))
+     return 0;
+   err = gt_error_new();
+@@ -1398,7 +1395,7 @@
+ 
+   hbox = gtk_hbox_new(FALSE, 1);
+   checkb = gtk_check_button_new_with_label("Use existing parameter set?");
+-  ltrfams->blastn_params_combob = combob = gtk_combo_box_new_text();
++  ltrfams->blastn_params_combob = combob = gtk_combo_box_text_new();
+   gtk_widget_set_sensitive(combob, FALSE);
+   if (ltrfams->projectfile) {
+     GtRDBStmt *stmt;
+@@ -1417,13 +1414,13 @@
+           gchar buffer[BUFSIZ];
+ 
+           g_snprintf(buffer, BUFSIZ, "%lu", result);
+-          gtk_combo_box_append_text(GTK_COMBO_BOX(combob), buffer);
++          gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combob), buffer);
+         }
+       }
+       gtk_combo_box_set_active(GTK_COMBO_BOX(combob), 0);
+       gt_rdb_stmt_delete(stmt);
+     } else had_err = -1;
+-    if (!gtk_combo_box_get_active_text(GTK_COMBO_BOX(combob)) &&
++    if (!gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(combob)) &&
+         ltrfams->projectfile) {
+       result = 1;
+       gtk_widget_set_sensitive(checkb, FALSE);
+@@ -1463,7 +1460,7 @@
+                                        GTK_RESPONSE_REJECT,
+                                        NULL);
+ 
+-  gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), blastn_params);
++  gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), blastn_params);
+   gtk_widget_show_all(dialog);
+   if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_ACCEPT) {
+     gtk_widget_destroy(dialog);
+@@ -1541,7 +1538,7 @@
+     gchar *tmp;
+ 
+     threaddata->use_paramset = TRUE;
+-    tmp = gtk_combo_box_get_active_text(GTK_COMBO_BOX(combob));
++    tmp = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(combob));
+     sscanf(tmp, "%lu", &threaddata->set_id);
+     g_free(tmp);
+   } else
+@@ -2023,8 +2020,8 @@
+   label = gtk_label_new(ENTER_NEW_FAMILIE_NAME);
+   entry = gtk_entry_new();
+   gtk_entry_set_max_length(GTK_ENTRY(entry), 25);
+-  gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox), label);
+-  gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox), entry);
++  gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), label, TRUE, TRUE, 0);
++  gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), entry, TRUE, TRUE, 0);
+   gtk_widget_show_all(dialog);
+   if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_OK) {
+     gtk_widget_destroy(dialog);
+@@ -2659,7 +2656,7 @@
+             *align,
+             *hbox,
+             *toplevel;
+-  GtkObject *adjust;
++  GtkAdjustment *adjust;
+   GtArray *nodes;
+   GtGenomeNode *gn;
+   GList *children;
+@@ -2695,7 +2692,6 @@
+                                        GTK_DIALOG_MODAL, GTK_STOCK_CANCEL,
+                                        GTK_RESPONSE_CANCEL, GTK_STOCK_OK,
+                                        GTK_RESPONSE_OK, NULL);
+-  gtk_dialog_set_has_separator(GTK_DIALOG (dialog), FALSE);
+ 
+   hbox = gtk_hbox_new(FALSE, 5);
+   vbox = gtk_vbox_new(TRUE, 1);
+@@ -2719,7 +2715,7 @@
+   gtk_box_pack_start(GTK_BOX(vbox), spinb1, FALSE, FALSE, 5);
+   gtk_box_pack_start(GTK_BOX(vbox), spinb2, FALSE, FALSE, 1);
+   gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 1);
+-  gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox);
++  gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), hbox, TRUE, TRUE, 0);
+   gtk_widget_show_all(dialog);
+ 
+   if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_OK) {
+@@ -2818,14 +2814,13 @@
+                                            GTK_DIALOG_MODAL, GTK_STOCK_CANCEL,
+                                            GTK_RESPONSE_CANCEL, GTK_STOCK_OK,
+                                            GTK_RESPONSE_OK, NULL);
+-      gtk_dialog_set_has_separator(GTK_DIALOG (dialog), FALSE);
+       label = gtk_label_new(PREFIX_EXISTS);
+       entry = gtk_entry_new();
+       gtk_entry_set_text(GTK_ENTRY(entry), fam_prefix);
+       vbox = gtk_vbox_new(FALSE, 5);
+       gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 5);
+       gtk_box_pack_start(GTK_BOX(vbox), entry, FALSE, FALSE, 1);
+-      gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox), vbox);
++      gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), vbox, TRUE, TRUE, 0);
+       gtk_widget_show_all(dialog);
+       g_free(fam_prefix);
+       if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_OK) {
+@@ -3729,7 +3724,7 @@
+                                              GtkLTRFamilies *ltrfams)
+ {
+   switch (event->keyval) {
+-    case GDK_Delete:
++    case GDK_KEY_Delete:
+       notebook_list_view_menu_remove_clicked(NULL, ltrfams);
+       return TRUE;
+       break;
+@@ -4498,11 +4493,11 @@
+                                               GtkLTRFamilies *ltrfams)
+ {
+   switch (event->keyval) {
+-    case GDK_Delete:
++    case GDK_KEY_Delete:
+       list_view_families_menu_remove_clicked(NULL, ltrfams);
+       return TRUE;
+       break;
+-    case GDK_F2:
++    case GDK_KEY_F2:
+       list_view_families_menu_edit_clicked(NULL,
+                                         (gpointer) ltrfams->list_view_families);
+       return TRUE;
+@@ -4630,8 +4625,8 @@
+                                  GTK_POLICY_AUTOMATIC);
+   ltrfams->image_area = gtk_layout_new(NULL, vadj);
+   gtk_widget_modify_bg(ltrfams->image_area, GTK_STATE_NORMAL, &color);
+-  g_signal_connect(ltrfams->image_area, "expose-event",
+-                   G_CALLBACK(image_area_expose_event), ltrfams);
++  g_signal_connect(ltrfams->image_area, "draw",
++                   G_CALLBACK(image_area_draw), ltrfams);
+   gtk_layout_set_size(GTK_LAYOUT(ltrfams->image_area), 100, 100);
+   gtk_container_add(GTK_CONTAINER(sw3), ltrfams->image_area);
+ 
+@@ -4678,7 +4673,7 @@
+                                 GtError *err)
+ {
+   GtkLTRFamilies *ltrfams;
+-  ltrfams = gtk_type_new(GTK_LTR_FAMILIES_TYPE);
++  ltrfams = g_object_new(GTK_LTR_FAMILIES_TYPE, NULL);
+   list_view_families_create(ltrfams);
+   tree_view_details_create(GTK_TREE_VIEW(ltrfams->tree_view_details));
+   g_signal_connect(G_OBJECT(ltrfams->tree_view_details), "cursor-changed",
+--- a/src/gtk_ltr_filter.c	2026-10-20 11:21:18.000000000 +0200
++++ b/src/gtk_ltr_filter.c	2026-10-20 11:34:00.552000000 +0200
+@@ -1234,12 +1234,12 @@
+      gtk_label_new("Action to perform with filtered candidates:");
+   gtk_label_set_attributes(GTK_LABEL(label), pattrl);
+   gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+-  ltrfilt->filter_action = gtk_combo_box_new_text();
+-  gtk_combo_box_append_text(GTK_COMBO_BOX(ltrfilt->filter_action),
++  ltrfilt->filter_action = gtk_combo_box_text_new();
++  gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(ltrfilt->filter_action),
+                             LTR_FILTER_ACTION_DELETE_TEXT);
+   gtk_combo_box_set_active(GTK_COMBO_BOX(ltrfilt->filter_action),
+                             LTR_FILTER_ACTION_DELETE);
+-  gtk_combo_box_append_text(GTK_COMBO_BOX(ltrfilt->filter_action),
++  gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(ltrfilt->filter_action),
+                             LTR_FILTER_ACTION_NEW_FAM_TEXT);
+   gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 1);
+   gtk_box_pack_start(GTK_BOX(hbox), ltrfilt->filter_action, FALSE, FALSE, 1);
+@@ -1344,7 +1344,7 @@
+   GtkLTRFilter *ltrfilt;
+   gchar title[BUFSIZ];
+ 
+-  ltrfilt = gtk_type_new(GTK_LTR_FILTER_TYPE);
++  ltrfilt = g_object_new(GTK_LTR_FILTER_TYPE, NULL);
+   ltrfilt->last_dir = NULL;
+   ltrfilt->ltrfams = ltrfams;
+   g_signal_connect(G_OBJECT(ltrfilt), "delete_event",
+--- a/src/gtk_project_settings.c	2026-10-20 11:21:18.000000000 +0200
++++ b/src/gtk_project_settings.c	2026-10-20 11:34:00.552000000 +0200
+@@ -890,7 +890,7 @@
+   GtkProjectSettings *projset;
+   gchar title[BUFSIZ];
+ 
+-  projset = gtk_type_new(GTK_PROJECT_SETTINGS_TYPE);
++  projset = g_object_new(GTK_PROJECT_SETTINGS_TYPE, NULL);
+   g_signal_connect(G_OBJECT(projset), "delete_event",
+                    G_CALLBACK(delete_event), NULL);
+   gtk_window_set_position(GTK_WINDOW(projset), GTK_WIN_POS_CENTER_ALWAYS);
+--- a/src/menubar.c	2026-10-20 11:30:18.648000000 +0200
++++ b/src/menubar.c	2026-10-20 11:37:04.300000000 +0200
+@@ -1223,7 +1223,7 @@
+     g_error_free(err);
+   }
+ 
+-  gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(dialog), GUI_NAME);
++  gtk_about_dialog_set_program_name(GTK_ABOUT_DIALOG(dialog), GUI_NAME);
+   gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(dialog), GUI_VERSION);
+   gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(dialog), GUI_COPYRIGHT);
+   gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(dialog), GUI_COMMENTS);
+--- a/src/support.c	2026-10-20 11:21:18.000000000 +0200
++++ b/src/support.c	2026-10-20 11:34:00.560000000 +0200
+@@ -144,9 +144,9 @@
+                                    GTK_ICON_SIZE_DIALOG);
+   hbox = gtk_hbox_new(FALSE, 5);
+   gtk_container_set_border_width(GTK_CONTAINER(hbox), 10);
+-  gtk_box_pack_start_defaults(GTK_BOX(hbox), image);
+-  gtk_box_pack_start_defaults(GTK_BOX(hbox), label);
+-  gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG (dialog)->vbox), hbox);
++  gtk_box_pack_start(GTK_BOX(hbox), image, TRUE, TRUE, 0);
++  gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
++  gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), hbox, TRUE, TRUE, 0);
+   gtk_widget_show_all(dialog);
+ 
+   return dialog;


=====================================
debian/patches/series
=====================================
@@ -2,3 +2,4 @@ build_on_64bit.patch
 use_deterministic_file_order.patch
 spelling.patch
 no-binary-in-examples.patch
+gtk3.patch


=====================================
debian/tests/control
=====================================
@@ -0,0 +1,3 @@
+Tests: run-unit-test
+Depends: @, xauth, xvfb
+Restrictions: allow-stderr


=====================================
debian/tests/run-unit-test
=====================================
@@ -0,0 +1,42 @@
+#!/bin/sh
+set -eu
+
+pkg=ltrsift
+
+export LC_ALL=C.UTF-8
+if [ "${AUTOPKGTEST_TMP}" = "" ] ; then
+  AUTOPKGTEST_TMP=$(mktemp -d /tmp/${pkg}-test.XXXXXX)
+  # shellcheck disable=SC2064
+  trap "rm -rf ${AUTOPKGTEST_TMP}" 0 INT QUIT ABRT PIPE TERM
+fi
+
+# cp -a /usr/share/doc/${pkg}/examples/* "${AUTOPKGTEST_TMP}"
+
+cd "${AUTOPKGTEST_TMP}"
+
+TMP="${AUTOPKGTEST_TMP:-$(mktemp -d)}"
+export HOME="$TMP/home"
+export XDG_CONFIG_HOME="$HOME/.config"
+export XDG_CACHE_HOME="$HOME/.cache"
+export GDK_BACKEND=x11
+mkdir -p "$XDG_CONFIG_HOME" "$XDG_CACHE_HOME"
+
+# Exercise the non-GUI encoder on a small sequence.
+cat > "$TMP/test.fa" <<EOF
+>chr1
+ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT
+EOF
+ltrsift_encode "$TMP/test.fa" "$TMP/index"
+test -f "$TMP/index.esq"
+
+# Start the GUI under Xvfb and make sure it stays alive. A timeout means the
+# main loop is running, which is the expected outcome of this smoke test.
+set +e
+xvfb-run -a timeout 10 ltrsift > "$TMP/ltrsift.log" 2>&1
+status=$?
+set -e
+if [ "$status" -ne 124 ]; then
+    cat "$TMP/ltrsift.log" >&2
+    echo "FAIL: ltrsift exited unexpectedly with status $status" >&2
+    exit 1
+fi



View it on GitLab: https://salsa.debian.org/med-team/ltrsift/-/compare/e50759f1c12379138ea9696bf3c1c867dd6fe68d...a481fec97cbdcddd9f82cb5c02a281b94e8e5fd6

-- 
View it on GitLab: https://salsa.debian.org/med-team/ltrsift/-/compare/e50759f1c12379138ea9696bf3c1c867dd6fe68d...a481fec97cbdcddd9f82cb5c02a281b94e8e5fd6
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/debian-med-commit/attachments/20261020/1282bf2f/attachment-0001.htm>


More information about the debian-med-commit mailing list