Skip to content
Commits on Source (7)
=========
GHex 42.3
=========
Bugfixes since 42.2 (all backports from master pending upcoming 43 release)
(Logan Rathbone):
- main: Hotfix to workaround gtk #4880 (affects Save As dialogs on X11
primarily)
- config: Add GNOME 42+ compatibility for dark mode, and fetch dark settings
from portal if possible
- widget: Properly update highlights upon resize
- find-replace: Remove spurious g_object_ref() call
=========
GHex 42.2
=========
......
......@@ -30,6 +30,7 @@
<kudo>UserDocs</kudo>
</kudos>
<releases>
<release version="42.3" date="2022-06-13"/>
<release version="42.2" date="2022-04-26"/>
<release version="42.1" date="2022-04-16"/>
<release version="42.0" date="2022-04-05"/>
......
project(
'ghex', 'c',
version: '42.2',
version: '42.3',
meson_version: '>=0.59.0',
license: 'GPL2'
)
......
......@@ -75,11 +75,140 @@ dark_mode_changed_cb (GSettings *settings,
def_dark_mode = g_settings_get_enum (settings, key);
}
/* NOTE: for GTK 4.0 backwards compatibility, we manually define these
* here. If we wish to add an additional dependency on
* gsettings-desktop-schemas >= 42, this can be eliminated.
*/
enum system_color_scheme {
SYSTEM_DEFAULT,
SYSTEM_PREFER_DARK,
SYSTEM_PREFER_LIGHT,
};
static gboolean
try_dark_from_gsettings (void)
{
int color_scheme;
GSettingsSchemaSource *source;
GSettingsSchema *schema;
char *schema_id = NULL;
source = g_settings_schema_source_get_default ();
schema = g_settings_schema_source_lookup (source, "org.freedesktop.appearance", TRUE);
if (schema && g_settings_schema_has_key (schema, "color-scheme"))
{
schema_id = "org.freedesktop.appearance";
}
else
{
g_clear_pointer (&schema, g_settings_schema_unref);
schema = g_settings_schema_source_lookup (source, "org.gnome.desktop.interface", TRUE);
if (schema && g_settings_schema_has_key (schema, "color-scheme"))
{
schema_id = "org.gnome.desktop.interface";
}
g_clear_pointer (&schema, g_settings_schema_unref);
}
if (schema_id)
{
GSettings *set = g_settings_new (schema_id);
color_scheme = g_settings_get_enum (set, "color-scheme");
if (color_scheme == SYSTEM_PREFER_DARK)
sys_default_is_dark = TRUE;
g_object_unref (set);
return TRUE;
}
return FALSE;
}
static gboolean
try_dark_from_portal (void)
{
int color_scheme;
char *color_scheme_str = NULL;
GDBusProxy *settings_portal = NULL;
GVariant *gvar = NULL, *gvar2 = NULL;
gboolean retval = FALSE;
settings_portal = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
G_DBUS_PROXY_FLAGS_NONE,
NULL,
"org.freedesktop.portal.Desktop",
"/org/freedesktop/portal/desktop",
"org.freedesktop.portal.Settings",
NULL,
NULL);
if (! settings_portal)
goto out;
gvar = g_dbus_proxy_call_sync (settings_portal,
"Read",
g_variant_new ("(ss)", "org.freedesktop.appearance", "color-scheme"),
G_DBUS_CALL_FLAGS_NONE,
G_MAXINT,
NULL,
NULL);
if (gvar)
{
g_variant_get (gvar, "(v)", &gvar2);
g_variant_get (g_variant_get_variant (gvar2), "u", &color_scheme);
retval = TRUE;
goto out;
}
gvar = g_dbus_proxy_call_sync (settings_portal,
"Read",
g_variant_new ("(ss)", "org.gnome.desktop.interface", "color-scheme"),
G_DBUS_CALL_FLAGS_NONE,
G_MAXINT,
NULL,
NULL);
if (! gvar)
goto out;
g_variant_get (gvar, "(v)", &gvar2);
g_variant_get (g_variant_get_variant (gvar2), "s", &color_scheme_str);
if (color_scheme_str)
{
retval = TRUE;
if (g_strcmp0 (color_scheme_str, "prefer-dark") == 0)
color_scheme = SYSTEM_PREFER_DARK;
}
out:
if (color_scheme == SYSTEM_PREFER_DARK)
sys_default_is_dark = TRUE;
g_clear_object (&settings_portal);
g_clear_pointer (&gvar, g_variant_unref);
g_clear_pointer (&gvar2, g_variant_unref);
return retval;
}
void
get_sys_default_is_dark (void)
{
GtkSettings *gtk_settings;
gboolean got_dark_pref;
got_dark_pref = try_dark_from_portal ();
if (got_dark_pref)
return;
got_dark_pref = try_dark_from_gsettings ();
if (got_dark_pref)
return;
/* If all else fails, try to fetch from GtkSettings. */
gtk_settings = gtk_settings_get_default ();
g_object_get (gtk_settings,
"gtk-application-prefer-dark-theme", &sys_default_is_dark,
......
......@@ -121,7 +121,6 @@ create_hex_view (HexDocument *doc)
GtkWidget *gh;
gh = hex_widget_new (doc);
g_object_ref (gh);
gtk_widget_set_hexpand (gh, TRUE);
hex_widget_set_group_type (HEX_WIDGET(gh), def_group_type);
......
......@@ -1298,9 +1298,6 @@ adj_value_changed_cb (GtkAdjustment *adj, HexWidget *self)
self->top_line = gtk_adjustment_get_value (adj);
hex_widget_update_all_auto_highlights (self);
hex_widget_invalidate_all_highlights (self);
gtk_widget_queue_draw (GTK_WIDGET(self));
}
......@@ -2348,6 +2345,9 @@ hex_widget_snapshot (GtkWidget *widget, GtkSnapshot *snapshot)
else
self->vis_lines = self->default_lines;
hex_widget_update_all_auto_highlights (self);
hex_widget_invalidate_all_highlights (self);
/* queue child draw functions
*/
......
......@@ -115,6 +115,10 @@ activate (GtkApplication *app,
{
(void)user_data; /* unused */
/* WORKAROUND https://gitlab.gnome.org/GNOME/gtk/-/issues/4880 */
g_object_set (gtk_settings_get_default (), "gtk-dialogs-use-header", TRUE, NULL);
do_app_window (app);
gtk_window_set_application (window, app);
......