pull up r19760 from trunk
authorTom Yu <tlyu@mit.edu>
Thu, 9 Aug 2007 22:14:09 +0000 (22:14 +0000)
committerTom Yu <tlyu@mit.edu>
Thu, 9 Aug 2007 22:14:09 +0000 (22:14 +0000)
 r19760@cathode-dark-space:  jaltman | 2007-08-08 13:45:37 -0400
 ticket: 5613

 Patch developed by kpkoch with style changes from jaltman.

 The size/position of the main application window is
 internally updated in response to WM_MOVE messages but is
 only written to the registry after a timeout period.  This
 is done due to the large number of WM_MOVE messages that
 can be delivered during a windows drag / resize operation
 involving the user or explorer shell's tile and cascade
 operations.  (or those involving third party desktop managers.)

 In NIM 1.8 two different application view modes (standard
 and advanced) replaced the single view mode in previous
 releases.  The size/position update logic was not modified
 to take into consideration the possibility that a user might
 move/resize the window and then quickly toggle modes before
 the new location or size were recorded to the registry.

 This change ensures that when a mode change occurs, via a
 call to khm_set_main_window_mode(), that the current
 location/size will be written to the registry and any
 outstanding timer, MW_RESIZE_TIMER, will be cleared.

 The logic to save the location/size has been extracted
 into the new static function main_wnd_save_sizepos().

 main_wnd_save_sizepos() is only called after the application
 window has been created.

ticket: 5613
version_fixed: 1.6.3

git-svn-id: svn://anonsvn.mit.edu/krb5/branches/krb5-1-6@19798 dc483132-0cff-0310-8789-dd5450dbe970

src/windows/identity/ui/mainwnd.c

index d177b114c7809889e7c1fb3f03a0d9390c42de75..f96bee91876428b5c6cfefd1c8bb1b240476ccba 100644 (file)
@@ -205,6 +205,50 @@ khm_ui_cb(LPARAM lParam) {
     }
 }
 
+
+static void 
+main_wnd_save_sizepos() {
+    RECT r;
+    khm_handle csp_cw;
+    khm_handle csp_mw;
+    const wchar_t * wconfig;
+
+    KillTimer(khm_hwnd_main, MW_RESIZE_TIMER);
+
+    if (khm_main_wnd_mode == KHM_MAIN_WND_MINI)
+        wconfig = L"Windows\\MainMini";
+    else
+        wconfig = L"Windows\\Main";
+
+    GetWindowRect(khm_hwnd_main, &r);
+
+    if (KHM_SUCCEEDED(khc_open_space(NULL,
+                                     L"CredWindow",
+                                     KHM_PERM_WRITE,
+                                     &csp_cw))) {
+        if (KHM_SUCCEEDED(khc_open_space(csp_cw,
+                                        wconfig,
+                                        KHM_PERM_WRITE,
+                                        &csp_mw))) {
+            khm_int32 t;
+
+            khc_write_int32(csp_mw, L"XPos", r.left);
+            khc_write_int32(csp_mw, L"YPos", r.top);
+            khc_write_int32(csp_mw, L"Width", r.right - r.left);
+            khc_write_int32(csp_mw, L"Height", r.bottom - r.top);
+
+            if (KHM_SUCCEEDED(khc_read_int32(csp_mw, L"Dock", &t)) && 
+                t != KHM_DOCK_NONE) {
+                khc_write_int32(csp_mw, L"Dock", KHM_DOCK_AUTO);
+            }
+
+            khc_close_space(csp_mw);
+        }
+
+        khc_close_space(csp_cw);
+    }
+}
+
 LRESULT CALLBACK 
 khm_main_wnd_proc(HWND hwnd,
                   UINT uMsg,
@@ -567,46 +611,7 @@ khm_main_wnd_proc(HWND hwnd,
 
     case WM_TIMER:
         if (wParam == MW_RESIZE_TIMER) {
-            RECT r;
-            khm_handle csp_cw;
-            khm_handle csp_mw;
-            const wchar_t * wconfig;
-
-            if (khm_main_wnd_mode == KHM_MAIN_WND_MINI)
-                wconfig = L"Windows\\MainMini";
-            else
-                wconfig = L"Windows\\Main";
-
-            KillTimer(hwnd, wParam);
-
-            GetWindowRect(hwnd, &r);
-
-            if (KHM_SUCCEEDED(khc_open_space(NULL,
-                                             L"CredWindow",
-                                             KHM_PERM_WRITE,
-                                             &csp_cw))) {
-                if (KHM_SUCCEEDED(khc_open_space(csp_cw,
-                                                 wconfig,
-                                                 KHM_PERM_WRITE,
-                                                 &csp_mw))) {
-                    khm_int32 t;
-
-                    khc_write_int32(csp_mw, L"XPos", r.left);
-                    khc_write_int32(csp_mw, L"YPos", r.top);
-                    khc_write_int32(csp_mw, L"Width",
-                                    r.right - r.left);
-                    khc_write_int32(csp_mw, L"Height",
-                                    r.bottom - r.top);
-
-                    if (KHM_SUCCEEDED(khc_read_int32(csp_mw, L"Dock", &t)) &&
-                        t != KHM_DOCK_NONE) {
-                        khc_write_int32(csp_mw, L"Dock", KHM_DOCK_AUTO);
-                    }
-
-                    khc_close_space(csp_mw);
-                }
-                khc_close_space(csp_cw);
-            }
+            main_wnd_save_sizepos();
 
             return 0;
 
@@ -1114,6 +1119,15 @@ khm_set_main_window_mode(int mode) {
 
     khui_refresh_actions();
 
+    /* 
+     * set the window position before the global khm_main_wnd_mode 
+     * is updated.  otherwise, the windows position for the wrong
+     * mode will be set.  Do not set the window position if the 
+     * main application window has not yet been created.
+     */
+    if (khm_hwnd_main)
+        main_wnd_save_sizepos();
+
     khm_main_wnd_mode = mode;
     if (khm_hwnd_main) {
         khm_get_main_window_rect(&r);