diff --git a/helpers/DATA/cron/license-info-fix.patch b/helpers/DATA/cron/license-info-fix.patch
new file mode 100644
index 0000000..b6221bd
--- /dev/null
+++ b/helpers/DATA/cron/license-info-fix.patch
@@ -0,0 +1,37 @@
+diff --git a/debian/copyright b/debian/copyright
+index 3c8824f..c6ec81a 100644
+--- a/debian/copyright
++++ b/debian/copyright
+@@ -38,7 +38,7 @@ License: GPL-2+
+
+ Files: debian/examples/crontab2english.pl
+ Copyright: 2001, Sean M. Burke
+-License: Artistic
++License: GPL-1+ or Artistic
+
+ License: Paul-Vixie's-license
+ Distribute freely, except: don't remove my name from the source or
+@@ -67,6 +67,23 @@ License: GPL-2+
+ On Debian systems, the complete text of the GNU General
+ Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".
+
++License: GPL-1+
++ This package is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 1 of the License, or
++ (at your option) any later version.
++ .
++ This package is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++ .
++ You should have received a copy of the GNU General Public License
++ along with this program. If not, see
++ .
++ On Debian systems, the complete text of the GNU General
++ Public License version 1 can be found in "/usr/share/common-licenses/GPL-1".
++
+ License: Artistic
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the "Artistic License" which comes with Debian.
diff --git a/helpers/DATA/dia/patch_changes/000-apply_current_dia_mr_114.patch b/helpers/DATA/dia/patch_changes/000-apply_current_dia_mr_114.patch
new file mode 100644
index 0000000..80b30cf
--- /dev/null
+++ b/helpers/DATA/dia/patch_changes/000-apply_current_dia_mr_114.patch
@@ -0,0 +1,1324 @@
+From 6d7a3b627566ff2201292a45ed35a5ab3e425c13 Mon Sep 17 00:00:00 2001
+From: Duncan McIntosh
+Date: Sun, 15 Oct 2023 22:26:17 -0400
+Subject: [PATCH 1/4] objects: disable Tab in multi-line entry widgets
+
+This becomes a 'black hole' for focus, making it hard to navigate by
+keyboard. This is both annoying, and also an accessibility problem.
+---
+ lib/prop_text.c | 1 +
+ objects/UML/class_attributes_dialog.c | 1 +
+ objects/UML/class_dialog.c | 1 +
+ objects/UML/class_operations_dialog.c | 2 ++
+ 4 files changed, 5 insertions(+)
+
+diff --git a/lib/prop_text.c b/lib/prop_text.c
+index 4ff98f60d..8e1e9fcf7 100644
+--- a/lib/prop_text.c
++++ b/lib/prop_text.c
+@@ -125,6 +125,7 @@ multistringprop_get_widget(StringProperty *prop, PropDialog *dialog)
+ GtkWidget *ret = gtk_text_view_new();
+ GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(ret));
+ GtkWidget *frame = gtk_frame_new(NULL);
++ gtk_text_view_set_accepts_tab (GTK_TEXT_VIEW (ret), FALSE);
+ gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
+ gtk_container_add(GTK_CONTAINER(frame), ret);
+ g_signal_connect(G_OBJECT(ret), "key-release-event",
+diff --git a/objects/UML/class_attributes_dialog.c b/objects/UML/class_attributes_dialog.c
+index 2722a2a03..085624e31 100644
+--- a/objects/UML/class_attributes_dialog.c
++++ b/objects/UML/class_attributes_dialog.c
+@@ -729,6 +729,7 @@ _attributes_create_page (GtkNotebook *notebook, UMLClass *umlclass)
+ gtk_container_add (GTK_CONTAINER (scrolledwindow), entry);
+ gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (entry), GTK_WRAP_WORD);
+ gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (entry), TRUE);
++ gtk_text_view_set_accepts_tab (GTK_TEXT_VIEW (entry), FALSE);
+ gtk_widget_show (entry);
+ #if 0 /* while the GtkEntry has a "activate" signal, GtkTextView does not.
+ * Maybe we should connect to "set-focus-child" instead?
+diff --git a/objects/UML/class_dialog.c b/objects/UML/class_dialog.c
+index 8867ae9ac..163cc2949 100644
+--- a/objects/UML/class_dialog.c
++++ b/objects/UML/class_dialog.c
+@@ -382,6 +382,7 @@ class_create_page(GtkNotebook *notebook, UMLClass *umlclass)
+ gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
+ GTK_SHADOW_IN);
+ entry = gtk_text_view_new ();
++ gtk_text_view_set_accepts_tab (GTK_TEXT_VIEW (entry), FALSE);
+ prop_dialog->comment = GTK_TEXT_VIEW(entry);
+ gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (entry), GTK_WRAP_WORD);
+
+diff --git a/objects/UML/class_operations_dialog.c b/objects/UML/class_operations_dialog.c
+index a530337a9..936a8b575 100644
+--- a/objects/UML/class_operations_dialog.c
++++ b/objects/UML/class_operations_dialog.c
+@@ -982,6 +982,7 @@ operations_data_create_hbox (UMLClass *umlclass)
+ gtk_container_add (GTK_CONTAINER (scrolledwindow), entry);
+ gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (entry), GTK_WRAP_WORD);
+ gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (entry),TRUE);
++ gtk_text_view_set_accepts_tab (GTK_TEXT_VIEW (entry), FALSE);
+
+
+ gtk_grid_attach (GTK_GRID (grid), label, 4, 0, 1, 1);
+@@ -1340,6 +1341,7 @@ operations_parameters_data_create_vbox (UMLClass *umlclass)
+ gtk_container_add (GTK_CONTAINER (scrolledwindow), entry);
+ gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (entry), GTK_WRAP_WORD);
+ gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (entry),TRUE);
++ gtk_text_view_set_accepts_tab (GTK_TEXT_VIEW (entry), FALSE);
+
+ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+ gtk_grid_attach (GTK_GRID (grid), label, 2, 1, 1, 1);
+--
+GitLab
+
+
+From b5dc904ed58ea026898fbc7bf6940de97a6e4e15 Mon Sep 17 00:00:00 2001
+From: Duncan McIntosh
+Date: Mon, 16 Oct 2023 15:34:23 -0400
+Subject: [PATCH 2/4] font: don't store the height internally
+
+We now solely rely on the PangoFontDescription, which is more flexible and
+less prone to mistakes.
+---
+ lib/font.c | 85 ++++++++++++++++++++++----------------------------
+ lib/font.h | 2 ++
+ lib/libdia.def | 1 +
+ 3 files changed, 41 insertions(+), 47 deletions(-)
+
+diff --git a/lib/font.c b/lib/font.c
+index 1a321c462..6dec80bb1 100644
+--- a/lib/font.c
++++ b/lib/font.c
+@@ -39,6 +39,7 @@
+ #include "font.h"
+ #include "message.h"
+ #include "textline.h"
++#include "units.h"
+
+ static PangoContext *pango_context = NULL;
+
+@@ -53,13 +54,6 @@ struct _DiaFont {
+ PangoFontDescription *pfd;
+ /* mutable */ char *legacy_name;
+
+- /* there is a difference between Pango's font size and Dia's font height */
+- /* Calculated font_size is to make 'font_height = ascent + descent */
+- /* The font_height is used as default line height, there used to be a hard-coded size = 0.7 * height */
+- /* before using pango_set_absolute_size() to overcome font size differences between renderers */
+- double height;
+- /* Need to load a font to query it's metrics */
+- PangoFont *loaded;
+ PangoFontMetrics *metrics;
+ };
+
+@@ -136,8 +130,6 @@ dia_font_finalize (GObject *object)
+ g_clear_pointer (&font->pfd, pango_font_description_free);
+ g_clear_pointer (&font->metrics, pango_font_metrics_unref);
+
+- g_clear_object (&font->loaded);
+-
+ G_OBJECT_CLASS (dia_font_parent_class)->finalize (object);
+ }
+
+@@ -166,33 +158,17 @@ dia_pfd_set_height(PangoFontDescription *pfd, double height)
+ }
+
+
+-/*!
+- * In Dia a font is usually referred to by it's (line-) height, not it's size.
+- *
+- * This methods "calculates" the latter from the former. This used to be some magic factor of 0.7 which did not
+- * solve the resolution dependencance of the former calculation. In fact there is new magic factor now because
+- * really calculating the font size from the height would involve two font loads which seem to be two expensive.
+- */
+ static void
+-_dia_font_adjust_size (DiaFont *font, double height, gboolean recalc_alwways)
++dia_font_update_metrics (DiaFont *font)
+ {
++ PangoFont *loaded;
+
+- if (font->height != height || !font->metrics || recalc_alwways) {
+- PangoFont *loaded;
+-
+- dia_pfd_set_height (font->pfd, height);
+- /* need to load a font to get it's metrics */
+- loaded = font->loaded;
+- font->loaded = pango_context_load_font (dia_font_get_context (), font->pfd);
+-
+- g_clear_object (&loaded);
+-
+- g_clear_pointer (&font->metrics, pango_font_metrics_unref);
++ g_clear_pointer (&font->metrics, pango_font_metrics_unref);
+
+- /* caching metrics */
+- font->metrics = pango_font_get_metrics (font->loaded, NULL);
+- font->height = height;
+- }
++ /* need to load a font to get its metrics */
++ loaded = pango_context_load_font (dia_font_get_context (), font->pfd);
++ font->metrics = pango_font_get_metrics (loaded, NULL);
++ g_clear_object (&loaded);
+ }
+
+
+@@ -205,15 +181,8 @@ DiaFont *
+ dia_font_new (const char *family, DiaFontStyle style, double height)
+ {
+ DiaFont* font = dia_font_new_from_style(style, height);
+- gboolean changed;
+-
+- changed = family != NULL && g_strcmp0 (pango_font_description_get_family (font->pfd), family) != 0;
+ pango_font_description_set_family(font->pfd, family);
+
+- if (changed) {
+- _dia_font_adjust_size (font, font->height, TRUE);
+- }
+-
+ return font;
+ }
+
+@@ -316,9 +285,10 @@ dia_font_new_from_style (DiaFontStyle style, double height)
+
+ retval = g_object_new (DIA_TYPE_FONT, NULL);
+ retval->pfd = pfd;
+- _dia_font_adjust_size (retval, height, FALSE);
+ retval->legacy_name = NULL;
+
++ dia_font_update_metrics (retval);
++
+ return retval;
+ }
+
+@@ -407,8 +377,9 @@ double
+ dia_font_get_height (DiaFont *font)
+ {
+ g_return_val_if_fail (font != NULL, 0.0);
++ g_return_val_if_fail (pango_font_description_get_size_is_absolute (font->pfd), 0.0);
+
+- return font->height;
++ return pdu_to_dcm(pango_font_description_get_size(font->pfd)) / 0.8;
+ }
+
+
+@@ -430,6 +401,23 @@ dia_font_get_size (DiaFont *font)
+ }
+
+
++/**
++ * dia_font_set_size:
++ * @font: The font to modify.
++ * @size: The new size in centimetres.
++ *
++ * Sets the size of font to the provided (positive) size.
++ */
++void
++dia_font_set_size (DiaFont *font, double size)
++{
++ g_return_if_fail (size >= 0);
++
++ pango_font_description_set_absolute_size (font->pfd, dcm_to_pdu (size));
++ dia_font_update_metrics (font);
++}
++
++
+ /**
+ * dia_font_set_height:
+ *
+@@ -438,7 +426,8 @@ dia_font_get_size (DiaFont *font)
+ void
+ dia_font_set_height (DiaFont* font, double height)
+ {
+- _dia_font_adjust_size (font, height, FALSE);
++ /* FIXME For now, assume height is 80% of size. */
++ dia_font_set_size (font, height / 0.8);
+ }
+
+
+@@ -493,7 +482,7 @@ dia_font_set_any_family (DiaFont *font, const char *family)
+ pango_font_description_set_family (font->pfd, family);
+ if (changed) {
+ /* force recalculation on name change */
+- _dia_font_adjust_size (font, font->height, TRUE);
++ dia_font_update_metrics (font);
+ }
+
+ g_clear_pointer (&font->legacy_name, g_free);
+@@ -531,7 +520,7 @@ dia_font_set_weight (DiaFont *font, DiaFontWeight weight)
+ dia_pfd_set_weight(font->pfd,weight);
+
+ if (old_weight != weight) {
+- _dia_font_adjust_size (font, font->height, TRUE);
++ dia_font_update_metrics (font);
+ }
+ }
+
+@@ -548,7 +537,7 @@ dia_font_set_slant (DiaFont *font, DiaFontSlant slant)
+ g_return_if_fail(font != NULL);
+ dia_pfd_set_slant(font->pfd,slant);
+ if (slant != old_slant)
+- _dia_font_adjust_size (font, font->height, TRUE);
++ dia_font_update_metrics (font);
+ }
+
+
+@@ -702,7 +691,8 @@ dia_font_ascent (const char *string, DiaFont *font, double height)
+ {
+ if (font->metrics) {
+ double ascent = pdu_to_dcm (pango_font_metrics_get_ascent (font->metrics));
+- return ascent * (height / font->height);
++ double factor = height / dia_font_get_height (font);
++ return ascent * factor;
+ } else {
+ /* previous, _expensive_ but string specific way */
+ TextLine *text_line = text_line_new (string, font, height);
+@@ -723,7 +713,8 @@ dia_font_descent (const char *string, DiaFont *font, double height)
+ {
+ if (font->metrics) {
+ double descent = pdu_to_dcm (pango_font_metrics_get_descent (font->metrics));
+- return descent * (height / font->height);
++ double factor = height / dia_font_get_height (font);
++ return descent * factor;
+ } else {
+ /* previous, _expensive_ but string specific way */
+ TextLine *text_line = text_line_new (string, font, height);
+diff --git a/lib/font.h b/lib/font.h
+index aaf19ef6d..bd6868cb3 100644
+--- a/lib/font.h
++++ b/lib/font.h
+@@ -103,6 +103,8 @@ const PangoFontDescription *dia_font_get_description (DiaFont *f
+ double dia_font_get_height (DiaFont *font);
+ void dia_font_set_height (DiaFont *font,
+ double height);
++void dia_font_set_size (DiaFont *font,
++ double size);
+ double dia_font_get_size (DiaFont *font);
+ void dia_font_set_slant (DiaFont *font,
+ DiaFontSlant slant);
+diff --git a/lib/libdia.def b/lib/libdia.def
+index d7f579479..1218a20c9 100644
+--- a/lib/libdia.def
++++ b/lib/libdia.def
+@@ -243,6 +243,7 @@ EXPORTS
+ dia_font_new_from_style
+ dia_font_set_any_family
+ dia_font_set_height
++ dia_font_set_size
+ dia_font_set_slant
+ dia_font_set_slant_from_string
+ dia_font_set_weight
+--
+GitLab
+
+
+From da5b8963d3bd8f80a50b3bf81ec5d7a59bdbe8a7 Mon Sep 17 00:00:00 2001
+From: Duncan McIntosh
+Date: Fri, 20 Oct 2023 17:29:48 -0400
+Subject: [PATCH 3/4] font: add dia_font_new_from_description
+
+Since we no longer need to keep track of font heights in DiaFont, it
+basically wraps descriptions. As such, allow creating fonts from a
+string Pango description.
+
+This uses a string to try and avoid a public dependency on Pango. We
+still have public dependencies elsewhere, but it means shifting to
+alternative libraries, or incompatible versions (like Pango2, which
+appears at least on hold) should be easier. It also doesn't really
+add much friction with GTK.
+---
+ lib/font.c | 21 +++++++++++++++++++++
+ lib/font.h | 1 +
+ lib/libdia.def | 1 +
+ 3 files changed, 23 insertions(+)
+
+diff --git a/lib/font.c b/lib/font.c
+index 6dec80bb1..ca3953f28 100644
+--- a/lib/font.c
++++ b/lib/font.c
+@@ -293,6 +293,27 @@ dia_font_new_from_style (DiaFontStyle style, double height)
+ }
+
+
++DiaFont *
++dia_font_new_from_description (const char *desc)
++{
++ DiaFont *retval;
++ PangoFontDescription *pfd = pango_font_description_from_string (desc);
++
++ if (!pango_font_description_get_size_is_absolute (pfd)) {
++ double size = pango_font_description_get_size (pfd);
++ pango_font_description_set_absolute_size(pfd, size * global_zoom_factor * 72.0);
++ }
++
++ retval = g_object_new (DIA_TYPE_FONT, NULL);
++ retval->pfd = pfd;
++ retval->legacy_name = NULL;
++
++ dia_font_update_metrics (retval);
++
++ return retval;
++}
++
++
+ DiaFont *
+ dia_font_copy (DiaFont *font)
+ {
+diff --git a/lib/font.h b/lib/font.h
+index bd6868cb3..cc1260815 100644
+--- a/lib/font.h
++++ b/lib/font.h
+@@ -95,6 +95,7 @@ DiaFont *dia_font_new (const char *f
+ DiaFont *dia_font_new_from_style (DiaFontStyle style,
+ double height);
+ DiaFont *dia_font_new_from_legacy_name (const char *name);
++DiaFont *dia_font_new_from_description (const char *description);
+ const char *dia_font_get_legacy_name (DiaFont *font);
+ DiaFont *dia_font_copy (DiaFont *font);
+ DiaFontStyle dia_font_get_style (DiaFont *font);
+diff --git a/lib/libdia.def b/lib/libdia.def
+index 1218a20c9..db1c4ad7a 100644
+--- a/lib/libdia.def
++++ b/lib/libdia.def
+@@ -241,6 +241,7 @@ EXPORTS
+ dia_font_new
+ dia_font_new_from_legacy_name
+ dia_font_new_from_style
++ dia_font_new_from_description
+ dia_font_set_any_family
+ dia_font_set_height
+ dia_font_set_size
+--
+GitLab
+
+
+From 48c9b9b81d347d3f3c6df4df9c7456f2b74919c8 Mon Sep 17 00:00:00 2001
+From: Duncan McIntosh
+Date: Fri, 20 Oct 2023 17:31:58 -0400
+Subject: [PATCH 4/4] lib: remove DiaFontSelector
+
+We can now use GtkFontButton, which (a) allows removing ~700 lines of code,
+and (b) doesn't lock up whenever a property dialog is opened.
+
+Currently, we don't allow configuring size in the dialog, since the size
+of a DiaFont isn't really used. Further refactoring should let us use it
+instead of separate spin buttons.
+---
+ lib/dia-font-selector.c | 646 -------------------------------------
+ lib/dia-font-selector.h | 37 ---
+ lib/libdia.def | 5 -
+ lib/meson.build | 2 -
+ lib/prop_attr.c | 17 +-
+ objects/UML/class_dialog.c | 54 +++-
+ objects/UML/class_dialog.h | 13 +-
+ 7 files changed, 56 insertions(+), 718 deletions(-)
+ delete mode 100644 lib/dia-font-selector.c
+ delete mode 100644 lib/dia-font-selector.h
+
+diff --git a/lib/dia-font-selector.c b/lib/dia-font-selector.c
+deleted file mode 100644
+index fb59d6c98..000000000
+--- a/lib/dia-font-selector.c
++++ /dev/null
+@@ -1,646 +0,0 @@
+-/* Dia -- an diagram creation/manipulation program
+- * Copyright (C) 1998 Alexander Larsson
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+- */
+-
+-#include "config.h"
+-
+-#include
+-#include
+-
+-#include
+-#include
+-
+-#include "dia-font-selector.h"
+-#include "font.h"
+-#include "persistence.h"
+-
+-#define PERSIST_NAME "font-menu"
+-
+-struct _DiaFontSelector {
+- GtkBox hbox;
+-};
+-
+-
+-typedef struct _DiaFontSelectorPrivate DiaFontSelectorPrivate;
+-struct _DiaFontSelectorPrivate {
+- GtkWidget *fonts;
+- GtkTreeStore *fonts_store;
+- GtkTreeIter fonts_default_end;
+- GtkTreeIter fonts_custom_end;
+- GtkTreeIter fonts_other;
+- GtkTreeIter fonts_reset;
+-
+- const char *looking_for;
+-
+- GtkWidget *styles;
+- GtkListStore *styles_store;
+-
+- char *current;
+- int current_style;
+-};
+-
+-G_DEFINE_TYPE_WITH_PRIVATE (DiaFontSelector, dia_font_selector, GTK_TYPE_BOX)
+-
+-enum {
+- VALUE_CHANGED,
+- LAST_SIGNAL
+-};
+-
+-static guint signals[LAST_SIGNAL] = { 0 };
+-
+-
+-/* New and improved font selector: Contains the three standard fonts
+- * and an 'Other fonts...' entry that opens the font dialog. The fonts
+- * selected in the font dialog are persistently added to the menu.
+- *
+- * +----------------+
+- * | Sans |
+- * | Serif |
+- * | Monospace |
+- * | -------------- |
+- * | Bodini |
+- * | CurlyGothic |
+- * | OldWestern |
+- * | -------------- |
+- * | Other fonts... |
+- * +----------------+
+- */
+-
+-enum {
+- STYLE_COL_LABEL,
+- STYLE_COL_ID,
+- STYLE_N_COL,
+-};
+-
+-
+-enum {
+- FONT_COL_FAMILY,
+- FONT_N_COL,
+-};
+-
+-
+-static void
+-dia_font_selector_finalize (GObject *object)
+-{
+- DiaFontSelector *self = DIA_FONT_SELECTOR (object);
+- DiaFontSelectorPrivate *priv = dia_font_selector_get_instance_private (self);
+-
+- g_clear_object (&priv->fonts_store);
+- g_clear_object (&priv->styles_store);
+-
+- g_clear_pointer (&priv->current, g_free);
+-
+- G_OBJECT_CLASS (dia_font_selector_parent_class)->finalize (object);
+-}
+-
+-
+-static void
+-dia_font_selector_class_init (DiaFontSelectorClass *klass)
+-{
+- GObjectClass *object_class = G_OBJECT_CLASS (klass);
+-
+- object_class->finalize = dia_font_selector_finalize;
+-
+- signals[VALUE_CHANGED] = g_signal_new ("value-changed",
+- G_TYPE_FROM_CLASS (klass),
+- G_SIGNAL_RUN_FIRST,
+- 0, NULL, NULL,
+- g_cclosure_marshal_VOID__VOID,
+- G_TYPE_NONE, 0);
+-}
+-
+-
+-static int
+-sort_fonts (const void *p1, const void *p2)
+-{
+- const gchar *n1 = pango_font_family_get_name (PANGO_FONT_FAMILY (*(void**)p1));
+- const gchar *n2 = pango_font_family_get_name (PANGO_FONT_FAMILY (*(void**)p2));
+- return g_ascii_strcasecmp (n1, n2);
+-}
+-
+-
+-static char *style_labels[] = {
+- "Normal",
+- "Oblique",
+- "Italic",
+- "Ultralight",
+- "Ultralight-Oblique",
+- "Ultralight-Italic",
+- "Light",
+- "Light-Oblique",
+- "Light-Italic",
+- "Medium",
+- "Medium-Oblique",
+- "Medium-Italic",
+- "Demibold",
+- "Demibold-Oblique",
+- "Demibold-Italic",
+- "Bold",
+- "Bold-Oblique",
+- "Bold-Italic",
+- "Ultrabold",
+- "Ultrabold-Oblique",
+- "Ultrabold-Italic",
+- "Heavy",
+- "Heavy-Oblique",
+- "Heavy-Italic"
+-};
+-
+-
+-static PangoFontFamily *
+-get_family_from_name (GtkWidget *widget, const gchar *fontname)
+-{
+- PangoFontFamily **families;
+- int n_families, i;
+-
+- pango_context_list_families (dia_font_get_context(),
+- &families, &n_families);
+- /* Doing it the slow way until I find a better way */
+- for (i = 0; i < n_families; i++) {
+- if (!(g_ascii_strcasecmp (pango_font_family_get_name (families[i]), fontname))) {
+- PangoFontFamily *fam = families[i];
+- g_clear_pointer (&families, g_free);
+- return fam;
+- }
+- }
+- g_warning (_("Couldn't find font family for %s\n"), fontname);
+- g_clear_pointer (&families, g_free);
+- return NULL;
+-}
+-
+-
+-static void
+-set_styles (DiaFontSelector *fs,
+- const gchar *name,
+- DiaFontStyle dia_style)
+-{
+- PangoFontFamily *pff;
+- DiaFontSelectorPrivate *priv;
+- PangoFontFace **faces = NULL;
+- int nfaces = 0;
+- int i = 0;
+- long stylebits = 0;
+-
+- g_return_if_fail (DIA_IS_FONT_SELECTOR (fs));
+-
+- priv = dia_font_selector_get_instance_private (fs);
+-
+- pff = get_family_from_name (GTK_WIDGET (fs), name);
+-
+- pango_font_family_list_faces (pff, &faces, &nfaces);
+-
+- for (i = 0; i < nfaces; i++) {
+- PangoFontDescription *pfd = pango_font_face_describe (faces[i]);
+- PangoStyle style = pango_font_description_get_style (pfd);
+- PangoWeight weight = pango_font_description_get_weight (pfd);
+- /*
+- * This is a quick and dirty way to pick the styles present,
+- * sort them and avoid duplicates.
+- * We set a bit for each style present, bit (weight*3+style)
+- * From style_labels, we pick #(weight*3+style)
+- * where weight and style are the Dia types.
+- */
+- /* Account for DIA_WEIGHT_NORMAL hack */
+- int weightnr = (weight-200)/100;
+- if (weightnr < 2) weightnr ++;
+- else if (weightnr == 2) weightnr = 0;
+- stylebits |= 1 << (3*weightnr + style);
+- pango_font_description_free (pfd);
+- }
+-
+- g_clear_pointer (&faces, g_free);
+-
+- if (stylebits == 0) {
+- g_warning ("'%s' has no style!",
+- pango_font_family_get_name (pff) ? pango_font_family_get_name (pff) : "(null font)");
+- }
+-
+- gtk_list_store_clear (priv->styles_store);
+-
+- for (i = DIA_FONT_NORMAL; i <= (DIA_FONT_HEAVY | DIA_FONT_ITALIC); i+=4) {
+- GtkTreeIter iter;
+-
+- /*
+- * bad hack continued ...
+- */
+- int weight = DIA_FONT_STYLE_GET_WEIGHT (i) >> 4;
+- int slant = DIA_FONT_STYLE_GET_SLANT (i) >> 2;
+-
+- if (DIA_FONT_STYLE_GET_SLANT (i) > DIA_FONT_ITALIC) {
+- continue;
+- }
+-
+- if (!(stylebits & (1 << (3 * weight + slant)))) {
+- continue;
+- }
+-
+- gtk_list_store_append (priv->styles_store, &iter);
+- gtk_list_store_set (priv->styles_store,
+- &iter,
+- STYLE_COL_LABEL, style_labels[3 * weight + slant],
+- STYLE_COL_ID, i,
+- -1);
+-
+- if (dia_style == i || (i == DIA_FONT_NORMAL && dia_style == -1)) {
+- gtk_combo_box_set_active_iter (GTK_COMBO_BOX (priv->styles), &iter);
+- }
+- }
+-
+- gtk_widget_set_sensitive (GTK_WIDGET (priv->styles),
+- gtk_tree_model_iter_n_children (GTK_TREE_MODEL (priv->styles_store), NULL) > 1);
+-}
+-
+-
+-static void
+-font_changed (GtkComboBox *widget,
+- DiaFontSelector *self)
+-{
+- DiaFontSelectorPrivate *priv;
+- GtkTreeIter active;
+- GtkTreePath *active_path;
+- GtkTreePath *path;
+- char *family = NULL;
+-
+- g_return_if_fail (DIA_IS_FONT_SELECTOR (self));
+-
+- priv = dia_font_selector_get_instance_private (self);
+-
+- gtk_combo_box_get_active_iter (widget, &active);
+-
+- active_path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->fonts_store), &active);
+- path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->fonts_store), &priv->fonts_reset);
+-
+- if (gtk_tree_path_compare (path, active_path) == 0) {
+- GtkTreeIter iter;
+- GtkTreePath *end_path;
+- DiaFont *font;
+-
+- persistent_list_clear (PERSIST_NAME);
+-
+- path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->fonts_store), &priv->fonts_default_end);
+-
+- // Move over the separator
+- gtk_tree_path_next (path);
+- gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->fonts_store), &iter, path);
+-
+- end_path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->fonts_store), &priv->fonts_custom_end);
+-
+- while (gtk_tree_path_compare (path, end_path) != 0) {
+- gtk_tree_store_remove (priv->fonts_store, &iter);
+-
+- gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->fonts_store), &iter, path);
+-
+- gtk_tree_path_free (end_path);
+- end_path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->fonts_store), &priv->fonts_custom_end);
+- }
+-
+- gtk_tree_path_free (path);
+- gtk_tree_path_free (end_path);
+- gtk_tree_path_free (active_path);
+-
+- if (priv->current) {
+- font = dia_font_new (priv->current, priv->current_style, 1.0);
+- dia_font_selector_set_font (self, font);
+- g_clear_object (&font);
+- } else {
+- gtk_tree_model_get_iter_first (GTK_TREE_MODEL (priv->fonts_store), &iter);
+- gtk_combo_box_set_active_iter (GTK_COMBO_BOX (priv->fonts), &iter);
+- }
+-
+- return;
+- }
+-
+- gtk_tree_model_get (GTK_TREE_MODEL (priv->fonts_store),
+- &active,
+- FONT_COL_FAMILY, &family,
+- -1);
+-
+- g_clear_pointer (&priv->current, g_free);
+- priv->current = g_strdup (family);
+-
+- set_styles (self, family, -1);
+- g_signal_emit (G_OBJECT (self), signals[VALUE_CHANGED], 0);
+-
+- if (g_strcmp0 (family, "sans") != 0 &&
+- g_strcmp0 (family, "serif") != 0 &&
+- g_strcmp0 (family, "monospace") != 0 &&
+- !persistent_list_add (PERSIST_NAME, family)) {
+- GtkTreeIter iter;
+-
+- gtk_tree_store_insert_before (priv->fonts_store,
+- &iter,
+- NULL,
+- &priv->fonts_custom_end);
+- gtk_tree_store_set (priv->fonts_store,
+- &iter,
+- FONT_COL_FAMILY, family,
+- -1);
+-
+- gtk_combo_box_set_active_iter (widget, &iter);
+- }
+-
+- gtk_tree_path_free (path);
+- gtk_tree_path_free (active_path);
+- g_clear_pointer (&family, g_free);
+-}
+-
+-
+-static gboolean
+-is_separator (GtkTreeModel *model,
+- GtkTreeIter *iter,
+- gpointer data)
+-{
+- gboolean result;
+- char *family;
+-
+- gtk_tree_model_get (model, iter, FONT_COL_FAMILY, &family, -1);
+-
+- result = g_strcmp0 (family, "separator") == 0;
+-
+- g_clear_pointer (&family, g_free);
+-
+- return result;
+-}
+-
+-
+-static void
+-is_sensitive (GtkCellLayout *cell_layout,
+- GtkCellRenderer *cell,
+- GtkTreeModel *tree_model,
+- GtkTreeIter *iter,
+- gpointer data)
+-{
+- gboolean sensitive;
+-
+- sensitive = !gtk_tree_model_iter_has_child (tree_model, iter);
+-
+- g_object_set (cell, "sensitive", sensitive, NULL);
+-}
+-
+-
+-static void
+-style_changed (GtkComboBox *widget,
+- DiaFontSelector *self)
+-{
+- DiaFontSelectorPrivate *priv;
+- GtkTreeIter active;
+-
+- g_return_if_fail (DIA_IS_FONT_SELECTOR (self));
+-
+- priv = dia_font_selector_get_instance_private (self);
+-
+- if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (priv->styles), &active)) {
+- gtk_tree_model_get (GTK_TREE_MODEL (priv->styles_store),
+- &active,
+- STYLE_COL_ID, &priv->current_style,
+- -1);
+- } else {
+- priv->current_style = 0;
+- }
+-
+- g_signal_emit (G_OBJECT (self), signals[VALUE_CHANGED], 0);
+-}
+-
+-
+-static void
+-dia_font_selector_init (DiaFontSelector *fs)
+-{
+- DiaFontSelectorPrivate *priv;
+- PangoFontFamily **families;
+- int n_families,i;
+- GtkCellRenderer *renderer;
+- GtkTreeIter iter;
+- GList *tmplist;
+-
+- g_return_if_fail (DIA_IS_FONT_SELECTOR (fs));
+-
+- priv = dia_font_selector_get_instance_private (fs);
+-
+- priv->fonts_store = gtk_tree_store_new (FONT_N_COL, G_TYPE_STRING);
+-
+- gtk_tree_store_append (priv->fonts_store, &iter, NULL);
+- gtk_tree_store_set (priv->fonts_store,
+- &iter,
+- FONT_COL_FAMILY, "sans",
+- -1);
+- gtk_tree_store_append (priv->fonts_store, &iter, NULL);
+- gtk_tree_store_set (priv->fonts_store,
+- &iter,
+- FONT_COL_FAMILY, "serif",
+- -1);
+- gtk_tree_store_append (priv->fonts_store, &iter, NULL);
+- gtk_tree_store_set (priv->fonts_store,
+- &iter,
+- FONT_COL_FAMILY, "monospace",
+- -1);
+-
+- gtk_tree_store_append (priv->fonts_store, &priv->fonts_default_end, NULL);
+- gtk_tree_store_set (priv->fonts_store,
+- &priv->fonts_default_end,
+- FONT_COL_FAMILY, "separator",
+- -1);
+-
+- persistence_register_list (PERSIST_NAME);
+-
+- for (tmplist = persistent_list_get_glist (PERSIST_NAME);
+- tmplist != NULL; tmplist = g_list_next (tmplist)) {
+- gtk_tree_store_append (priv->fonts_store, &iter, NULL);
+- gtk_tree_store_set (priv->fonts_store,
+- &iter,
+- FONT_COL_FAMILY, tmplist->data,
+- -1);
+- }
+-
+- gtk_tree_store_append (priv->fonts_store, &priv->fonts_custom_end, NULL);
+- gtk_tree_store_set (priv->fonts_store,
+- &priv->fonts_custom_end,
+- FONT_COL_FAMILY, "separator",
+- -1);
+-
+- gtk_tree_store_append (priv->fonts_store, &priv->fonts_other, NULL);
+- gtk_tree_store_set (priv->fonts_store,
+- &priv->fonts_other,
+- FONT_COL_FAMILY, _("Other Fonts"),
+- -1);
+-
+- gtk_tree_store_append (priv->fonts_store, &priv->fonts_reset, NULL);
+- gtk_tree_store_set (priv->fonts_store,
+- &priv->fonts_reset,
+- FONT_COL_FAMILY, _("Reset Menu"),
+- -1);
+-
+- priv->fonts = gtk_combo_box_new_with_model (GTK_TREE_MODEL (priv->fonts_store));
+- gtk_widget_set_hexpand (priv->fonts, TRUE);
+- gtk_widget_show (priv->fonts);
+-
+- g_signal_connect (priv->fonts,
+- "changed",
+- G_CALLBACK (font_changed),
+- fs);
+-
+- renderer = gtk_cell_renderer_text_new ();
+- gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (priv->fonts), renderer, TRUE);
+- gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (priv->fonts), renderer,
+- "text", FONT_COL_FAMILY,
+- "family", FONT_COL_FAMILY,
+- NULL);
+-
+- gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (priv->fonts),
+- is_separator, NULL, NULL);
+- gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (priv->fonts),
+- renderer,
+- is_sensitive,
+- NULL, NULL);
+-
+- priv->styles_store = gtk_list_store_new (STYLE_N_COL,
+- G_TYPE_STRING,
+- G_TYPE_INT);
+- priv->styles = gtk_combo_box_new_with_model (GTK_TREE_MODEL (priv->styles_store));
+- gtk_widget_show (priv->styles);
+-
+- g_signal_connect (priv->styles,
+- "changed",
+- G_CALLBACK (style_changed),
+- fs);
+-
+- renderer = gtk_cell_renderer_text_new ();
+- gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (priv->styles), renderer, TRUE);
+- gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (priv->styles), renderer,
+- "text", STYLE_COL_LABEL,
+- NULL);
+-
+- pango_context_list_families (dia_font_get_context (),
+- &families,
+- &n_families);
+-
+- qsort (families,
+- n_families,
+- sizeof (PangoFontFamily *),
+- sort_fonts);
+-
+- /* Doing it the slow way until I find a better way */
+- for (i = 0; i < n_families; i++) {
+- gtk_tree_store_append (priv->fonts_store,
+- &iter,
+- &priv->fonts_other);
+- gtk_tree_store_set (priv->fonts_store,
+- &iter,
+- FONT_COL_FAMILY, pango_font_family_get_name (families[i]),
+- -1);
+- }
+- g_clear_pointer (&families, g_free);
+-
+- gtk_box_pack_start (GTK_BOX (fs), GTK_WIDGET (priv->fonts), FALSE, TRUE, 0);
+- gtk_box_pack_start (GTK_BOX (fs), GTK_WIDGET (priv->styles), FALSE, TRUE, 0);
+-}
+-
+-
+-GtkWidget *
+-dia_font_selector_new (void)
+-{
+- return g_object_new (DIA_TYPE_FONT_SELECTOR, NULL);
+-}
+-
+-
+-static gboolean
+-set_font (GtkTreeModel *model,
+- GtkTreePath *path,
+- GtkTreeIter *iter,
+- gpointer data)
+-{
+- DiaFontSelector *self = DIA_FONT_SELECTOR (data);
+- DiaFontSelectorPrivate *priv = dia_font_selector_get_instance_private (self);
+- char *font;
+- gboolean res = FALSE;
+-
+- gtk_tree_model_get (model,
+- iter,
+- FONT_COL_FAMILY, &font,
+- -1);
+-
+- res = g_strcmp0 (priv->looking_for, font) == 0;
+- if (res) {
+- gtk_combo_box_set_active_iter (GTK_COMBO_BOX (priv->fonts), iter);
+- }
+-
+- g_clear_pointer (&font, g_free);
+-
+- return res;
+-}
+-
+-
+-/**
+- * dia_font_selector_set_font:
+- *
+- * Set the current font to be shown in the font selector.
+- */
+-void
+-dia_font_selector_set_font (DiaFontSelector *self, DiaFont *font)
+-{
+- DiaFontSelectorPrivate *priv;
+- const gchar *fontname = dia_font_get_family (font);
+-
+- g_return_if_fail (DIA_IS_FONT_SELECTOR (self));
+-
+- priv = dia_font_selector_get_instance_private (self);
+-
+- priv->looking_for = fontname;
+- gtk_tree_model_foreach (GTK_TREE_MODEL (priv->fonts_store), set_font, self);
+- priv->looking_for = NULL;
+-
+- set_styles (self, fontname, dia_font_get_style (font));
+-}
+-
+-
+-DiaFont *
+-dia_font_selector_get_font (DiaFontSelector *self)
+-{
+- DiaFontSelectorPrivate *priv;
+- DiaFontStyle style;
+- DiaFont *font;
+- GtkTreeIter iter;
+- char *fontname = NULL;
+-
+- g_return_val_if_fail (DIA_IS_FONT_SELECTOR (self), NULL);
+-
+- priv = dia_font_selector_get_instance_private (self);
+-
+- if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (priv->fonts), &iter)) {
+- gtk_tree_model_get (GTK_TREE_MODEL (priv->fonts_store),
+- &iter,
+- FONT_COL_FAMILY, &fontname,
+- -1);
+- } else {
+- g_warning ("No font selected");
+- }
+-
+- if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (priv->styles), &iter)) {
+- gtk_tree_model_get (GTK_TREE_MODEL (priv->styles_store),
+- &iter,
+- STYLE_COL_ID, &style,
+- -1);
+- } else {
+- style = 0;
+- }
+-
+- font = dia_font_new (fontname, style, 1.0);
+-
+- g_clear_pointer (&fontname, g_free);
+-
+- return font;
+-}
+-
+diff --git a/lib/dia-font-selector.h b/lib/dia-font-selector.h
+deleted file mode 100644
+index 8ffba0ccb..000000000
+--- a/lib/dia-font-selector.h
++++ /dev/null
+@@ -1,37 +0,0 @@
+-/* Dia -- an diagram creation/manipulation program
+- * Copyright (C) 1998 Alexander Larsson
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+- *
+- * SPDX-License-Identifier: GPL-2.0-or-later
+- */
+-
+-#pragma once
+-
+-#include
+-
+-#include "font.h"
+-
+-G_BEGIN_DECLS
+-
+-#define DIA_TYPE_FONT_SELECTOR dia_font_selector_get_type ()
+-G_DECLARE_FINAL_TYPE (DiaFontSelector, dia_font_selector, DIA, FONT_SELECTOR, GtkBox)
+-
+-GtkWidget *dia_font_selector_new (void);
+-void dia_font_selector_set_font (DiaFontSelector *self,
+- DiaFont *font);
+-DiaFont *dia_font_selector_get_font (DiaFontSelector *self);
+-
+-G_END_DECLS
+diff --git a/lib/libdia.def b/lib/libdia.def
+index db1c4ad7a..7f2364ddd 100644
+--- a/lib/libdia.def
++++ b/lib/libdia.def
+@@ -252,11 +252,6 @@ EXPORTS
+ dia_font_copy
+ dia_font_string_width
+
+- dia_font_selector_get_font
+- dia_font_selector_get_type
+- dia_font_selector_new
+- dia_font_selector_set_font
+-
+ dia_guide_new
+ dia_guide_copy
+ dia_guide_free
+diff --git a/lib/meson.build b/lib/meson.build
+index f1ffb9659..7d2058c41 100644
+--- a/lib/meson.build
++++ b/lib/meson.build
+@@ -167,8 +167,6 @@ libdia_sources = stdprop_sources + [
+ 'dia-colour-cell-renderer.h',
+ 'dia-colour-selector.c',
+ 'dia-colour-selector.h',
+- 'dia-font-selector.c',
+- 'dia-font-selector.h',
+ 'dia-graphene.h',
+ 'dia-guide.c',
+ 'dia-guide.h',
+diff --git a/lib/prop_attr.c b/lib/prop_attr.c
+index 18a850a41..2362813a0 100644
+--- a/lib/prop_attr.c
++++ b/lib/prop_attr.c
+@@ -29,11 +29,11 @@
+
+ #include
+ #include "dia_xml.h"
++#include "font.h"
+ #include "properties.h"
+ #include "propinternals.h"
+ #include "dia-arrow-selector.h"
+ #include "dia-colour-selector.h"
+-#include "dia-font-selector.h"
+ #include "dia-line-style-selector.h"
+
+ /***************************/
+@@ -421,22 +421,27 @@ fontprop_copy(FontProperty *src)
+ static WIDGET *
+ fontprop_get_widget(FontProperty *prop, PropDialog *dialog)
+ {
+- GtkWidget *ret = dia_font_selector_new();
+- prophandler_connect(&prop->common, G_OBJECT(ret), "value-changed");
++ GtkWidget *ret = gtk_font_button_new();
++ gtk_font_chooser_set_level (GTK_FONT_CHOOSER (ret), GTK_FONT_CHOOSER_LEVEL_FAMILY | GTK_FONT_CHOOSER_LEVEL_STYLE);
++ prophandler_connect(&prop->common, G_OBJECT(ret), "font-set");
+ return ret;
+ }
+
+ static void
+ fontprop_reset_widget(FontProperty *prop, WIDGET *widget)
+ {
+- dia_font_selector_set_font (DIA_FONT_SELECTOR (widget),
+- prop->font_data);
++ const PangoFontDescription *desc = dia_font_get_description (prop->font_data);
++ gtk_font_chooser_set_font_desc (GTK_FONT_CHOOSER (widget), desc);
+ }
+
+ static void
+ fontprop_set_from_widget(FontProperty *prop, WIDGET *widget)
+ {
+- prop->font_data = dia_font_selector_get_font (DIA_FONT_SELECTOR (widget));
++ char *desc = gtk_font_chooser_get_font (GTK_FONT_CHOOSER (widget));
++ DiaFont *new_font = dia_font_new_from_description (desc);
++
++ g_clear_pointer (&desc, g_free);
++ g_set_object (&prop->font_data, new_font);
+ }
+
+ static void
+diff --git a/objects/UML/class_dialog.c b/objects/UML/class_dialog.c
+index 163cc2949..56af1d84b 100644
+--- a/objects/UML/class_dialog.c
++++ b/objects/UML/class_dialog.c
+@@ -40,6 +40,7 @@
+ #include
+ #include
+
++#include "font.h"
+ #include "object.h"
+ #include "class.h"
+ #include "diaoptionmenu.h"
+@@ -196,6 +197,28 @@ _class_set_comment (GtkTextView *view, gchar *text)
+ }
+
+
++static DiaFont *
++_font_from_button (GtkFontButton *btn)
++{
++ char *font_desc;
++ DiaFont *ret;
++
++ font_desc = gtk_font_chooser_get_font (GTK_FONT_CHOOSER (btn));
++ ret = dia_font_new_from_description (font_desc);
++ g_clear_pointer (&font_desc, g_free);
++
++ return ret;
++}
++
++
++static void
++_set_selector_font (GtkFontButton *btn, DiaFont *font)
++{
++ gtk_font_chooser_set_font_desc (GTK_FONT_CHOOSER (btn),
++ dia_font_get_description (font));
++}
++
++
+ static void
+ class_read_from_dialog(UMLClass *umlclass, UMLClassDialog *prop_dialog)
+ {
+@@ -243,12 +266,12 @@ class_read_from_dialog(UMLClass *umlclass, UMLClassDialog *prop_dialog)
+ dia_colour_selector_get_colour (DIA_COLOUR_SELECTOR (prop_dialog->fill_color),
+ ¨class->fill_color);
+
+- umlclass->normal_font = dia_font_selector_get_font (prop_dialog->normal_font);
+- umlclass->polymorphic_font = dia_font_selector_get_font (prop_dialog->polymorphic_font);
+- umlclass->abstract_font = dia_font_selector_get_font (prop_dialog->abstract_font);
+- umlclass->classname_font = dia_font_selector_get_font (prop_dialog->classname_font);
+- umlclass->abstract_classname_font = dia_font_selector_get_font (prop_dialog->abstract_classname_font);
+- umlclass->comment_font = dia_font_selector_get_font (prop_dialog->comment_font);
++ umlclass->normal_font = _font_from_button(prop_dialog->normal_font);
++ umlclass->polymorphic_font = _font_from_button(prop_dialog->polymorphic_font);
++ umlclass->abstract_font = _font_from_button(prop_dialog->abstract_font);
++ umlclass->classname_font = _font_from_button (prop_dialog->classname_font);
++ umlclass->abstract_classname_font = _font_from_button (prop_dialog->abstract_classname_font);
++ umlclass->comment_font = _font_from_button (prop_dialog->comment_font);
+
+ umlclass->font_height = gtk_spin_button_get_value (prop_dialog->normal_font_height);
+ umlclass->abstract_font_height = gtk_spin_button_get_value (prop_dialog->abstract_font_height);
+@@ -291,12 +314,12 @@ class_fill_in_dialog(UMLClass *umlclass)
+ dia_colour_selector_set_colour (prop_dialog->text_color, ¨class->text_color);
+ dia_colour_selector_set_colour (prop_dialog->line_color, ¨class->line_color);
+ dia_colour_selector_set_colour (prop_dialog->fill_color, ¨class->fill_color);
+- dia_font_selector_set_font (prop_dialog->normal_font, umlclass->normal_font);
+- dia_font_selector_set_font (prop_dialog->polymorphic_font, umlclass->polymorphic_font);
+- dia_font_selector_set_font (prop_dialog->abstract_font, umlclass->abstract_font);
+- dia_font_selector_set_font (prop_dialog->classname_font, umlclass->classname_font);
+- dia_font_selector_set_font (prop_dialog->abstract_classname_font, umlclass->abstract_classname_font);
+- dia_font_selector_set_font (prop_dialog->comment_font, umlclass->comment_font);
++ _set_selector_font (prop_dialog->normal_font, umlclass->normal_font);
++ _set_selector_font (prop_dialog->polymorphic_font, umlclass->polymorphic_font);
++ _set_selector_font (prop_dialog->abstract_font, umlclass->abstract_font);
++ _set_selector_font (prop_dialog->classname_font, umlclass->classname_font);
++ _set_selector_font (prop_dialog->abstract_classname_font, umlclass->abstract_classname_font);
++ _set_selector_font (prop_dialog->comment_font, umlclass->comment_font);
+ gtk_spin_button_set_value (prop_dialog->normal_font_height, umlclass->font_height);
+ gtk_spin_button_set_value (prop_dialog->polymorphic_font_height, umlclass->polymorphic_font_height);
+ gtk_spin_button_set_value (prop_dialog->abstract_font_height, umlclass->abstract_font_height);
+@@ -311,7 +334,7 @@ create_font_props_row (GtkGrid *grid,
+ gint row,
+ DiaFont *font,
+ real height,
+- DiaFontSelector **fontsel,
++ GtkFontButton **fontsel,
+ GtkSpinButton **heightsel)
+ {
+ GtkWidget *label;
+@@ -320,9 +343,10 @@ create_font_props_row (GtkGrid *grid,
+ label = gtk_label_new (kind);
+ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+ gtk_grid_attach (grid, label, 0, row, 1, 1);
+- *fontsel = DIA_FONT_SELECTOR (dia_font_selector_new ());
++ *fontsel = GTK_FONT_BUTTON (gtk_font_button_new ());
+ gtk_widget_set_hexpand (GTK_WIDGET (*fontsel), TRUE);
+- dia_font_selector_set_font (DIA_FONT_SELECTOR (*fontsel), font);
++ gtk_font_chooser_set_font_desc (GTK_FONT_CHOOSER (*fontsel), dia_font_get_description (font));
++ gtk_font_chooser_set_level (GTK_FONT_CHOOSER (*fontsel), GTK_FONT_CHOOSER_LEVEL_FAMILY | GTK_FONT_CHOOSER_LEVEL_STYLE);
+ gtk_grid_attach (GTK_GRID (grid), GTK_WIDGET(*fontsel), 1, row, 1, 1);
+
+ adj = GTK_ADJUSTMENT (gtk_adjustment_new (height, 0.1, 10.0, 0.1, 1.0, 0));
+diff --git a/objects/UML/class_dialog.h b/objects/UML/class_dialog.h
+index 6bbb4b404..bf38b5613 100644
+--- a/objects/UML/class_dialog.h
++++ b/objects/UML/class_dialog.h
+@@ -1,7 +1,6 @@
+ #pragma once
+
+ #include "dia-colour-selector.h"
+-#include "dia-font-selector.h"
+
+ G_BEGIN_DECLS
+
+@@ -32,12 +31,12 @@ struct _UMLClassDialog {
+ GtkToggleButton *op_supp;
+ GtkToggleButton *comments_vis;
+ GtkToggleButton *op_wrap;
+- DiaFontSelector *normal_font;
+- DiaFontSelector *abstract_font;
+- DiaFontSelector *polymorphic_font;
+- DiaFontSelector *classname_font;
+- DiaFontSelector *abstract_classname_font;
+- DiaFontSelector *comment_font;
++ GtkFontButton *normal_font;
++ GtkFontButton *abstract_font;
++ GtkFontButton *polymorphic_font;
++ GtkFontButton *classname_font;
++ GtkFontButton *abstract_classname_font;
++ GtkFontButton *comment_font;
+ GtkSpinButton *normal_font_height;
+ GtkSpinButton *abstract_font_height;
+ GtkSpinButton *polymorphic_font_height;
+--
+GitLab
+
diff --git a/helpers/DATA/firefox/patch_changes/012-fix_wrong_directory_on_home_dir_for_abrowser.patch b/helpers/DATA/firefox/patch_changes/012-fix_wrong_directory_on_home_dir_for_abrowser.patch
index 42890c6..8241634 100644
--- a/helpers/DATA/firefox/patch_changes/012-fix_wrong_directory_on_home_dir_for_abrowser.patch
+++ b/helpers/DATA/firefox/patch_changes/012-fix_wrong_directory_on_home_dir_for_abrowser.patch
@@ -1,12 +1,14 @@
-diff --git a/debian/config/mozconfig.in b/debian/config/mozconfig.in
-index aee1b988..291b4683 100644
---- a/debian/config/mozconfig.in
-+++ b/debian/config/mozconfig.in
-@@ -71,6 +71,7 @@ ac_add_options --disable-av1
- %%endif
- %%if MOZ_APP_NAME != MOZ_DEFAULT_APP_NAME
- ac_add_options --with-app-name=@MOZ_APP_NAME@
-+ac_add_options --with-app-basename=@MOZ_APP_NAME@
- %%endif
- %%if DISTRIB == Ubuntu
- #ac_add_options --with-ua-vendor=Ubuntu
+diff --git a/toolkit/xre/nsXREDirProvider.cpp b/toolkit/xre/nsXREDirProvider.cpp
+index 9c94cb88..0c19fad9 100644
+--- a/toolkit/xre/nsXREDirProvider.cpp
++++ b/toolkit/xre/nsXREDirProvider.cpp
+@@ -1232,7 +1232,8 @@ nsresult nsXREDirProvider::AppendProfilePath(nsIFile* aFile, bool aLocal) {
+ if (gAppData->profile) {
+ profile = gAppData->profile;
+ } else {
+- appName = gAppData->name;
++ // For Abrowser compatibility: force use of ~/.mozilla/abrowser
++ appName.AssignLiteral("abrowser");
+ vendor = gAppData->vendor;
+ }
+
diff --git a/helpers/DATA/kolourpaint/patch_changes/000-add_recommends_icon_theme_for_kolourpaint.patch b/helpers/DATA/kolourpaint/patch_changes/000-add_recommends_icon_theme_for_kolourpaint.patch
new file mode 100644
index 0000000..89736f9
--- /dev/null
+++ b/helpers/DATA/kolourpaint/patch_changes/000-add_recommends_icon_theme_for_kolourpaint.patch
@@ -0,0 +1,12 @@
+diff --git a/debian/control b/debian/control
+index 43e3abe5..1677a89d 100644
+--- a/debian/control
++++ b/debian/control
+@@ -32,6 +32,7 @@ Package: kolourpaint
+ Section: graphics
+ Architecture: any
+ Depends: ${misc:Depends}, ${shlibs:Depends}
++Recommends: breeze-icon-theme
+ Breaks: kolourpaint4 (<< 4:17.04)
+ Replaces: kolourpaint4 (<< 4:17.04)
+ Description: simple image editor and drawing application
diff --git a/helpers/DATA/ubuntu-release-upgrader/DistUpgrade.cfg b/helpers/DATA/ubuntu-release-upgrader/DistUpgrade.cfg
index 8b65961..0a5bed4 100644
--- a/helpers/DATA/ubuntu-release-upgrader/DistUpgrade.cfg
+++ b/helpers/DATA/ubuntu-release-upgrader/DistUpgrade.cfg
@@ -68,8 +68,8 @@ BackupExt=distUpgrade
LogDir=/var/log/dist-upgrade/
[Sources]
-From=nabia
-To=aramo
+From=aramo
+To=ecne
ValidOrigin=Trisquel
ValidMirrors = mirrors.cfg
Components=main
diff --git a/helpers/DATA/ubuntu-release-upgrader/DistUpgrade.cfg.aramo b/helpers/DATA/ubuntu-release-upgrader/DistUpgrade.cfg.aramo
new file mode 100644
index 0000000..0a5bed4
--- /dev/null
+++ b/helpers/DATA/ubuntu-release-upgrader/DistUpgrade.cfg.aramo
@@ -0,0 +1,93 @@
+[View]
+# the views will be tried in this order, if one fails to import, the next
+# is tried
+View=DistUpgradeViewGtk3,DistUpgradeViewKDE,DistUpgradeViewText
+#View=DistUpgradeViewNonInteractive
+#Depends= apt (>= 1.0.10.2ubuntu2)
+# the views below support upgrades over ssh connection
+SupportSSH=DistUpgradeViewText,DistUpgradeViewNonInteractive
+
+# Distro contains global information about the upgrade
+[Distro]
+# the meta-pkgs we support
+MetaPkgs=trisquel, trisquel-mini, triskel, trisquel-sugar, trisquel-gnome
+BaseMetaPkgs=trisquel-minimal, trisquel-base
+IgnoredTasks=minimal, standard
+Demotions=demoted.cfg
+RemovalDenylistFile=removal_denylist.cfg
+# if those packages were installed, make sure to keep them installed
+KeepInstalledPkgs=xserver-xorg-video-all
+KeepInstalledSection=translations
+RemoveObsoletes=yes
+PurgeObsoletes=yes
+#ForcedObsoletes=ksplash-engine-moodin, powernowd, laptop-mode-tools
+# hints for for stuff that should be done right after the cache calculated
+# the dist-upgrade (not to be confused with the PostUpgrade hooks in the
+# quirks handling)
+#PostUpgradePurge=linux-restricted-modules-common
+#PostUpgradeRemove=xsettings-kde
+PostUpgradeRemove=resolvconf,notification-daemon
+#PostUpgradeUpgrade=brasero,edubuntu-desktop
+#PostUpgradeInstall=apt
+#PostInstallScripts=./trisquel-postinstall.sh
+EnableApport=no
+# this supported deny listing certain versions to ensure we do not upgrade
+# - blcr-dkms fails to build on kernel 2.6.35
+#BadVersions=blcr-dkms_0.8.2-13
+# ubiquity slideshow
+#SlideshowUrl=http://people.canonical.com/~mvo/ubiquity-slideshow-upgrade/slides/
+
+[trisquel]
+KeyDependencies=lightdm, mate-desktop-environment, marco, ubuntu-mate-default-settings, lightdm-gtk-greeter
+# those pkgs will be marked remove right after the distUpgrade in the cache
+PostUpgradeRemove=casper, xscreensaver, powermanagement-interface, compiz-core, gdm, gnome-ppp, resolvconf
+ForcedObsoletes= cups-pdf, notification-daemon, libcogl15, resolvconf
+
+[trisquel-mini]
+KeyDependencies=lxde
+#Remove previous gnome component from ltrisquel to avoid pulling gnome depends on upgrade (LP: #945215)
+PostUpgradeRemove=casper, gnome-bluetooth, resolvconf
+ForcedObsoletes= cups-pdf, notification-daemon, libcogl15, resolvconf
+
+[triskel]
+KeyDependencies=triskel-settings-desktop, plasma-desktop, sddm
+PostUpgradeRemove=powermanagement-interface, guidance-power-manager, kde-guidance-powermanager, kmix
+# those packages are marked as obsolete right after the upgrade
+ForcedObsoletes=ivman, gtk-qt-engine
+# help the resolver a bit: LP: #1426132
+PostUpgradeInstall=baloo-kf5
+
+[trisquel-sugar]
+KeyDependencies=sugar, lightdm-gtk-greeter
+
+[trisquel-gnome]
+KeyDependencies=gnome-core, gdm3
+
+[Files]
+BackupExt=distUpgrade
+LogDir=/var/log/dist-upgrade/
+
+[Sources]
+From=aramo
+To=ecne
+ValidOrigin=Trisquel
+ValidMirrors = mirrors.cfg
+Components=main
+Pockets=security,updates,backports
+;AllowThirdParty=False
+
+;[PreRequists]
+;Packages=release-upgrader-apt,release-upgrader-dpkg
+;SourcesList=prerequists-sources.list
+;SourcesList-ia64=prerequists-sources.ports.list
+;SourcesList-hppa=prerequists-sources.ports.list
+
+[Network]
+MaxRetries=3
+
+[NonInteractive]
+ForceOverwrite=yes
+RealReboot=no
+DebugBrokenScripts=no
+DpkgProgressLog=no
+;TerminalTimeout=2400
diff --git a/helpers/DATA/ubuntu-release-upgrader/patch_changes/000-automatic_install_usrmerge_for_t-r-u.patch b/helpers/DATA/ubuntu-release-upgrader/patch_changes/000-automatic_install_usrmerge_for_t-r-u.patch
new file mode 100644
index 0000000..9d2e828
--- /dev/null
+++ b/helpers/DATA/ubuntu-release-upgrader/patch_changes/000-automatic_install_usrmerge_for_t-r-u.patch
@@ -0,0 +1,42 @@
+diff --git a/DistUpgrade/DistUpgradeQuirks.py b/DistUpgrade/DistUpgradeQuirks.py
+index 9423f091..00d9b84c 100644
+--- a/DistUpgrade/DistUpgradeQuirks.py
++++ b/DistUpgrade/DistUpgradeQuirks.py
+@@ -2000,17 +2000,27 @@ class DistUpgradeQuirks(object):
+ break
+
+ if fail:
+- logging.debug('System is not /usr-merged!')
+- self._view.error(
+- _(
+- f'Cannot upgrade system with unmerged /usr'
+- ),
+- _(
+- 'Please install the usrmerge package to fix this, '
+- 'and then try the upgrade again.'
+- ),
++ logging.warning(
++ "System is not /usr-merged. Installing usrmerge before continuing..."
++ )
++ res = subprocess.run(["apt-get", "update"])
++ res2 = subprocess.run(["apt-get", "-y", "install", "usrmerge"])
++
++ if res2.returncode != 0:
++ # Installation failed, abort the upgrade with a clear message
++ self.controller.error(_(
++ "The system is not /usr-merged and 'usrmerge' could not be "
++ "installed automatically. Please install it manually and "
++ "try again."
++ ))
++ return
++
++ # Re-check that /usr merge is now in place
++ # (ensure /bin -> /usr/bin, /lib -> /usr/lib, etc.)
++ logging.info(
++ "usrmerge installed successfully; system is now /usr-merged. "
++ "Proceeding with the upgrade."
+ )
+- self.controller.abort()
+
+ def _disable_cloud_init(self):
+ """
diff --git a/helpers/DATA/yt-dlp/patch_changes/000-add_cookies_support_for_firefox_based_browser_abrowser.patch b/helpers/DATA/yt-dlp/patch_changes/000-add_cookies_support_for_firefox_based_browser_abrowser.patch
new file mode 100644
index 0000000..ddcb270
--- /dev/null
+++ b/helpers/DATA/yt-dlp/patch_changes/000-add_cookies_support_for_firefox_based_browser_abrowser.patch
@@ -0,0 +1,102 @@
+Enables Firefox based browser 'Abrowser' with custom folder (.mozilla/abrowser)
+to use the --cookies-from-browser feature, might also work for other customized
+browser in similar cases.
+
+
+diff --git a/yt_dlp/cookies.py b/yt_dlp/cookies.py
+index 5675445a..7afd324b 100644
+--- a/yt_dlp/cookies.py
++++ b/yt_dlp/cookies.py
+@@ -47,7 +47,7 @@
+ from .utils.networking import normalize_url
+
+ CHROMIUM_BASED_BROWSERS = {'brave', 'chrome', 'chromium', 'edge', 'opera', 'vivaldi', 'whale'}
+-SUPPORTED_BROWSERS = CHROMIUM_BASED_BROWSERS | {'firefox', 'safari'}
++SUPPORTED_BROWSERS = CHROMIUM_BASED_BROWSERS | {'abrowser', 'firefox', 'safari'}
+
+
+ class YDLLogger(_YDLLogger):
+@@ -114,8 +114,8 @@ def load_cookies(cookie_file, browser_specification, ydl):
+
+
+ def extract_cookies_from_browser(browser_name, profile=None, logger=YDLLogger(), *, keyring=None, container=None):
+- if browser_name == 'firefox':
+- return _extract_firefox_cookies(profile, container, logger)
++ if browser_name in ('firefox', 'abrowser'):
++ return _extract_firefox_cookies(profile, container, logger, browser_name)
+ elif browser_name == 'safari':
+ return _extract_safari_cookies(profile, logger)
+ elif browser_name in CHROMIUM_BASED_BROWSERS:
+@@ -124,15 +124,15 @@ def extract_cookies_from_browser(browser_name, profile=None, logger=YDLLogger(),
+ raise ValueError(f'unknown browser: {browser_name}')
+
+
+-def _extract_firefox_cookies(profile, container, logger):
+- logger.info('Extracting cookies from firefox')
++def _extract_firefox_cookies(profile, container, logger, browser_name):
++ logger.info(f'Extracting cookies from {browser_name}')
+ if not sqlite3:
+- logger.warning('Cannot extract cookies from firefox without sqlite3 support. '
++ logger.warning(f'Cannot extract cookies from {browser_name} without sqlite3 support. '
+ 'Please use a Python interpreter compiled with sqlite3 support')
+ return YoutubeDLCookieJar()
+
+ if profile is None:
+- search_roots = list(_firefox_browser_dirs())
++ search_roots = list(_firefox_browser_dirs(browser_name))
+ elif _is_path(profile):
+ search_roots = [profile]
+ else:
+@@ -141,7 +141,7 @@ def _extract_firefox_cookies(profile, container, logger, browser_name):
+
+ cookie_database_path = _newest(_firefox_cookie_dbs(search_roots))
+ if cookie_database_path is None:
+- raise FileNotFoundError(f'could not find firefox cookies database in {search_root}')
++ raise FileNotFoundError(f'could not find {browser_name} cookies database in {search_root}')
+ logger.debug(f'Extracting cookies from: "{cookie_database_path}"')
+
+ container_id = None
+@@ -156,7 +156,7 @@ def _extract_firefox_cookies(profile, container, logger, browser_name):
+ try_call(lambda: re.fullmatch(r'userContext([^\.]+)\.label', context['l10nID']).group()),
+ )), None)
+ if not isinstance(container_id, int):
+- raise ValueError(f'could not find firefox container "{container}" in containers.json')
++ raise ValueError(f'could not find {browser_name} container "{container}" in containers.json')
+
+ with tempfile.TemporaryDirectory(prefix='yt_dlp') as tmpdir:
+ cursor = None
+@@ -164,7 +164,7 @@ def _extract_firefox_cookies(profile, container, logger, browser_name):
+ cursor = _open_database_copy(cookie_database_path, tmpdir)
+ if isinstance(container_id, int):
+ logger.debug(
+- f'Only loading cookies from firefox container "{container}", ID {container_id}')
++ f'Only loading cookies from {browser_name} container "{container}", ID {container_id}')
+ cursor.execute(
+ 'SELECT host, name, value, path, expiry, isSecure FROM moz_cookies WHERE originAttributes LIKE ? OR originAttributes LIKE ?',
+ (f'%userContextId={container_id}', f'%userContextId={container_id}&%'))
+@@ -186,14 +186,14 @@ def _extract_firefox_cookies(profile, container, logger):
+ path=path, path_specified=bool(path), secure=is_secure, expires=expiry, discard=False,
+ comment=None, comment_url=None, rest={})
+ jar.set_cookie(cookie)
+- logger.info(f'Extracted {len(jar)} cookies from firefox')
++ logger.info(f'Extracted {len(jar)} cookies from {browser_name}')
+ return jar
+ finally:
+ if cursor is not None:
+ cursor.connection.close()
+
+
+-def _firefox_browser_dirs():
++def _firefox_browser_dirs(browser_name='firefox'):
+ if sys.platform in ('cygwin', 'win32'):
+ yield from map(os.path.expandvars, (
+ R'%APPDATA%\Mozilla\Firefox\Profiles',
+@@ -205,7 +205,7 @@ def _firefox_browser_dirs():
+
+ else:
+ yield from map(os.path.expanduser, (
+- '~/.mozilla/firefox',
++ f'~/.mozilla/{browser_name}',
+ '~/snap/firefox/common/.mozilla/firefox',
+ '~/.var/app/org.mozilla.firefox/.mozilla/firefox',
+ ))
diff --git a/helpers/config b/helpers/config
index c42bcc2..b39e4e7 100755
--- a/helpers/config
+++ b/helpers/config
@@ -38,18 +38,18 @@ fi
[ -d PACKAGES ] || mkdir PACKAGES
export DEBIAN_FRONTEND=noninteractive
-export DEBEMAIL=trisquel-devel@listas.trisquel.info
-export DEBFULLNAME="Trisquel GNU/Linux developers"
+export DEBEMAIL=devel@cmxsl.org
+export DEBFULLNAME="Desarrollo CMXSL"
export CODENAME=ecne
export REVISION=12.0
-export RELEASE=trisquel
-export DOMAIN=trisquel.info
+export RELEASE=cmxsl
+export DOMAIN=cmxsl.org
export UPSTREAM=noble
export UPSTREAMRELEASE=24.04
-MIRROR=http://mirrors.ocf.berkeley.edu/ubuntu/
+MIRROR=http://archive.ubuntu.com/ubuntu/
LOCALMIRROR=http://archive.trisquel.org/trisquel
-GIT_TPH_REPO=https://gitlab.trisquel.org/trisquel/package-helpers
-LOCAL_APT=`mktemp -d`
+GIT_TPH_REPO=https://git.cmxsl.org/CMXSL.org/package-helpers-cmxsl
+LOCAL_APT=`mktemp -d`
if [[ "$PACKAGE" =~ ^linux(-hwe-[0-9]+\.[0-9]+)?$ && -n "$LP_VERSION" ]]; then
# Function to truncate the version string to the major version (e.g., 6.5.0)
truncate_version() {
@@ -64,6 +64,7 @@ LP_DIFF_FILE="${PACKAGE}_${LP_VERSION}.diff.gz"
LP_DSC_FILE="${PACKAGE}_${LP_VERSION}.dsc"
fi
+echo -e "> $PACKAGE helper build started - $(date -R)\n"
if [ -n "$BUILD_UNTIL" ] && (( $(echo "$BUILD_UNTIL $REVISION" | awk '{print ($1 > $2)}') )); then
echo "Skipping build of helper with BUILD_UNTIL=$BUILD_UNTIL > REVISION=$REVISION"
exit 0
@@ -88,7 +89,7 @@ head -n 1 debian/changelog | grep -q $UPSTREAM-security && REPO=$CODENAME-securi
echo | dch -D $REPO -v $FULLVERSION "$1"
# Make sure the changelog file is identical between archs
-/bin/sed "/-- Trisquel/s/.*/ -- Trisquel GNU\/Linux developers $DATE/" -i debian/changelog
+/bin/sed "/-- Desarrollo/s/.*/ -- Desarrollo CMXSL $DATE/" -i debian/changelog
}
@@ -195,7 +196,7 @@ cd source
UPSTREAMVERSION=$(dpkg-parsechangelog --show-field Version)
-export FULLVERSION=$(dpkg-parsechangelog --show-field Version)trisquel${VERSION}
+export FULLVERSION=$(dpkg-parsechangelog --show-field Version)cmxsl${VERSION}
# Use 3.0 (native) deb source format
[ -f debian/source/format ] && echo "3 (native)" > debian/source/format
@@ -220,7 +221,7 @@ cd ..
mv source $PACKAGE-$FULLVERSION
dpkg-source -b -I.falsefileextension99 $PACKAGE-$FULLVERSION
rm -rf ${LOCAL_APT}
-echo -e "Trisquel source package built! - $(date -R)\n"
+echo -e "> CMXSL source package built! - $(date -R)\n"
notify_found_distro_match_on_debian_rules
}
diff --git a/helpers/make-cron b/helpers/make-cron
index 3f6c3de..1b70b03 100644
--- a/helpers/make-cron
+++ b/helpers/make-cron
@@ -17,15 +17,14 @@
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
-VERSION=1
+VERSION=2
+BUILD_UNTIL=12
. ./config
-rm debian/examples/crontab2english.pl
+patch_p1 $DATA/license-info-fix.patch
-sed '/crontab2english.pl/,/License: Artistic/d;/License: Artistic/,/common-licenses/d' -i debian/copyright
-
-changelog "Removed non-free example #10868"
+changelog "Corrected license info (package-helpers issue #199)"
package
diff --git a/helpers/make-dia b/helpers/make-dia
new file mode 100644
index 0000000..fcaee2b
--- /dev/null
+++ b/helpers/make-dia
@@ -0,0 +1,30 @@
+#!/bin/sh
+#
+# Copyright (C) 2025 Luis Guznán
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+
+VERSION=1
+
+. ./config
+
+apply_patch_changes
+# See more at: https://gitlab.gnome.org/GNOME/dia/-/merge_requests/114
+
+changelog "Apply MR 114 on GNOME to fix delay to open text properties"
+
+package
+
diff --git a/helpers/make-firefox b/helpers/make-firefox
index cd08ae0..9571bc2 100644
--- a/helpers/make-firefox
+++ b/helpers/make-firefox
@@ -19,7 +19,7 @@
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
-VERSION=122
+VERSION=123
EXTERNAL='deb-src http://ppa.launchpadcontent.net/mozillateam/ppa/ubuntu $UPSTREAM main'
REPOKEY=9BDB3D89CE49EC21
diff --git a/helpers/make-kolourpaint b/helpers/make-kolourpaint
new file mode 100644
index 0000000..279e8f5
--- /dev/null
+++ b/helpers/make-kolourpaint
@@ -0,0 +1,27 @@
+#!/bin/sh
+#
+# Copyright (C) 2025 Luis Guzmán
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+
+VERSION=1
+. ./config
+
+apply_patch_changes
+
+changelog "Set icon theme recommendation for non-KDE environments"
+
+package
diff --git a/helpers/make-llvm-toolchain-19 b/helpers/make-llvm-toolchain-19
index e5890be..81c50f7 100644
--- a/helpers/make-llvm-toolchain-19
+++ b/helpers/make-llvm-toolchain-19
@@ -18,7 +18,7 @@
#
VERSION=1
-EXTERNAL='deb-src http://archive.ubuntu.com/ubuntu $UPSTREAM main universe'
+EXTERNAL='deb-src http://archive.ubuntu.com/ubuntu $UPSTREAM universe'
BACKPORTS=true
. ./config
diff --git a/helpers/make-ubuntu-release-upgrader b/helpers/make-ubuntu-release-upgrader
index c0980e5..191cfce 100644
--- a/helpers/make-ubuntu-release-upgrader
+++ b/helpers/make-ubuntu-release-upgrader
@@ -1,5 +1,6 @@
#!/bin/sh
#
+# Copyright (C) 2025 Luis Guzmán
# Copyright (C) 2008-2024 Ruben Rodriguez
# Copyright (C) 2014 Santiago Rodriguez
# Copyright (C) 2019 Mason Hock
@@ -24,13 +25,20 @@
# Also, don't forget to update the meta-release files at archive and packages.t.i
# The "obsoletes" list from ubuntu has been removed
-VERSION=16
+VERSION=16.1
. ./config
+# Previous upstream release name, update for each release.
+PREV_UPS_REL=jammy
+PREV_TRIS_REL=aramo
+# Use git Mirrors.masterlist as source.
+Mirrors_masterlist=$(mktemp)
+Mirrors_masterlist_git="trisquel-packages/-/raw/master/extra/mirrors/Mirrors.masterlist"
+TPH_GIT_URL="https://gitlab.trisquel.org/trisquel/package-helpers/"
# Fix PEP440 version compatibility
# https://salsa.debian.org/debian/distro-info/-/commit/e2877dc44659d034155495e91976874c209a3c02
-patch --no-backup-if-mismatch -Np1 < $DATA/pep440.patch
+patch_p1 $DATA/pep440.patch
#%FSDG: Remove functions to deal with proprietary drivers
rm ./DistUpgrade/xorg_fix_proprietary.py
@@ -226,25 +234,11 @@ trisquel-release-upgrader-core
EOF
rm data/mirrors.cfg
-#https://mirmon.trisquel.org/conf.txt
-cat << EOF > data/mirrors.cfg
-https://archive.trisquel.info/trisquel/
-https://archive.trisquel.org/trisquel/
-https://mirror.fsf.org/trisquel/
-https://mirror.cedia.org.ec/trisquel.packages/
-https://mirrors.ustc.edu.cn/trisquel/
-https://ftp.caliu.cat/pub/distribucions/trisquel/packages/
-https://ftp.acc.umu.se/mirror/trisquel/packages/
-https://mirrors.ocf.berkeley.edu/trisquel/
-https://mirror.librelabucm.org/trisquel/
-https://mirror.linux.pizza/trisquel/packages/
-https://quantum-mirror.hu/mirrors/pub/trisquel/packages/
-https://mirror.csclub.uwaterloo.ca/trisquel/packages/
-https://ftpmirror1.infania.net/mirror/trisquel/packages/
-https://mirrors.nju.edu.cn/trisquel/
-https://mirror.math.princeton.edu/pub/trisquel-packages/
-https://mirrors.dotsrc.org/trisquel/
-EOF
+# https://gitlab.trisquel.org/trisquel/trisquel-packages/-/tree/master/extra/mirrors
+# FIXME: Propose a way to integrate from git and avoid fetching via wget/curl.
+wget https://gitlab.trisquel.org/trisquel/$Mirrors_masterlist_git -o /dev/null -O $Mirrors_masterlist
+python3 $DATA/../python-apt/parse-mirror-masterlist.py $Mirrors_masterlist|grep https|sort > data/mirrors.cfg
+rm $Mirrors_masterlist
replace changelogs.ubuntu.com packages.trisquel.org .
@@ -288,16 +282,23 @@ rpl noble ecne . -R
rm data/DistUpgrade.cfg*
cp $DATA/DistUpgrade.cfg* data/
-cat << EOF >> data/demoted.cfg
+cat << EOF | tee -a utils/demoted.cfg utils/demoted.cfg.$PREV_UPS_REL
notification-daemon
resolvconf
eom
+desktop-common
EOF
-sed 's|.ubuntu-bug ubuntu-release-upgrader-core. in a terminal|https://gitlab.trisquel.org/trisquel/package-helpers in a browser.|' DistUpgrade/DistUpgradeCache.py -i
-replace "https*://launchpad.net/ubuntu/+source/ubuntu-release-upgrader/+filebug" "https://gitlab.trisquel.org/trisquel/package-helpers/-/issues" .
-replace "https*://launchpad.net/ubuntu/+source/ubuntu-release-upgrader" "https://gitlab.trisquel.org/trisquel/package-helpers/" .
-replace "https*://bugs.launchpad.net/ubuntu/+source/ubuntu-release-upgrader/+filebug" "https://gitlab.trisquel.org/trisquel/package-helpers/-/issues" .
+for i in utils/demoted.cfg utils/demoted.cfg.$PREV_UPS_REL
+do
+ sort -o $i $i
+done
+mv data/demoted.cfg.$PREV_UPS_REL data/demoted.cfg.$PREV_TRIS_REL
+
+sed -i "s|the command .ubuntu-bug ubuntu-release-upgrader-core. in a terminal|$TPH_GIT_URL|" DistUpgrade/DistUpgradeCache.py
+replace "https*://launchpad.net/ubuntu/+source/ubuntu-release-upgrader/+filebug" "${TPH_GIT_URL}-/issues" .
+replace "https*://launchpad.net/ubuntu/+source/ubuntu-release-upgrader" "$TPH_GIT_URL" .
+replace "https*://bugs.launchpad.net/ubuntu/+source/ubuntu-release-upgrader/+filebug" "${TPH_GIT_URL}-/issues" .
find -type f |xargs rename 's/ubuntu-release-upgrader/trisquel-release-upgrader/g'
replace "ubuntu-release-upgrader" "trisquel-release-upgrader" .
mv kubuntu-devel-release-upgrade triskel-devel-release-upgrade
@@ -325,12 +326,28 @@ rpl "main restricted" "main" DistUpgrade -R
replace Ubuntu Trisquel
replace Canonical Trisquel
replace "https*://www.ubuntu.com/" "https://trisquel.info" .
-replace "https*://wiki.ubuntu.com/X/Bugs/" "https://gitlab.trisquel.org/trisquel/package-helpers/-/issues" .
+replace "https*://wiki.ubuntu.com/X/Bugs/" "${TPH_GIT_URL}-/issues" .
replace "https*://wiki.ubuntu.com/" "https://trisquel.info/wiki" .
replace "https*://help.ubuntu.com/community" "https://trisquel.info/wiki" .
+/bin/sed -i \
+ -e 's/kubuntu/triskel/g' \
+ -e 's/xubuntu/trisquel-mini/g' \
+ -e 's/�~Lubuntu/�~Ltrisquel/g' \
+ -e 's/被ubuntu/被trisquel/g' \
+ -e "s#http://launchpad.net/ubuntu/+source/%s/%s/+changelog#$TPH_GIT_URL#g" \
+ -e 's/<.*@ubuntu.com/>>Site replacement needs fixing, exiting...<<<\n" && exit
+apply_patch_changes
+
changelog "Remove explicit site listing, redirecting to website author."
package