X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=gtk-gui.c;h=3450a59750161e375ac2b62614d43cbdec7ed6b4;hb=af290d5eb281662d336b8186a9df1a489d78ec9d;hp=f4212b41c01f8838914fda21b9224df408ce3e9a;hpb=c36bf636bd8e6f8fdd700a5031ea3e1a7dc0827e;p=ext%2Fsubsurface.git diff --git a/gtk-gui.c b/gtk-gui.c index f4212b4..3450a59 100644 --- a/gtk-gui.c +++ b/gtk-gui.c @@ -8,12 +8,6 @@ #include #include -#ifndef WIN32 -#include -#else -#include -#endif - #include "dive.h" #include "divelist.h" #include "display.h" @@ -30,11 +24,6 @@ int error_count; #define DIVELIST_DEFAULT_FONT "Sans 8" const char *divelist_font; -#ifndef WIN32 -GConfClient *gconf; -#define GCONF_NAME(x) "/apps/subsurface/" #x -#endif - struct units output_units; static GtkWidget *dive_profile; @@ -406,45 +395,18 @@ static void preferences_dialog(GtkWidget *w, gpointer data) update_dive_list_units(); repaint_dive(); update_dive_list_col_visibility(); -#ifndef WIN32 - gconf_client_set_bool(gconf, GCONF_NAME(feet), output_units.length == FEET, NULL); - gconf_client_set_bool(gconf, GCONF_NAME(psi), output_units.pressure == PSI, NULL); - gconf_client_set_bool(gconf, GCONF_NAME(cuft), output_units.volume == CUFT, NULL); - gconf_client_set_bool(gconf, GCONF_NAME(fahrenheit), output_units.temperature == FAHRENHEIT, NULL); - gconf_client_set_bool(gconf, GCONF_NAME(TEMPERATURE), visible_cols.temperature, NULL); - gconf_client_set_bool(gconf, GCONF_NAME(CYLINDER), visible_cols.cylinder, NULL); - gconf_client_set_bool(gconf, GCONF_NAME(NITROX), visible_cols.nitrox, NULL); - gconf_client_set_bool(gconf, GCONF_NAME(SAC), visible_cols.sac, NULL); - gconf_client_set_bool(gconf, GCONF_NAME(OTU), visible_cols.otu, NULL); - gconf_client_set_string(gconf, GCONF_NAME(divelist_font), divelist_font, NULL); -#else - HKEY hkey; - LONG success = RegCreateKeyEx(HKEY_CURRENT_USER, TEXT("Software\\subsurface"), - 0L, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, - NULL, &hkey, NULL); - if (success != ERROR_SUCCESS) - printf("CreateKey Software\\subsurface failed %ld\n", success); - DWORD value; - -#define StoreInReg(_key, _val) { \ - value = (_val) ; \ - RegSetValueEx(hkey, TEXT(_key), 0, REG_DWORD, &value, 4); \ - } - StoreInReg("feet", output_units.length == FEET); - StoreInReg("psi", output_units.pressure == PSI); - StoreInReg("cuft", output_units.volume == CUFT); - StoreInReg("fahrenheit", output_units.temperature == FAHRENHEIT); - StoreInReg("temperature", visible_cols.temperature); - StoreInReg("cylinder", visible_cols.cylinder); - StoreInReg("nitrox", visible_cols.nitrox); - StoreInReg("sac", visible_cols.sac); - StoreInReg("otu", visible_cols.otu); - RegSetValueEx(hkey, TEXT("divelist_font"), 0, REG_SZ, divelist_font, strlen(divelist_font)); - if (RegFlushKey(hkey) != ERROR_SUCCESS) - printf("RegFlushKey failed %ld\n"); - RegCloseKey(hkey); -#endif + subsurface_set_conf("feet", PREF_BOOL, BOOL_TO_PTR(output_units.length == FEET)); + subsurface_set_conf("psi", PREF_BOOL, BOOL_TO_PTR(output_units.pressure == PSI)); + subsurface_set_conf("cuft", PREF_BOOL, BOOL_TO_PTR(output_units.volume == CUFT)); + subsurface_set_conf("fahrenheit", PREF_BOOL, BOOL_TO_PTR(output_units.temperature == FAHRENHEIT)); + subsurface_set_conf("TEMPERATURE", PREF_BOOL, BOOL_TO_PTR(visible_cols.temperature)); + subsurface_set_conf("CYLINDER", PREF_BOOL, BOOL_TO_PTR(visible_cols.cylinder)); + subsurface_set_conf("NITROX", PREF_BOOL, BOOL_TO_PTR(visible_cols.nitrox)); + subsurface_set_conf("SAC", PREF_BOOL, BOOL_TO_PTR(visible_cols.sac)); + subsurface_set_conf("OTU", PREF_BOOL, BOOL_TO_PTR(visible_cols.otu)); + subsurface_set_conf("divelist_font", PREF_STRING, divelist_font); + subsurface_close_conf(); } gtk_widget_destroy(dialog); } @@ -552,9 +514,9 @@ static void about_dialog(GtkWidget *w, gpointer data) GdkPixbuf *logo = NULL; if (need_icon) { -#ifndef WIN32 +#if defined __linux__ || defined __APPLE__ GtkWidget *image = gtk_image_new_from_file("subsurface.svg"); -#else +#elif defined WIN32 GtkWidget *image = gtk_image_new_from_file("subsurface.ico"); #endif @@ -641,104 +603,6 @@ static void switch_page(GtkNotebook *notebook, gint arg1, gpointer user_data) repaint_dive(); } -static const char notebook_group[] = "123"; -#define GRP_ID ((void *)notebook_group) -typedef struct { - char *name; - GtkWidget *widget; - GtkWidget *box; - gulong delete_handler; - gulong destroy_handler; -} notebook_data_t; - -static notebook_data_t nbd[2]; /* we rip at most two notebook pages off */ - -static GtkNotebook *create_new_notebook_window(GtkNotebook *source, - GtkWidget *page, - gint x, gint y, gpointer data) -{ - GtkWidget *win, *notebook, *vbox; - notebook_data_t *nbdp; - GtkAllocation allocation; - - /* pick the right notebook page data and return if both are detached */ - if (nbd[0].widget == NULL) - nbdp = nbd; - else if (nbd[1].widget == NULL) - nbdp = nbd + 1; - else - return NULL; - - nbdp->name = strdup(gtk_widget_get_name(page)); - nbdp->widget = win = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_title(GTK_WINDOW(win), nbdp->name); - gtk_window_move(GTK_WINDOW(win), x, y); - - /* Destroying the dive list will kill the application */ - nbdp->delete_handler = g_signal_connect(G_OBJECT(win), "delete-event", G_CALLBACK(on_delete), NULL); - nbdp->destroy_handler = g_signal_connect(G_OBJECT(win), "destroy", G_CALLBACK(on_destroy), NULL); - - nbdp->box = vbox = gtk_vbox_new(FALSE, 0); - gtk_container_add(GTK_CONTAINER(win), vbox); - - notebook = gtk_notebook_new(); - gtk_notebook_set_group(GTK_NOTEBOOK(notebook), GRP_ID); - gtk_widget_set_name(notebook, nbdp->name); - /* disallow drop events */ - gtk_drag_dest_set(notebook, 0, NULL, 0, 0); - gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 6); - gtk_widget_get_allocation(page, &allocation); - gtk_window_set_default_size(GTK_WINDOW(win), allocation.width, allocation.height); - - gtk_widget_show_all(win); - return GTK_NOTEBOOK(notebook); -} - -static gboolean drag_cb(GtkWidget *widget, GdkDragContext *context, - gint x, gint y, guint time, - gpointer user_data) -{ - GtkWidget *source; - notebook_data_t *nbdp; - - gtk_drag_finish(context, TRUE, TRUE, time); - source = gtk_drag_get_source_widget(context); - if (nbd[0].name && ! strcmp(nbd[0].name,gtk_widget_get_name(source))) - nbdp = nbd; - else if (nbd[1].name && ! strcmp(nbd[1].name,gtk_widget_get_name(source))) - nbdp = nbd + 1; - else /* just on ourselves */ - return TRUE; - - /* we no longer need the widget - but getting rid of this is hard; - * remove the signal handler, remove the notebook from the box - * then destroy the widget (and clear out our data structure) */ - g_signal_handler_disconnect(nbdp->widget,nbdp->delete_handler); - g_signal_handler_disconnect(nbdp->widget,nbdp->destroy_handler); - gtk_container_remove(GTK_CONTAINER(nbdp->box), source); - gtk_widget_destroy(nbdp->widget); - nbdp->widget = NULL; - free(nbdp->name); - nbdp->name = NULL; - - return TRUE; -} - -#ifdef WIN32 -static int get_from_registry(HKEY hkey, const char *key) -{ - DWORD value; - DWORD len = 4; - LONG success; - - success = RegQueryValueEx(hkey, TEXT(key), NULL, NULL, - (LPBYTE) &value, &len ); - if (success != ERROR_SUCCESS) - return FALSE; /* that's what happens the first time we start */ - return value; -} -#endif - void init_ui(int *argcp, char ***argvp) { GtkWidget *win; @@ -753,9 +617,6 @@ void init_ui(int *argcp, char ***argvp) GdkScreen *screen; GtkIconTheme *icon_theme=NULL; GtkSettings *settings; - static const GtkTargetEntry notebook_target = { - "GTK_NOTEBOOK_TAB", GTK_TARGET_SAME_APP, 0 - }; gtk_init(argcp, argvp); settings = gtk_settings_get_default(); @@ -763,55 +624,24 @@ void init_ui(int *argcp, char ***argvp) g_type_init(); -#ifndef WIN32 - gconf = gconf_client_get_default(); - - if (gconf_client_get_bool(gconf, GCONF_NAME(feet), NULL)) + subsurface_open_conf(); + if (subsurface_get_conf("feet", PREF_BOOL)) output_units.length = FEET; - if (gconf_client_get_bool(gconf, GCONF_NAME(psi), NULL)) + if (subsurface_get_conf("psi", PREF_BOOL)) output_units.pressure = PSI; - if (gconf_client_get_bool(gconf, GCONF_NAME(cuft), NULL)) + if (subsurface_get_conf("cuft", PREF_BOOL)) output_units.volume = CUFT; - if (gconf_client_get_bool(gconf, GCONF_NAME(fahrenheit), NULL)) + if (subsurface_get_conf("fahrenheit", PREF_BOOL)) output_units.temperature = FAHRENHEIT; /* an unset key is FALSE - all these are hidden by default */ - visible_cols.cylinder = gconf_client_get_bool(gconf, GCONF_NAME(CYLINDER), NULL); - visible_cols.temperature = gconf_client_get_bool(gconf, GCONF_NAME(TEMPERATURE), NULL); - visible_cols.nitrox = gconf_client_get_bool(gconf, GCONF_NAME(NITROX), NULL); - visible_cols.otu = gconf_client_get_bool(gconf, GCONF_NAME(OTU), NULL); - visible_cols.sac = gconf_client_get_bool(gconf, GCONF_NAME(SAC), NULL); - - divelist_font = gconf_client_get_string(gconf, GCONF_NAME(divelist_font), NULL); -#else - DWORD len = 4; - LONG success; - HKEY hkey; - - success = RegOpenKeyEx( HKEY_CURRENT_USER, TEXT("Software\\subsurface"), 0, - KEY_QUERY_VALUE, &hkey); - - output_units.length = get_from_registry(hkey, "feet"); - output_units.pressure = get_from_registry(hkey, "psi"); - output_units.volume = get_from_registry(hkey, "cuft"); - output_units.temperature = get_from_registry(hkey, "fahrenheit"); - visible_cols.temperature = get_from_registry(hkey, "temperature"); - visible_cols.cylinder = get_from_registry(hkey, "cylinder"); - visible_cols.nitrox = get_from_registry(hkey, "nitrox"); - visible_cols.sac = get_from_registry(hkey, "sac"); - visible_cols.otu = get_from_registry(hkey, "otu"); - - divelist_font = malloc(80); - len = 80; - success = RegQueryValueEx(hkey, TEXT("divelist_font"), NULL, NULL, - (LPBYTE) divelist_font, &len ); - if (success != ERROR_SUCCESS) { - /* that's what happens the first time we start - just use the default */ - free(divelist_font); - divelist_font = NULL; - } - RegCloseKey(hkey); + visible_cols.cylinder = PTR_TO_BOOL(subsurface_get_conf("CYLINDER", PREF_BOOL)); + visible_cols.temperature = PTR_TO_BOOL(subsurface_get_conf("TEMPERATURE", PREF_BOOL)); + visible_cols.nitrox = PTR_TO_BOOL(subsurface_get_conf("NITROX", PREF_BOOL)); + visible_cols.otu = PTR_TO_BOOL(subsurface_get_conf("OTU", PREF_BOOL)); + visible_cols.sac = PTR_TO_BOOL(subsurface_get_conf("SAC", PREF_BOOL)); + + divelist_font = subsurface_get_conf("divelist_font", PREF_STRING); -#endif if (!divelist_font) divelist_font = DIVELIST_DEFAULT_FONT; @@ -830,9 +660,9 @@ void init_ui(int *argcp, char ***argvp) } } if (need_icon) -#ifndef WIN32 +#if defined __linux__ || defined __APPLE__ gtk_window_set_icon_from_file(GTK_WINDOW(win), "subsurface.svg", NULL); -#else +#elif defined WIN32 gtk_window_set_icon_from_file(GTK_WINDOW(win), "subsurface.ico", NULL); #endif g_signal_connect(G_OBJECT(win), "delete-event", G_CALLBACK(on_delete), NULL); @@ -855,10 +685,6 @@ void init_ui(int *argcp, char ***argvp) /* Notebook for dive info vs profile vs .. */ notebook = gtk_notebook_new(); gtk_paned_add1(GTK_PANED(hpane), notebook); - gtk_notebook_set_group(GTK_NOTEBOOK(notebook), GRP_ID); - g_signal_connect(notebook, "create-window", G_CALLBACK(create_new_notebook_window), NULL); - gtk_drag_dest_set(notebook, GTK_DEST_DEFAULT_ALL, ¬ebook_target, 1, GDK_ACTION_MOVE); - g_signal_connect(notebook, "drag-drop", G_CALLBACK(drag_cb), notebook); g_signal_connect(notebook, "switch-page", G_CALLBACK(switch_page), NULL); /* Create the actual divelist */ @@ -952,7 +778,7 @@ static gboolean expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer gc.cr = gdk_cairo_create(widget->window); g_object_set(widget, "has-tooltip", TRUE, NULL); g_signal_connect(widget, "query-tooltip", G_CALLBACK(profile_tooltip), &drawing_area); - set_source_rgb(&gc, 0, 0, 0); + init_profile_background(&gc); cairo_paint(gc.cr); if (dive) {