annotate foosdk/sdk/foobar2000/SDK/app_close_blocker.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 <functional>
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 //! (DEPRECATED) This service is used to signal whether something is currently preventing main window from being closed and app from being shut down.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 class NOVTABLE app_close_blocker : public service_base
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 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 //! Checks whether this service is currently preventing main window from being closed and app from being shut down.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 virtual bool query() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 //! Static helper function, checks whether any of registered app_close_blocker services is currently preventing main window from being closed and app from being shut down.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 static bool g_query();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(app_close_blocker);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 //! An interface encapsulating a task preventing the foobar2000 application from being closed. Instances of this class need to be registered using app_close_blocking_task_manager methods. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 //! Implementation: it's recommended that you derive from app_close_blocking_task_impl class instead of deriving from app_close_blocking_task directly, it manages registration/unregistration behind-the-scenes.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 class NOVTABLE app_close_blocking_task {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 //! Retrieves user-friendly name of the task to be shown to the user, should the user try to close foobar2000 while the task is active. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 //! Implementation note: this will NOT be called from register_task() or unregister_task(), only in response to user attempting to close foobar2000. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 //! Common helper implementations of app_close_blocking_task register from base class constructor while intended query_task_name() override is not yet in place.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 virtual void query_task_name(pfc::string_base & out) = 0;
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 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 app_close_blocking_task() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 ~app_close_blocking_task() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 PFC_CLASS_NOT_COPYABLE_EX(app_close_blocking_task);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 //! Entrypoint class for registering app_close_blocking_task instances. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 //! You can use app_close_blocking_task_impl to call this automatically with your object.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 class NOVTABLE app_close_blocking_task_manager : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 FB2K_MAKE_SERVICE_COREAPI(app_close_blocking_task_manager);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 //! Registers a task object. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 //! Main thread only.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 virtual void register_task(app_close_blocking_task * task) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 //! Unregisters a task object. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 //! Main thread only.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 virtual void unregister_task(app_close_blocking_task * task) = 0;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 //! Helper; implements standard functionality required by app_close_blocking_task implementations - registers/unregisters the task on construction/destruction.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 class app_close_blocking_task_impl : public app_close_blocking_task {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 app_close_blocking_task_impl(const char * name = "<unnamed task>");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 app_close_blocking_task_impl(pfc::string8&& name);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 ~app_close_blocking_task_impl();
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 //! Override me, or provide name to constructor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 void query_task_name(pfc::string_base & out) override;
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 app_close_blocking_task_impl( const app_close_blocking_task_impl & ) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 void operator=(const app_close_blocking_task_impl & ) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 const pfc::string8 m_name;
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 class app_close_blocking_task_impl_dynamic : public app_close_blocking_task {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 app_close_blocking_task_impl_dynamic(const char * name = "<unnamed task>") : m_name(name) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 ~app_close_blocking_task_impl_dynamic() { toggle_blocking(false); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 //! Override me, or provide name to constructor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 void query_task_name(pfc::string_base & out) override;
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 void toggle_blocking(bool state);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 bool m_taskActive = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 const pfc::string8 m_name;
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
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 //! \since 1.4.5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 //! Provides means for async tasks - running detached from any UI - to reliably finish before the app terminates. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 //! During a late phase of app shutdown, past initquit ops, when no worker code should be still running - a core-managed instance of abort_callback is signaled, \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 //! then main thread stalls until all objects created with acquire() have been released. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 //! As this API was introduced out-of-band with 1.4.5, you should use tryGet() to obtain it with FOOBAR2000_TARGET_VERSION < 80, but can safely use ::get() with FOOBAR2000_TARGET_VERSION >= 80.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 class async_task_manager : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 FB2K_MAKE_SERVICE_COREAPI( async_task_manager );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 virtual abort_callback & get_aborter() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 virtual service_ptr acquire() = 0;
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 //! acquire() helper; returns nullptr if the API isn't available due to old fb2k
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 static service_ptr g_acquire();
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 // fb2k::spltiTask() moved to threadsLite.h