[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