Commit 3ba890c669bba8ab1073f4fae2fc075a6cadb7be
1 parent
47a63a65
Exists in
v5.2
Still refactoring windows settings engine.
Showing
1 changed file
with
162 additions
and
13 deletions
Show diff stats
src/pw3270/windows/config.c
@@ -64,8 +64,10 @@ | @@ -64,8 +64,10 @@ | ||
64 | /// @brief Open registry for read-only access. | 64 | /// @brief Open registry for read-only access. |
65 | static enum REG_KEY search_for_registry_key(const gchar *group, const gchar *key, HKEY *hKey) | 65 | static enum REG_KEY search_for_registry_key(const gchar *group, const gchar *key, HKEY *hKey) |
66 | { | 66 | { |
67 | - g_autofree gchar * path = g_strdup_printf("%s\\%s\\%s",WINDOWS_REGISTRY_PATH,g_get_application_name(),group); | ||
68 | size_t ix; | 67 | size_t ix; |
68 | + g_autofree gchar * path = g_strjoin("\\",WINDOWS_REGISTRY_PATH,g_get_application_name(),group,NULL); | ||
69 | + | ||
70 | + trace("%s(%s)",__FUNCTION__,path); | ||
69 | 71 | ||
70 | for(ix=0;ix < G_N_ELEMENTS(predefined);ix++) | 72 | for(ix=0;ix < G_N_ELEMENTS(predefined);ix++) |
71 | { | 73 | { |
@@ -88,7 +90,9 @@ | @@ -88,7 +90,9 @@ | ||
88 | gboolean pw3270_win32_registry_open(const gchar *group, HKEY *hKey, REGSAM samDesired) | 90 | gboolean pw3270_win32_registry_open(const gchar *group, HKEY *hKey, REGSAM samDesired) |
89 | { | 91 | { |
90 | size_t ix; | 92 | size_t ix; |
91 | - g_autofree gchar * path = g_strdup_printf("%s\\%s\\%s",WINDOWS_REGISTRY_PATH,g_get_application_name(),group); | 93 | + g_autofree gchar * path = g_strjoin("\\",WINDOWS_REGISTRY_PATH,g_get_application_name(),group,NULL); |
94 | + | ||
95 | + trace("%s(%s)",__FUNCTION__,path); | ||
92 | 96 | ||
93 | for(ix=0;ix < G_N_ELEMENTS(predefined);ix++) | 97 | for(ix=0;ix < G_N_ELEMENTS(predefined);ix++) |
94 | { | 98 | { |
@@ -308,7 +312,19 @@ void set_string_to_config(const gchar *group, const gchar *key, const gchar *fmt | @@ -308,7 +312,19 @@ void set_string_to_config(const gchar *group, const gchar *key, const gchar *fmt | ||
308 | } | 312 | } |
309 | 313 | ||
310 | } | 314 | } |
315 | + else if(pw3270_win32_registry_open(group, &hKey, KEY_ALL_ACCESS)) | ||
316 | + { | ||
317 | + if(str) | ||
318 | + { | ||
319 | + RegSetValueEx(hKey,key,0,REG_SZ,(const BYTE *) str,strlen(str)+1); | ||
320 | + } | ||
321 | + else | ||
322 | + { | ||
323 | + RegDeleteKey(hKey,key); | ||
324 | + } | ||
311 | 325 | ||
326 | + RegCloseKey(hKey); | ||
327 | + } | ||
312 | 328 | ||
313 | } | 329 | } |
314 | 330 | ||
@@ -320,7 +336,21 @@ void set_boolean_to_config(const gchar *group, const gchar *key, gboolean val) | @@ -320,7 +336,21 @@ void set_boolean_to_config(const gchar *group, const gchar *key, gboolean val) | ||
320 | { | 336 | { |
321 | g_key_file_set_boolean(keyfile,group,key,val); | 337 | g_key_file_set_boolean(keyfile,group,key,val); |
322 | } | 338 | } |
339 | + else if(pw3270_win32_registry_open(group, &hKey, KEY_ALL_ACCESS)) | ||
340 | + { | ||
341 | + DWORD value = val ? 1 : 0; | ||
342 | + LONG rc = RegSetValueEx(hKey, key, 0, REG_DWORD,(const BYTE *) &value,sizeof(value)); | ||
343 | + | ||
344 | + SetLastError(rc); | ||
323 | 345 | ||
346 | + if(rc != ERROR_SUCCESS) | ||
347 | + { | ||
348 | + g_autofree gchar *msg = g_win32_error_message(GetLastError()); | ||
349 | + g_warning("Error \"%s\" when setting key HKCU\\%s\\%s\\%s",msg,WINDOWS_REGISTRY_PATH,g_get_application_name(),group,key); | ||
350 | + } | ||
351 | + | ||
352 | + RegCloseKey(hKey); | ||
353 | + } | ||
324 | } | 354 | } |
325 | 355 | ||
326 | void set_integer_to_config(const gchar *group, const gchar *key, gint val) | 356 | void set_integer_to_config(const gchar *group, const gchar *key, gint val) |
@@ -331,6 +361,21 @@ void set_integer_to_config(const gchar *group, const gchar *key, gint val) | @@ -331,6 +361,21 @@ void set_integer_to_config(const gchar *group, const gchar *key, gint val) | ||
331 | { | 361 | { |
332 | g_key_file_set_integer(keyfile,group,key,val); | 362 | g_key_file_set_integer(keyfile,group,key,val); |
333 | } | 363 | } |
364 | + else if(pw3270_win32_registry_open(group, &hKey, KEY_ALL_ACCESS)) | ||
365 | + { | ||
366 | + DWORD value = val; | ||
367 | + LONG rc = RegSetValueEx(hKey, key, 0, REG_DWORD,(const BYTE *) &value,sizeof(value)); | ||
368 | + | ||
369 | + SetLastError(rc); | ||
370 | + | ||
371 | + if(rc != ERROR_SUCCESS) | ||
372 | + { | ||
373 | + g_autofree gchar *msg = g_win32_error_message(GetLastError()); | ||
374 | + g_warning("Error \"%s\" when setting key HKCU\\%s\\%s\\%s",msg,WINDOWS_REGISTRY_PATH,g_get_application_name(),group,key); | ||
375 | + } | ||
376 | + | ||
377 | + RegCloseKey(hKey); | ||
378 | + } | ||
334 | 379 | ||
335 | } | 380 | } |
336 | 381 | ||
@@ -358,7 +403,6 @@ void pw3270_session_config_save() | @@ -358,7 +403,6 @@ void pw3270_session_config_save() | ||
358 | g_file_set_contents(filename,text,-1,&error); | 403 | g_file_set_contents(filename,text,-1,&error); |
359 | } | 404 | } |
360 | 405 | ||
361 | - | ||
362 | if(error) { | 406 | if(error) { |
363 | g_message( _( "Can't save session settings: %s" ), error->message); | 407 | g_message( _( "Can't save session settings: %s" ), error->message); |
364 | g_error_free(error); | 408 | g_error_free(error); |
@@ -440,6 +484,23 @@ GKeyFile * pw3270_session_config_get(gboolean create) | @@ -440,6 +484,23 @@ GKeyFile * pw3270_session_config_get(gboolean create) | ||
440 | return keyfile; | 484 | return keyfile; |
441 | } | 485 | } |
442 | 486 | ||
487 | + void pw3270_session_save_terminal(GtkWidget *terminal) | ||
488 | + { | ||
489 | + HKEY hKey; | ||
490 | + | ||
491 | + if(keyfile) | ||
492 | + { | ||
493 | + v3270_to_key_file(terminal, keyfile, "terminal"); | ||
494 | + pw3270_session_config_save(); | ||
495 | + } | ||
496 | + else if(pw3270_win32_registry_open(NULL, &hKey, KEY_ALL_ACCESS)) | ||
497 | + { | ||
498 | + v3270_to_registry(terminal, hKey, "terminal"); | ||
499 | + RegCloseKey(hKey); | ||
500 | + } | ||
501 | + | ||
502 | + } | ||
503 | + | ||
443 | static const struct _WindowState | 504 | static const struct _WindowState |
444 | { | 505 | { |
445 | const char *name; | 506 | const char *name; |
@@ -452,33 +513,121 @@ GKeyFile * pw3270_session_config_get(gboolean create) | @@ -452,33 +513,121 @@ GKeyFile * pw3270_session_config_get(gboolean create) | ||
452 | { "Sticky", GDK_WINDOW_STATE_STICKY, gtk_window_stick } | 513 | { "Sticky", GDK_WINDOW_STATE_STICKY, gtk_window_stick } |
453 | }; | 514 | }; |
454 | 515 | ||
455 | - void pw3270_session_save_terminal(GtkWidget *terminal) | 516 | + void save_window_state_to_config(const gchar *group, const gchar *key, GdkWindowState CurrentState) |
456 | { | 517 | { |
518 | + size_t f; | ||
457 | HKEY hKey; | 519 | HKEY hKey; |
458 | 520 | ||
459 | - GKeyFile * keyfile = pw3270_session_config_get(FALSE); | ||
460 | - | ||
461 | - if(keyfile) | 521 | + if(keyfile) |
462 | { | 522 | { |
463 | - v3270_to_key_file(terminal, keyfile, "terminal"); | ||
464 | - pw3270_session_config_save(); | ||
465 | - } | 523 | + g_autofree gchar * id = g_strconcat(group,".",key,NULL); |
466 | 524 | ||
525 | + for(f=0;f<G_N_ELEMENTS(WindowState);f++) | ||
526 | + g_key_file_set_boolean(keyfile,id,WindowState[f].name,CurrentState & WindowState[f].flag); | ||
467 | 527 | ||
468 | - } | 528 | + } |
529 | + else if(pw3270_win32_registry_open(group, &hKey, KEY_ALL_ACCESS)) | ||
530 | + { | ||
531 | + for(f=0;f<G_N_ELEMENTS(WindowState);f++) | ||
532 | + { | ||
533 | + DWORD value = (CurrentState & WindowState[f].flag) ? 1 : 0; | ||
534 | + RegSetValueEx(hKey, WindowState[f].name, 0, REG_DWORD,(const BYTE *) &value,sizeof(value)); | ||
535 | + } | ||
469 | 536 | ||
470 | - void save_window_state_to_config(const gchar *group, const gchar *key, GdkWindowState CurrentState) | ||
471 | - { | 537 | + RegCloseKey(hKey); |
538 | + } | ||
472 | 539 | ||
473 | } | 540 | } |
474 | 541 | ||
475 | void save_window_size_to_config(const gchar *group, const gchar *key, GtkWidget *hwnd) | 542 | void save_window_size_to_config(const gchar *group, const gchar *key, GtkWidget *hwnd) |
476 | { | 543 | { |
544 | + HKEY hKey; | ||
545 | + | ||
546 | + int pos[2]; | ||
547 | + gtk_window_get_size(GTK_WINDOW(hwnd),&pos[0],&pos[1]); | ||
548 | + | ||
549 | + if(keyfile) | ||
550 | + { | ||
551 | + g_autofree gchar * id = g_strconcat(group,".",key,NULL); | ||
552 | + g_key_file_set_integer_list(keyfile,id,"size",pos,2); | ||
553 | + } | ||
554 | + else if(pw3270_win32_registry_open(group, &hKey, KEY_ALL_ACCESS)) | ||
555 | + { | ||
556 | + RegSetValueEx(hKey, "Size", 0, REG_BINARY,(const BYTE *) pos,sizeof(pos)); | ||
557 | + RegCloseKey(hKey); | ||
558 | + } | ||
477 | 559 | ||
478 | } | 560 | } |
479 | 561 | ||
480 | void restore_window_from_config(const gchar *group, const gchar *key, GtkWidget *hwnd) | 562 | void restore_window_from_config(const gchar *group, const gchar *key, GtkWidget *hwnd) |
481 | { | 563 | { |
564 | + HKEY hKey; | ||
565 | + int f; | ||
566 | + | ||
567 | + if(keyfile) | ||
568 | + { | ||
569 | + g_autofree gchar * id = g_strconcat(group,".",key,NULL); | ||
570 | + | ||
571 | + if(g_key_file_has_key(keyfile,id,"size",NULL)) | ||
572 | + { | ||
573 | + gsize sz = 2; | ||
574 | + gint * vlr = g_key_file_get_integer_list(keyfile,id,"size",&sz,NULL); | ||
575 | + | ||
576 | + if(vlr) | ||
577 | + { | ||
578 | + gtk_window_resize(GTK_WINDOW(hwnd),vlr[0],vlr[1]); | ||
579 | + g_free(vlr); | ||
580 | + } | ||
581 | + | ||
582 | + } | ||
583 | + | ||
584 | + for(f=0;f<G_N_ELEMENTS(WindowState);f++) | ||
585 | + { | ||
586 | + if(g_key_file_get_boolean(keyfile,id,WindowState[f].name,NULL)) | ||
587 | + WindowState[f].activate(GTK_WINDOW(hwnd)); | ||
588 | + } | ||
589 | + | ||
590 | + } | ||
591 | + else if(search_for_registry_key(group,key,&hKey) != REG_KEY_INEXISTENT) | ||
592 | + { | ||
593 | + int pos[2]; | ||
594 | + unsigned long datalen = sizeof(pos); | ||
595 | + unsigned long datatype; | ||
596 | + | ||
597 | + if(RegQueryValueExA(hKey,"Size",NULL,&datatype,(BYTE *) pos,&datalen) == ERROR_SUCCESS) | ||
598 | + { | ||
599 | + if(datatype == REG_BINARY && datalen == sizeof(pos)) | ||
600 | + { | ||
601 | + gtk_window_resize(GTK_WINDOW(hwnd),pos[0],pos[1]); | ||
602 | + } | ||
603 | + else | ||
604 | + { | ||
605 | + g_warning("Unexpected registry data in %s\\%s\\Size",group,key); | ||
606 | + } | ||
607 | + } | ||
608 | + | ||
609 | + for(f=0;f<G_N_ELEMENTS(WindowState);f++) | ||
610 | + { | ||
611 | + DWORD data; | ||
612 | + | ||
613 | + datalen = sizeof(data); | ||
614 | + | ||
615 | + if(RegQueryValueExA(hKey,WindowState[f].name,NULL,&datatype,(BYTE *) &data,&datalen) == ERROR_SUCCESS) | ||
616 | + { | ||
617 | + if(datatype == REG_DWORD) | ||
618 | + { | ||
619 | + if(data) | ||
620 | + WindowState[f].activate(GTK_WINDOW(hwnd)); | ||
621 | + } | ||
622 | + else | ||
623 | + { | ||
624 | + g_warning("Unexpected registry data type in %s\\%s\\%s",group,key,WindowState[f].name); | ||
625 | + } | ||
626 | + } | ||
627 | + } | ||
628 | + | ||
629 | + RegCloseKey(hKey); | ||
630 | + } | ||
482 | 631 | ||
483 | } | 632 | } |
484 | 633 |