#include "launcher.h"
#include "dbus-server-bindings.h"
-#define LAUNCH_DEFAULT_BROWSER launch_tear
+#define LAUNCH_DEFAULT_BROWSER launch_microb
static void launch_tear(struct swb_context *ctx, char *uri) {
int status;
printf("launch_tear with uri '%s'\n", uri);
+ /* We should be able to just call the D-Bus service to open Tear ...
+ but if Tear's not open, that cuases D-Bus to star Tear and then pass
+ it the OpenAddress call, which results in two browser windows.
+ Properly fixing this probably requires Tear to provide a D-Bus
+ method that opens an address in an existing window, but for now work
+ around by just invoking Tear with exec() if it's not running. */
status = system("pidof tear > /dev/null");
if (WIFEXITED(status) && !WEXITSTATUS(status)) {
if (!tear_proxy)
if (!uri)
uri = "new_window";
+ printf("launch_microb with uri '%s'\n", uri);
+
+ /* Launch browserd if it's not running */
status = system("pidof /usr/sbin/browserd > /dev/null");
if (WIFEXITED(status) && WEXITSTATUS(status)) {
kill_browserd = 1;
system("/usr/sbin/browserd -d");
}
+ /* Release the osso_browser D-Bus name so that MicroB can take it */
dbus_release_osso_browser_name(ctx);
if ((pid = fork()) == -1) {
waitpid(pid, &status, 0);
} else {
/* Child process */
+ /* exec maemo-invoker directly instead of relying on the
+ /usr/bin/browser symlink, since /usr/bin/browser may have
+ been replaced with a shell script calling us via D-Bus */
if (!strcmp(uri, "new_window")) {
execl("/usr/bin/maemo-invoker",
"browser", (char *)NULL);
}
}
+ /* Kill off browserd if we started it */
if (kill_browserd)
system("kill `pidof /usr/sbin/browserd`");
if (!uri || !strcmp(uri, "new_window"))
uri = "";
- urilen = strlen(uri);
- if (urilen > 0) {
- /* Quote the URI */
+
+ printf("launch_other_browser with uri '%s'\n", uri);
+
+ if ((urilen = strlen(uri)) > 0) {
+ /* Quote the URI to prevent the shell from interpreting it */
/* urilen+3 = length of URI + 2x \' + \0 */
if (!(quoted_uri = calloc(urilen+3, sizeof(char))))
exit(1);
execl("/bin/sh", "/bin/sh", "-c", command, (char *)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);
return;
if (!default_browser) {
+ /* No default_browser configured -- use built-in default */
ctx->default_browser_launcher = LAUNCH_DEFAULT_BROWSER;
return;
}
else if (!strcmp(default_browser, "microb"))
ctx->default_browser_launcher = launch_microb;
else if (!strcmp(default_browser, "fennec"))
+ /* Cheat and reuse launch_other_browser, since we don't appear
+ to need to do anything special */
use_other_browser_cmd(ctx, "fennec %s");
else if (!strcmp(default_browser, "midori"))
use_other_browser_cmd(ctx, "midori %s");