X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=gtk-gui.c;h=f4212b41c01f8838914fda21b9224df408ce3e9a;hb=0d1f8f9a5db6f3433d8deb6cdab7ffa3ebc10a87;hp=f4b9989d3bec561f7c6c7943027acf1073738b90;hpb=036fccd34a8659208554c38aa4cf31a1fd56800d;p=ext%2Fsubsurface.git diff --git a/gtk-gui.c b/gtk-gui.c index f4b9989..f4212b4 100644 --- a/gtk-gui.c +++ b/gtk-gui.c @@ -8,7 +8,11 @@ #include #include +#ifndef WIN32 #include +#else +#include +#endif #include "dive.h" #include "divelist.h" @@ -26,10 +30,12 @@ int error_count; #define DIVELIST_DEFAULT_FONT "Sans 8" const char *divelist_font; +#ifndef WIN32 GConfClient *gconf; -struct units output_units; - #define GCONF_NAME(x) "/apps/subsurface/" #x +#endif + +struct units output_units; static GtkWidget *dive_profile; @@ -400,6 +406,7 @@ 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); @@ -410,6 +417,34 @@ static void preferences_dialog(GtkWidget *w, gpointer data) 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 } gtk_widget_destroy(dialog); } @@ -517,7 +552,11 @@ static void about_dialog(GtkWidget *w, gpointer data) GdkPixbuf *logo = NULL; if (need_icon) { +#ifndef WIN32 GtkWidget *image = gtk_image_new_from_file("subsurface.svg"); +#else + GtkWidget *image = gtk_image_new_from_file("subsurface.ico"); +#endif if (image) { logo = gtk_image_get_pixbuf(GTK_IMAGE(image)); @@ -655,23 +694,21 @@ static GtkNotebook *create_new_notebook_window(GtkNotebook *source, return GTK_NOTEBOOK(notebook); } -static void drag_cb(GtkWidget *widget, GdkDragContext *context, +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 - /* HU? */ - return; - - gtk_drag_finish(context, TRUE, TRUE, time); + 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 @@ -683,17 +720,36 @@ static void drag_cb(GtkWidget *widget, GdkDragContext *context, 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 argc, char **argv) +void init_ui(int *argcp, char ***argvp) { GtkWidget *win; GtkWidget *notebook; GtkWidget *dive_info; GtkWidget *dive_list; GtkWidget *equipment; + GtkWidget *stats; GtkWidget *menubar; GtkWidget *vbox; + GtkWidget *hpane, *vpane; GdkScreen *screen; GtkIconTheme *icon_theme=NULL; GtkSettings *settings; @@ -701,11 +757,13 @@ void init_ui(int argc, char **argv) "GTK_NOTEBOOK_TAB", GTK_TARGET_SAME_APP, 0 }; - gtk_init(&argc, &argv); + gtk_init(argcp, argvp); settings = gtk_settings_get_default(); gtk_settings_set_long_property(settings, "gtk_tooltip_timeout", 10, "subsurface setting"); g_type_init(); + +#ifndef WIN32 gconf = gconf_client_get_default(); if (gconf_client_get_bool(gconf, GCONF_NAME(feet), NULL)) @@ -724,6 +782,36 @@ void init_ui(int argc, char **argv) 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); + +#endif if (!divelist_font) divelist_font = DIVELIST_DEFAULT_FONT; @@ -742,7 +830,11 @@ void init_ui(int argc, char **argv) } } if (need_icon) +#ifndef WIN32 gtk_window_set_icon_from_file(GTK_WINDOW(win), "subsurface.svg", NULL); +#else + 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); g_signal_connect(G_OBJECT(win), "destroy", G_CALLBACK(on_destroy), NULL); main_window = win; @@ -754,9 +846,15 @@ void init_ui(int argc, char **argv) menubar = get_menubar_menu(win); gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0); + vpane = gtk_vpaned_new(); + gtk_box_pack_start(GTK_BOX(vbox), vpane, TRUE, TRUE, 3); + + hpane = gtk_hpaned_new(); + gtk_paned_add1(GTK_PANED(vpane), hpane); + /* Notebook for dive info vs profile vs .. */ notebook = gtk_notebook_new(); - gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 6); + 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); @@ -766,16 +864,12 @@ void init_ui(int argc, char **argv) /* Create the actual divelist */ dive_list = dive_list_create(); gtk_widget_set_name(dive_list, "Dive List"); - gtk_notebook_append_page(GTK_NOTEBOOK(notebook), dive_list, gtk_label_new("Dive List")); - gtk_notebook_set_tab_detachable(GTK_NOTEBOOK(notebook), dive_list, 1); - gtk_notebook_set_tab_reorderable(GTK_NOTEBOOK(notebook), dive_list, 1); + gtk_paned_add2(GTK_PANED(vpane), dive_list); /* Frame for dive profile */ dive_profile = dive_profile_widget(); gtk_widget_set_name(dive_profile, "Dive Profile"); - gtk_notebook_append_page(GTK_NOTEBOOK(notebook), dive_profile, gtk_label_new("Dive Profile")); - gtk_notebook_set_tab_detachable(GTK_NOTEBOOK(notebook), dive_profile, 1); - gtk_notebook_set_tab_reorderable(GTK_NOTEBOOK(notebook), dive_profile, 1); + gtk_paned_add2(GTK_PANED(hpane), dive_profile); /* Frame for extended dive info */ dive_info = extended_dive_info_widget(); @@ -785,6 +879,10 @@ void init_ui(int argc, char **argv) equipment = equipment_widget(); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), equipment, gtk_label_new("Equipment")); + /* Frame for dive statistics */ + stats = stats_widget(); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), stats, gtk_label_new("Info & Stats")); + gtk_widget_set_app_paintable(win, TRUE); gtk_widget_show_all(win);