Default font: more fine tuning

In order to get rid of the old default font on Windows (Calibri) we are
going to near ridiculous length. The reason for this is that we in the
past always saved the default font in the settings (how stupid was that!)
and so now even with a new default font in place, since there is an
explicit font in the settings we take that instead of the default.

Instead of requiring our existing users to use a registry cleaner to get
the correct default font on Windows 7 and later (the VAST majority of our
Windows users at this stage), we simply explicitly ignore that old default
font.

There is one very nasty side effect. A user cannot set Calibri as their
font of choice on Windows 7 or later (because we always force them back
onto Segoe). Given how much nicer Segoe looks I think this is an
acceptable flaw - let's hope this doesn't come back to bite me in the
future.

At the same time this changes the default font size handling. We try to
get the default font size of the OS so the app looks "right". This seems
to not give me the expected result on Linux with KDE, but maybe I'm doing
it wrong? Looks good when testing on Windows.

See #712

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Dirk Hohndel 2014-08-27 06:00:10 -07:00
parent 113ccc18cd
commit 9aca309611
6 changed files with 53 additions and 12 deletions

View file

@ -13,13 +13,19 @@ extern "C" {
const char android_system_divelist_default_font[] = "Roboto"; const char android_system_divelist_default_font[] = "Roboto";
const char *system_divelist_default_font = android_system_divelist_default_font; const char *system_divelist_default_font = android_system_divelist_default_font;
const int system_divelist_default_font_size = 8; double system_divelist_default_font_size = 8.0;
void subsurface_OS_pref_setup(void) void subsurface_OS_pref_setup(void)
{ {
// nothing // nothing
} }
bool subsurface_ignore_font(const char *font)
{
// there are no old default fonts that we would want to ignore
return false;
}
const char *system_default_filename(void) const char *system_default_filename(void)
{ {
/* Replace this when QtCore/QStandardPaths getExternalStorageDirectory landed */ /* Replace this when QtCore/QStandardPaths getExternalStorageDirectory landed */

View file

@ -12,15 +12,22 @@
#include <unistd.h> #include <unistd.h>
#include <pwd.h> #include <pwd.h>
// the DE should provide us with a default font and font size...
const char linux_system_divelist_default_font[] = "Sans"; const char linux_system_divelist_default_font[] = "Sans";
const char *system_divelist_default_font = linux_system_divelist_default_font; const char *system_divelist_default_font = linux_system_divelist_default_font;
const int system_divelist_default_font_size = 8; double system_divelist_default_font_size = -1.0;
void subsurface_OS_pref_setup(void) void subsurface_OS_pref_setup(void)
{ {
// nothing // nothing
} }
bool subsurface_ignore_font(const char *font)
{
// there are no old default fonts to ignore
return false;
}
void subsurface_user_info(struct user_info *user) void subsurface_user_info(struct user_info *user)
{ {
struct passwd *pwd = getpwuid(getuid()); struct passwd *pwd = getpwuid(getuid());

View file

@ -30,13 +30,19 @@ void subsurface_user_info(struct user_info *info)
const char mac_system_divelist_default_font[] = "Arial"; const char mac_system_divelist_default_font[] = "Arial";
const char *system_divelist_default_font = mac_system_divelist_default_font; const char *system_divelist_default_font = mac_system_divelist_default_font;
const int system_divelist_default_font_size = 10; double system_divelist_default_font_size = -1.0;
void subsurface_OS_pref_setup(void) void subsurface_OS_pref_setup(void)
{ {
// nothing // nothing
} }
bool subsurface_ignore_font(const char *font)
{
// there are no old default fonts to ignore
return false;
}
const char *system_default_filename(void) const char *system_default_filename(void)
{ {
const char *home, *user; const char *home, *user;

3
pref.h
View file

@ -80,8 +80,9 @@ extern struct preferences prefs, default_prefs;
#define PP_GRAPHS_ENABLED (prefs.pp_graphs.po2 || prefs.pp_graphs.pn2 || prefs.pp_graphs.phe) #define PP_GRAPHS_ENABLED (prefs.pp_graphs.po2 || prefs.pp_graphs.pn2 || prefs.pp_graphs.phe)
extern const char *system_divelist_default_font; extern const char *system_divelist_default_font;
extern const int system_divelist_default_font_size; extern double system_divelist_default_font_size;
extern const char *system_default_filename(); extern const char *system_default_filename();
extern bool subsurface_ignore_font(const char *font);
extern void subsurface_OS_pref_setup(); extern void subsurface_OS_pref_setup();
#ifdef __cplusplus #ifdef __cplusplus

View file

@ -333,14 +333,26 @@ void PreferencesDialog::loadSettings()
s.endGroup(); s.endGroup();
s.beginGroup("Display"); s.beginGroup("Display");
QFont defaultFont = s.value("divelist_font", qApp->font()).value<QFont>(); // get the font from the settings or our defaults
defaultFont.setPointSizeF(s.value("font_size", qApp->font().pointSizeF()).toFloat()); // respect the system default font size if none is explicitly set
QFont defaultFont = s.value("divelist_font", prefs.divelist_font).value<QFont>();
if (IS_FP_SAME(system_divelist_default_font_size, -1.0)) {
prefs.font_size = qApp->font().pointSizeF();
system_divelist_default_font_size = prefs.font_size; // this way we don't save it on exit
}
prefs.font_size = s.value("font_size", prefs.font_size).toFloat();
// painful effort to ignore previous default fonts on Windows - ridiculous
QString fontName = defaultFont.toString();
if (fontName.contains(","))
fontName = fontName.left(fontName.indexOf(","));
if (subsurface_ignore_font(fontName.toUtf8().constData())) {
defaultFont = QFont(prefs.divelist_font);
} else {
free((void *)prefs.divelist_font);
prefs.divelist_font = strdup(fontName.toUtf8().constData());
}
defaultFont.setPointSizeF(prefs.font_size);
qApp->setFont(defaultFont); qApp->setFont(defaultFont);
GET_TXT("divelist_font", divelist_font);
GET_INT("font_size", font_size);
if (prefs.font_size < 0)
prefs.font_size = defaultFont.pointSizeF();
GET_INT("displayinvalid", display_invalid_dives); GET_INT("displayinvalid", display_invalid_dives);
s.endGroup(); s.endGroup();

View file

@ -15,7 +15,7 @@
const char non_standard_system_divelist_default_font[] = "Calibri"; const char non_standard_system_divelist_default_font[] = "Calibri";
const char current_system_divelist_default_font[] = "Segoe UI"; const char current_system_divelist_default_font[] = "Segoe UI";
const char *system_divelist_default_font = non_standard_system_divelist_default_font; const char *system_divelist_default_font = non_standard_system_divelist_default_font;
const int system_divelist_default_font_size = 9; double system_divelist_default_font_size = -1;
void subsurface_user(struct user_info *user) void subsurface_user(struct user_info *user)
{ /* Encourage use of at least libgit2-0.20 */ } { /* Encourage use of at least libgit2-0.20 */ }
@ -28,6 +28,15 @@ void subsurface_OS_pref_setup(void)
system_divelist_default_font = current_system_divelist_default_font; system_divelist_default_font = current_system_divelist_default_font;
} }
bool subsurface_ignore_font(const char *font)
{
// if this is running on a recent enough version of Windows and the font
// passed in is the pre 4.3 default font, ignore it
if (isWin7Or8() && strcmp(font, non_standard_system_divelist_default_font) == 0)
return true;
return false;
}
const char *system_default_filename(void) const char *system_default_filename(void)
{ {
char datapath[MAX_PATH]; char datapath[MAX_PATH];