//============================================================ // // winclip.c - Win32 OSD core clipboard access functions // //============================================================ // // Copyright Aaron Giles // All rights reserved. // // Redistribution and use in source and binary forms, with or // without modification, are permitted provided that the // following conditions are met: // // * Redistributions of source code must retain the above // copyright notice, this list of conditions and the // following disclaimer. // * Redistributions in binary form must reproduce the // above copyright notice, this list of conditions and // the following disclaimer in the documentation and/or // other materials provided with the distribution. // * Neither the name 'MAME' nor the names of its // contributors may be used to endorse or promote // products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO // EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGE (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // //============================================================ #define WIN32_LEAN_AND_MEAN #include #include "strconv.h" //============================================================ // get_clipboard_text_by_format //============================================================ static char *get_clipboard_text_by_format(UINT format, char *(*convert)(LPCVOID data)) { char *result = NULL; HANDLE data_handle; LPVOID data; // check to see if this format is available if (IsClipboardFormatAvailable(format)) { // open the clipboard if (OpenClipboard(NULL)) { // try to access clipboard data data_handle = GetClipboardData(format); if (data_handle != NULL) { // lock the data data = GlobalLock(data_handle); if (data != NULL) { // invoke the convert result = (*convert)(data); // unlock the data GlobalUnlock(data_handle); } } // close out the clipboard CloseClipboard(); } } return result; } //============================================================ // convert_wide //============================================================ static char *convert_wide(LPCVOID data) { return utf8_from_wstring((LPCWSTR) data); } //============================================================ // convert_ansi //============================================================ static char *convert_ansi(LPCVOID data) { return utf8_from_astring((LPCSTR) data); } //============================================================ // osd_get_clipboard_text //============================================================ char *osd_get_clipboard_text(void) { char *result = NULL; // try to access unicode text result = get_clipboard_text_by_format(CF_UNICODETEXT, convert_wide); // try to access ANSI text if (result == NULL) result = get_clipboard_text_by_format(CF_TEXT, convert_ansi); return result; }