static void sigchld(int unused);
static char *buildfile(const char *path);
static char *buildpath(const char *path);
+static const char *getuserhomedir(const char *user);
+static const char *getcurrentuserhomedir(void);
static Client *newclient(Client *c);
static void loaduri(Client *c, const Arg *a);
static const char *geturi(Client *c);
static void cleanup(void);
/* GTK/WebKit */
-static GdkDevice *getkbdevice(void);
static WebKitWebView *newview(Client *c, WebKitWebView *rv);
static GtkWidget *createview(WebKitWebView *v, WebKitNavigationAction *a,
Client *c);
void
setup(void)
{
+ GdkDisplay *gdpy;
int i, j;
/* clean up any zombies immediately */
sigchld(0);
gtk_init(NULL, NULL);
- dpy = GDK_DISPLAY_XDISPLAY(gdk_display_get_default());
+ gdpy = gdk_display_get_default();
+ dpy = GDK_DISPLAY_XDISPLAY(gdpy);
curconfig = defconfig;
scriptfile = buildfile(scriptfile);
cachedir = buildpath(cachedir);
- gdkkb = getkbdevice();
+ gdkkb = gdk_seat_get_keyboard(gdk_display_get_default_seat(gdpy));
if (!stylefile) {
styledir = buildpath(styledir);
return fpath;
}
+static const char*
+getuserhomedir(const char *user)
+{
+ struct passwd *pw = getpwnam(user);
+
+ if (!pw)
+ die("Can't get user %s login information.\n", user);
+
+ return pw->pw_dir;
+}
+
+static const char*
+getcurrentuserhomedir(void)
+{
+ const char *homedir;
+ const char *user;
+ struct passwd *pw;
+
+ homedir = getenv("HOME");
+ if (homedir)
+ return homedir;
+
+ user = getenv("USER");
+ if (user)
+ return getuserhomedir(user);
+
+ pw = getpwuid(getuid());
+ if (!pw)
+ die("Can't get current user home directory\n");
+
+ return pw->pw_dir;
+}
+
char *
buildpath(const char *path)
{
- struct passwd *pw;
char *apath, *name, *p, *fpath;
+ const char *homedir;
if (path[0] == '~') {
if (path[1] == '/' || path[1] == '\0') {
p = (char *)&path[1];
- pw = getpwuid(getuid());
+ homedir = getcurrentuserhomedir();
} else {
if ((p = strchr(path, '/')))
name = g_strndup(&path[1], --p - path);
else
name = g_strdup(&path[1]);
- if (!(pw = getpwnam(name))) {
- die("Can't get user %s home directory: %s.\n",
- name, path);
- }
+ homedir = getuserhomedir(name);
g_free(name);
}
- apath = g_build_filename(pw->pw_dir, p, NULL);
+ apath = g_build_filename(homedir, p, NULL);
} else {
apath = g_strdup(path);
}
if (g_strcmp0(uri, "") == 0)
return;
- if (g_strrstr(uri, "://") || g_str_has_prefix(uri, "about:")) {
+ if (g_str_has_prefix(uri, "http://") ||
+ g_str_has_prefix(uri, "https://") ||
+ g_str_has_prefix(uri, "file://") ||
+ g_str_has_prefix(uri, "about:")) {
url = g_strdup(uri);
} else if (!stat(uri, &st) && (path = realpath(uri, NULL))) {
url = g_strdup_printf("file://%s", path);
g_free(cachedir);
}
-static GdkDevice *
-getkbdevice(void)
-{
- GList *l, *gdl = gdk_device_manager_list_devices(
- gdk_display_get_device_manager(gdk_display_get_default()),
- GDK_DEVICE_TYPE_MASTER);
- GdkDevice *gd = NULL;
-
- for (l = gdl; l != NULL; l = l->next)
- if (gdk_device_get_source(l->data) == GDK_SOURCE_KEYBOARD)
- gd = l->data;
-
- g_list_free(gdl);
- return gd;
-}
-
WebKitWebView *
newview(Client *c, WebKitWebView *rv)
{