diff options
Diffstat (limited to 'frontends/windows/main.c')
-rw-r--r-- | frontends/windows/main.c | 207 |
1 files changed, 146 insertions, 61 deletions
diff --git a/frontends/windows/main.c b/frontends/windows/main.c index a3a7c2b39..c051f446c 100644 --- a/frontends/windows/main.c +++ b/frontends/windows/main.c @@ -34,6 +34,7 @@ #include "utils/nsoption.h" #include "netsurf/url_db.h" #include "netsurf/cookie_db.h" +#include "netsurf/browser.h" #include "netsurf/browser_window.h" #include "netsurf/fetch.h" #include "netsurf/misc.h" @@ -42,22 +43,40 @@ #include "windows/findfile.h" #include "windows/file.h" +#include "windows/cookies.h" #include "windows/drawable.h" #include "windows/corewindow.h" -#include "windows/ssl_cert.h" #include "windows/download.h" #include "windows/local_history.h" #include "windows/window.h" #include "windows/schedule.h" #include "windows/font.h" -#include "windows/filetype.h" +#include "windows/fetch.h" #include "windows/pointers.h" #include "windows/bitmap.h" +#include "windows/clipboard.h" #include "windows/gui.h" -static char **respaths; /** resource search path vector. */ -char *nsw32_config_home; /* exported global defined in windows/gui.h */ +/** + * Obtain the DPI of the display. + * + * \return The DPI of the device the window is displayed on. + */ +static int get_screen_dpi(void) +{ + HDC screendc = GetDC(0); + int dpi = GetDeviceCaps(screendc, LOGPIXELSY); + ReleaseDC(0, screendc); + + if (dpi <= 10) { + dpi = 96; /* 96DPI is the default */ + } + + NSLOG(netsurf, INFO, "FIX DPI %d", dpi); + + return dpi; +} /** * Get the path to the config directory. @@ -118,15 +137,6 @@ static void die(const char *error) } -static nsurl *gui_get_resource_url(const char *path) -{ - char buf[PATH_MAX]; - nsurl *url = NULL; - - netsurf_path_to_nsurl(filepath_sfind(respaths, buf, path), &url); - - return url; -} /** * Ensures output logging stream is available @@ -134,7 +144,7 @@ static nsurl *gui_get_resource_url(const char *path) static bool nslog_ensure(FILE *fptr) { /* mwindows compile flag normally invalidates standard io unless - * already redirected + * already redirected */ if (_get_osfhandle(fileno(fptr)) == -1) { AllocConsole(); @@ -180,6 +190,11 @@ static nserror set_defaults(struct nsoption_s *defaults) &ptr); if (res_len > 0) { nsoption_setnull_charp(ca_bundle, strdup(buf)); + } else { + ptr = filepath_sfind(G_resource_pathv, buf, "ca-bundle.crt"); + if (ptr != NULL) { + nsoption_setnull_charp(ca_bundle, strdup(buf)); + } } @@ -205,34 +220,34 @@ static nserror set_defaults(struct nsoption_s *defaults) } free(buf); - + /* ensure homepage option has a default */ nsoption_setnull_charp(homepage_url, strdup(NETSURF_HOMEPAGE)); /* cookie file default */ fname = NULL; - netsurf_mkpath(&fname, NULL, 2, nsw32_config_home, "Cookies"); + netsurf_mkpath(&fname, NULL, 2, G_config_path, "Cookies"); if (fname != NULL) { nsoption_setnull_charp(cookie_file, fname); } /* cookie jar default */ fname = NULL; - netsurf_mkpath(&fname, NULL, 2, nsw32_config_home, "Cookies"); + netsurf_mkpath(&fname, NULL, 2, G_config_path, "Cookies"); if (fname != NULL) { nsoption_setnull_charp(cookie_jar, fname); } /* url database default */ fname = NULL; - netsurf_mkpath(&fname, NULL, 2, nsw32_config_home, "URLs"); + netsurf_mkpath(&fname, NULL, 2, G_config_path, "URLs"); if (fname != NULL) { nsoption_setnull_charp(url_file, fname); } /* bookmark database default */ fname = NULL; - netsurf_mkpath(&fname, NULL, 2, nsw32_config_home, "Hotlist"); + netsurf_mkpath(&fname, NULL, 2, G_config_path, "Hotlist"); if (fname != NULL) { nsoption_setnull_charp(hotlist_path, fname); } @@ -244,11 +259,16 @@ static nserror set_defaults(struct nsoption_s *defaults) /** * Initialise user options location and contents */ -static nserror nsw32_option_init(int *pargc, char** argv) +static nserror +nsw32_option_init(int *pargc, char** argv, char **respaths, char *config_path) { nserror ret; char *choices = NULL; + /* set the globals that will be used in the set_defaults() callback */ + G_resource_pathv = respaths; + G_config_path = config_path; + /* user options setup */ ret = nsoption_init(set_defaults, &nsoptions, &nsoptions_default); if (ret != NSERROR_OK) { @@ -256,7 +276,7 @@ static nserror nsw32_option_init(int *pargc, char** argv) } /* Attempt to load the user choices */ - ret = netsurf_mkpath(&choices, NULL, 2, nsw32_config_home, "Choices"); + ret = netsurf_mkpath(&choices, NULL, 2, config_path, "Choices"); if (ret == NSERROR_OK) { nsoption_read(choices, nsoptions); free(choices); @@ -268,11 +288,90 @@ static nserror nsw32_option_init(int *pargc, char** argv) return NSERROR_OK; } +/** + * Initialise messages + */ +static nserror nsw32_messages_init(char **respaths) +{ + char *messages; + nserror res; + const uint8_t *data; + size_t data_size; + + res = nsw32_get_resource_data("messages", &data, &data_size); + if (res == NSERROR_OK) { + res = messages_add_from_inline(data, data_size); + } else { + /* Obtain path to messages */ + messages = filepath_find(respaths, "messages"); + if (messages == NULL) { + res = NSERROR_NOT_FOUND; + } else { + res = messages_add_from_file(messages); + free(messages); + } + } + + return res; +} + + +/** + * Construct a unix style argc/argv + * + * \param argc_out number of commandline arguments + * \param argv_out string vector of command line arguments + * \return NSERROR_OK on success else error code + */ +static nserror win32_to_unix_commandline(int *argc_out, char ***argv_out) +{ + int argc = 0; + char **argv; + int cura; + LPWSTR *argvw; + size_t len; + + argvw = CommandLineToArgvW(GetCommandLineW(), &argc); + if (argvw == NULL) { + return NSERROR_INVALID; + } + + argv = malloc(sizeof(char *) * argc); + if (argv == NULL) { + return NSERROR_NOMEM; + } + + for (cura = 0; cura < argc; cura++) { + + len = wcstombs(NULL, argvw[cura], 0) + 1; + if (len > 0) { + argv[cura] = malloc(len); + if (argv[cura] == NULL) { + free(argv); + return NSERROR_NOMEM; + } + } else { + free(argv); + return NSERROR_INVALID; + } + + wcstombs(argv[cura], argvw[cura], len); + /* alter windows-style forward slash flags to hyphen flags. */ + if (argv[cura][0] == '/') { + argv[cura][0] = '-'; + } + } + + *argc_out = argc; + *argv_out = argv; + + return NSERROR_OK; +} + static struct gui_misc_table win32_misc_table = { .schedule = win32_schedule, - .warning = win32_warning, - .cert_verify = nsw32_cert_verify, + .present_cookies = nsw32_cookies_present, }; /** @@ -281,11 +380,10 @@ static struct gui_misc_table win32_misc_table = { int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hLastInstance, LPSTR lpcli, int ncmd) { - char **argv = NULL; - int argc = 0, argctemp = 0; - size_t len; - LPWSTR *argvw; - char *messages; + int argc; + char **argv; + char **respaths; + char *nsw32_config_home = NULL; nserror ret; const char *addr; nsurl *url; @@ -300,7 +398,6 @@ WinMain(HINSTANCE hInstance, HINSTANCE hLastInstance, LPSTR lpcli, int ncmd) .bitmap = win32_bitmap_table, .layout = win32_layout_table, }; - win32_fetch_table->get_resource_url = gui_get_resource_url; ret = netsurf_register(&win32_table); if (ret != NSERROR_OK) { @@ -312,56 +409,43 @@ WinMain(HINSTANCE hInstance, HINSTANCE hLastInstance, LPSTR lpcli, int ncmd) setbuf(stderr, NULL); - /* Construct a unix style argc/argv */ - if (SLEN(lpcli) > 0) { - argvw = CommandLineToArgvW(GetCommandLineW(), &argc); - } - - argv = malloc(sizeof(char *) * argc); - while (argctemp < argc) { - len = wcstombs(NULL, argvw[argctemp], 0) + 1; - if (len > 0) { - argv[argctemp] = malloc(len); - } - - if (argv[argctemp] != NULL) { - wcstombs(argv[argctemp], argvw[argctemp], len); - /* alter windows-style forward slash flags to - * hyphen flags. - */ - if (argv[argctemp][0] == '/') - argv[argctemp][0] = '-'; - } - argctemp++; + ret = win32_to_unix_commandline(&argc, &argv); + if (ret != NSERROR_OK) { + /* no log as logging requires this for initialisation */ + return 1; } /* initialise logging - not fatal if it fails but not much we - * can do about it + * can do about it */ nslog_init(nslog_ensure, &argc, argv); + /* build resource path string vector */ + respaths = nsws_init_resource("${APPDATA}\\NetSurf:${PROGRAMFILES}\\NetSurf\\NetSurf\\:"NETSURF_WINDOWS_RESPATH); + /* Locate the correct user configuration directory path */ ret = get_config_home(&nsw32_config_home); if (ret != NSERROR_OK) { NSLOG(netsurf, INFO, "Unable to locate a configuration directory."); - nsw32_config_home = NULL; } /* Initialise user options */ - ret = nsw32_option_init(&argc, argv); + ret = nsw32_option_init(&argc, argv, respaths, nsw32_config_home); if (ret != NSERROR_OK) { - NSLOG(netsurf, INFO, "Options failed to initialise (%s)\n", + NSLOG(netsurf, ERROR, "Options failed to initialise (%s)\n", messages_get_errorcode(ret)); return 1; } - respaths = nsws_init_resource("${APPDATA}\\NetSurf:${HOME}\\.netsurf:${NETSURFRES}:${PROGRAMFILES}\\NetSurf\\NetSurf\\:"NETSURF_WINDOWS_RESPATH); - - /* message init */ - messages = filepath_find(respaths, "messages"); - messages_add_from_file(messages); - free(messages); + /* Initialise translated messages */ + ret = nsw32_messages_init(respaths); + if (ret != NSERROR_OK) { + fprintf(stderr, "Unable to load translated messages (%s)\n", + messages_get_errorcode(ret)); + NSLOG(netsurf, INFO, "Unable to load translated messages"); + /** \todo decide if message load faliure should be fatal */ + } /* common initialisation */ ret = netsurf_init(NULL); @@ -370,6 +454,8 @@ WinMain(HINSTANCE hInstance, HINSTANCE hLastInstance, LPSTR lpcli, int ncmd) return 1; } + browser_set_dpi(get_screen_dpi()); + urldb_load(nsoption_charp(url_file)); urldb_load_cookies(nsoption_charp(cookie_file)); hotlist_init(nsoption_charp(hotlist_path), @@ -378,7 +464,6 @@ WinMain(HINSTANCE hInstance, HINSTANCE hLastInstance, LPSTR lpcli, int ncmd) ret = nsws_create_main_class(hInstance); ret = nsws_create_drawable_class(hInstance); ret = nsw32_create_corewindow_class(hInstance); - ret = nsws_create_cert_verify_class(hInstance); nsoption_set_bool(target_blank, false); |