1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4  * License, v. 2.0. If a copy of the MPL was not distributed with this
5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 
7 #ifndef IPC_GLUE_WINDOWSMESSAGELOOP_H
8 #define IPC_GLUE_WINDOWSMESSAGELOOP_H
9 
10 // This file is only meant to compile on windows
11 #include <windows.h>
12 
13 #include "nsISupportsImpl.h"
14 
15 namespace mozilla {
16 namespace ipc {
17 namespace windows {
18 
19 void InitUIThread();
20 
21 class DeferredMessage {
22  public:
23   MOZ_COUNTED_DEFAULT_CTOR(DeferredMessage)
24 
25   MOZ_COUNTED_DTOR_VIRTUAL(DeferredMessage)
26 
27   virtual void Run() = 0;
28 };
29 
30 // Uses CallWndProc to deliver a message at a later time. Messages faked with
31 // this class must not have pointers in their wParam or lParam members as they
32 // may be invalid by the time the message actually runs.
33 class DeferredSendMessage : public DeferredMessage {
34  public:
DeferredSendMessage(HWND aHWnd,UINT aMessage,WPARAM aWParam,LPARAM aLParam)35   DeferredSendMessage(HWND aHWnd, UINT aMessage, WPARAM aWParam, LPARAM aLParam)
36       : hWnd(aHWnd), message(aMessage), wParam(aWParam), lParam(aLParam) {}
37 
38   virtual void Run();
39 
40  protected:
41   HWND hWnd;
42   UINT message;
43   WPARAM wParam;
44   LPARAM lParam;
45 };
46 
47 // Uses RedrawWindow to fake several painting-related messages. Flags passed
48 // to the constructor go directly to RedrawWindow.
49 class DeferredRedrawMessage : public DeferredMessage {
50  public:
DeferredRedrawMessage(HWND aHWnd,UINT aFlags)51   DeferredRedrawMessage(HWND aHWnd, UINT aFlags) : hWnd(aHWnd), flags(aFlags) {}
52 
53   virtual void Run();
54 
55  private:
56   HWND hWnd;
57   UINT flags;
58 };
59 
60 // Uses UpdateWindow to generate a WM_PAINT message if needed.
61 class DeferredUpdateMessage : public DeferredMessage {
62  public:
63   explicit DeferredUpdateMessage(HWND aHWnd);
64 
65   virtual void Run();
66 
67  private:
68   HWND mWnd;
69   RECT mUpdateRect;
70 };
71 
72 // This class duplicates a string that may exist in the lParam member of the
73 // message.
74 class DeferredSettingChangeMessage : public DeferredSendMessage {
75  public:
76   DeferredSettingChangeMessage(HWND aHWnd, UINT aMessage, WPARAM aWParam,
77                                LPARAM aLParam);
78 
79   ~DeferredSettingChangeMessage();
80 
81  private:
82   wchar_t* lParamString;
83 };
84 
85 // This class uses SetWindowPos to fake various size-related messages. Flags
86 // passed to the constructor go straight through to SetWindowPos.
87 class DeferredWindowPosMessage : public DeferredMessage {
88  public:
89   DeferredWindowPosMessage(HWND aHWnd, LPARAM aLParam,
90                            bool aForCalcSize = false, WPARAM aWParam = 0);
91 
92   virtual void Run();
93 
94  private:
95   WINDOWPOS windowPos;
96 };
97 
98 // This class duplicates a data buffer for a WM_COPYDATA message.
99 class DeferredCopyDataMessage : public DeferredSendMessage {
100  public:
101   DeferredCopyDataMessage(HWND aHWnd, UINT aMessage, WPARAM aWParam,
102                           LPARAM aLParam);
103 
104   ~DeferredCopyDataMessage();
105 
106  private:
107   COPYDATASTRUCT copyData;
108 };
109 
110 class DeferredStyleChangeMessage : public DeferredMessage {
111  public:
112   DeferredStyleChangeMessage(HWND aHWnd, WPARAM aWParam, LPARAM aLParam);
113 
114   virtual void Run();
115 
116  private:
117   HWND hWnd;
118   int index;
119   LONG_PTR style;
120 };
121 
122 class DeferredSetIconMessage : public DeferredSendMessage {
123  public:
124   DeferredSetIconMessage(HWND aHWnd, UINT aMessage, WPARAM aWParam,
125                          LPARAM aLParam);
126 
127   virtual void Run();
128 };
129 
130 } /* namespace windows */
131 } /* namespace ipc */
132 } /* namespace mozilla */
133 
134 #endif /* IPC_GLUE_WINDOWSMESSAGELOOP_H */
135