xref: /aosp_15_r20/external/cronet/base/win/message_window.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_WIN_MESSAGE_WINDOW_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_WIN_MESSAGE_WINDOW_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <string>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/compiler_specific.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/threading/thread_checker.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/win/windows_types.h"
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker // Protect against windows.h being included before this header.
17*6777b538SAndroid Build Coastguard Worker #undef FindWindow
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker namespace base {
20*6777b538SAndroid Build Coastguard Worker namespace win {
21*6777b538SAndroid Build Coastguard Worker 
22*6777b538SAndroid Build Coastguard Worker // Implements a message-only window.
23*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT MessageWindow {
24*6777b538SAndroid Build Coastguard Worker  public:
25*6777b538SAndroid Build Coastguard Worker   // Used to register a process-wide message window class.
26*6777b538SAndroid Build Coastguard Worker   class WindowClass;
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker   // Implement this callback to handle messages received by the message window.
29*6777b538SAndroid Build Coastguard Worker   // If the callback returns |false|, the first four parameters are passed to
30*6777b538SAndroid Build Coastguard Worker   // DefWindowProc(). Otherwise, |*result| is returned by the window procedure.
31*6777b538SAndroid Build Coastguard Worker   using MessageCallback =
32*6777b538SAndroid Build Coastguard Worker       base::RepeatingCallback<bool(UINT message,
33*6777b538SAndroid Build Coastguard Worker                                    WPARAM wparam,
34*6777b538SAndroid Build Coastguard Worker                                    LPARAM lparam,
35*6777b538SAndroid Build Coastguard Worker                                    LRESULT* result)>;  // NOLINT
36*6777b538SAndroid Build Coastguard Worker 
37*6777b538SAndroid Build Coastguard Worker   MessageWindow();
38*6777b538SAndroid Build Coastguard Worker 
39*6777b538SAndroid Build Coastguard Worker   MessageWindow(const MessageWindow&) = delete;
40*6777b538SAndroid Build Coastguard Worker   MessageWindow& operator=(const MessageWindow&) = delete;
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker   ~MessageWindow();
43*6777b538SAndroid Build Coastguard Worker 
44*6777b538SAndroid Build Coastguard Worker   // Creates a message-only window. The incoming messages will be passed by
45*6777b538SAndroid Build Coastguard Worker   // |message_callback|. |message_callback| must outlive |this|.
46*6777b538SAndroid Build Coastguard Worker   bool Create(MessageCallback message_callback);
47*6777b538SAndroid Build Coastguard Worker 
48*6777b538SAndroid Build Coastguard Worker   // Same as Create() but assigns the name to the created window.
49*6777b538SAndroid Build Coastguard Worker   bool CreateNamed(MessageCallback message_callback,
50*6777b538SAndroid Build Coastguard Worker                    const std::wstring& window_name);
51*6777b538SAndroid Build Coastguard Worker 
hwnd()52*6777b538SAndroid Build Coastguard Worker   HWND hwnd() const { return window_; }
53*6777b538SAndroid Build Coastguard Worker 
54*6777b538SAndroid Build Coastguard Worker   // Retrieves a handle of the first message-only window with matching
55*6777b538SAndroid Build Coastguard Worker   // |window_name|.
56*6777b538SAndroid Build Coastguard Worker   static HWND FindWindow(const std::wstring& window_name);
57*6777b538SAndroid Build Coastguard Worker 
58*6777b538SAndroid Build Coastguard Worker  private:
59*6777b538SAndroid Build Coastguard Worker   // Give |WindowClass| access to WindowProc().
60*6777b538SAndroid Build Coastguard Worker   friend class WindowClass;
61*6777b538SAndroid Build Coastguard Worker 
62*6777b538SAndroid Build Coastguard Worker   // Contains the actual window creation code.
63*6777b538SAndroid Build Coastguard Worker   bool DoCreate(MessageCallback message_callback, const wchar_t* window_name);
64*6777b538SAndroid Build Coastguard Worker 
65*6777b538SAndroid Build Coastguard Worker   // Invoked by the OS to process incoming window messages.
66*6777b538SAndroid Build Coastguard Worker   static LRESULT CALLBACK WindowProc(HWND hwnd,
67*6777b538SAndroid Build Coastguard Worker                                      UINT message,
68*6777b538SAndroid Build Coastguard Worker                                      WPARAM wparam,
69*6777b538SAndroid Build Coastguard Worker                                      LPARAM lparam);
70*6777b538SAndroid Build Coastguard Worker 
71*6777b538SAndroid Build Coastguard Worker   // Invoked to handle messages received by the window.
72*6777b538SAndroid Build Coastguard Worker   MessageCallback message_callback_;
73*6777b538SAndroid Build Coastguard Worker 
74*6777b538SAndroid Build Coastguard Worker   // Handle of the input window.
75*6777b538SAndroid Build Coastguard Worker   HWND window_ = nullptr;
76*6777b538SAndroid Build Coastguard Worker 
77*6777b538SAndroid Build Coastguard Worker   THREAD_CHECKER(thread_checker_);
78*6777b538SAndroid Build Coastguard Worker };
79*6777b538SAndroid Build Coastguard Worker 
80*6777b538SAndroid Build Coastguard Worker }  // namespace win
81*6777b538SAndroid Build Coastguard Worker }  // namespace base
82*6777b538SAndroid Build Coastguard Worker 
83*6777b538SAndroid Build Coastguard Worker #endif  // BASE_WIN_MESSAGE_WINDOW_H_
84