summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--windows.c63
1 files changed, 57 insertions, 6 deletions
diff --git a/windows.c b/windows.c
index df136085f..1189fae5a 100644
--- a/windows.c
+++ b/windows.c
@@ -121,15 +121,66 @@ void subsurface_close_conf(void)
int subsurface_fill_device_list(GtkListStore *store)
{
+ const int bufdef = 512;
+ const char *dlabels[] = {"UEMISSDA", NULL};
+ const char *devdef = "COM1";
GtkTreeIter iter;
- int index = -1;
+ int index = -1, nentries = 0, ret, i;
+ char bufname[bufdef], bufval[bufdef], *p;
+ DWORD nvalues, bufval_len, bufname_len;
+ HKEY key;
+ /* add serial ports */
+ ret = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\SERIALCOMM",
+ 0, KEY_READ, &key);
+ if (ret == ERROR_SUCCESS) {
+ ret = RegQueryInfoKeyA(key, NULL, NULL, NULL, NULL, NULL, NULL, &nvalues,
+ NULL, NULL, NULL, NULL);
+ if (ret == ERROR_SUCCESS)
+ for (i = 0; i < nvalues; i++) {
+ memset(bufval, 0, bufdef);
+ memset(bufname, 0, bufdef);
+ bufname_len = bufdef;
+ bufval_len = bufdef;
+ ret = RegEnumValueA(key, i, bufname, &bufname_len, NULL, NULL, bufval,
+ &bufval_len);
+ if (ret == ERROR_SUCCESS) {
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter, 0, bufval, -1);
+ if (is_default_dive_computer_device(bufval))
+ index = nentries;
+ nentries++;
+ }
+ }
+ }
+ /* add drive letters that match labels */
+ memset(bufname, 0, bufdef);
+ bufname_len = bufdef;
+ if (GetLogicalDriveStringsA(bufname_len, bufname)) {
+ p = bufname;
+ while (*p) {
+ memset(bufval, 0, bufdef);
+ if (GetVolumeInformationA(p, bufval, bufdef, NULL, NULL, NULL, NULL, 0)) {
+ for (i = 0; dlabels[i] != NULL; i++)
+ if (!strcmp(bufval, dlabels[i])) {
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter, 0, p, -1);
+ if (is_default_dive_computer_device(p))
+ index = nentries;
+ nentries++;
+ }
+ }
+ p = &p[strlen(p) + 1];
+ }
+ }
/* if we can't find anything, use the default */
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter,
- 0, "COM3", -1);
- if (is_default_dive_computer_device("COM3"))
- index = 0;
+ if (!nentries) {
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter,
+ 0, devdef, -1);
+ if (is_default_dive_computer_device(devdef))
+ index = 0;
+ }
return index;
}