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 | 64 | /// @brief Open registry for read-only access. |
65 | 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 | 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 | 72 | for(ix=0;ix < G_N_ELEMENTS(predefined);ix++) |
71 | 73 | { |
... | ... | @@ -88,7 +90,9 @@ |
88 | 90 | gboolean pw3270_win32_registry_open(const gchar *group, HKEY *hKey, REGSAM samDesired) |
89 | 91 | { |
90 | 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 | 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 | 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 | 336 | { |
321 | 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 | 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 | 361 | { |
332 | 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 | 403 | g_file_set_contents(filename,text,-1,&error); |
359 | 404 | } |
360 | 405 | |
361 | - | |
362 | 406 | if(error) { |
363 | 407 | g_message( _( "Can't save session settings: %s" ), error->message); |
364 | 408 | g_error_free(error); |
... | ... | @@ -440,6 +484,23 @@ GKeyFile * pw3270_session_config_get(gboolean create) |
440 | 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 | 504 | static const struct _WindowState |
444 | 505 | { |
445 | 506 | const char *name; |
... | ... | @@ -452,33 +513,121 @@ GKeyFile * pw3270_session_config_get(gboolean create) |
452 | 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 | 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 | 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 | 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 | ... | ... |