[X2Go-Dev] Patch to Fix x2goagent / nxagent With New LibCairo

Mike Gabriel mike.gabriel at das-netzwerkteam.de
Tue May 15 11:17:37 CEST 2012


Hi Jim,

I sent the link to the patch in Git:
http://code.x2go.org/gitweb?p=nx-libs.git;a=blob;f=debian/patches/120_nxagent_libcairo-null-source-drawables.full.patch

Mike

On Di 15 Mai 2012 03:01:00 CEST Jim Burnes wrote:

> Mike,
>
> Did you send them my patch?
>
> Jim
>
>
> On Mon, May 14, 2012 at 3:54 PM, Mike Gabriel <
> mike.gabriel at das-netzwerkteam.de> wrote:
>
>> Hi Jim, hi all,
>>
>> NoMachine upstream of NX has become aware of the issue (reported by me)...
>> http://www.nomachine.com/tr/**view.php?id=TR05J02703<http://www.nomachine.com/tr/view.php?id=TR05J02703>
>>
>> Mike
>>
>>
>> On Do 10 Mai 2012 19:21:18 CEST Jim Burnes wrote:
>>
>>  I don't know what the current patch status is for fixing nxagent with the
>>> new libcairo (1.12.1+ I believe), but eventually I got tired of waiting
>>> and
>>> created my own patches for nxagent/x2goagent.
>>>
>>> Most of the fixes were required because the render extension now allows
>>> (and libcairo uses) null source drawables (for gradients etc), null masks
>>> and null mask drawables.
>>>
>>> This change creates a bit of a logic mess in the code.   Previous patches
>>> to the code tried to account for all of the possibilities, but fell a
>>> little short.
>>>
>>> Consider this an alpha-quality patch.  I've only tested it in KDE while
>>> running GTK applications.   All my favorite GTK apps like Firefox, Emacs,
>>>  rox-filer and all my other GTK apps that were broken are now working just
>>> fine.  (Though I'm getting only the standard GTK look and feel - don't
>>> know
>>> if that's caused by anything I've done.)
>>>
>>> Could someone test this under Gnome?
>>>
>>>  Also, since I'm not primarily an X software engineer I'd like a
>>> specialist
>>> to take a look at it.   The fix is a little crude.   I just attached to
>>> the
>>> x2goagent process and fixed the lines that caused segfaults.   (About 10
>>> of
>>> them).
>>>
>>> I also rewrote one of the macros in Pixels.h into a local subroutine in
>>> Render.c.  It had a bug in it and complex macro bugs are a PITA to debug
>>> in
>>> gdb (or anything else really).   The macro is only used in one place and
>>> although the code in the macro is called pretty often, it's very likely
>>> that the compiler would inline it anyway.  The rewrite increases
>>> readability by a large factor.
>>>
>>> A better patch could be created by someone that understands nxagent and X
>>> much better.   The render extension code receives render ops from X client
>>> programs.  The render ops can contain any combination of picture source,
>>> picture destination and picture mask.  It's apparently legal to send
>>> render
>>> ops with combinations of null picture source drawables, picture masks and
>>> picture mask drawables.   A better way to patch this would be to simply
>>> perform a return on all the illegal combinations of null parameters for
>>> the
>>> render ops.  That way you wouldn't have to keep re-checking the parameter
>>> values.
>>>
>>> So anyway, here it is.  I appreciate it if someone out there would test it
>>> and let me know.   Also if anyone knows of the X docs which discuss null
>>> picture sources and masks in the render extension I'd be glad to create a
>>> cleaner patch that conforms to the stands.
>>>
>>> Let me know.
>>>
>>> eris0xff
>>>
>>> *** x2go/nx-libs-3.5.0.12/nx-X11/**programs/Xserver/hw/nxagent/**Render.c
>>> 2012-03-07 14:04:02.000000000 -0700
>>> ---
>>> x2go-new/nx-libs-3.5.0.12/nx-**X11/programs/Xserver/hw/**nxagent/Render.c
>>> 2012-05-10 11:09:39.631786853 -0600
>>> ***************
>>> *** 995,1000 ****
>>> --- 995,1030 ----
>>>    #endif
>>>  }
>>>
>>> +
>>> + int nxagentShouldDeferComposite(**PicturePtr pSrc, PicturePtr pMask,
>>> PicturePtr pDst)
>>> + {
>>> +
>>> + int drawableDst;
>>> + int linkDeferred;
>>> + int unSyncedSrcMask;
>>> +
>>> +     drawableDst      =  ( nxagentRenderVersionMajor == 0 &&
>>> +                           nxagentRenderVersionMinor == 8 &&
>>> +                       (pDst) -> pDrawable -> type == DRAWABLE_PIXMAP
>>> +                             );
>>> +
>>> +     linkDeferred     =  ( nxagentOption(DeferLevel) >= 2
>>> &&
>>> +                               nxagentOption(LinkType) < LINK_TYPE_ADSL
>>> +                             );
>>> +
>>> +     unSyncedSrcMask  =  ( nxagentOption(DeferLevel) == 1 &&
>>> +                               (pDst) -> pDrawable -> type ==
>>> DRAWABLE_PIXMAP &&
>>> +                               (
>>> +                    (pSrc -> pDrawable && (nxagentDrawableStatus(pSrc ->
>>> pDrawable) == NotSynchronized)) ||
>>> +                            ((pMask) && pMask -> pDrawable &&
>>> (nxagentDrawableStatus((pMask) -> pDrawable) == NotSynchronized))
>>> +                   )
>>> +                 );
>>> +
>>> +
>>> +     return drawableDst || linkDeferred || unSyncedSrcMask;
>>> + }
>>> +
>>> +
>>>  void nxagentComposite(CARD8 op, PicturePtr pSrc, PicturePtr pMask,
>>> PicturePtr pDst,
>>>                            INT16 xSrc, INT16 ySrc, INT16 xMask, INT16
>>> yMask, INT16 xDst,
>>>                                INT16 yDst, CARD16 width, CARD16 height)
>>> ***************
>>> *** 1036,1043 ****
>>>    }
>>>
>>>    #endif
>>> !
>>> !   if (NXAGENT_SHOULD_DEFER_**COMPOSITE(pSrc, pMask, pDst))
>>>    {
>>>      pDstRegion = nxagentCreateRegion(pDst -> pDrawable, NULL, xDst, yDst,
>>> width, height);
>>>
>>> --- 1066,1073 ----
>>>    }
>>>
>>>    #endif
>>> !   /* if (NXAGENT_SHOULD_DEFER_**COMPOSITE(pSrc, pMask, pDst)) */
>>> !   if (nxagentShouldDeferComposite(**pSrc, pMask, pDst))
>>>    {
>>>      pDstRegion = nxagentCreateRegion(pDst -> pDrawable, NULL, xDst, yDst,
>>> width, height);
>>>
>>> ***************
>>> *** 1095,1101 ****
>>>      }
>>>    }
>>>
>>> !   if (pMask != NULL && pMask -> pDrawable != pSrc -> pDrawable &&
>>>            pMask -> pDrawable != pDst -> pDrawable)
>>>    {
>>>      nxagentSynchronizeShmPixmap(**pMask -> pDrawable, xMask, yMask,
>>> width,
>>> height);
>>> --- 1125,1132 ----
>>>      }
>>>    }
>>>
>>> !   if ((pMask) && (pMask->pDrawable) &&
>>> !           pMask -> pDrawable != pSrc -> pDrawable &&
>>>            pMask -> pDrawable != pDst -> pDrawable)
>>>    {
>>>      nxagentSynchronizeShmPixmap(**pMask -> pDrawable, xMask, yMask,
>>> width,
>>> height);
>>> ***************
>>> *** 1259,1265 ****
>>>     * on the real X server.
>>>     */
>>>
>>> !   if (nxagentDrawableStatus(pSrc -> pDrawable) == NotSynchronized)
>>>    {
>>>      #ifdef TEST
>>>      fprintf(stderr, "nxagentGlyphs: Synchronizing source [%s] at
>>> [%p].\n",
>>> --- 1290,1296 ----
>>>     * on the real X server.
>>>     */
>>>
>>> !   if (pSrc -> pDrawable && (nxagentDrawableStatus(pSrc -> pDrawable) ==
>>> NotSynchronized))
>>>    {
>>>      #ifdef TEST
>>>      fprintf(stderr, "nxagentGlyphs: Synchronizing source [%s] at
>>> [%p].\n",
>>> ***************
>>> *** 1302,1315 ****
>>>        nxagentSynchronizeBox(pSrc -> pDrawable, &glyphBox, NEVER_BREAK);
>>>      }
>>>
>>> !     if (pSrc -> pDrawable -> type == DRAWABLE_PIXMAP)
>>>      {
>>>        nxagentIncreasePixmapUsageCoun**ter((PixmapPtr) pSrc ->
>>> pDrawable);
>>>      }
>>>    }
>>>
>>> !   if (pSrc -> pDrawable != pDst -> pDrawable &&
>>> !           nxagentDrawableStatus(pDst -> pDrawable) == NotSynchronized)
>>>    {
>>>      #ifdef TEST
>>>      fprintf(stderr, "nxagentGlyphs: Synchronizing destination [%s] at
>>> [%p].\n",
>>> --- 1333,1347 ----
>>>        nxagentSynchronizeBox(pSrc -> pDrawable, &glyphBox, NEVER_BREAK);
>>>      }
>>>
>>> !     if (pSrc -> pDrawable && (pSrc -> pDrawable -> type ==
>>> DRAWABLE_PIXMAP))
>>>      {
>>>        nxagentIncreasePixmapUsageCoun**ter((PixmapPtr) pSrc ->
>>> pDrawable);
>>>      }
>>>    }
>>>
>>> !
>>> !   if (pSrc -> pDrawable && (pSrc -> pDrawable != pDst -> pDrawable &&
>>> !           nxagentDrawableStatus(pDst -> pDrawable) == NotSynchronized))
>>>    {
>>>      #ifdef TEST
>>>      fprintf(stderr, "nxagentGlyphs: Synchronizing destination [%s] at
>>> [%p].\n",
>>> ***************
>>> *** 1749,1755 ****
>>>      return;
>>>    }
>>>
>>> !   if (nxagentDrawableStatus(pSrc -> pDrawable) == NotSynchronized)
>>>    {
>>>      #ifdef TEST
>>>      fprintf(stderr, "nxagentTrapezoids: Going to synchronize the source
>>> drawable at [%p].\n",
>>> --- 1781,1789 ----
>>>      return;
>>>    }
>>>
>>> !   /* the following blocks need fixing to ignore null values of pDrawable
>>> */
>>> !
>>> !   if (pSrc -> pDrawable && (nxagentDrawableStatus(pSrc -> pDrawable) ==
>>> NotSynchronized))
>>>    {
>>>      #ifdef TEST
>>>      fprintf(stderr, "nxagentTrapezoids: Going to synchronize the source
>>> drawable at [%p].\n",
>>> ***************
>>> *** 1843,1849 ****
>>>     * operation like nxagentTrapezoids() does.
>>>     */
>>>
>>> !   if (nxagentDrawableStatus(pSrc -> pDrawable) == NotSynchronized)
>>>    {
>>>      #ifdef TEST
>>>      fprintf(stderr, "nxagentTriangles: Going to synchronize the source
>>> drawable at [%p].\n",
>>> --- 1877,1885 ----
>>>     * operation like nxagentTrapezoids() does.
>>>     */
>>>
>>> !
>>> !
>>> !   if (pSrc -> pDrawable && (nxagentDrawableStatus(pSrc -> pDrawable) ==
>>> NotSynchronized))
>>>    {
>>>      #ifdef TEST
>>>      fprintf(stderr, "nxagentTriangles: Going to synchronize the source
>>> drawable at [%p].\n",
>>> ***************
>>> *** 1920,1926 ****
>>>     * operation like nxagentTrapezoids() does.
>>>     */
>>>
>>> !   if (nxagentDrawableStatus(pSrc -> pDrawable) == NotSynchronized)
>>>    {
>>>      #ifdef TEST
>>>      fprintf(stderr, "nxagentTriStrip: Going to synchronize the source
>>> drawable at [%p].\n",
>>> --- 1956,1963 ----
>>>     * operation like nxagentTrapezoids() does.
>>>     */
>>>
>>> !
>>> !   if (pSrc -> pDrawable && (nxagentDrawableStatus(pSrc -> pDrawable) ==
>>> NotSynchronized))
>>>    {
>>>      #ifdef TEST
>>>      fprintf(stderr, "nxagentTriStrip: Going to synchronize the source
>>> drawable at [%p].\n",
>>> ***************
>>> *** 1997,2003 ****
>>>     * operation like nxagentTrapezoids() does.
>>>     */
>>>
>>> !   if (nxagentDrawableStatus(pSrc -> pDrawable) == NotSynchronized)
>>>    {
>>>      #ifdef TEST
>>>      fprintf(stderr, "nxagentTriFan: Going to synchronize the source
>>> drawable at [%p].\n",
>>> --- 2034,2041 ----
>>>     * operation like nxagentTrapezoids() does.
>>>     */
>>>
>>> !
>>> !   if (pSrc -> pDrawable && (nxagentDrawableStatus(pSrc -> pDrawable) ==
>>> NotSynchronized))
>>>    {
>>>      #ifdef TEST
>>>      fprintf(stderr, "nxagentTriFan: Going to synchronize the source
>>> drawable at [%p].\n",
>>>
>>>
>>
>>
>> --
>>
>> DAS-NETZWERKTEAM
>> mike gabriel, dorfstr. 27, 24245 barmissen
>> fon: +49 (4302) 281418, fax: +49 (4302) 281419
>>
>> GnuPG Key ID 0xB588399B
>> mail: mike.gabriel at das-netzwerkteam.**de<mike.gabriel at das-netzwerkteam.de>,
>> http://das-netzwerkteam.de
>>
>> freeBusy:
>> https://mail.das-netzwerkteam.**de/freebusy/m.gabriel%40das-**
>> netzwerkteam.de.xfb<https://mail.das-netzwerkteam.de/freebusy/m.gabriel%40das-netzwerkteam.de.xfb>
>>
>> _______________________________________________
>> X2Go-Dev mailing list
>> X2Go-Dev at lists.berlios.de
>> https://lists.berlios.de/mailman/listinfo/x2go-dev
>>
>



-- 

DAS-NETZWERKTEAM
mike gabriel, dorfstr. 27, 24245 barmissen
fon: +49 (4302) 281418, fax: +49 (4302) 281419

GnuPG Key ID 0xB588399B
mail: mike.gabriel at das-netzwerkteam.de, http://das-netzwerkteam.de

freeBusy:
https://mail.das-netzwerkteam.de/freebusy/m.gabriel%40das-netzwerkteam.de.xfb
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 490 bytes
Desc: Digitale PGP-Unterschrift
URL: <http://lists.x2go.org/pipermail/x2go-dev/attachments/20120515/f10c1990/attachment.pgp>


More information about the x2go-dev mailing list