From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-io1-xd29.google.com (mail-io1-xd29.google.com [IPv6:2607:f8b0:4864:20::d29]) by sourceware.org (Postfix) with ESMTPS id 111D83858C53 for ; Sat, 7 May 2022 02:01:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 111D83858C53 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-io1-xd29.google.com with SMTP id e194so9869478iof.11 for ; Fri, 06 May 2022 19:01:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to; bh=KxxH6w4yQYoNlXQdlKIbBR1HC6gKAj009K1pH/W3hQA=; b=nBBmBiE1wl8Gn2tvE6E3TyEsKZFsRTDQ0GVNvttjW6RnGHJLFqpDkUxlB444HqiTLl KZlKKtps1ClJTb9pvrLf/dVq3qjtAiXwRdWEixybdZChOZrUM0EIYcnXIyQpkTheMcL5 XFN1qOLKSaAHirrvnb97J/9ca216j1weZ3ECTUd2FKRIKfYaLDD1cP4yqUNIQw7fjA1C uYtUYSVirGs4N+pUxhD59qT7TVH88xo/f9WlekI34k8jsxPy04OjtNtpwyABxqdmtTRw /MiAJ/A7CBTZZ7VXmC8ofJMKmwqjyQUW6n4CB1Q5Zaj14NOFFS2oFEpWrpnlKAuRsqqu rqhw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=KxxH6w4yQYoNlXQdlKIbBR1HC6gKAj009K1pH/W3hQA=; b=ol3DZ8QXrxXL7xxcgro1trShjTR78rHtJg9mmd3YnQAKhT3kDP80vcFSML36Cu8Z+9 g5gCVLTQRTZcM5Gbf4w54XL1rjk/i0k+kVr8JznMWrAoF5P9S++5izlS1poO9Zdla2e9 ChJHPV+sCUTL+iD7vrICpbVWBqcBeKOrJuusEGSTfFIM5OAyBy+YsB3w8Viy1abFgGZh SJqsmL6zhSgUohDs24EqNU4ZW+qzVNYgAMbVU5Ryhahfh/DBhtm/4kQMr3d4+OyO/8CG e2votGHo9/sxwkhH2emHxsNDfa8Q8ZKtiYjZGVpYjzpp2K/zWggUe+EcCqZ0MddriDpK d92A== X-Gm-Message-State: AOAM532Wx8Ck+g1rUE8qiCqADX6AU5+oJ9NrbKA4kRctyZ7U6jKPJ2yl 1qZWmXJUVaFqXprYx5Z6YgR1eLYd2yYRuGCViCGwwL1O X-Google-Smtp-Source: ABdhPJyK4fmfR6ztN/ib7lW73jv/iv/QOGYmqkMf00Dosm/OI+5RR4cyITWYLL4NYuOMmlcOv++60ByyKMwOmjduBZs= X-Received: by 2002:a05:6638:30e:b0:32a:f864:e4d4 with SMTP id w14-20020a056638030e00b0032af864e4d4mr2569389jap.218.1651888898827; Fri, 06 May 2022 19:01:38 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: "S.J. Luo" Date: Sat, 7 May 2022 10:01:32 +0800 Message-ID: Subject: Re: Window flickering problem in XWin multiwindow mode To: cygwin@cygwin.com Content-Type: multipart/mixed; boundary="00000000000005fcba05de625b8a" X-Spam-Status: No, score=-0.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: cygwin@cygwin.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: General Cygwin discussions and problem reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 07 May 2022 02:01:42 -0000 --00000000000005fcba05de625b8a Content-Type: text/plain; charset="UTF-8" Hi, > > > I have some EDA tools running on a Linux machine and display on my Windows > > > PC using xorg-server-21.1.3 XWin multiwindow mode > > > Sometimes the application window flickers forever for an unknown reason. > > > The problem became more severe after my PC upgrade to Windows10. > > > > > > Knowing the root cause, I am now able to demonstrate the issue with a small > > > test case as well as a patch that works for me. Both are attached below. > > > > Thanks very much for taking the time to look into this, and writing a patch. > > But I'd like to add a bit more commentary, which perhaps you can supply, > > about the analysis you did to determine: > > > > 1. how the code is misbehaving > > 2. how this change remedies that > > 3. how this change doesn't effect anything else > > > > What your fix does is examine the queue of pending WM messages to > > determine if there are any more pending for the window receiving a > > WM_WM_CHANGE_STATE message, and if there are, ignore it. > > > > It seems to me that is error prone, in a couple of ways: > > > > 1. it should check the message type as well, as e.g. a pending message > > of a different type could cause a WM_WM_CHANGE_STATE message to be ignored. > > > > 2. even then, assuming that successive WM_WM_CHANGE_STATE messages > > cancel out each other isn't always true e.g. consider a sequence of > > _NET_WM_STATE_ADD _NET_WM_STATE_MAXIMIZED_VERT followed by > > _NET_WM_STATE_ADD _NET_WM_STATE_MAXIMIZED_HORZ. > > > Here I have some details on the problem: > In following, WWCS means WM_WM_CHANGE_STATE > There exists a message self-generating loop > I.e., a WWCS message may generate another WWCS. > > winSendMessageToWM(WWCS) --> MultiWindowWMProc(WWCS) > --> UpdateState() --> ShowWindow() --> MultiWindowProc(WM_SIZE) > --> winAdjustXWindowState() --> winSendMessageToWM(WWCS) > > In normal case, there is a conditional code inside UpdateState() that > could break the loop. > > if (current_state == state) > return; > > Normally after maximizing the window, the WWCS just > to be self-generated once. On processing the 2nd WWCS, > the current window state matches WWCS target state > and ShowWindow() won't be called and the loop could end. > > Initial > Window state normal > queue : | WWCS(max1) | > --> process WWCS(max1) : > Winow state (norm) != target state (max2) > Set Window state to max and generate WWCS(max2) > queue : | WWCS(max2) | > --> Process WWCS(max2) : > Winow state (max) == target state (max) > break > > where WWCS(max1) means WWCS msg with target state max > and 1 means first generated/inserted WWCS in queue. > > However, there is case triggering this loop running forever. > Assuming intitially there are two WWCS message exists > where one is to maximize window and one is to normal window > The condition of state compare in UpdateState() would never match. > And WWCS(max) and WWCS(norm) is going to self-generate in turn. > > Initial > Window state normal > queue : | WWCS(max1) | WWCS(norm1) | > --> process WWCS(max1) > Winow state (norm) != target state (max) > Set window state to max and generate WWCS(max2) > queue : | WWCS(norm1) | WWCS(max2) | > --> Process WWCS(norm1) > Winow state (max) != target state (norm) > Set window state to norm and generate WWCS(norm2) > queue : | WWCS(max2) | WWCS(norm2) | > --> Process WWCS(max2) > Winow state (norm) != target state (max) > Set window state to max and generate WWCS(max3) > queue : | WWCS(norm2) | WWCS(max3) | > --> Process WWCS(norm2) > Winow state (max) != target state (norm) > Set window state to norm and generate WWCS(norm3) > queue : | WWCS(max3) | WWCS(norm3) | > : > (loop forever) > I just did some more study on the code of multiwindow window manager and X11 Window Properties as well as the questions you brought up. The first question : > it should check the message type as well, as e.g. > a different type mesage could cause WM_WM_CHANGE_STYLE to be ignored. Not sure what the "type" of a message means. Do you mean window manager message WM_xxxxx that is processed by winMultiWindowWMProc() where it is alreadychecked in HaveMessage(), or do you mean X message XCB_xxxxxx that is processed by winMultiWindowXMsgProc()? Maybe you can provide an example of another message type? The second question: > Successive WM_WM_CHANGE_STATE messages cancel out each other > isn't always true ex. _NET_WM_STATE_ADD _NET_WM_STATE_MAXIMIZED_VERT > followed by _NET_WM_STATE_ADD _NET_WM_STATE_MAXIMIZED_HORZ. Inspecting the code that deal with XCB_CLIENT_MESSAGE, it seems already true before the patch: The window goes maximized only if X client do one _WM_STATE_ADD action with _NET_WM_STATE_MAXIMIZED_VERT and _NET_WM_STATE_MAXIMIZED_HORZ simultaneously specified. Otherwise, the WM_WM_CHANGE would not be sent to the queue. Further, in UpdateWindowState(), the state and related X properties are either all-overwritten or all-skipped. There seems to be no state property half-update case if we skip UpdateWindowState(). In anyway, I just came out somewhat different patch attached. Where it just skips the Win32 ShowWindow() call instead of skipping processing WM_WM_CHANGE_STATE. It might be better because the X properties are still always updated in each in WM_WM_CHANGE_STATE. Maybe you could provide further comment. SL --00000000000005fcba05de625b8a Content-Type: application/x-patch; name="flicker2b.patch" Content-Disposition: attachment; filename="flicker2b.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_l2v6rrax0 ZGlmZiAtLWdpdCBhL2h3L3h3aW4vd2lubXVsdGl3aW5kb3d3bS5jIGIvaHcveHdpbi93aW5tdWx0 aXdpbmRvd3dtLmMKaW5kZXggN2VlZTJmYi4uYjJlNWRjOSAxMDA2NDQKLS0tIGEvaHcveHdpbi93 aW5tdWx0aXdpbmRvd3dtLmMKKysrIGIvaHcveHdpbi93aW5tdWx0aXdpbmRvd3dtLmMKQEAgLTE1 Myw2ICsxNTMsOSBAQCBzdGF0aWMgdm9pZAogCiBzdGF0aWMgV01Nc2dOb2RlUHRyIFBvcE1lc3Nh Z2UoV01Nc2dRdWV1ZVB0ciBwUXVldWUsIFdNSW5mb1B0ciBwV01JbmZvKTsKIAorc3RhdGljIEJv b2wKKyBIYXZlTWVzc2FnZShXTU1zZ1F1ZXVlUHRyIHBRdWV1ZSwgVUlOVCBtc2csIHhjYl93aW5k b3dfdCBpV2luZG93KTsKKwogc3RhdGljIEJvb2wKICBJbml0UXVldWUoV01Nc2dRdWV1ZVB0ciBw UXVldWUpOwogCkBAIC0zMTksNyArMzIyLDYgQEAgUG9wTWVzc2FnZShXTU1zZ1F1ZXVlUHRyIHBR dWV1ZSwgV01JbmZvUHRyIHBXTUluZm8pCiAgICAgcmV0dXJuIHBOb2RlOwogfQogCi0jaWYgMAog LyoKICAqIEhhdmVNZXNzYWdlIC0KICAqLwpAQCAtMzMxLDEyICszMzMsMTEgQEAgSGF2ZU1lc3Nh Z2UoV01Nc2dRdWV1ZVB0ciBwUXVldWUsIFVJTlQgbXNnLCB4Y2Jfd2luZG93X3QgaVdpbmRvdykK IAogICAgIGZvciAocE5vZGUgPSBwUXVldWUtPnBIZWFkOyBwTm9kZSAhPSBOVUxMOyBwTm9kZSA9 IHBOb2RlLT5wTmV4dCkgewogICAgICAgICBpZiAocE5vZGUtPm1zZy5tc2cgPT0gbXNnICYmIHBO b2RlLT5tc2cuaVdpbmRvdyA9PSBpV2luZG93KQotICAgICAgICAgICAgcmV0dXJuIFRydWU7Cisg ICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAKLSAgICByZXR1cm4gRmFsc2U7CisgICAg cmV0dXJuIEZBTFNFOwogfQotI2VuZGlmCiAKIC8qCiAgKiBJbml0UXVldWUgLSBJbml0aWFsaXpl IHRoZSBXaW5kb3cgTWFuYWdlciBtZXNzYWdlIHF1ZXVlCkBAIC03NDgsMTIgKzc0OSwxMiBAQCBV cGRhdGVTdHlsZShXTUluZm9QdHIgcFdNSW5mbywgeGNiX3dpbmRvd190IGlXaW5kb3csIHVuc2ln bmVkIGxvbmcgKm1heG1pbikKICAqLwogCiBzdGF0aWMgdm9pZAotVXBkYXRlU3RhdGUoV01JbmZv UHRyIHBXTUluZm8sIHhjYl93aW5kb3dfdCBpV2luZG93LCBpbnQgc3RhdGUpCitVcGRhdGVTdGF0 ZShXTUluZm9QdHIgcFdNSW5mbywgeGNiX3dpbmRvd190IGlXaW5kb3csIGludCBzdGF0ZSwgQk9P TCBiU2hvdykKIHsKICAgICBIV05EIGhXbmQ7CiAgICAgaW50IGN1cnJlbnRfc3RhdGUgPSAtMTsK IAotICAgIHdpbkRlYnVnKCJVcGRhdGVTdGF0ZTogaVdpbmRvdyAweCUwOHggJWRcbiIsIChpbnQp aVdpbmRvdywgc3RhdGUpOworICAgIHdpbkRlYnVnKCJVcGRhdGVTdGF0ZTogaVdpbmRvdyAweCUw OHggJWQgJWRcbiIsIChpbnQpaVdpbmRvdywgc3RhdGUsIChpbnQpIGJTaG93KTsKIAogICAgIGhX bmQgPSBnZXRId25kKHBXTUluZm8sIGlXaW5kb3cpOwogICAgIGlmIChoV25kKQpAQCAtNzY0LDI5 ICs3NjUsMzYgQEAgVXBkYXRlU3RhdGUoV01JbmZvUHRyIHBXTUluZm8sIHhjYl93aW5kb3dfdCBp V2luZG93LCBpbnQgc3RhdGUpCiAgICAgICAgICAgICBpZiAoY3VycmVudF9zdGF0ZSA9PSBzdGF0 ZSkKICAgICAgICAgICAgICAgICByZXR1cm47CiAKKyAgICAgICAgICAgIC8vIFRoZXJlIHdvdWxk IGJlIHNtYWxsIGludGVydmFsIHRoYXQgdmFyaWFibGUgJ3N0YXRlJyBkb2VzIG5vdAorICAgICAg ICAgICAgLy8gbWF0Y2ggdG8gV2luZG93cyB3aW5kb3cgc3RhdGUgaWYgYlNob3c9PTAKKyAgICAg ICAgICAgIC8vIEJ1dCBtZWFud2hpbGUgdGhlcmUgc2hvdWxkIGJlIGEgYW5vdGhlciBXTV9XTV9D SEFOR0UgcGVuZGluZworICAgICAgICAgICAgLy8gYW5kIHNvb24gdGhlIFdpbmRvd3Mgc3RhdGUg d2lsbCBiZSB1cGRhdGVkCiAgICAgICAgICAgICBTZXRQcm9wKGhXbmQsIFdJTl9TVEFURV9QUk9Q LCAoSEFORExFKShpbnRwdHJfdClzdGF0ZSk7CiAKLSAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUp Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgWENCX0lDQ0NNX1dNX1NU QVRFX0lDT05JQzoKLSAgICAgICAgICAgICAgICAgICAgU2hvd1dpbmRvdyhoV25kLCBTV19TSE9X TUlOTk9BQ1RJVkUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotI2RlZmluZSBYQ0Jf SUNDQ01fV01fU1RBVEVfWk9PTSAyCi0gICAgICAgICAgICAgICAgY2FzZSBYQ0JfSUNDQ01fV01f U1RBVEVfWk9PTToKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgZG9lc24ndCBzZWVtIHRv IGJlIGEgU1dfU0hPV01BWE5PQUNUSVZFLiAgSG9wZWZ1bGx5Ci0gICAgICAgICAgICAgICAgICAg IC8vIGFsd2F5cyBhY3RpdmF0aW5nIGEgbWF4aW1pemVkIHdpbmRvdyBpc24ndCBzbyBiYWQuLi4K LSAgICAgICAgICAgICAgICAgICAgU2hvd1dpbmRvdyhoV25kLCBTV19TSE9XTUFYSU1JWkVEKTsK LSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFhDQl9J Q0NDTV9XTV9TVEFURV9OT1JNQUw6Ci0gICAgICAgICAgICAgICAgICAgIFNob3dXaW5kb3coaFdu ZCwgU1dfU0hPV05PQUNUSVZBVEUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAg ICAgICAgICAgICAgIGNhc2UgWENCX0lDQ0NNX1dNX1NUQVRFX1dJVEhEUkFXTjoKLSAgICAgICAg ICAgICAgICAgICAgU2hvd1dpbmRvdyhoV25kLCBTV19ISURFKTsKLSAgICAgICAgICAgICAgICAg ICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoYlNob3cpIHsKKwor ICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAg ICAgICAgICAgICAgICAgICAgY2FzZSBYQ0JfSUNDQ01fV01fU1RBVEVfSUNPTklDOgorICAgICAg ICAgICAgICAgICAgICAgICAgU2hvd1dpbmRvdyhoV25kLCBTV19TSE9XTUlOTk9BQ1RJVkUpOwor ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAjZGVmaW5lIFhDQl9JQ0NDTV9X TV9TVEFURV9aT09NIDIKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBYQ0JfSUNDQ01fV01fU1RB VEVfWk9PTToKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGRvZXNuJ3Qgc2VlbSB0 byBiZSBhIFNXX1NIT1dNQVhOT0FDVElWRS4gIEhvcGVmdWxseQorICAgICAgICAgICAgICAgICAg ICAgICAgLy8gYWx3YXlzIGFjdGl2YXRpbmcgYSBtYXhpbWl6ZWQgd2luZG93IGlzbid0IHNvIGJh ZC4uLgorICAgICAgICAgICAgICAgICAgICAgICAgU2hvd1dpbmRvdyhoV25kLCBTV19TSE9XTUFY SU1JWkVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAg ICAgICAgIGNhc2UgWENCX0lDQ0NNX1dNX1NUQVRFX05PUk1BTDoKKyAgICAgICAgICAgICAgICAg ICAgICAgIFNob3dXaW5kb3coaFduZCwgU1dfU0hPV05PQUNUSVZBVEUpOworICAgICAgICAgICAg ICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBYQ0JfSUNDQ01f V01fU1RBVEVfV0lUSERSQVdOOgorICAgICAgICAgICAgICAgICAgICAgICAgU2hvd1dpbmRvdyho V25kLCBTV19ISURFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg ICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgIC8vIFVwZGF0ZSBX TV9TVEFURSBwcm9wZXJ0eQpAQCAtMTAxMiw3ICsxMDIwLDcgQEAgd2luTXVsdGlXaW5kb3dXTVBy b2Modm9pZCAqcEFyZykKICAgICAgICAgICAgIFVwZGF0ZVdpbmRvdyhwTm9kZS0+bXNnLmh3bmRX aW5kb3cpOwogCiAgICAgICAgICAgICAvKiBFc3RhYmxpc2ggaW5pdGlhbCBzdGF0ZSAqLwotICAg ICAgICAgICAgVXBkYXRlU3RhdGUocFdNSW5mbywgcE5vZGUtPm1zZy5pV2luZG93LCBYQ0JfSUND Q01fV01fU1RBVEVfTk9STUFMKTsKKyAgICAgICAgICAgIFVwZGF0ZVN0YXRlKHBXTUluZm8sIHBO b2RlLT5tc2cuaVdpbmRvdywgWENCX0lDQ0NNX1dNX1NUQVRFX05PUk1BTCwgVFJVRSk7CiAKICAg ICAgICAgICAgIC8qCiAgICAgICAgICAgICAgIEl0IG9ubHkgbWFrZXMgc2Vuc2UgdG8gYXBwbHkg bWluaW1pemUvbWF4aW1pemUgb3ZlcnJpZGUgYXMgdGhlCkBAIC0xMTczLDcgKzExODEsMTEgQEAg d2luTXVsdGlXaW5kb3dXTVByb2Modm9pZCAqcEFyZykKICAgICAgICAgICAgIGJyZWFrOwogCiAg ICAgICAgIGNhc2UgV01fV01fQ0hBTkdFX1NUQVRFOgotICAgICAgICAgICAgVXBkYXRlU3RhdGUo cFdNSW5mbywgcE5vZGUtPm1zZy5pV2luZG93LCBwTm9kZS0+bXNnLmR3SUQpOworICAgICAgICAg ICAgaWYoSGF2ZU1lc3NhZ2UoJnBXTUluZm8tPndtTXNnUXVldWUsIHBOb2RlLT5tc2cubXNnLCBw Tm9kZS0+bXNnLmlXaW5kb3cpKQorICAgICAgICAgICAgICAgIFVwZGF0ZVN0YXRlKHBXTUluZm8s IHBOb2RlLT5tc2cuaVdpbmRvdywgcE5vZGUtPm1zZy5kd0lELCBGQUxTRSk7CisgICAgICAgICAg ICBlbHNlCisgICAgICAgICAgICAgICAgVXBkYXRlU3RhdGUocFdNSW5mbywgcE5vZGUtPm1zZy5p V2luZG93LCBwTm9kZS0+bXNnLmR3SUQsIFRSVUUpOworCiAgICAgICAgICAgICBicmVhazsKIAog ICAgICAgICBkZWZhdWx0Ogo= --00000000000005fcba05de625b8a--