annotate foosdk/sdk/foobar2000/SDK/popup_message.h @ 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 #pragma once
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 #include <climits> // UINT_MAX
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include <functional>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include "completion_notify.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 //! This interface allows you to show generic nonmodal noninteractive dialog with a text message. This should be used instead of MessageBox where possible.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 //! Usage: use popup_message::g_show / popup_message::g_show_ex static helpers, or popup_message::get() to obtain an instance.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 //! Thread safety: OK to call from worker threads (will delegate UI ops to main thread automatically). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 //! Note that all strings are UTF-8.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 class NOVTABLE popup_message : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 enum t_icon {icon_information, icon_error, icon_query};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 //! Activates the popup dialog; returns immediately (the dialog remains visible).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 //! @param p_msg Message to show (UTF-8 encoded string).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 //! @param p_msg_length Length limit of message string to show, in bytes (actual string may be shorter if null terminator is encountered before). Set this to infinite to use plain null-terminated strings.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 //! @param p_title Title of dialog to show (UTF-8 encoded string).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 //! @param p_title_length Length limit of the title string, in bytes (actual string may be shorter if null terminator is encountered before). Set this to infinite to use plain null-terminated strings.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 //! @param p_icon Icon of the dialog - can be set to icon_information, icon_error or icon_query.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 virtual void show_ex(const char * p_msg,size_t p_msg_length,const char * p_title,size_t p_title_length,t_icon p_icon = icon_information) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 //! Activates the popup dialog; returns immediately (the dialog remains visible); helper function built around show_ex(), takes null terminated strings with no length limit parameters.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 //! @param p_msg Message to show (UTF-8 encoded string).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 //! @param p_title Title of dialog to show (UTF-8 encoded string).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 //! @param p_icon Icon of the dialog - can be set to icon_information, icon_error or icon_query.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 inline void show(const char * p_msg,const char * p_title,t_icon p_icon = icon_information) {show_ex(p_msg,UINT_MAX,p_title,UINT_MAX,p_icon);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 //! Static helper function instantiating the service and activating the message dialog. See show_ex() for description of parameters.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 static void g_show_ex(const char * p_msg,size_t p_msg_length,const char * p_title,size_t p_title_length,t_icon p_icon = icon_information);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 //! Static helper function instantiating the service and activating the message dialog. See show() for description of parameters.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 static inline void g_show(const char * p_msg,const char * p_title,t_icon p_icon = icon_information) {g_show_ex(p_msg,UINT_MAX,p_title,UINT_MAX,p_icon);}
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 //! Shows generic box with a failure message
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 static void g_complain(const char * what);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 //! <whatfailed>: <exception message>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 static void g_complain(const char * p_whatFailed, const std::exception & p_exception);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 //! <whatfailed>: <msg>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 static void g_complain(const char * p_whatFailed, const char * msg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 static void g_showToast(const char * msg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 static void g_showToastLongDuration(const char * msg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 FB2K_MAKE_SERVICE_COREAPI(popup_message);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 };
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 #define EXCEPTION_TO_POPUP_MESSAGE(CODE,LABEL) try { CODE; } catch(std::exception const & e) {popup_message::g_complain(LABEL,e);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 //! \since 1.1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 //! Extendsion to popup_message API. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 //! Thread safety: OK to call from worker threads (will delegate UI ops to main thread automatically). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 //! Note that all strings are UTF-8.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 class NOVTABLE popup_message_v2 : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 FB2K_MAKE_SERVICE_COREAPI(popup_message_v2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 virtual void show(fb2k::hwnd_t parent, const char * msg, t_size msg_length, const char * title, t_size title_length) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 void show(fb2k::hwnd_t parent, const char * msg, const char * title) {show(parent, msg, SIZE_MAX, title, SIZE_MAX);}
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 static void g_show(fb2k::hwnd_t parent, const char * msg, const char * title = "Information");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 static void g_complain(fb2k::hwnd_t parent, const char * whatFailed, const char * msg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 static void g_complain(fb2k::hwnd_t parent, const char * whatFailed, const std::exception & e);
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 namespace fb2k {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 //! Not really implemented for Windows yet.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 class popup_toast : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 FB2K_MAKE_SERVICE_COREAPI( popup_toast );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 struct arg_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 bool longDuration = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 virtual void show_toast(const char * msg, arg_t const & arg) = 0;
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 void showToast( const char * msg );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 void showToastLongDuration( const char * msg );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 class toastFormatter : public pfc::string_formatter {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 ~toastFormatter() noexcept {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 if ( this->length() > 0 ) showToast( c_str() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 } catch(...) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 }
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 #define FB2K_Toast() ::fb2k::toastFormatter()._formatter()
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 //! \since 1.5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 //! MessageBox-like dialog, only non-blocking and with dark mode support under foobar2000 v2.0. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 //! Call from main thread only (contrary to popup_message / popup_message_v2) !!!
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 class NOVTABLE popup_message_v3 : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 FB2K_MAKE_SERVICE_COREAPI(popup_message_v3);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 //! show_query button codes. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 //! Combine one or more of these to create a button mask to pass to show_query().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 buttonOK = 1 << 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 buttonCancel = 1 << 1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 buttonYes = 1 << 2,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 buttonNo = 1 << 3,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 buttonRetry = 1 << 4,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 buttonAbort = 1 << 5,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 buttonIgnore = 1 << 6,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 flagDoNotAskAgain = 1 << 16,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 iconNone = 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 iconInformation,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 iconQuestion,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 iconWarning,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 iconError,
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 struct query_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 const char * title = nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 const char * msg = nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 uint32_t buttons = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 uint32_t defButton = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 uint32_t icon = iconNone;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 completion_notify::ptr reply; // optional
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 fb2k::hwnd_t wndParent = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 const char * msgDoNotAskAgain = nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 void show();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 //! Shows an interactive query presenting the user with multiple actions to choose from.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 virtual void show_query(query_t const &) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 //! Modal version of show_query. Reply part of the argument can be empty; the status code will be returned.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 virtual uint32_t show_query_modal(query_t const &) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 // Minimalist MessageBox() reimplementation wrapper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 int messageBox(fb2k::hwnd_t, const char*, const char*, unsigned);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 void messageBoxAsync(fb2k::hwnd_t, const char*, const char*, unsigned, std::function<void (int)> reply = nullptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 static query_t setupMessageBox(fb2k::hwnd_t parent, const char* msg, const char* title, unsigned flags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 static int messageBoxReply(uint32_t);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 //! Old method wrapper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 void show_query( const char * title, const char * msg, unsigned buttons, completion_notify::ptr reply);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 };