From fddf7d04a3b67c95a83a538a65ea7de2272e4bdb Mon Sep 17 00:00:00 2001 From: crs Date: Sat, 1 May 2004 16:10:09 +0000 Subject: [PATCH] X11 clipboard logging now also prints atom names, not just numbers. --- lib/platform/CXWindowsClipboard.cpp | 30 +++++++++++++++-------------- lib/platform/CXWindowsUtil.cpp | 27 ++++++++++++++++++++++++++ lib/platform/CXWindowsUtil.h | 14 ++++++++++++++ 3 files changed, 57 insertions(+), 14 deletions(-) diff --git a/lib/platform/CXWindowsClipboard.cpp b/lib/platform/CXWindowsClipboard.cpp index 52140624..2379850b 100644 --- a/lib/platform/CXWindowsClipboard.cpp +++ b/lib/platform/CXWindowsClipboard.cpp @@ -110,7 +110,7 @@ CXWindowsClipboard::addRequest(Window owner, Window requestor, // at the given time. bool success = false; if (owner == m_window) { - LOG((CLOG_DEBUG1 "request for clipboard %d, target %d by 0x%08x (property=%d)", m_selection, target, requestor, property)); + LOG((CLOG_DEBUG1 "request for clipboard %d, target %s by 0x%08x (property=%s)", m_selection, CXWindowsUtil::atomToString(m_display, target).c_str(), requestor, CXWindowsUtil::atomToString(m_display, property).c_str())); if (wasOwnedAtTime(time)) { if (target == m_atomMultiple) { // add a multiple request. property may not be None @@ -203,7 +203,7 @@ CXWindowsClipboard::processRequest(Window requestor, // unknown requestor window return false; } - LOG((CLOG_DEBUG1 "received property %d delete from 0x08%x", property, requestor)); + LOG((CLOG_DEBUG1 "received property %s delete from 0x08%x", CXWindowsUtil::atomToString(m_display, property).c_str(), requestor)); // find the property in the known requests. it should be the // first property but we'll check 'em all if we have to. @@ -398,7 +398,7 @@ CXWindowsClipboard::getConverter(Atom target, bool onlyIfNotAdded) const } } if (converter == NULL) { - LOG((CLOG_DEBUG1 " no converter for target %d", target)); + LOG((CLOG_DEBUG1 " no converter for target %s", CXWindowsUtil::atomToString(m_display, target).c_str())); return NULL; } @@ -503,10 +503,12 @@ CXWindowsClipboard::icccmFillCache() data.append(reinterpret_cast(&target), sizeof(target)); } - // try each converter in order (because they're in order of - // preference). const Atom* targets = reinterpret_cast(data.data()); const UInt32 numTargets = data.size() / sizeof(Atom); + LOG((CLOG_DEBUG " available targets: %s", CXWindowsUtil::atomsToString(m_display, targets, numTargets).c_str())); + + // try each converter in order (because they're in order of + // preference). for (ConverterList::const_iterator index = m_converters.begin(); index != m_converters.end(); ++index) { IXWindowsClipboardConverter* converter = *index; @@ -532,7 +534,7 @@ CXWindowsClipboard::icccmFillCache() Atom actualTarget; CString targetData; if (!icccmGetSelection(target, &actualTarget, &targetData)) { - LOG((CLOG_DEBUG1 " no data for target %d", target)); + LOG((CLOG_DEBUG1 " no data for target %s", CXWindowsUtil::atomToString(m_display, target).c_str())); continue; } @@ -540,7 +542,7 @@ CXWindowsClipboard::icccmFillCache() IClipboard::EFormat format = converter->getFormat(); m_data[format] = converter->toIClipboard(targetData); m_added[format] = true; - LOG((CLOG_DEBUG " added format %d for target %d", format, target)); + LOG((CLOG_DEBUG " added format %d for target %s (%u %s)", format, CXWindowsUtil::atomToString(m_display, target).c_str(), targetData.size(), targetData.size() == 1 ? "byte" : "bytes")); } } @@ -555,12 +557,12 @@ CXWindowsClipboard::icccmGetSelection(Atom target, CICCCMGetClipboard getter(m_window, m_time, m_atomData); if (!getter.readClipboard(m_display, m_selection, target, actualTarget, data)) { - LOG((CLOG_DEBUG1 "can't get data for selection target %d", target)); + LOG((CLOG_DEBUG1 "can't get data for selection target %s", CXWindowsUtil::atomToString(m_display, target).c_str())); LOGC(getter.m_error, (CLOG_WARN "ICCCM violation by clipboard owner")); return false; } else if (*actualTarget == None) { - LOG((CLOG_DEBUG1 "selection conversion failed for target %d", target)); + LOG((CLOG_DEBUG1 "selection conversion failed for target %s", CXWindowsUtil::atomToString(m_display, target).c_str())); return false; } return true; @@ -770,7 +772,7 @@ CXWindowsClipboard::motifFillCache() Atom actualTarget; CString targetData; if (!motifGetSelection(motifFormat, &actualTarget, &targetData)) { - LOG((CLOG_DEBUG1 " no data for target %d", target)); + LOG((CLOG_DEBUG1 " no data for target %s", CXWindowsUtil::atomToString(m_display, target).c_str())); continue; } @@ -778,7 +780,7 @@ CXWindowsClipboard::motifFillCache() IClipboard::EFormat format = converter->getFormat(); m_data[format] = converter->toIClipboard(targetData); m_added[format] = true; - LOG((CLOG_DEBUG " added format %d for target %d", format, target)); + LOG((CLOG_DEBUG " added format %d for target %s", format, CXWindowsUtil::atomToString(m_display, target).c_str())); } } @@ -1255,7 +1257,7 @@ CXWindowsClipboard::CICCCMGetClipboard::readClipboard(Display* display, assert(actualTarget != NULL); assert(data != NULL); - LOG((CLOG_DEBUG1 "request selection=%d, target=%d, window=%x", selection, target, m_requestor)); + LOG((CLOG_DEBUG1 "request selection=%s, target=%s, window=%x", CXWindowsUtil::atomToString(display, selection).c_str(), CXWindowsUtil::atomToString(display, target).c_str(), m_requestor)); // save output pointers m_actualTarget = actualTarget; @@ -1423,7 +1425,7 @@ CXWindowsClipboard::CICCCMGetClipboard::processEvent( else if (m_incr) { // if first incremental chunk then save target if (oldSize == 0) { - LOG((CLOG_DEBUG1 " INCR first chunk, target %d", target)); + LOG((CLOG_DEBUG1 " INCR first chunk, target %s", CXWindowsUtil::atomToString(display, target).c_str())); *m_actualTarget = target; } @@ -1445,7 +1447,7 @@ CXWindowsClipboard::CICCCMGetClipboard::processEvent( // not incremental; save the target. else { - LOG((CLOG_DEBUG1 " target %d", target)); + LOG((CLOG_DEBUG1 " target %s", CXWindowsUtil::atomToString(display, target).c_str())); *m_actualTarget = target; m_done = true; } diff --git a/lib/platform/CXWindowsUtil.cpp b/lib/platform/CXWindowsUtil.cpp index 066085ab..f18d4647 100644 --- a/lib/platform/CXWindowsUtil.cpp +++ b/lib/platform/CXWindowsUtil.cpp @@ -15,6 +15,7 @@ #include "CXWindowsUtil.h" #include "CThread.h" #include "CLog.h" +#include "CStringUtil.h" #include #define XK_XKB_KEYS #define XK_LATIN1 @@ -1244,6 +1245,32 @@ CXWindowsUtil::decomposeKeySym(KeySym keysym, KeySyms& decomposed) return true; } +CString +CXWindowsUtil::atomToString(Display* display, Atom atom) +{ + char* name = XGetAtomName(display, atom); + CString msg = CStringUtil::print("%s (%d)", name, (int)atom); + XFree(name); + return msg; +} + +CString +CXWindowsUtil::atomsToString(Display* display, const Atom* atom, UInt32 num) +{ + char** names = new char*[num]; + XGetAtomNames(display, const_cast(atom), (int)num, names); + CString msg; + for (UInt32 i = 0; i < num; ++i) { + msg += CStringUtil::print("%s (%d), ", names[i], (int)atom[i]); + XFree(names[i]); + } + delete[] names; + if (msg.size() > 2) { + msg.erase(msg.size() - 2); + } + return msg; +} + Bool CXWindowsUtil::propertyNotifyPredicate(Display*, XEvent* xevent, XPointer arg) { diff --git a/lib/platform/CXWindowsUtil.h b/lib/platform/CXWindowsUtil.h index 179227eb..fb3fb9e7 100644 --- a/lib/platform/CXWindowsUtil.h +++ b/lib/platform/CXWindowsUtil.h @@ -81,6 +81,20 @@ public: */ static bool decomposeKeySym(KeySym keysym, KeySyms& decomposed); + //! Convert Atom to its string + /*! + Converts \p atom to its string representation. + */ + static CString atomToString(Display*, Atom atom); + + //! Convert several Atoms to a string + /*! + Converts each atom in \p atoms to its string representation and + concatenates the results. + */ + static CString atomsToString(Display* display, + const Atom* atom, UInt32 num); + //! X11 error handler /*! This class sets an X error handler in the c'tor and restores the