mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-30 22:20:21 +00:00
678fffdcf4
Opening URI addresses from Subsurface does not work on Windows using the latest GTK bundle from the Gnome website. The reason lies in GIO and GLib and how it obtains assigned applications for protocols and MIME types. While gtk_show_uri() should be viable for both linux.c and macos.c, in windows.c ShellExecute() is used, which provides proper support for the URI calls. subsurface_launch_for_uri() returns TRUE on success. Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
190 lines
3.9 KiB
C
190 lines
3.9 KiB
C
/* linux.c */
|
|
/* implements Linux specific functions */
|
|
#include "dive.h"
|
|
#include "display-gtk.h"
|
|
#include <gconf/gconf-client.h>
|
|
#include <string.h>
|
|
|
|
const char system_divelist_default_font[] = "Sans 8";
|
|
|
|
GConfClient *gconf;
|
|
|
|
static char *gconf_name(char *name)
|
|
{
|
|
static char buf[255] = "/apps/subsurface/";
|
|
|
|
snprintf(buf, 255, "/apps/subsurface/%s", name);
|
|
|
|
return buf;
|
|
}
|
|
|
|
void subsurface_open_conf(void)
|
|
{
|
|
gconf = gconf_client_get_default();
|
|
}
|
|
|
|
void subsurface_unset_conf(char *name)
|
|
{
|
|
gconf_client_unset(gconf, gconf_name(name), NULL);
|
|
}
|
|
|
|
void subsurface_set_conf(char *name, const char *value)
|
|
{
|
|
gconf_client_set_string(gconf, gconf_name(name), value, NULL);
|
|
}
|
|
|
|
void subsurface_set_conf_bool(char *name, int value)
|
|
{
|
|
gconf_client_set_bool(gconf, gconf_name(name), value > 0, NULL);
|
|
}
|
|
|
|
const void *subsurface_get_conf(char *name)
|
|
{
|
|
return gconf_client_get_string(gconf, gconf_name(name), NULL);
|
|
}
|
|
|
|
int subsurface_get_conf_bool(char *name)
|
|
{
|
|
GConfValue *val;
|
|
gboolean ret;
|
|
|
|
val = gconf_client_get(gconf, gconf_name(name), NULL);
|
|
if (!val)
|
|
return -1;
|
|
ret = gconf_value_get_bool(val);
|
|
gconf_value_free(val);
|
|
return ret;
|
|
}
|
|
|
|
void subsurface_flush_conf(void)
|
|
{
|
|
/* this is a no-op */
|
|
}
|
|
|
|
void subsurface_close_conf(void)
|
|
{
|
|
/* this is a no-op */
|
|
}
|
|
|
|
int subsurface_fill_device_list(GtkListStore *store)
|
|
{
|
|
int i = 0;
|
|
int index = -1;
|
|
GtkTreeIter iter;
|
|
GDir *dev;
|
|
const char *name;
|
|
char *buffer;
|
|
gsize length;
|
|
|
|
dev = g_dir_open("/dev", 0, NULL);
|
|
while (dev && (name = g_dir_read_name(dev)) != NULL) {
|
|
if (strstr(name, "USB")) {
|
|
int len = strlen(name) + 6;
|
|
char *devicename = malloc(len);
|
|
snprintf(devicename, len, "/dev/%s", name);
|
|
gtk_list_store_append(store, &iter);
|
|
gtk_list_store_set(store, &iter,
|
|
0, devicename, -1);
|
|
if (is_default_dive_computer_device(devicename))
|
|
index = i;
|
|
i++;
|
|
}
|
|
}
|
|
if (dev)
|
|
g_dir_close(dev);
|
|
if (g_file_get_contents("/proc/mounts", &buffer, &length, NULL) &&
|
|
length > 0) {
|
|
char *ptr = strstr(buffer, "UEMISSDA");
|
|
if (ptr) {
|
|
char *end = ptr, *start = ptr;
|
|
while (start > buffer && *start != ' ')
|
|
start--;
|
|
if (*start == ' ')
|
|
start++;
|
|
while (*end != ' ' && *end != '\0')
|
|
end++;
|
|
*end = '\0';
|
|
name = strdup(start);
|
|
gtk_list_store_append(store, &iter);
|
|
gtk_list_store_set(store, &iter,
|
|
0, name, -1);
|
|
if (is_default_dive_computer_device(name))
|
|
index = i;
|
|
i++;
|
|
free((void *)name);
|
|
}
|
|
g_free(buffer);
|
|
}
|
|
if (i == 0) {
|
|
/* if we can't find anything, use the default */
|
|
gtk_list_store_append(store, &iter);
|
|
gtk_list_store_set(store, &iter,
|
|
0, "/dev/ttyUSB0", -1);
|
|
if (is_default_dive_computer_device("/dev/ttyUSB0"))
|
|
index = i;
|
|
}
|
|
return index;
|
|
}
|
|
|
|
const char *subsurface_icon_name()
|
|
{
|
|
return "subsurface.svg";
|
|
}
|
|
|
|
const char *system_default_filename(void)
|
|
{
|
|
const char *home, *user;
|
|
char *buffer;
|
|
int len;
|
|
|
|
home = g_get_home_dir();
|
|
user = g_get_user_name();
|
|
len = strlen(home) + strlen(user) + 17;
|
|
buffer = malloc(len);
|
|
snprintf(buffer, len, "%s/subsurface/%s.xml", home, user);
|
|
return buffer;
|
|
}
|
|
|
|
const char *subsurface_gettext_domainpath(char *argv0)
|
|
{
|
|
if (argv0[0] == '.') {
|
|
/* we're starting a local copy */
|
|
return "./share/locale";
|
|
} else {
|
|
/* subsurface is installed, so system dir should be fine */
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
void subsurface_ui_setup(GtkSettings *settings, GtkWidget *menubar,
|
|
GtkWidget *vbox, GtkUIManager *ui_manager)
|
|
{
|
|
gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
|
|
}
|
|
|
|
void subsurface_command_line_init(gint *argc, gchar ***argv)
|
|
{
|
|
/* this is a no-op */
|
|
}
|
|
|
|
void subsurface_command_line_exit(gint *argc, gchar ***argv)
|
|
{
|
|
/* this is a no-op */
|
|
}
|
|
|
|
gboolean subsurface_os_feature_available(os_feature_t f)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
gboolean subsurface_launch_for_uri(const char* uri)
|
|
{
|
|
GError *err = NULL;
|
|
gtk_show_uri(NULL, uri, gtk_get_current_event_time(), &err);
|
|
if (err) {
|
|
g_message("%s: %s", err->message, uri);
|
|
g_error_free(err);
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|