From eadf9f9ff1bc420611daedb8e43328c772d9689f Mon Sep 17 00:00:00 2001
From: Alexander Vanhee <160625516+AlexanderVanhee@users.noreply.github.com>
Date: Fri, 27 Feb 2026 20:04:31 +0100
Subject: [PATCH 1/2] Add mobile only preference toggle.
This toggle is only visible when at mobile resolutions (or when its already enabled) to reduce clutter in the preferences menu.
---
data/io.github.kolunmi.Bazaar.gschema.xml | 5 ++
src/bz-application.c | 13 ++++
src/bz-apps-page.blp | 1 +
src/bz-entry-group.c | 33 +++++++++-
src/bz-entry-group.h | 3 +
src/bz-preferences-dialog.blp | 9 ++-
src/bz-preferences-dialog.c | 76 +++++++++++++++--------
src/bz-state-info.txt | 1 +
8 files changed, 113 insertions(+), 28 deletions(-)
diff --git a/data/io.github.kolunmi.Bazaar.gschema.xml b/data/io.github.kolunmi.Bazaar.gschema.xml
index c1d58796..5ed4a108 100644
--- a/data/io.github.kolunmi.Bazaar.gschema.xml
+++ b/data/io.github.kolunmi.Bazaar.gschema.xml
@@ -21,6 +21,11 @@
Show Only Verified Content
Hide applications which are not verified on Flathub
+
+ false
+ Show Only Mobile apps
+ Hide applications which do not work well on mobile
+
true
Debounce Search Inputs
diff --git a/src/bz-application.c b/src/bz-application.c
index 34fab309..8e08bf77 100644
--- a/src/bz-application.c
+++ b/src/bz-application.c
@@ -2134,6 +2134,7 @@ show_hide_app_setting_changed (BzApplication *self,
bz_state_info_set_show_only_foss (self->state, g_settings_get_boolean (self->settings, "show-only-foss"));
bz_state_info_set_show_only_flathub (self->state, g_settings_get_boolean (self->settings, "show-only-flathub"));
bz_state_info_set_show_only_verified (self->state, g_settings_get_boolean (self->settings, "show-only-verified"));
+ bz_state_info_set_show_only_mobile (self->state, g_settings_get_boolean (self->settings, "show-only-mobile"));
gtk_filter_changed (GTK_FILTER (self->group_filter), GTK_FILTER_CHANGE_DIFFERENT);
gtk_filter_changed (GTK_FILTER (self->appid_filter), GTK_FILTER_CHANGE_DIFFERENT);
@@ -2742,6 +2743,15 @@ init_service_struct (BzApplication *self,
G_CALLBACK (show_hide_app_setting_changed),
self);
+ bz_state_info_set_show_only_mobile (
+ self->state,
+ g_settings_get_boolean (self->settings, "show-only-mobile"));
+ g_signal_connect_swapped (
+ self->settings,
+ "changed::show-only-mobile",
+ G_CALLBACK (show_hide_app_setting_changed),
+ self);
+
self->blocklist_regexes = g_ptr_array_new_with_free_func (
(GDestroyNotify) g_ptr_array_unref);
self->blocklists_provider = bz_content_provider_new ();
@@ -3095,6 +3105,9 @@ validate_group_for_ui (BzApplication *self,
if (bz_state_info_get_show_only_verified (self->state) &&
!bz_entry_group_get_is_verified (group))
return FALSE;
+ if (bz_state_info_get_show_only_mobile (self->state) &&
+ !bz_entry_group_get_is_mobile_friendly (group))
+ return FALSE;
if (bz_state_info_get_disable_blocklists (self->state))
return TRUE;
diff --git a/src/bz-apps-page.blp b/src/bz-apps-page.blp
index a191c15b..a1e75094 100644
--- a/src/bz-apps-page.blp
+++ b/src/bz-apps-page.blp
@@ -76,6 +76,7 @@ template $BzAppsPage: Adw.NavigationPage {
Box content_box {
orientation: vertical;
+ valign: start;
spacing: 10;
margin-start: 30;
margin-end: 30;
diff --git a/src/bz-entry-group.c b/src/bz-entry-group.c
index 30242590..c66ac140 100644
--- a/src/bz-entry-group.c
+++ b/src/bz-entry-group.c
@@ -47,6 +47,7 @@ struct _BzEntryGroup
char *dark_accent_color;
gboolean is_flathub;
gboolean is_verified;
+ gboolean is_mobile_friendly;
char *search_tokens;
char *remote_repos_string;
char *eol;
@@ -95,6 +96,7 @@ enum
PROP_DARK_ACCENT_COLOR,
PROP_IS_FLATHUB,
PROP_IS_VERIFIED,
+ PROP_IS_MOBILE_FRIENDLY,
PROP_SEARCH_TOKENS,
PROP_UI_ENTRY,
PROP_REMOTE_REPOS_STRING,
@@ -215,6 +217,9 @@ bz_entry_group_get_property (GObject *object,
case PROP_IS_VERIFIED:
g_value_set_boolean (value, bz_entry_group_get_is_verified (self));
break;
+ case PROP_IS_MOBILE_FRIENDLY:
+ g_value_set_boolean (value, bz_entry_group_get_is_mobile_friendly (self));
+ break;
case PROP_SEARCH_TOKENS:
g_value_set_boxed (value, bz_entry_group_get_search_tokens (self));
break;
@@ -287,6 +292,7 @@ bz_entry_group_set_property (GObject *object,
case PROP_DARK_ACCENT_COLOR:
case PROP_IS_FLATHUB:
case PROP_IS_VERIFIED:
+ case PROP_IS_MOBILE_FRIENDLY:
case PROP_SEARCH_TOKENS:
case PROP_EOL:
case PROP_UI_ENTRY:
@@ -395,6 +401,12 @@ bz_entry_group_class_init (BzEntryGroupClass *klass)
NULL, NULL, FALSE,
G_PARAM_READABLE);
+ props[PROP_IS_MOBILE_FRIENDLY] =
+ g_param_spec_boolean (
+ "is-mobile-friendly",
+ NULL, NULL, FALSE,
+ G_PARAM_READABLE);
+
props[PROP_SEARCH_TOKENS] =
g_param_spec_string (
"search-tokens",
@@ -540,6 +552,7 @@ bz_entry_group_new_for_single_entry (BzEntry *entry)
const char *dark_accent_color = NULL;
gboolean is_flathub = FALSE;
gboolean is_verified = FALSE;
+ gboolean is_mobile_friendly = FALSE;
const char *eol = NULL;
guint64 installed_size = 0;
const char *donation_url = NULL;
@@ -563,6 +576,7 @@ bz_entry_group_new_for_single_entry (BzEntry *entry)
dark_accent_color = bz_entry_get_dark_accent_color (entry);
is_flathub = bz_entry_get_is_flathub (entry);
is_verified = bz_entry_is_verified (entry);
+ is_mobile_friendly = bz_entry_get_is_mobile_friendly (entry);
eol = bz_entry_get_eol (entry);
installed_size = bz_entry_get_installed_size (entry);
donation_url = bz_entry_get_donation_url (entry);
@@ -587,8 +601,9 @@ bz_entry_group_new_for_single_entry (BzEntry *entry)
group->light_accent_color = g_strdup (light_accent_color);
if (dark_accent_color != NULL)
group->dark_accent_color = g_strdup (dark_accent_color);
- group->is_flathub = is_flathub;
- group->is_verified = is_verified;
+ group->is_flathub = is_flathub;
+ group->is_verified = is_verified;
+ group->is_mobile_friendly = is_mobile_friendly;
if (eol != NULL)
group->eol = g_strdup (eol);
group->installed_size = installed_size;
@@ -705,6 +720,13 @@ bz_entry_group_get_is_verified (BzEntryGroup *self)
return self->is_verified;
}
+gboolean
+bz_entry_group_get_is_mobile_friendly (BzEntryGroup *self)
+{
+ g_return_val_if_fail (BZ_IS_ENTRY_GROUP (self), FALSE);
+ return self->is_mobile_friendly;
+}
+
const char *
bz_entry_group_get_search_tokens (BzEntryGroup *self)
{
@@ -877,6 +899,7 @@ bz_entry_group_add (BzEntryGroup *self,
const char *dark_accent_color = NULL;
gboolean is_flathub = FALSE;
gboolean is_verified = FALSE;
+ gboolean is_mobile_friendly = FALSE;
guint64 installed_size = 0;
GListModel *addons = NULL;
int n_addons = 0;
@@ -926,6 +949,7 @@ bz_entry_group_add (BzEntryGroup *self,
dark_accent_color = bz_entry_get_dark_accent_color (entry);
is_flathub = bz_entry_get_is_flathub (entry);
is_verified = bz_entry_is_verified (entry);
+ is_mobile_friendly = bz_entry_get_is_mobile_friendly (entry);
installed_size = bz_entry_get_installed_size (entry);
donation_url = bz_entry_get_donation_url (entry);
entry_categories = bz_entry_get_categories (entry);
@@ -1011,6 +1035,11 @@ bz_entry_group_add (BzEntryGroup *self,
self->is_verified = is_verified;
g_object_notify_by_pspec (G_OBJECT (self), props[PROP_IS_VERIFIED]);
}
+ if (!!is_mobile_friendly != !!self->is_mobile_friendly)
+ {
+ self->is_mobile_friendly = is_mobile_friendly;
+ g_object_notify_by_pspec (G_OBJECT (self), props[PROP_IS_MOBILE_FRIENDLY]);
+ }
if (installed_size != self->installed_size)
{
self->installed_size = installed_size;
diff --git a/src/bz-entry-group.h b/src/bz-entry-group.h
index fc4a711a..f9ee4677 100644
--- a/src/bz-entry-group.h
+++ b/src/bz-entry-group.h
@@ -79,6 +79,9 @@ bz_entry_group_get_is_flathub (BzEntryGroup *self);
gboolean
bz_entry_group_get_is_verified (BzEntryGroup *self);
+gboolean
+bz_entry_group_get_is_mobile_friendly (BzEntryGroup *self);
+
const char *
bz_entry_group_get_search_tokens (BzEntryGroup *self);
diff --git a/src/bz-preferences-dialog.blp b/src/bz-preferences-dialog.blp
index d24c1a63..d13bbfa3 100644
--- a/src/bz-preferences-dialog.blp
+++ b/src/bz-preferences-dialog.blp
@@ -12,6 +12,7 @@ template $BzPreferencesDialog: Adw.PreferencesDialog {
setters {
flag_buttons_box.max-children-per-line: 6;
+ template.compact: true;
}
}
@@ -45,6 +46,12 @@ template $BzPreferencesDialog: Adw.PreferencesDialog {
subtitle: _("Hide results that are not verified on Flathub");
}
+ Adw.SwitchRow only_mobile_switch {
+ visible: bind $logical_or(template.compact, only_mobile_switch.active) as ;
+ title: _("Mobile Friendly Only");
+ subtitle: _("Hide applications that are not optimized for mobile devices");
+ }
+
Adw.SwitchRow hide_eol_switch {
title: _("Hide EOL Apps");
subtitle: _("Hide apps which are no longer supported by their developers");
@@ -92,4 +99,4 @@ template $BzPreferencesDialog: Adw.PreferencesDialog {
}
}
}
-}
+}
\ No newline at end of file
diff --git a/src/bz-preferences-dialog.c b/src/bz-preferences-dialog.c
index 6c985790..6e6bb407 100644
--- a/src/bz-preferences-dialog.c
+++ b/src/bz-preferences-dialog.c
@@ -19,6 +19,7 @@
*/
#include "bz-preferences-dialog.h"
+#include "bz-template-callbacks.h"
#include
typedef struct
@@ -29,28 +30,28 @@ typedef struct
} BarTheme;
static const BarTheme bar_themes[] = {
- { "accent-color", "accent-color-theme", N_ ("Accent Color") },
- { "pride-rainbow-flag", "pride-rainbow-flag-theme", N_ ("Pride Colors") },
- { "lesbian-pride-flag", "lesbian-pride-flag-theme", N_ ("Lesbian Pride Colors") },
- { "gay-pride-flag", "gay-pride-flag-theme", N_ ("Male Homosexual Pride Colors") },
- { "transgender-flag", "transgender-flag-theme", N_ ("Transgender Pride Colors") },
- { "nonbinary-flag", "nonbinary-flag-theme", N_ ("Nonbinary Pride Colors") },
- { "bisexual-flag", "bisexual-flag-theme", N_ ("Bisexual Pride Colors") },
- { "asexual-flag", "asexual-flag-theme", N_ ("Asexual Pride Colors") },
- { "pansexual-flag", "pansexual-flag-theme", N_ ("Pansexual Pride Colors") },
- { "aromantic-flag", "aromantic-flag-theme", N_ ("Aromantic Pride Colors") },
- { "genderfluid-flag", "genderfluid-flag-theme", N_ ("Genderfluid Pride Colors") },
- { "polysexual-flag", "polysexual-flag-theme", N_ ("Polysexual Pride Colors") },
- { "omnisexual-flag", "omnisexual-flag-theme", N_ ("Omnisexual Pride Colors") },
- { "aroace-flag", "aroace-flag-theme", N_ ("Aroace Pride Colors") },
- { "agender-flag", "agender-flag-theme", N_ ("Agender Pride Colors") },
- { "genderqueer-flag", "genderqueer-flag-theme", N_ ("Genderqueer Pride Colors") },
- { "intersex-flag", "intersex-flag-theme", N_ ("Intersex Pride Colors") },
- { "demigender-flag", "demigender-flag-theme", N_ ("Demigender Pride Colors") },
- { "biromantic-flag", "biromantic-flag-theme", N_ ("Biromantic Pride Colors") },
- { "disability-flag", "disability-flag-theme", N_ ("Disability Pride Colors") },
- { "femboy-flag", "femboy-flag-theme", N_ ("Femboy Pride Colors") },
- { "neutrois-flag", "neutrois-flag-theme", N_ ("Neutrois Pride Colors") },
+ { "accent-color", "accent-color-theme", N_ ("Accent Color") },
+ { "pride-rainbow-flag", "pride-rainbow-flag-theme", N_ ("Pride Colors") },
+ { "lesbian-pride-flag", "lesbian-pride-flag-theme", N_ ("Lesbian Pride Colors") },
+ { "gay-pride-flag", "gay-pride-flag-theme", N_ ("Male Homosexual Pride Colors") },
+ { "transgender-flag", "transgender-flag-theme", N_ ("Transgender Pride Colors") },
+ { "nonbinary-flag", "nonbinary-flag-theme", N_ ("Nonbinary Pride Colors") },
+ { "bisexual-flag", "bisexual-flag-theme", N_ ("Bisexual Pride Colors") },
+ { "asexual-flag", "asexual-flag-theme", N_ ("Asexual Pride Colors") },
+ { "pansexual-flag", "pansexual-flag-theme", N_ ("Pansexual Pride Colors") },
+ { "aromantic-flag", "aromantic-flag-theme", N_ ("Aromantic Pride Colors") },
+ { "genderfluid-flag", "genderfluid-flag-theme", N_ ("Genderfluid Pride Colors") },
+ { "polysexual-flag", "polysexual-flag-theme", N_ ("Polysexual Pride Colors") },
+ { "omnisexual-flag", "omnisexual-flag-theme", N_ ("Omnisexual Pride Colors") },
+ { "aroace-flag", "aroace-flag-theme", N_ ("Aroace Pride Colors") },
+ { "agender-flag", "agender-flag-theme", N_ ("Agender Pride Colors") },
+ { "genderqueer-flag", "genderqueer-flag-theme", N_ ("Genderqueer Pride Colors") },
+ { "intersex-flag", "intersex-flag-theme", N_ ("Intersex Pride Colors") },
+ { "demigender-flag", "demigender-flag-theme", N_ ("Demigender Pride Colors") },
+ { "biromantic-flag", "biromantic-flag-theme", N_ ("Biromantic Pride Colors") },
+ { "disability-flag", "disability-flag-theme", N_ ("Disability Pride Colors") },
+ { "femboy-flag", "femboy-flag-theme", N_ ("Femboy Pride Colors") },
+ { "neutrois-flag", "neutrois-flag-theme", N_ ("Neutrois Pride Colors") },
};
struct _BzPreferencesDialog
@@ -58,12 +59,14 @@ struct _BzPreferencesDialog
AdwPreferencesDialog parent_instance;
BzStateInfo *state;
+ gboolean compact;
GSettings *settings;
/* Template widgets */
AdwSwitchRow *only_foss_switch;
AdwSwitchRow *only_flathub_switch;
AdwSwitchRow *only_verified_switch;
+ AdwSwitchRow *only_mobile_switch;
AdwSwitchRow *search_debounce_switch;
GtkFlowBox *flag_buttons_box;
AdwSwitchRow *hide_eol_switch;
@@ -79,6 +82,7 @@ enum
PROP_0,
PROP_STATE,
+ PROP_COMPACT,
LAST_PROP
};
@@ -139,7 +143,7 @@ on_rotate_switch_changed (AdwSwitchRow *row,
BzPreferencesDialog *self)
{
gboolean active = FALSE;
- active = adw_switch_row_get_active (row);
+ active = adw_switch_row_get_active (row);
for (guint i = 0; i < G_N_ELEMENTS (bar_themes); i++)
{
if (active)
@@ -205,6 +209,10 @@ bind_settings (BzPreferencesDialog *self)
self->only_verified_switch, "active",
G_SETTINGS_BIND_DEFAULT);
+ g_settings_bind (self->settings, "show-only-mobile",
+ self->only_mobile_switch, "active",
+ G_SETTINGS_BIND_DEFAULT);
+
g_settings_bind (self->settings, "search-debounce",
self->search_debounce_switch, "active",
G_SETTINGS_BIND_DEFAULT);
@@ -214,8 +222,8 @@ bind_settings (BzPreferencesDialog *self)
G_SETTINGS_BIND_DEFAULT);
g_settings_bind (self->settings, "rotate-flag",
- self->rotate_switch, "active",
- G_SETTINGS_BIND_DEFAULT);
+ self->rotate_switch, "active",
+ G_SETTINGS_BIND_DEFAULT);
if (adw_switch_row_get_active (self->rotate_switch))
{
@@ -246,6 +254,9 @@ bz_preferences_dialog_get_property (GObject *object,
case PROP_STATE:
g_value_set_object (value, self->state);
break;
+ case PROP_COMPACT:
+ g_value_set_boolean (value, self->compact);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@@ -257,8 +268,14 @@ bz_preferences_dialog_set_property (GObject *object,
const GValue *value,
GParamSpec *pspec)
{
+ BzPreferencesDialog *self = BZ_PREFERENCES_DIALOG (object);
+
switch (prop_id)
{
+ case PROP_COMPACT:
+ self->compact = g_value_get_boolean (value);
+ g_object_notify_by_pspec (object, props[PROP_COMPACT]);
+ break;
case PROP_STATE:
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -289,13 +306,22 @@ bz_preferences_dialog_class_init (BzPreferencesDialogClass *klass)
BZ_TYPE_STATE_INFO,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+ props[PROP_COMPACT] =
+ g_param_spec_boolean (
+ "compact",
+ NULL, NULL, FALSE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY);
+
g_object_class_install_properties (object_class, LAST_PROP, props);
gtk_widget_class_set_template_from_resource (widget_class, "/io/github/kolunmi/Bazaar/bz-preferences-dialog.ui");
+ bz_widget_class_bind_all_util_callbacks (widget_class);
+
gtk_widget_class_bind_template_child (widget_class, BzPreferencesDialog, only_foss_switch);
gtk_widget_class_bind_template_child (widget_class, BzPreferencesDialog, only_flathub_switch);
gtk_widget_class_bind_template_child (widget_class, BzPreferencesDialog, only_verified_switch);
+ gtk_widget_class_bind_template_child (widget_class, BzPreferencesDialog, only_mobile_switch);
gtk_widget_class_bind_template_child (widget_class, BzPreferencesDialog, search_debounce_switch);
gtk_widget_class_bind_template_child (widget_class, BzPreferencesDialog, flag_buttons_box);
gtk_widget_class_bind_template_child (widget_class, BzPreferencesDialog, hide_eol_switch);
diff --git a/src/bz-state-info.txt b/src/bz-state-info.txt
index 1db3970c..6d99816d 100644
--- a/src/bz-state-info.txt
+++ b/src/bz-state-info.txt
@@ -52,6 +52,7 @@ property=settings GSettings G_TYPE_SETTINGS object
property=show_only_flathub gboolean G_TYPE_BOOLEAN boolean
property=show_only_foss gboolean G_TYPE_BOOLEAN boolean
property=show_only_verified gboolean G_TYPE_BOOLEAN boolean
+property=show_only_mobile gboolean G_TYPE_BOOLEAN boolean
property=syncing gboolean G_TYPE_BOOLEAN boolean
property=system_icon_theme GtkIconTheme GTK_TYPE_ICON_THEME object
property=transaction_manager BzTransactionManager BZ_TYPE_TRANSACTION_MANAGER object
From 8692bde983f42a95d2e2b355c7c5b147c216ef64 Mon Sep 17 00:00:00 2001
From: Alexander Vanhee <160625516+AlexanderVanhee@users.noreply.github.com>
Date: Mon, 2 Mar 2026 15:03:28 +0100
Subject: [PATCH 2/2] Make preference visible non conditionally
---
src/bz-preferences-dialog.blp | 2 --
src/bz-preferences-dialog.c | 17 -----------------
2 files changed, 19 deletions(-)
diff --git a/src/bz-preferences-dialog.blp b/src/bz-preferences-dialog.blp
index d13bbfa3..2a16d0f7 100644
--- a/src/bz-preferences-dialog.blp
+++ b/src/bz-preferences-dialog.blp
@@ -12,7 +12,6 @@ template $BzPreferencesDialog: Adw.PreferencesDialog {
setters {
flag_buttons_box.max-children-per-line: 6;
- template.compact: true;
}
}
@@ -47,7 +46,6 @@ template $BzPreferencesDialog: Adw.PreferencesDialog {
}
Adw.SwitchRow only_mobile_switch {
- visible: bind $logical_or(template.compact, only_mobile_switch.active) as ;
title: _("Mobile Friendly Only");
subtitle: _("Hide applications that are not optimized for mobile devices");
}
diff --git a/src/bz-preferences-dialog.c b/src/bz-preferences-dialog.c
index 6e6bb407..63cf9ad8 100644
--- a/src/bz-preferences-dialog.c
+++ b/src/bz-preferences-dialog.c
@@ -59,7 +59,6 @@ struct _BzPreferencesDialog
AdwPreferencesDialog parent_instance;
BzStateInfo *state;
- gboolean compact;
GSettings *settings;
/* Template widgets */
@@ -82,7 +81,6 @@ enum
PROP_0,
PROP_STATE,
- PROP_COMPACT,
LAST_PROP
};
@@ -254,9 +252,6 @@ bz_preferences_dialog_get_property (GObject *object,
case PROP_STATE:
g_value_set_object (value, self->state);
break;
- case PROP_COMPACT:
- g_value_set_boolean (value, self->compact);
- break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@@ -268,14 +263,8 @@ bz_preferences_dialog_set_property (GObject *object,
const GValue *value,
GParamSpec *pspec)
{
- BzPreferencesDialog *self = BZ_PREFERENCES_DIALOG (object);
-
switch (prop_id)
{
- case PROP_COMPACT:
- self->compact = g_value_get_boolean (value);
- g_object_notify_by_pspec (object, props[PROP_COMPACT]);
- break;
case PROP_STATE:
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -306,12 +295,6 @@ bz_preferences_dialog_class_init (BzPreferencesDialogClass *klass)
BZ_TYPE_STATE_INFO,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
- props[PROP_COMPACT] =
- g_param_spec_boolean (
- "compact",
- NULL, NULL, FALSE,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY);
-
g_object_class_install_properties (object_class, LAST_PROP, props);
gtk_widget_class_set_template_from_resource (widget_class, "/io/github/kolunmi/Bazaar/bz-preferences-dialog.ui");