GNU Emacs is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
+the Free Software Foundation; either version 3, or (at your option)
any later version.
GNU Emacs is distributed in the hope that it will be useful,
#include <shellapi.h>
#include <ctype.h>
#include <winspool.h>
+#include <objbase.h>
#include <dlgs.h>
#define FILE_NAME_TEXT_FIELD edt1
POINT pt;
RECT rect;
- GetClientRect(FRAME_W32_WINDOW(f), &rect);
- AdjustWindowRect(&rect, f->output_data.w32->dwStyle, FRAME_EXTERNAL_MENU_BAR(f));
+ /* Get the bounds of the WM window. */
+ GetWindowRect (FRAME_W32_WINDOW (f), &rect);
- pt.x = rect.left;
- pt.y = rect.top;
+ pt.x = 0;
+ pt.y = 0;
- ClientToScreen (FRAME_W32_WINDOW(f), &pt);
+ /* Convert (0, 0) in the client area to screen co-ordinates. */
+ ClientToScreen (FRAME_W32_WINDOW (f), &pt);
/* Remember x_pixels_diff and y_pixels_diff. */
f->x_pixels_diff = pt.x - rect.left;
f->y_pixels_diff = pt.y - rect.top;
- *xptr = pt.x;
- *yptr = pt.y;
+ *xptr = rect.left;
+ *yptr = rect.top;
}
\f
/* Produced by complete_deferred_msg; just ignore. */
break;
case WM_EMACS_CREATEWINDOW:
+ /* Initialize COM for this window. Even though we don't use it,
+ some third party shell extensions can cause it to be used in
+ system dialogs, which causes a crash if it is not initialized.
+ This is a known bug in Windows, which was fixed long ago, but
+ the patch for XP is not publically available until XP SP3,
+ and older versions will never be patched. */
+ CoInitialize (NULL);
w32_createwindow ((struct frame *) msg.wParam);
if (!PostThreadMessage (dwMainThreadId, WM_EMACS_DONE, 0, 0))
abort ();
my_post_msg (&wmsg, hwnd, msg, wParam, lParam);
goto dflt;
+ case WM_DESTROY:
+ CoUninitialize ();
+ return 0;
+
case WM_CLOSE:
wmsg.dwModifiers = w32_get_modifiers ();
my_post_msg (&wmsg, hwnd, msg, wParam, lParam);
/* Apparently NT4 crashes if you give it an unexpected size.
I'm not sure about Windows 9x, so play it safe. */
if (w32_major_version > 4 && w32_major_version < 95)
- file_details->lStructSize = sizeof (new_file_details);
+ file_details->lStructSize = sizeof (NEWOPENFILENAME);
else
- file_details->lStructSize = sizeof (file_details);
+ file_details->lStructSize = sizeof (OPENFILENAME);
file_details->hwndOwner = FRAME_W32_WINDOW (f);
/* Undocumented Bug in Common File Dialog: