annotate foosdk/sdk/libPPUI/clipboard.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 #include "clipboard.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "win32_op.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #ifdef UNICODE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #define CF_TCHAR CF_UNICODETEXT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 #define CF_TCHAR CF_TEXT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 #endif
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 namespace ClipboardHelper {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 void OpenScope::Open(HWND p_owner) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 Close();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 WIN32_OP(OpenClipboard(p_owner));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 m_open = true;
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 void OpenScope::Close() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 if (m_open) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 m_open = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 CloseClipboard();
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 void SetRaw(UINT format,const void * data, t_size size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 HANDLE buffer = GlobalAlloc(GMEM_DDESHARE,size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 if (buffer == NULL) throw std::bad_alloc();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 CGlobalLockScope lock(buffer);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 PFC_ASSERT(lock.GetSize() == size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 memcpy(lock.GetPtr(),data,size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 } catch(...) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 GlobalFree(buffer); throw;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 WIN32_OP(SetClipboardData(format,buffer) != NULL);
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 void SetString(const char * in) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 pfc::stringcvt::string_os_from_utf8 temp(in);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 SetRaw(CF_TCHAR,temp.get_ptr(),(temp.length() + 1) * sizeof(TCHAR));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 bool GetString(pfc::string_base & out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 pfc::array_t<t_uint8> temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 if (!GetRaw(CF_TCHAR,temp)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 out = pfc::stringcvt::string_utf8_from_os(reinterpret_cast<const TCHAR*>(temp.get_ptr()),temp.get_size() / sizeof(TCHAR));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 return true;
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 bool IsTextAvailable() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 return IsClipboardFormatAvailable(CF_TCHAR) == TRUE;
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 }