commit 5bac3b6

uint  ·  2026-06-23 01:29:03 +0000 UTC
parent 3e167e3
Implement win32 clipboard support
1 files changed,  +46, -0
+46, -0
 1@@ -270,12 +270,58 @@ void maus_clear(Maus* mw, MausColor col)
 2 
 3 void maus_clipboard_set_text(Maus* mw, const char* text)
 4 {
 5+	MausBackend* be = &mw->backend;
 6+	if (!text || !OpenClipboard(be->hwnd))
 7+		return;
 8+	EmptyClipboard();
 9+	size_t len = strlen(text) + 1;
10+	HGLOBAL hmem = GlobalAlloc(GMEM_MOVEABLE, len);
11+	if (hmem) {
12+		void* ptr = GlobalLock(hmem);
13+		if (ptr) {
14+			memcpy(ptr, text, len);
15+			GlobalUnlock(hmem);
16+
17+			if (!SetClipboardData(CF_TEXT, hmem))
18+				GlobalFree(hmem); /* failed */
19+		}
20+		else {
21+			GlobalFree(hmem);
22+		}
23+	}
24 
25+	CloseClipboard();
26 }
27 
28 char* maus_clipboard_get_text(Maus* mw)
29 {
30+	MausBackend* be = &mw->backend;
31+	if (!OpenClipboard(be->hwnd))
32+		return NULL;
33+
34+	HANDLE hmem = GetClipboardData(CF_TEXT);
35+	if (!hmem) {
36+		CloseClipboard();
37+		return NULL;
38+	}
39+
40+	const char* text = GlobalLock(hmem);
41+	if (text) {
42+		if (mw->clipboard) {
43+			free(mw->clipboard);
44+			mw->clipboard = NULL;
45+		}
46+
47+		size_t len = strlen(text) + 1;
48+		mw->clipboard = malloc(len);
49+		if (mw->clipboard)
50+			memcpy(mw->clipboard, text, len);
51+
52+		GlobalUnlock(hmem);
53+	}
54 
55+	CloseClipboard();
56+	return mw->clipboard;
57 }
58 
59 void maus_close(Maus* mw)