X-Git-Url: http://git.maemo.org/git/?p=browser-switch;a=blobdiff_plain;f=launcher.c;h=fe57eb94b7640de4f80443d340d5b02101e3871b;hp=b01b48b030fe7861900b7dcb05c4c5e7dbbf8b48;hb=7bfa2858f0a4c938bf4c9ad205f67e96052aff6e;hpb=bf130a22e50fa0de2a13485016635a90a3b0861a diff --git a/launcher.c b/launcher.c index b01b48b..fe57eb9 100644 --- a/launcher.c +++ b/launcher.c @@ -51,6 +51,7 @@ struct browser_launcher { char *name; void (*launcher)(struct swb_context *, char *); char *other_browser_cmd; + char *binary; }; #ifdef FREMANTLE @@ -602,35 +603,14 @@ static void launch_other_browser(struct swb_context *ctx, char *uri) { /* The list of known browsers and how to launch them */ static struct browser_launcher browser_launchers[] = { - { "microb", launch_microb, NULL }, /* First entry is the default! */ - { "tear", launch_tear, NULL }, - { "fennec", NULL, "fennec %s" }, - { "opera", NULL, "opera %s" }, - { "midori", NULL, "midori %s" }, - { NULL, NULL, NULL }, + { "microb", launch_microb, NULL, NULL }, /* First entry is the default! */ + { "tear", launch_tear, NULL, "/usr/bin/tear" }, + { "fennec", NULL, "fennec %s", "/usr/bin/fennec" }, + { "opera", NULL, "opera %s", "/usr/bin/opera" }, + { "midori", NULL, "midori %s", "/usr/bin/midori" }, + { NULL, NULL, NULL, NULL }, }; -/* Use launch_other_browser as the default browser launcher, with the string - passed in as the other_browser_cmd - Resulting other_browser_cmd is always safe to free(), even if a pointer - to a string constant is passed in */ -static void use_other_browser_cmd(struct swb_context *ctx, char *cmd) { - size_t len = strlen(cmd); - - free(ctx->other_browser_cmd); - ctx->other_browser_cmd = calloc(len+1, sizeof(char)); - if (!ctx->other_browser_cmd) { - log_msg("malloc failed!\n"); - /* Ideally, we'd configure the built-in default here -- but - it's possible we could be called in that path */ - exit(1); - } else { - ctx->other_browser_cmd = strncpy(ctx->other_browser_cmd, - cmd, len+1); - ctx->default_browser_launcher = launch_other_browser; - } -} - static void use_launcher_as_default(struct swb_context *ctx, struct browser_launcher *browser) { if (!ctx || !browser) @@ -638,8 +618,20 @@ static void use_launcher_as_default(struct swb_context *ctx, if (browser->launcher) ctx->default_browser_launcher = browser->launcher; - else if (browser->other_browser_cmd) - use_other_browser_cmd(ctx, browser->other_browser_cmd); + else if (browser->other_browser_cmd) { + free(ctx->other_browser_cmd); + + /* Make a copy of the string constant so that + ctx->other_browser_cmd is safe to free() */ + ctx->other_browser_cmd = strdup(browser->other_browser_cmd); + if (!ctx->other_browser_cmd) { + log_msg("malloc failed!\n"); + /* Ideally, we'd configure the built-in default here -- + but it's possible we could be called in that path */ + exit(1); + } else + ctx->default_browser_launcher = launch_other_browser; + } return; } @@ -662,8 +654,15 @@ void update_default_browser(struct swb_context *ctx, char *default_browser) { it matches */ for (browser = browser_launchers; browser->name; ++browser) if (!strcmp(default_browser, browser->name)) { - use_launcher_as_default(ctx, browser); - return; + /* Make sure the user's choice is installed on the + system */ + if (browser->binary && access(browser->binary, X_OK)) { + log_msg("%s appears not to be installed\n", + default_browser); + } else { + use_launcher_as_default(ctx, browser); + return; + } } /* Deal with default_browser = "other" */