annotate foosdk/sdk/foobar2000/helpers/win32_dialog.cpp @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "StdAfx.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #ifdef FOOBAR2000_DESKTOP_WINDOWS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include "win32_misc.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #include "win32_dialog.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 namespace dialog_helper {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 INT_PTR CALLBACK dialog::DlgProc(HWND wnd,UINT msg,WPARAM wp,LPARAM lp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 dialog * p_this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 BOOL rv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 if (msg==WM_INITDIALOG)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 p_this = reinterpret_cast<dialog*>(lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 p_this->wnd = wnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 SetWindowLongPtr(wnd,DWLP_USER,lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 if (p_this->m_is_modal) p_this->m_modal_scope.initialize(wnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 else p_this = reinterpret_cast<dialog*>(GetWindowLongPtr(wnd,DWLP_USER));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 rv = p_this ? p_this->on_message(msg,wp,lp) : FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 if (msg==WM_DESTROY && p_this)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 SetWindowLongPtr(wnd,DWLP_USER,0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 // p_this->wnd = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 return rv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 int dialog::run_modal(unsigned id,HWND parent)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 assert(wnd == 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 if (wnd != 0) return -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 m_is_modal = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 return uDialogBox(id,parent,DlgProc,reinterpret_cast<LPARAM>(this));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 HWND dialog::run_modeless(unsigned id,HWND parent)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 assert(wnd == 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 if (wnd != 0) return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 m_is_modal = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 return uCreateDialog(id,parent,DlgProc,reinterpret_cast<LPARAM>(this));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 void dialog::end_dialog(int code)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 assert(m_is_modal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 if (m_is_modal) uEndDialog(wnd,code);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 int dialog_modal::run(unsigned p_id,HWND p_parent,HINSTANCE p_instance)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 int status;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 // note: uDialogBox() has its own modal scope, we don't want that to trigger
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 // if this is ever changed, move deinit to WM_DESTROY handler in DlgProc
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 status = (int)DialogBoxParam(p_instance,MAKEINTRESOURCE(p_id),p_parent,DlgProc,reinterpret_cast<LPARAM>(this));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 m_modal_scope.deinitialize();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 return status;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 void dialog_modal::end_dialog(int p_code)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 EndDialog(m_wnd,p_code);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 INT_PTR CALLBACK dialog_modal::DlgProc(HWND wnd,UINT msg,WPARAM wp,LPARAM lp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 dialog_modal * _this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 if (msg==WM_INITDIALOG)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 _this = reinterpret_cast<dialog_modal*>(lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 _this->m_wnd = wnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 SetWindowLongPtr(wnd,DWLP_USER,lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 _this->m_modal_scope.initialize(wnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 else _this = reinterpret_cast<dialog_modal*>(GetWindowLongPtr(wnd,DWLP_USER));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 assert(_this == 0 || _this->m_wnd == wnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 return _this ? _this->on_message(msg,wp,lp) : FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 HWND uCreateDialog(UINT id,HWND parent,DLGPROC proc,LPARAM param)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 return CreateDialogParam(core_api::get_my_instance(),MAKEINTRESOURCE(id),parent,proc,param);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 int uDialogBox(UINT id,HWND parent,DLGPROC proc,LPARAM param)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 return (int)DialogBoxParam(core_api::get_my_instance(),MAKEINTRESOURCE(id),parent,proc,param);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 #endif // FOOBAR2000_DESKTOP_WINDOWS