Git commit d2d89653b2eac1e3de57041d642f8f9319c667db by Martin Gr=C3=A4=C3= =9Flin. Committed on 07/04/2014 at 13:05. Pushed by graesslin into branch 'master'. Print better error messages for XCB errors from extensions Qt doesn't print proper error messages for any errors caused by extensions. As KWin is a heavy user of extensions not of interest to Qt (e.g. damage or composite) we do our own error code mapping. The Xcb::ExtensionData is extended by a vector of OpCodes and ErrorNames. In ::workspaceEvent it's checked whether the event is an error and if that is the case KWin tries to map the error to one of the extensions. If that is successful it prints a warning looking like Qt's one: XCB error: 151 (BadDamage), sequence: 12534, resource id: 127926362, \ major code: 143 (DAMAGE), minor code: 2 (Destroy) and the event gets filtered out, so that the Qt error messages is not printed in addition. If the error is not from one of the extensions the error is not filtered out and so the default Qt behavior gets applied. REVIEW: 117421 M +49 -0 events.cpp M +227 -0 xcbutils.cpp M +2 -0 xcbutils.h http://commits.kde.org/kwin/d2d89653b2eac1e3de57041d642f8f9319c667db diff --git a/events.cpp b/events.cpp index a182f92..4f13abc 100644 --- a/events.cpp +++ b/events.cpp @@ -135,12 +135,61 @@ static xcb_window_t findEventWindow(xcb_generic_event= _t *event) } } = +QVector s_xcbEerrors({ + QByteArrayLiteral("Success"), + QByteArrayLiteral("BadRequest"), + QByteArrayLiteral("BadValue"), + QByteArrayLiteral("BadWindow"), + QByteArrayLiteral("BadPixmap"), + QByteArrayLiteral("BadAtom"), + QByteArrayLiteral("BadCursor"), + QByteArrayLiteral("BadFont"), + QByteArrayLiteral("BadMatch"), + QByteArrayLiteral("BadDrawable"), + QByteArrayLiteral("BadAccess"), + QByteArrayLiteral("BadAlloc"), + QByteArrayLiteral("BadColor"), + QByteArrayLiteral("BadGC"), + QByteArrayLiteral("BadIDChoice"), + QByteArrayLiteral("BadName"), + QByteArrayLiteral("BadLength"), + QByteArrayLiteral("BadImplementation"), + QByteArrayLiteral("Unknown")}); /*! Handles workspace specific XCB event */ bool Workspace::workspaceEvent(xcb_generic_event_t *e) { const uint8_t eventType =3D e->response_type & ~0x80; + if (!eventType) { + // let's check whether it's an error from one of the extensions KW= in uses + xcb_generic_error_t *error =3D reinterpret_cast(e); + const QVector extensions =3D Xcb::Extensions::= self()->extensions(); + for (const auto &extension : extensions) { + if (error->major_code =3D=3D extension.majorOpcode) { + QByteArray errorName; + if (error->error_code < s_xcbEerrors.size()) { + errorName =3D s_xcbEerrors.at(error->error_code); + } else if (error->error_code >=3D extension.errorBase) { + const int index =3D error->error_code - extension.erro= rBase; + if (index >=3D 0 && index < extension.errorCodes.size(= )) { + errorName =3D extension.errorCodes.at(index); + } + } + if (errorName.isEmpty()) { + errorName =3D QByteArrayLiteral("Unknown"); + } + qWarning("XCB error: %d (%s), sequence: %d, resource id: %= d, major code: %d (%s), minor code: %d (%s)", + int(error->error_code), errorName.constData(), + int(error->sequence), int(error->resource_id), + int(error->major_code), extension.name.constData(= ), + int(error->minor_code), + extension.opCodes.size() > error->minor_code ? ex= tension.opCodes.at(error->minor_code).constData() : "Unknown"); + return true; + } + } + return false; + } if (effects && static_cast< EffectsHandlerImpl* >(effects)->hasKeyboar= dGrab() && (eventType =3D=3D XCB_KEY_PRESS || eventType =3D=3D XCB_KEY= _RELEASE)) return false; // let Qt process it, it'll be intercepted again in = eventFilter() diff --git a/xcbutils.cpp b/xcbutils.cpp index 5a24cb3..1ac3b09 100644 --- a/xcbutils.cpp +++ b/xcbutils.cpp @@ -51,6 +51,221 @@ static const int RENDER_MAX_MINOR =3D 11; static const int XFIXES_MAX_MAJOR =3D 5; static const int XFIXES_MAX_MINOR =3D 0; = +QVector shapeOpCodes() +{ + // see http://www.x.org/releases/X11R7.7/doc/xextproto/shape.html + // extracted from + return QVector({QByteArrayLiteral("QueryVersion"), + QByteArrayLiteral("Rectangles"), + QByteArrayLiteral("Mask"), + QByteArrayLiteral("Combine"), + QByteArrayLiteral("Offset"), + QByteArrayLiteral("Extents"), + QByteArrayLiteral("Input"), + QByteArrayLiteral("InputSelected"), + QByteArrayLiteral("GetRectangles")}); +} + +QVector randrOpCodes() +{ + // see http://www.x.org/releases/X11R7.7/doc/randrproto/randrproto.txt + // extracted from + return QVector({QByteArrayLiteral("QueryVersion"), + QByteArray(""), // doesn't exist + QByteArrayLiteral("SetScreenConfig"), + QByteArray(""), // doesn't exits + QByteArrayLiteral("SelectInput"), + QByteArrayLiteral("GetScreenInfo"), + QByteArrayLiteral("GetScreenSizeRange"), + QByteArrayLiteral("SetScreenSize"), + QByteArrayLiteral("GetScreenResources"), + QByteArrayLiteral("GetOutputInfo"), + QByteArrayLiteral("ListOutputProperties"), + QByteArrayLiteral("QueryOutputProperty"), + QByteArrayLiteral("ConfigureOutputProperty= "), + QByteArrayLiteral("ChangeOutputProperty"), + QByteArrayLiteral("DeleteOutputProperty"), + QByteArrayLiteral("GetOutputproperty"), + QByteArrayLiteral("CreateMode"), + QByteArrayLiteral("DestroyMode"), + QByteArrayLiteral("AddOutputMode"), + QByteArrayLiteral("DeleteOutputMode"), + QByteArrayLiteral("GetCrtcInfo"), + QByteArrayLiteral("SetCrtcConfig"), + QByteArrayLiteral("GetCrtcGammaSize"), + QByteArrayLiteral("GetCrtcGamma"), + QByteArrayLiteral("SetCrtcGamma"), + QByteArrayLiteral("GetScreenResourcesCurre= nt"), + QByteArrayLiteral("SetCrtcTransform"), + QByteArrayLiteral("GetCrtcTransform"), + QByteArrayLiteral("GetPanning"), + QByteArrayLiteral("SetPanning"), + QByteArrayLiteral("SetOutputPrimary"), + QByteArrayLiteral("GetOutputPrimary"), + QByteArrayLiteral("GetProviders"), + QByteArrayLiteral("GetProviderInfo"), + QByteArrayLiteral("SetProviderOffloadSink"= ), + QByteArrayLiteral("SetProviderOutputSource= "), + QByteArrayLiteral("ListProviderProperties"= ), + QByteArrayLiteral("QueryProviderProperty"), + QByteArrayLiteral("ConfigureProviderropert= y"), + QByteArrayLiteral("ChangeProviderProperty"= ), + QByteArrayLiteral("DeleteProviderProperty"= ), + QByteArrayLiteral("GetProviderProperty")}); +} + +QVector randrErrorCodes() +{ + // see http://www.x.org/releases/X11R7.7/doc/randrproto/randrproto.txt + // extracted from + return QVector({QByteArrayLiteral("BadOutput"), + QByteArrayLiteral("BadCrtc"), + QByteArrayLiteral("BadMode"), + QByteArrayLiteral("BadProvider")}); +} + +QVector damageOpCodes() +{ + // see http://www.x.org/releases/X11R7.7/doc/damageproto/damageproto.t= xt + // extracted from + return QVector({QByteArrayLiteral("QueryVersion"), + QByteArrayLiteral("Create"), + QByteArrayLiteral("Destroy"), + QByteArrayLiteral("Subtract"), + QByteArrayLiteral("Add")}); +} + +QVector damageErrorCodes() +{ + // see http://www.x.org/releases/X11R7.7/doc/damageproto/damageproto.t= xt + // extracted from + return QVector({QByteArrayLiteral("BadDamage")}); +} + +QVector compositeOpCodes() +{ + // see http://www.x.org/releases/X11R7.7/doc/compositeproto/compositep= roto.txt + // extracted from + return QVector({QByteArrayLiteral("QueryVersion"), + QByteArrayLiteral("RedirectWindow"), + QByteArrayLiteral("RedirectSubwindows"), + QByteArrayLiteral("UnredirectWindow"), + QByteArrayLiteral("UnredirectSubwindows"), + QByteArrayLiteral("CreateRegionFromBorderC= lip"), + QByteArrayLiteral("NameWindowPixmap"), + QByteArrayLiteral("GetOverlayWindow"), + QByteArrayLiteral("ReleaseOverlayWindow")}= ); +} + +QVector fixesOpCodes() +{ + // see http://www.x.org/releases/X11R7.7/doc/fixesproto/fixesproto.txt + // extracted from + return QVector({QByteArrayLiteral("QueryVersion"), + QByteArrayLiteral("ChangeSaveSet"), + QByteArrayLiteral("SelectSelectionInput"), + QByteArrayLiteral("SelectCursorInput"), + QByteArrayLiteral("GetCursorImage"), + QByteArrayLiteral("CreateRegion"), + QByteArrayLiteral("CreateRegionFromBitmap"= ), + QByteArrayLiteral("CreateRegionFromWindow"= ), + QByteArrayLiteral("CreateRegionFromGc"), + QByteArrayLiteral("CreateRegionFromPicture= "), + QByteArrayLiteral("DestroyRegion"), + QByteArrayLiteral("SetRegion"), + QByteArrayLiteral("CopyRegion"), + QByteArrayLiteral("UnionRegion"), + QByteArrayLiteral("IntersectRegion"), + QByteArrayLiteral("SubtractRegion"), + QByteArrayLiteral("InvertRegion"), + QByteArrayLiteral("TranslateRegion"), + QByteArrayLiteral("RegionExtents"), + QByteArrayLiteral("FetchRegion"), + QByteArrayLiteral("SetGcClipRegion"), + QByteArrayLiteral("SetWindowShapeRegion"), + QByteArrayLiteral("SetPictureClipRegion"), + QByteArrayLiteral("SetCursorName"), + QByteArrayLiteral("GetCursorName"), + QByteArrayLiteral("GetCursorImageAndName"), + QByteArrayLiteral("ChangeCursor"), + QByteArrayLiteral("ChangeCursorByName"), + QByteArrayLiteral("ExpandRegion"), + QByteArrayLiteral("HideCursor"), + QByteArrayLiteral("ShowCursor"), + QByteArrayLiteral("CreatePointerBarrier"), + QByteArrayLiteral("DeletePointerBarrier")}= ); +} + +QVector fixesErrorCodes() +{ + // see http://www.x.org/releases/X11R7.7/doc/fixesproto/fixesproto.txt + // extracted from + return QVector({QByteArrayLiteral("BadRegion")}); +} + +QVector renderOpCodes() +{ + // see http://www.x.org/releases/X11R7.7/doc/renderproto/renderproto.t= xt + // extracted from + return QVector({QByteArrayLiteral("QueryVersion"), + QByteArrayLiteral("QueryPictFormats"), + QByteArrayLiteral("QueryPictIndexValues"), + QByteArrayLiteral("CreatePicture"), + QByteArrayLiteral("ChangePicture"), + QByteArrayLiteral("SetPictureClipRectangle= s"), + QByteArrayLiteral("FreePicture"), + QByteArrayLiteral("Composite"), + QByteArrayLiteral("Trapezoids"), + QByteArrayLiteral("Triangles"), + QByteArrayLiteral("TriStrip"), + QByteArrayLiteral("TriFan"), + QByteArrayLiteral("CreateGlyphSet"), + QByteArrayLiteral("ReferenceGlyphSet"), + QByteArrayLiteral("FreeGlyphSet"), + QByteArrayLiteral("AddGlyphs"), + QByteArrayLiteral("FreeGlyphs"), + QByteArrayLiteral("CompositeGlyphs8"), + QByteArrayLiteral("CompositeGlyphs16"), + QByteArrayLiteral("CompositeGlyphs32"), + QByteArrayLiteral("FillRectangles"), + QByteArrayLiteral("CreateCursor"), + QByteArrayLiteral("SetPictureTransform"), + QByteArrayLiteral("QueryFilters"), + QByteArrayLiteral("SetPictureFilter"), + QByteArrayLiteral("CreateAnimCursor"), + QByteArrayLiteral("AddTraps"), + QByteArrayLiteral("CreateSolidFill"), + QByteArrayLiteral("CreateLinearGradient"), + QByteArrayLiteral("CreateRadialGradient"), + QByteArrayLiteral("CreateConicalGradient")= }); +} + +QVector syncOpCodes() +{ + // see http://www.x.org/releases/X11R7.7/doc/xextproto/sync.html + // extracted from + return QVector({QByteArrayLiteral("Initialize"), + QByteArrayLiteral("ListSystemCounters"), + QByteArrayLiteral("CreateCounter"), + QByteArrayLiteral("DestroyCounter"), + QByteArrayLiteral("QueryCounter"), + QByteArrayLiteral("Await"), + QByteArrayLiteral("ChangeCounter"), + QByteArrayLiteral("SetCounter"), + QByteArrayLiteral("CreateAlarm"), + QByteArrayLiteral("ChangeAlarm"), + QByteArrayLiteral("DestroyAlarm"), + QByteArrayLiteral("QueryAlarm"), + QByteArrayLiteral("SetPriority"), + QByteArrayLiteral("GetPriority"), + QByteArrayLiteral("CreateFence"), + QByteArrayLiteral("TriggerFence"), + QByteArrayLiteral("ResetFence"), + QByteArrayLiteral("DestroyFence"), + QByteArrayLiteral("QueryFence"), + QByteArrayLiteral("AwaitFence")}); +} + ExtensionData::ExtensionData() : version(0) , eventBase(0) @@ -111,6 +326,18 @@ void Extensions::init() m_render.name =3D QByteArray("RENDER"); m_sync.name =3D QByteArray("SYNC"); = + m_shape.opCodes =3D shapeOpCodes(); + m_randr.opCodes =3D randrOpCodes(); + m_damage.opCodes =3D damageOpCodes(); + m_composite.opCodes =3D compositeOpCodes(); + m_fixes.opCodes =3D fixesOpCodes(); + m_render.opCodes =3D renderOpCodes(); + m_sync.opCodes =3D syncOpCodes(); + + m_randr.errorCodes =3D randrErrorCodes(); + m_damage.errorCodes =3D damageErrorCodes(); + m_fixes.errorCodes =3D fixesErrorCodes(); + extensionQueryReply(xcb_get_extension_data(c, &xcb_shape_id), &m_shape= ); extensionQueryReply(xcb_get_extension_data(c, &xcb_randr_id), &m_randr= ); extensionQueryReply(xcb_get_extension_data(c, &xcb_damage_id), &m_dama= ge); diff --git a/xcbutils.h b/xcbutils.h index baa507f..3f2bd6c 100644 --- a/xcbutils.h +++ b/xcbutils.h @@ -341,6 +341,8 @@ public: int majorOpcode; bool present; QByteArray name; + QVector opCodes; + QVector errorCodes; }; = class Extensions