Skip to content
Permalink
Browse files

Add auto-detect toggle switch

Currently if a user changes the DPI, there is no way to reset it back to
the auto-detected value from Xserver (which we store as 0 in gsettings).
Adding this toggle solves that issue.

I also removed a deprecated
[GtkHandleBox](https://developer.gnome.org/gtk3/stable/GtkHandleBox.html)
and all its associated code.
  • Loading branch information...
vkareh authored and lukefromdc committed Mar 15, 2018
1 parent 9888c14 commit 48b4fc3407816ddcab6e2bd20b063b6de9746e25
@@ -473,11 +473,22 @@ dpi_load (GSettings *settings,
}

static void
dpi_changed (GSettings *settings,
gchar *key,
gpointer user_data)
dpi_changed (GSettings *settings,
gchar *key,
AppearanceData *data)
{
dpi_load (settings, user_data);
GtkWidget *spinner;
GtkWidget *toggle;
gdouble dpi;

dpi = g_settings_get_double (data->font_settings, FONT_DPI_KEY);
spinner = appearance_capplet_get_widget (data, "dpi_spinner");
toggle = appearance_capplet_get_widget (data, "dpi_reset_switch");

dpi_load (settings, GTK_SPIN_BUTTON (spinner));

gtk_switch_set_state (GTK_SWITCH (toggle), dpi == 0);
gtk_widget_set_sensitive (spinner, dpi != 0);
}

static void
@@ -490,8 +501,8 @@ monitors_changed (GdkScreen *screen,
}

static void
dpi_value_changed (GtkSpinButton *spinner,
GSettings *settings)
dpi_value_changed (GtkSpinButton *spinner,
AppearanceData *data)
{
/* Like any time when using a spin button with GSettings, there is
* a race condition here. When we change, we send the new
@@ -503,19 +514,42 @@ dpi_value_changed (GtkSpinButton *spinner,
*/
if (!in_change) {
GdkScreen *screen;
GtkWidget *toggle;
gint scale;
gdouble new_dpi;

screen = gdk_screen_get_default ();
scale = gdk_window_get_scale_factor (gdk_screen_get_root_window (screen));
new_dpi = gtk_spin_button_get_value (spinner) / (double)scale;

g_settings_set_double (settings, FONT_DPI_KEY, new_dpi);
g_settings_set_double (data->font_settings, FONT_DPI_KEY, new_dpi);

dpi_load (settings, spinner);
dpi_load (data->font_settings, spinner);

toggle = appearance_capplet_get_widget (data, "dpi_reset_switch");
gtk_switch_set_active (GTK_SWITCH (toggle), FALSE);
}
}

static gboolean
dpi_value_reset (GtkSwitch *toggle,
gboolean state,
AppearanceData *data)
{
GtkWidget *spinner;
spinner = appearance_capplet_get_widget (data, "dpi_spinner");

if (state)
g_settings_set_double (data->font_settings, FONT_DPI_KEY, 0);
else
dpi_value_changed (GTK_SPIN_BUTTON (spinner), data);

gtk_switch_set_state(toggle, state);
gtk_widget_set_sensitive (spinner, !state);

return TRUE;
}

static void
cb_details_response (GtkDialog *dialog, gint response_id)
{
@@ -532,27 +566,37 @@ cb_show_details (GtkWidget *button,
{
if (!data->font_details) {
GtkAdjustment *adjustment;
GtkWidget *widget;
GtkWidget *spinner;
GtkWidget *toggle;
EnumGroup *group;
gdouble dpi;

data->font_details = appearance_capplet_get_widget (data, "render_details");

gtk_window_set_transient_for (GTK_WINDOW (data->font_details),
GTK_WINDOW (appearance_capplet_get_widget (data, "appearance_window")));

widget = appearance_capplet_get_widget (data, "dpi_spinner");
spinner = appearance_capplet_get_widget (data, "dpi_spinner");
toggle = appearance_capplet_get_widget (data, "dpi_reset_switch");

/* Set initial state for widgets */
dpi = g_settings_get_double (data->font_settings, FONT_DPI_KEY);
gtk_switch_set_active (GTK_SWITCH (toggle), dpi == 0);
gtk_widget_set_sensitive (GTK_WIDGET (spinner), dpi != 0);

/* pick a sensible maximum dpi */
adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (widget));
adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spinner));
gtk_adjustment_set_lower (adjustment, DPI_LOW_REASONABLE_VALUE);
gtk_adjustment_set_upper (adjustment, DPI_HIGH_REASONABLE_VALUE);
gtk_adjustment_set_step_increment (adjustment, 1);

dpi_load (data->font_settings, GTK_SPIN_BUTTON (widget));
g_signal_connect (widget, "value_changed",
G_CALLBACK (dpi_value_changed), data->font_settings);
dpi_load (data->font_settings, GTK_SPIN_BUTTON (spinner));
g_signal_connect (spinner, "value-changed",
G_CALLBACK (dpi_value_changed), data);
g_signal_connect (toggle, "state-set",
G_CALLBACK (dpi_value_reset), data);

g_signal_connect (data->font_settings, "changed::" FONT_DPI_KEY, G_CALLBACK (dpi_changed), widget);
g_signal_connect (data->font_settings, "changed::" FONT_DPI_KEY, G_CALLBACK (dpi_changed), data);

/* Update font DPI when window scaling factor is changed */
g_signal_connect (gdk_screen_get_default (), "monitors-changed", G_CALLBACK (monitors_changed), data);
@@ -22,34 +22,6 @@
#include "appearance.h"
#include "stdio.h"


static void
show_handlebar (AppearanceData *data, gboolean show)
{
GtkWidget *handlebox = appearance_capplet_get_widget (data, "toolbar_handlebox");
GtkWidget *toolbar = appearance_capplet_get_widget (data, "toolbar_toolbar");
GtkWidget *align = appearance_capplet_get_widget (data, "toolbar_align");

g_object_ref (handlebox);
g_object_ref (toolbar);

if (gtk_bin_get_child (GTK_BIN (align)))
gtk_container_remove (GTK_CONTAINER (align), gtk_bin_get_child (GTK_BIN (align)));

if (gtk_bin_get_child (GTK_BIN (handlebox)))
gtk_container_remove (GTK_CONTAINER (handlebox), gtk_bin_get_child (GTK_BIN (handlebox)));

if (show) {
gtk_container_add (GTK_CONTAINER (align), handlebox);
gtk_container_add (GTK_CONTAINER (handlebox), toolbar);
g_object_unref (handlebox);
} else {
gtk_container_add (GTK_CONTAINER (align), toolbar);
}

g_object_unref (toolbar);
}

static void
set_have_icons (AppearanceData *data, gboolean value)
{
@@ -94,14 +66,6 @@ menus_have_icons_cb (GSettings *settings,
set_have_icons (data, g_settings_get_boolean (settings, key));
}

static void
toolbar_detachable_cb (GSettings *settings,
gchar *key,
AppearanceData *data)
{
show_handlebar (data, g_settings_get_boolean (settings, key));
}

/** GUI Callbacks **/

static gint
@@ -140,16 +104,4 @@ ui_init (AppearanceData *data)
set_have_icons (data,
g_settings_get_boolean (data->interface_settings,
MENU_ICONS_KEY));

g_signal_connect (appearance_capplet_get_widget (data, "toolbar_handlebox"),
"button_press_event",
(GCallback) button_press_block_cb, NULL);

show_handlebar (data,
g_settings_get_boolean (data->interface_settings,
TOOLBAR_DETACHABLE_KEY));

/* no ui for detachable toolbars */
g_signal_connect (data->interface_settings,
"changed::" TOOLBAR_DETACHABLE_KEY, (GCallback) toolbar_detachable_cb, data);
}
@@ -47,7 +47,6 @@
#define COLOR_SCHEME_KEY "gtk-color-scheme"
#define ACCEL_CHANGE_KEY "can-change-accels"
#define MENU_ICONS_KEY "menus-have-icons"
#define TOOLBAR_DETACHABLE_KEY "toolbar-detachable"
#define TOOLBAR_STYLE_KEY "toolbar-style"
#define GTK_FONT_DEFAULT_VALUE "Sans 10"

Oops, something went wrong.

0 comments on commit 48b4fc3

Please sign in to comment.
You can’t perform that action at this time.