[Xquartz-dev] Line drawing in 1.5 and 1.6 servers

Jeremy Huddleston jeremyhu at apple.com
Sat Sep 26 19:56:03 PDT 2009


Ok, I think I found the cause and a hackish workaround for this issue...

The problem stems from the fact that the core/common X server code no  
longer has hooks for paintWindowBorder and paintWindowBackground.

We were using those hooks for correcting alpha values as well as  
handling cases like this.  After the core X developers nuked those  
callbacks a while back, I went through and fixed hacked the alpha  
values back into place, but I missed this particular problem.

I have a bit of a hack to get functionality back in place, but it's  
not elegant.  I'm going to try finding a better solution for all of  
this.  I essentially resurrected some code that had been punted and  
found a place to put it into the pipe, but my guess is that there's a  
better location for it.

--Jeremy


----


diff --git a/mi/miexpose.c b/mi/miexpose.c
index 961c35c..d540a9f 100644
--- a/mi/miexpose.c
+++ b/mi/miexpose.c
@@ -531,6 +531,14 @@ miWindowExposures(pWin, prgn, other_exposed)
	REGION_DESTROY( pWin->drawable.pScreen, exposures);
}

+#ifdef ROOTLESS
+/* Ugly, ugly, but we lost our hooks into miPaintWindow... =/ */
+void RootlessSetPixmapOfAncestors(WindowPtr pWin);
+void RootlessStartDrawing(WindowPtr pWin);
+void RootlessDamageRegion(WindowPtr pWin, RegionPtr prgn);
+Bool IsFramedWindow(WindowPtr pWin);
+#endif
+
_X_EXPORT void
miPaintWindow(WindowPtr pWin, RegionPtr prgn, int what)
{
@@ -556,6 +564,19 @@ miPaintWindow(WindowPtr pWin, RegionPtr prgn, int  
what)
     Bool	solid = TRUE;
     DrawablePtr	drawable = &pWin->drawable;

+#ifdef ROOTLESS
+    if(IsFramedWindow(pWin)) {
+        RootlessStartDrawing(pWin);
+        RootlessDamageRegion(pWin, prgn);
+
+        if(pWin->backgroundState == ParentRelative) {
+            if((what == PW_BACKGROUND) ||
+               (what == PW_BORDER && !pWin->borderIsPixel))
+                RootlessSetPixmapOfAncestors(pWin);
+        }
+    }
+#endif
+
     if (what == PW_BACKGROUND)
     {
	while (pWin->backgroundState == ParentRelative)
diff --git a/miext/rootless/rootlessWindow.c b/miext/rootless/ 
rootlessWindow.c
index 3787e7e..2e5e84c 100644
--- a/miext/rootless/rootlessWindow.c
+++ b/miext/rootless/rootlessWindow.c
@@ -1692,3 +1692,29 @@ RootlessShowAllWindows (void)
         RootlessScreenExpose (pScreen);
     }
}
+
+/*
+ * SetPixmapOfAncestors
+ *  Set the Pixmaps on all ParentRelative windows up the ancestor  
chain.
+ */
+void
+RootlessSetPixmapOfAncestors(WindowPtr pWin)
+{
+    ScreenPtr pScreen = pWin->drawable.pScreen;
+    WindowPtr topWin = TopLevelParent(pWin);
+    RootlessWindowRec *topWinRec = WINREC(topWin);
+
+    while (pWin->backgroundState == ParentRelative) {
+        if (pWin == topWin) {
+            // disallow ParentRelative background state on top level
+            XID pixel = 0;
+            ChangeWindowAttributes(pWin, CWBackPixel, &pixel,  
serverClient);
+            RL_DEBUG_MSG("Cleared ParentRelative on 0x%x.\n", pWin);
+            break;
+        }
+
+        pWin = pWin->parent;
+        pScreen->SetWindowPixmap(pWin, topWinRec->pixmap);
+    }
+}
+
On Sep 24, 2009, at 14:29, Jeremy Huddleston wrote:

> Thanks Martin,
>
> This will help tremendously.  I'm going to look at it this weekend,  
> and if I can't figure it out, I'll ask the brain trust at XDC next  
> week.
>
> Thanks,
> Jeremy
>
> On Sep 24, 2009, at 13:38, Martin Otte wrote:
>
>> Hi,
>>
>> Attached is a simplified test case showing that in a call to  
>> XCreateSimpleWindow, the border around the subwindow is not  
>> displayed. With the 1.4 server, the program displays:
>>
>> <server_1.4.png>
>>
>>
>> but with the 1.5 server, the border of the inner window is not shown:
>>
>> <server_1.5.png>
>>
>>
>>
>> I also added this example code to bug report #290.
>>
>> Hope this helps,
>> Martin
>>
>>
>> <border.c>
>>
>>
>>
>>
>> On Sep 18, 2009, at 12:49 AM, Jeremy Huddleston wrote:
>>
>>>
>>> On Sep 17, 2009, at 11:48, Martin Otte wrote:
>>>
>>>> Hi,
>>>>
>>>> The problem with the lines not drawn correctly occurs when  
>>>> calling XCreateSimpleWindow. The program I have uses  
>>>> XCreateSimpleWindow to create the buttons and their borders. When  
>>>> I increase the size of the border in XCreateSimpleWindow and turn  
>>>> off all other decorations, this is what I see:
>>>>
>>>> <border.png>
>>>>
>>>> It is interesting to see part of the quartz-wm frame imposed on  
>>>> the button borders. My guess is that the border pixmap is not  
>>>> being created/shown correctly in the server. Looking through dix/ 
>>>> window.c and mi/miexpose.c a lot has changed between the 1.4 and  
>>>> 1.5 versions of the server, so I don't think I'll be much help in  
>>>> tracking down the problem.
>>>
>>> My guess is that the changes have just resulted in nothing  
>>> actually being drawn.  What you're seeing in the background there  
>>> is actually just the uninitialized garbage that happened to be at  
>>> the memory location allocated for that backing store which was  
>>> previously used to draw a quartz-wm widget.
>>>
>>> Can you provide me with your simplified test case.  That'll be  
>>> easier than dragging the xterm window resize around every time I  
>>> want to debug this.
>>>
>>> Thanks,
>>> Jeremy
>>>
>>>
>>> _______________________________________________
>>> Xquartz-dev mailing list
>>> Xquartz-dev at lists.macosforge.org
>>> http://lists.macosforge.org/mailman/listinfo.cgi/xquartz-dev
>>
>> _______________________________________________
>> Xquartz-dev mailing list
>> Xquartz-dev at lists.macosforge.org
>> http://lists.macosforge.org/mailman/listinfo.cgi/xquartz-dev
>
> _______________________________________________
> Xquartz-dev mailing list
> Xquartz-dev at lists.macosforge.org
> http://lists.macosforge.org/mailman/listinfo.cgi/xquartz-dev

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 3333 bytes
Desc: not available
URL: <http://lists.macosforge.org/pipermail/xquartz-dev/attachments/20090926/6cba288f/attachment.bin>


More information about the Xquartz-dev mailing list