[geany/geany-osx] 4edda2: Create a config file and make various things configurable
Jiří Techet
git-noreply at xxxxx
Sat Oct 26 21:37:21 UTC 2019
Branch: refs/heads/master
Author: Jiří Techet <techet at gmail.com>
Committer: Jiří Techet <techet at gmail.com>
Date: Sat, 26 Oct 2019 21:37:21 UTC
Commit: 4edda2adf7a2a4031d903ddc8ebe2931bf8cb8f2
https://github.com/geany/geany-osx/commit/4edda2adf7a2a4031d903ddc8ebe2931bf8cb8f2
Log Message:
-----------
Create a config file and make various things configurable
Modified Paths:
--------------
LauncherGtk3/geany/geany/main.m
Modified: LauncherGtk3/geany/geany/main.m
150 lines changed, 138 insertions(+), 12 deletions(-)
===================================================================
@@ -8,12 +8,122 @@
#include <dlfcn.h>
#include <limits.h>
-static NSString *get_locale(NSString *bundle_share) {
- NSString *fallback = @"en_US.UTF-8";
+#define GEANY_CONFIG_DIR [@"~/.config/geany" stringByExpandingTildeInPath]
+#define CONFIG_FILE [GEANY_CONFIG_DIR stringByAppendingPathComponent: @"geany_mac.conf"]
+
+#define THEME_KEY @"theme"
+#define LOCALE_KEY @"locale"
+#define IM_MODULE_KEY @"im_module"
+
+
+ at interface ConfigValue : NSObject
+
+ at property (nonatomic, copy) NSString *value;
+ at property (nonatomic, copy) NSString *desc;
+ at property (nonatomic, assign) BOOL present;
+
++ (ConfigValue *) valueWithDefault:(NSString *)deflt comment:(NSString *)comment;
+
+ at end
+
+ at implementation ConfigValue
+
++ valueWithDefault:(NSString *)deflt comment:(NSString *)comment {
+ ConfigValue *val = [[ConfigValue alloc] init];
+ val.value = deflt;
+ val.desc = comment;
+ val.present = NO;
+ return val;
+}
+
+ at end
+
+
+NSDictionary<NSString *, ConfigValue *> *config = nil;
+
+
+static void read_config() {
+ NSString *file = [NSString stringWithContentsOfFile:CONFIG_FILE encoding:NSUTF8StringEncoding error:nil];
+ if (file == nil) {
+ return;
+ }
+ NSArray<NSString *> *lines = [file componentsSeparatedByCharactersInSet: [NSCharacterSet newlineCharacterSet]];
+ for (NSString *line in lines) {
+ NSString *trimmed = [line stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
+ NSArray<NSString *> *key_value = [trimmed componentsSeparatedByString: @"="];
+ if (key_value.count != 2) {
+ continue;
+ }
+ NSString *key = [key_value[0] lowercaseString];
+ if (config[key] != nil) {
+ config[key].value = key_value[1];
+ config[key].present = YES;
+ }
+ }
+}
+
+
+static BOOL write_to_file(NSString *content, NSString *path) {
+ NSFileManager *fileManager = [NSFileManager defaultManager];
+ [fileManager createDirectoryAtPath:[path stringByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:nil];
+ NSError *err = nil;
+ BOOL success = [content writeToFile:path atomically:NO encoding:NSUTF8StringEncoding
+ error:&err];
+ if (!success) {
+ NSLog(@"Failed to write config file into %@: %@", path, err.localizedDescription);
+ }
+ return success;
+}
+
+
+static void write_config_if_needed() {
+ BOOL update_config = NO;
+ for (NSString *key in config) {
+ if (!config[key].present) {
+ update_config = YES;
+ break;
+ }
+ }
+ if (!update_config) {
+ return;
+ }
- BOOL ignore_locale = [[NSFileManager defaultManager] fileExistsAtPath: [@"~/.config/geany/ignore_locale" stringByExpandingTildeInPath]];
- if (ignore_locale) {
- return fallback;
+ NSMutableString *configFile = [[NSMutableString alloc] init];
+ [configFile appendString:@"[Settings]\n"];
+ for (NSString *key in config) {
+ [configFile appendFormat:@"# %@\n", config[key].desc];
+ [configFile appendFormat:@"%@=%@\n", key, config[key].value];
+ }
+
+ write_to_file(configFile, CONFIG_FILE);
+}
+
+
+static BOOL write_gtk_config() {
+ BOOL light = YES;
+ NSString *theme = config[THEME_KEY].value;
+ if ([theme isEqualToString:@"1"]) {
+ light = YES;
+ }
+ else if ([theme isEqualToString:@"2"]) {
+ light = NO;
+ }
+ else {
+ NSString *val = [[NSUserDefaults standardUserDefaults] stringForKey:@"AppleInterfaceStyle"];
+ if (val != nil) {
+ light = [[val lowercaseString] isEqualToString:@"light"];
+ }
+ }
+
+ NSString *gtk_config = [NSString stringWithFormat: @"[Settings]\ngtk-application-prefer-dark-theme=%@\ngtk-icon-theme-name=%@\n", light ? @"0" : @"1", light ? @"Papirus" : @"Papirus-Dark"];
+
+ return write_to_file(gtk_config, [GEANY_CONFIG_DIR stringByAppendingPathComponent: @"gtk-3.0/settings.ini"]);
+}
+
+
+static NSString *get_locale(NSString *bundle_share) {
+ if (config[LOCALE_KEY].value.length > 0) {
+ return config[LOCALE_KEY].value;
}
NSArray<NSString *> *langs = [NSLocale preferredLanguages];
@@ -39,7 +149,7 @@
}
}
- return fallback;
+ return @"en_US.UTF-8";
}
@@ -65,8 +175,17 @@ static int fill_argv_array(const char *arr[], NSArray<NSString *> *array) {
static int run_geany() {
- NSString *bundle_dir = [[NSBundle mainBundle] bundlePath];
+ config = @{
+ THEME_KEY: [ConfigValue valueWithDefault:@"0" comment:@"0: automatic selection based on system settings (requires Geany restart when changed); 1: light; 2: dark"],
+ LOCALE_KEY: [ConfigValue valueWithDefault:@"" comment:@"no value: autodetect; locale string: locale to be used (e.g. en_US.UTF-8)"],
+ IM_MODULE_KEY: [ConfigValue valueWithDefault:@"" comment:@"no value: don't use any IM module; module name: use the specified module, e.g. quartz for native macOS behavior (slightly buggy so not enabled by default), for complete list of modules see Geany.app/Contents/Resources/lib/gtk-3.0/3.0.0/immodules, use without the 'im-' prefix"],
+ };
+
+ read_config();
+ write_config_if_needed();
+ BOOL have_gtk_config = write_gtk_config();
+ NSString *bundle_dir = [[NSBundle mainBundle] bundlePath];
NSString *bundle_resources = [bundle_dir stringByAppendingPathComponent: @"Contents/Resources"];
NSString *bundle_lib = [bundle_resources stringByAppendingPathComponent: @"lib"];
NSString *bundle_share = [bundle_resources stringByAppendingPathComponent: @"share"];
@@ -76,17 +195,15 @@ static int run_geany() {
//set environment variables
//see https://developer.gnome.org/gtk3/stable/gtk-running.html
- NSDictionary<NSString *, NSString *> *env = @{
- @"XDG_CONFIG_DIRS": bundle_etc,
+ NSMutableDictionary<NSString *, NSString *> *env = [@{
+ @"XDG_CONFIG_DIRS": have_gtk_config ? GEANY_CONFIG_DIR : bundle_etc,
@"XDG_DATA_DIRS": bundle_share,
@"GIO_MODULE_DIR": [bundle_lib stringByAppendingPathComponent: @"gio/modules"],
@"GTK_PATH": bundle_resources,
@"GTK_EXE_PREFIX": bundle_resources,
@"GTK_DATA_PREFIX": bundle_resources,
- @"GTK_IM_MODULE": @"quartz",
- @"GTK_IM_MODULE_FILE": [bundle_lib stringByAppendingPathComponent: @"gtk-3.0/3.0.0/immodules.cache"],
@"GDK_PIXBUF_MODULE_FILE": [bundle_lib stringByAppendingPathComponent: @"gdk-pixbuf-2.0/2.10.0/loaders.cache"],
@"LANG": lang,
@@ -100,7 +217,16 @@ static int run_geany() {
//patched in https://gitlab.gnome.org/GNOME/gtk-osx/blob/master/patches/enchant-env.patch
@"ENCHANT_MODULE_PATH": [bundle_lib stringByAppendingPathComponent: @"enchant"],
- };
+ } mutableCopy];
+
+ if (config[IM_MODULE_KEY].value.length > 0) {
+ env[@"GTK_IM_MODULE"] = config[IM_MODULE_KEY].value;
+ env[@"GTK_IM_MODULE_FILE"] = [bundle_lib stringByAppendingPathComponent: @"gtk-3.0/3.0.0/immodules.cache"];
+ }
+ else {
+ //point to an invalid path so no IM module is loaded
+ env[@"GTK_IM_MODULE_FILE"] = [bundle_lib stringByAppendingPathComponent: @"gtk-3.0/3.0.0/immodules.cache1"];
+ }
//set binary name and command line arguments
NSMutableArray<NSString *> *args = [NSProcessInfo.processInfo.arguments mutableCopy];
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
More information about the Commits
mailing list