Commit 3ba890c669bba8ab1073f4fae2fc075a6cadb7be

Authored by Perry Werneck
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  
... ...