support COMPOUNDTEXT and TEXT target
Kusanagi Kouichi
slash at ma.neweb.ne.jp
Thu Jun 12 19:00:51 CDT 2003
This patch add support for selection request with COMPOUND_TEXT or TEXT
target.
-------------- next part --------------
--- wine-20030508.orig/dlls/x11drv/event.c 2003-05-04 11:27:20.000000000 +0900
+++ wine-20030508/dlls/x11drv/event.c 2003-06-13 08:21:24.000000000 +0900
@@ -664,6 +664,110 @@
/***********************************************************************
+ * EVENT_SelectionRequest_COMPOUND_TEXT
+ * Service a COMPOUND_TEXT or TEXT selection request event
+ */
+static Atom EVENT_SelectionRequest_COMPOUND_TEXT( Display *display,
+ Window requestor,
+ Atom target, Atom rprop )
+{
+ static UINT text_cp = (UINT)-1;
+ HANDLE hUnicodeText;
+ LPWSTR uni_text;
+ LPSTR text;
+ int size,i,j;
+ char* lpstr = 0;
+ char *itemFmtName;
+ XTextProperty prop;
+ XICCEncodingStyle style;
+
+ if(text_cp == (UINT)-1)
+ {
+ HKEY hkey;
+ /* default value */
+ text_cp = CP_ACP;
+ if(!RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\x11drv", &hkey))
+ {
+ char buf[20];
+ DWORD type, count = sizeof(buf);
+ if(!RegQueryValueExA(hkey, "TextCP", 0, &type, buf, &count))
+ text_cp = atoi(buf);
+ RegCloseKey(hkey);
+ }
+ }
+
+ /*
+ * Map the requested X selection property type atom name to a
+ * windows clipboard format ID.
+ */
+ itemFmtName = TSXGetAtomName(display, target);
+ TRACE("Request for %s (wFormat=%x %s)\n",
+ itemFmtName, CF_UNICODETEXT, CLIPBOARD_GetFormatName(CF_UNICODETEXT, NULL, 0));
+ if (strcmp(itemFmtName, "COMPOUND_TEXT") == 0)
+ {
+ style = XCompoundTextStyle;
+ }
+ else
+ {
+ style = XStdICCTextStyle;
+ }
+ TSXFree(itemFmtName);
+
+ hUnicodeText = GetClipboardData(CF_UNICODETEXT);
+ if(!hUnicodeText)
+ return None;
+ uni_text = GlobalLock(hUnicodeText);
+ if(!uni_text)
+ return None;
+
+ size = WideCharToMultiByte(text_cp, 0, uni_text, -1, NULL, 0, NULL, NULL);
+ text = HeapAlloc(GetProcessHeap(), 0, size);
+ if (!text)
+ return None;
+ WideCharToMultiByte(text_cp, 0, uni_text, -1, text, size, NULL, NULL);
+
+ /* remove carriage returns */
+
+ lpstr = (char*)HeapAlloc( GetProcessHeap(), 0, size-- );
+ if(lpstr == NULL) return None;
+ for(i=0,j=0; i < size && text[i]; i++ )
+ {
+ if( text[i] == '\r' &&
+ (text[i+1] == '\n' || text[i+1] == '\0') ) continue;
+ lpstr[j++] = text[i];
+ }
+ lpstr[j]='\0';
+
+ /* Update the X property */
+ wine_tsx11_lock();
+ if (XmbTextListToTextProperty(display, &lpstr, 1, style, &prop) == Success)
+ {
+ if (WINE_TRACE_ON(event))
+ {
+ char *property_name;
+
+ property_name = XGetAtomName(display, rprop);
+ TRACE("\tUpdating property %s...\n", property_name);
+ XFree(property_name);
+ }
+ XSetTextProperty(display, requestor, &prop, rprop);
+ XFree(prop.value);
+ }
+ else
+ {
+ rprop = None;
+ }
+ wine_tsx11_unlock();
+
+ GlobalUnlock(hUnicodeText);
+ HeapFree(GetProcessHeap(), 0, text);
+ HeapFree( GetProcessHeap(), 0, lpstr );
+
+ return rprop;
+}
+
+
+/***********************************************************************
* EVENT_SelectionRequest_STRING
* Service a STRING selection request event
*/
@@ -1017,6 +1121,8 @@
Atom xaClipboard = TSXInternAtom(display, "CLIPBOARD", False);
Atom xaTargets = TSXInternAtom(display, "TARGETS", False);
Atom xaMultiple = TSXInternAtom(display, "MULTIPLE", False);
+ Atom xaCompoundText = TSXInternAtom(display, "COMPOUND_TEXT", False);
+ Atom xaText = TSXInternAtom(display, "TEXT", False);
/*
* We can only handle the selection request if :
@@ -1048,6 +1154,11 @@
/* MULTIPLE selection request */
rprop = EVENT_SelectionRequest_MULTIPLE( hWnd, event );
}
+ else if(event->target == xaCompoundText || event->target == xaText)
+ {
+ /* COMPOUND_TEXT or TEXT selection request */
+ rprop = EVENT_SelectionRequest_COMPOUND_TEXT( display, request, event->target, rprop );
+ }
else if(event->target == XA_STRING) /* treat CF_TEXT as Unix text */
{
/* XA_STRING selection request */
More information about the wine-patches
mailing list