From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FROM autolearn=no autolearn_force=no version=3.4.4 Received: (qmail 18777 invoked from network); 12 Jul 2021 20:51:35 -0000 Received: from 1ess.inri.net (216.126.196.35) by inbox.vuxu.org with ESMTPUTF8; 12 Jul 2021 20:51:35 -0000 Received: from mail-pf1-f176.google.com ([209.85.210.176]) by 1ess; Mon Jul 12 16:00:23 -0400 2021 Received: by mail-pf1-f176.google.com with SMTP id p22so4492610pfh.8 for <9front@9front.org>; Mon, 12 Jul 2021 12:58:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=z61fO5o1kMoNYzevDi2aSO5r4wB69HcEoBDU3elVtYc=; b=CRGe7+yrttVYqQTkGGOO0VN1xjjuDplEvKqsA5iRW8jQQIXfV3P/W3C22QGbvBjCCf W96lY4rtZj3Qr2dUlz6ELsXphznmRMUS8M4r6aJmFra9W3BXandUyOZoc7bGeq09CTX7 Ar/QAzAIY1hsDiljFYJ9LcxUwjMp+nhxr8zJstwUFjPUV8IBjAE9kCVGhFRXxXtwrb0y yG7Ys68un0L7GIG4NuNoBHjYmDkwpPOXmcNObLM37/69L5lKHNm6m/pQO5END1ITr3fU GjyWcCfVDRaUx6X8AE4zzw6U2Ef/HK7z9S+eePxnHdkfyBCCQnW73Y9f9UAtLowW2wfY Vbfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=z61fO5o1kMoNYzevDi2aSO5r4wB69HcEoBDU3elVtYc=; b=CTYJJOGFy/ff1pTW30eKOHAprb+LaRqj3GtDi8hZ3p6KVF/DE6kLdhsnG2Z4rQHHqO jLTiS7JicGKDEy7rMUI3/5SIvwyoYcb4VGLx+OfkVo85vtXPjEoiR96rH47NTFvBb/4t p9PPM4WLl53QNy2VnZNbeo/LKFkE0cgaPgy2wp+842nG+YOz5S1IXnEJxYB0SZ+i0/eN hO1wKv8uq/XeYXnKjgmhYoUCsmhA2LHJOqzkc2RJLMAELdwPrFj+eZf17vcyOgeI2vGk emKImItnMnRl+ltvZyKgswI4SlCia4l8g3gOdYASJ2qs74MiuJLT58+DQZwPn1+BqIo+ XWWw== X-Gm-Message-State: AOAM533+q1KKPPPGL1Cg0ZDDMDEwy2TXVtjrCn078kaaIlYxR3tV4KHL 1XremIHshJspYgnTKdZeN/z/w+pvrcQkkHITY8Tq8dMlrlo= X-Google-Smtp-Source: ABdhPJzvFO01tybCwY6d00TQIWG9hqXCQEYx9TZMK/LAn8CNu+nIsW4zUovDNM4sR6nIbR5sjY2JQLfFiKzRMicCrOM= X-Received: by 2002:a63:ff22:: with SMTP id k34mr716051pgi.336.1626119466460; Mon, 12 Jul 2021 12:51:06 -0700 (PDT) MIME-Version: 1.0 From: =?UTF-8?B?Sm9zw6kgTWlndWVsIFPDoW5jaGV6IEdhcmPDrWE=?= Date: Mon, 12 Jul 2021 21:50:55 +0200 Message-ID: To: 9front@9front.org Content-Type: multipart/mixed; boundary="0000000000002adf8005c6f27177" List-ID: <9front.9front.org> List-Help: X-Glyph: ➈ X-Bullshit: encrypted stable CMS dependency HTML framework realtime-java manager Subject: [9front] Mouse clipping patch Reply-To: 9front@9front.org Precedence: bulk --0000000000002adf8005c6f27177 Content-Type: text/plain; charset="UTF-8" Hello everyone, After talking with some people about the need of proper mouse grabbing for some programs (think about vncv, qwx's quake ports, screenlock), I've implemented it. The devmouse and libdraw patches modify /dev/mousectl to accept two new commands: "clip x0 y0 x1 y1" and "release". The "clip" command confines the mouse inside the given rect. It must be a subrect of the current screen, otherwise the operation will fail. Release undoes that operation (and it's a no-op if there is no grab active). Subsequent clip and release commands override each other, and a grab is automatically released if the fd that made it is closed (in order to prevent a grab to trap the mouse after a program crash). The rio patch modifies rio so that it multiplexes the new grabbing capabilities among its windows. This is transparent to the underlying program: they can clip and release the mouse at will (provided that the clipping rect lies inside their window). Mouse grab in rio follows this rules: - The grab is released after a Reshape event. It's up to the running program to recover that grab in its resize handler. That guarantees the active grab to be always correct (and gives the program a chance to fix it once it isn't anymore) - Only the current window's grab is active at any moment. If some other window is grabbing the mouse, it doesn't have any effect. This keeps rio transparent to the underlying programs grabbing the mouse: they all think they have the global grab at the same time, but focus alone is what ultimately decides which one is active, like it already does for keyboard/mouse input. This proves to be useful when windows are opened while a grab is held (after a plumb, or after spawning a new window). - Rio menus temporarily release the mouse, so options outside of the grabbing rect can be accessed. The grab is restored if needed after the menu is closed. - Windows holding the mouse have a different border color, so they can be clearly identified. Currently it overrides the blue hold color, although I believe that the event of having a text window grabbing the mouse and also holding the input is unlikely. In order to make these changes possible, I had to alter the behavior of rio when handling a reshape done using the window borders: right now it tops the window, and then handles the reshape. I changed that behavior to be the opposite: first handle the resize and then top the window. This allows resizing unfocused windows which would grab the mouse when topped. As far as I know, and after some testing, it looks like I didn't break anything. I'm open to feedback, as there has been interesting alternatives proposed during the development of this patch. I hope that, by bringing my work to the public, any improvements can be shared and reviewed by everyone. Cheers, jmi2k --0000000000002adf8005c6f27177 Content-Type: application/octet-stream; name="libdraw-mousegrab.diff" Content-Disposition: attachment; filename="libdraw-mousegrab.diff" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_kr11dgfu2 LS0tIC8vLmdpdC9mcy9vYmplY3QvMmY4YTU5ZjRiNWJmZTAyOGMwMjI4NTVhY2MxOTY2NmQ2OWVl ZDkwOS90cmVlLy9zeXMvaW5jbHVkZS9tb3VzZS5oCisrKyAvc3lzL2luY2x1ZGUvbW91c2UuaApA QCAtMjIsNiArMjIsNyBAQAogCiAJY2hhcgkJKmZpbGU7CiAJaW50CQltZmQ7CQkvKiB0byBtb3Vz ZSBmaWxlICovCisJaW50CQltY3RsZmQ7CQkvKiB0byBtb3VzZWN0bCBmaWxlICovCiAJaW50CQlj ZmQ7CQkvKiB0byBjdXJzb3IgZmlsZSAqLwogCWludAkJcGlkOwkJLyogb2Ygc2xhdmUgcHJvYyAq LwogCUltYWdlKglpbWFnZTsJLyogb2YgYXNzb2NpYXRlZCB3aW5kb3cvZGlzcGxheSAqLwpAQCAt MzksNiArNDAsOCBAQAogICovCiBleHRlcm4gTW91c2VjdGwqCWluaXRtb3VzZShjaGFyKiwgSW1h Z2UqKTsKIGV4dGVybiB2b2lkCQltb3ZldG8oTW91c2VjdGwqLCBQb2ludCk7CitleHRlcm4gaW50 CQljbGlwbW91c2UoTW91c2VjdGwqLCBSZWN0YW5nbGUpOworZXh0ZXJuIHZvaWQJCXJlbGVhc2Vt b3VzZShNb3VzZWN0bCopOwogZXh0ZXJuIGludAkJCXJlYWRtb3VzZShNb3VzZWN0bCopOwogZXh0 ZXJuIHZvaWQJCWNsb3NlbW91c2UoTW91c2VjdGwqKTsKIGV4dGVybiB2b2lkCQlzZXRjdXJzb3Io TW91c2VjdGwqLCBDdXJzb3IqKTsKLS0tIC8vLmdpdC9mcy9vYmplY3QvMmY4YTU5ZjRiNWJmZTAy OGMwMjI4NTVhY2MxOTY2NmQ2OWVlZDkwOS90cmVlL3N5cy9zcmMvbGliZHJhdy9tb3VzZS5jCisr KyBzeXMvc3JjL2xpYmRyYXcvbW91c2UuYwpAQCAtMTIsMTQgKzEyLDI5IEBACiAJbS0+eHkgPSBw dDsKIH0KIAoraW50CitjbGlwbW91c2UoTW91c2VjdGwgKm0sIFJlY3RhbmdsZSBjbGlwcikKK3sK KwlyZXR1cm4gZnByaW50KG0tPm1jdGxmZCwgImNsaXAgJWQgJWQgJWQgJWQiLAorCQljbGlwci5t aW4ueCwgY2xpcHIubWluLnksCisJCWNsaXByLm1heC54LCBjbGlwci5tYXgueSk7Cit9CisKIHZv aWQKK3JlbGVhc2Vtb3VzZShNb3VzZWN0bCAqbSkKK3sKKwlmcHJpbnQobS0+bWN0bGZkLCAicmVs ZWFzZSIpOworfQorCit2b2lkCiBjbG9zZW1vdXNlKE1vdXNlY3RsICptYykKIHsKIAlpZihtYyA9 PSBuaWwpCiAJCXJldHVybjsKIAljbG9zZShtYy0+bWZkKTsKKwljbG9zZShtYy0+bWN0bGZkKTsK IAljbG9zZShtYy0+Y2ZkKTsKLQltYy0+bWZkID0gbWMtPmNmZCA9IC0xOworCW1jLT5tZmQgPSBt Yy0+bWN0bGZkID0gbWMtPmNmZCA9IC0xOwogCXRocmVhZGludChtYy0+cGlkKTsKIH0KIApAQCAt MTA2LDE4ICsxMjEsMjQgQEAKIAkJZnJlZShtYyk7CiAJCXJldHVybiBuaWw7CiAJfQotCXQgPSBt YWxsb2Moc3RybGVuKGZpbGUpKzE2KTsKKwluID0gc3RybGVuKGZpbGUpKzE2OworCXQgPSBtYWxs b2Mobik7CiAJaWYgKHQgPT0gbmlsKSB7CiAJCWNsb3NlKG1jLT5tZmQpOwogCQlmcmVlKG1jKTsK IAkJcmV0dXJuIG5pbDsKIAl9Ci0Jc3RyY3B5KHQsIGZpbGUpOworCXNlcHJpbnQodCwgdCtuLCAi JXMiLCBmaWxlKTsKIAlzbCA9IHV0ZnJydW5lKHQsICcvJyk7CiAJaWYoc2wpCi0JCXN0cmNweShz bCwgIi9jdXJzb3IiKTsKKwkJc2VwcmludChzbCwgdCtuLCAiL21vdXNlY3RsIik7CiAJZWxzZQot CQlzdHJjcHkodCwgIi9kZXYvY3Vyc29yIik7CisJCXNlcHJpbnQodCwgdCtuLCAiL2Rldi9tb3Vz ZWN0bCIpOworCW1jLT5tY3RsZmQgPSBvcGVuKHQsIE9SRFdSfE9DRVhFQyk7CisJaWYoc2wpCisJ CXNlcHJpbnQoc2wsIHQrbiwgIi9jdXJzb3IiKTsKKwllbHNlCisJCXNlcHJpbnQodCwgdCtuLCAi L2Rldi9jdXJzb3IiKTsKIAltYy0+Y2ZkID0gb3Blbih0LCBPUkRXUnxPQ0VYRUMpOwogCWZyZWUo dCk7CiAJbWMtPmltYWdlID0gaTsK --0000000000002adf8005c6f27177 Content-Type: application/octet-stream; name="rio-mousegrab.diff" Content-Disposition: attachment; filename="rio-mousegrab.diff" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_kr11dgfr1 LS0tIC8vLmdpdC9mcy9vYmplY3QvMmY4YTU5ZjRiNWJmZTAyOGMwMjI4NTVhY2MxOTY2NmQ2OWVl ZDkwOS90cmVlLy9zeXMvc3JjL2NtZC9yaW8vZGF0LmgKKysrIC9zeXMvc3JjL2NtZC9yaW8vZGF0 LmgKQEAgLTEwLDYgKzEwLDcgQEAKIAlRbGFiZWwsCiAJUWtiZCwKIAlRbW91c2UsCisJUW1vdXNl Y3RsLAogCVFuZXcsCiAJUXNjcmVlbiwKIAlRc25hcmYsCkBAIC0xNTQsNiArMTU1LDkgQEAKIAkg KiBOb3cgdGhleSdyZSBhbHdheXMgdGhlIHNhbWUgYnV0IHRoZSBjb2RlIGRvZXNuJ3QgYXNzdW1l IHNvLgogCSovCiAJUmVjdGFuZ2xlCQlzY3JlZW5yOwkvKiBzY3JlZW4gY29vcmRpbmF0ZXMgb2Yg d2luZG93ICovCisJUmVjdGFuZ2xlCWdyYWJyOworCUZpZAkJCSpncmFiZmlkOworCWludAkJCWdy YWI7CiAJaW50CQkJcmVzaXplZDsKIAlpbnQJCQl3Y3RscmVhZHk7CiAJUmVjdGFuZ2xlCQlsYXN0 c3I7CkBAIC0zMDQsMTEgKzMwOCwxNCBAQAogSW1hZ2UJKmxpZ2h0aG9sZGNvbDsKIEltYWdlCSpw YWxlaG9sZGNvbDsKIEltYWdlCSpwYWxldGV4dGNvbDsKK0ltYWdlCSpncmFiY29sOworSW1hZ2UJ KmxpZ2h0Z3JhYmNvbDsKIEltYWdlCSpzaXplY29sOwogaW50CXJldmVyc2U7CS8qIHRoZXJlIGFy ZSBubyBwYXN0ZWwgcGFpbnRzIGluIHRoZSBkdW5nZW9ucyBhbmQgZHJhZ29ucyB3b3JsZCAtLSBy b2IgcGlrZSAqLwogCiBXaW5kb3cJKip3aW5kb3c7CiBXaW5kb3cJKndrZXlib2FyZDsJLyogd2lu ZG93IG9mIHNpbXVsYXRlZCBrZXlib2FyZCAqLworV2luZG93CSp3Z3JhYjsKIGludAkJbndpbmRv dzsKIGludAkJc25hcmZmZDsKIGludAkJZ290c2NyZWVuOwotLS0gLy8uZ2l0L2ZzL29iamVjdC8y ZjhhNTlmNGI1YmZlMDI4YzAyMjg1NWFjYzE5NjY2ZDY5ZWVkOTA5L3RyZWUvL3N5cy9zcmMvY21k L3Jpby9kYXRhLmMKKysrIC9zeXMvc3JjL2NtZC9yaW8vZGF0YS5jCkBAIC0xOTUsNiArMTk1LDgg QEAKIAlsaWdodGhvbGRjb2wgPSBhbGxvY2ltYWdlKGRpc3BsYXksIFJlY3QoMCwwLDEsMSksIENN QVA4LCAxLCBER3JleWJsdWUpOwogCXBhbGVob2xkY29sID0gYWxsb2NpbWFnZShkaXNwbGF5LCBS ZWN0KDAsMCwxLDEpLCBDTUFQOCwgMSwgRFBhbGVncmV5Ymx1ZSk7CiAJcGFsZXRleHRjb2wgPSBh bGxvY2ltYWdlKGRpc3BsYXksIFJlY3QoMCwwLDEsMSksIENNQVA4LCAxLCAweDY2NjY2NkZGXnJl dmVyc2UpOworCWdyYWJjb2wgPSBhbGxvY2ltYWdlKGRpc3BsYXksIFJlY3QoMCwwLDEsMSksIENN QVA4LCAxLCAweEIyMjIyMkZGKTsKKwlsaWdodGdyYWJjb2wgPSBhbGxvY2ltYWdlKGRpc3BsYXks IFJlY3QoMCwwLDEsMSksIENNQVA4LCAxLCAweENENUM1Q0ZGKTsKIAlzaXplY29sID0gYWxsb2Np bWFnZShkaXNwbGF5LCBSZWN0KDAsMCwxLDEpLCBDTUFQOCwgMSwgRFJlZCk7CiAKIAlpZihyZXZl cnNlID09IDApCi0tLSAvLy5naXQvZnMvb2JqZWN0LzJmOGE1OWY0YjViZmUwMjhjMDIyODU1YWNj MTk2NjZkNjllZWQ5MDkvdHJlZS8vc3lzL3NyYy9jbWQvcmlvL2Zucy5oCisrKyAvc3lzL3NyYy9j bWQvcmlvL2Zucy5oCkBAIC01LDYgKzUsNyBAQAogaW50CXdyaXRld2N0bChYZmlkKiwgY2hhciop OwogV2luZG93ICpuZXcoSW1hZ2UqLCBpbnQsIGludCwgaW50LCBjaGFyKiwgY2hhciosIGNoYXIq Kik7CiB2b2lkCXJpb3NldGN1cnNvcihDdXJzb3IqKTsKK3ZvaWQJdXBkYXRlZ3JhYih2b2lkKTsK IGludAltaW4oaW50LCBpbnQpOwogaW50CW1heChpbnQsIGludCk7CiBSdW5lKglzdHJydW5lKFJ1 bmUqLCBSdW5lKTsKLS0tIC8vLmdpdC9mcy9vYmplY3QvMmY4YTU5ZjRiNWJmZTAyOGMwMjI4NTVh Y2MxOTY2NmQ2OWVlZDkwOS90cmVlLy9zeXMvc3JjL2NtZC9yaW8vZnN5cy5jCisrKyAvc3lzL3Ny Yy9jbWQvcmlvL2ZzeXMuYwpAQCAtMzAsNiArMzAsNyBAQAogCXsgImxhYmVsIiwJCVFURklMRSwJ UWxhYmVsLAkJMDYwMCB9LAogCXsgImtiZCIsCVFURklMRSwJUWtiZCwJCTA2MDAgfSwKIAl7ICJt b3VzZSIsCVFURklMRSwJUW1vdXNlLAkJMDYwMCB9LAorCXsgIm1vdXNlY3RsIiwJUVRGSUxFLAlR bW91c2VjdGwsCQkwNjAwIH0sCiAJeyAic2NyZWVuIiwJCVFURklMRSwJUXNjcmVlbiwJCTA0MDAg fSwKIAl7ICJzbmFyZiIsCQlRVEZJTEUsCVFzbmFyZiwJCTA2MDAgfSwKIAl7ICJ0ZXh0IiwJCVFU RklMRSwJUXRleHQsCQkwNjAwIH0sCi0tLSAvLy5naXQvZnMvb2JqZWN0LzJmOGE1OWY0YjViZmUw MjhjMDIyODU1YWNjMTk2NjZkNjllZWQ5MDkvdHJlZS8vc3lzL3NyYy9jbWQvcmlvL3Jpby5jCisr KyAvc3lzL3NyYy9jbWQvcmlvL3Jpby5jCkBAIC0zMjcsNiArMzI3LDI3IEBACiB9CiAKIHZvaWQK K3VwZGF0ZWdyYWIodm9pZCkKK3sKKwlXaW5kb3cgKnc7CisKKwlpZihpbnB1dCA9PSBuaWwgfHwg IWlucHV0LT5ncmFiIHx8IG1lbnVpbmcgfHwgc3dlZXBpbmcpCisJCXcgPSBuaWw7CisJZWxzZQor CQl3ID0gaW5wdXQ7CisJaWYodyA9PSB3Z3JhYikKKwkJcmV0dXJuOworCWlmKHcgIT0gbmlsKXsK KwkJY2xpcG1vdXNlKG1vdXNlY3RsLCB3LT5ncmFicik7CisJCXdzZW5kY3RsbWVzZyh3LCBSZXBh aW50LCBaUiwgbmlsKTsKKwl9ZWxzZQorCQlyZWxlYXNlbW91c2UobW91c2VjdGwpOworCWlmKHdn cmFiKQorCQl3c2VuZGN0bG1lc2cod2dyYWIsIFJlcGFpbnQsIFpSLCBuaWwpOworCXdncmFiID0g dzsKK30KKwordm9pZAoga2lsbHByb2NzKHZvaWQpCiB7CiAJaW50IGk7CkBAIC00ODksNiArNTEw LDkgQEAKIAkJCQl3dG9wbWUod2tleWJvYXJkKTsKIAkJCQl3aW5wdXQgPSB3a2V5Ym9hcmQ7CiAJ CQl9CisJCQl3ID0gd3BvaW50dG8obW91c2UtPnh5KTsKKwkJCWlmKHNlbmRpbmcgPT0gRkFMU0Ug JiYgIXNjcm9sbGluZyAmJiB3IT1uaWwgJiYgIXctPmRlbGV0ZWQgJiYgaW5ib3JkZXIody0+c2Ny ZWVuciwgbW91c2UtPnh5KSkKKwkJCQltb3ZpbmcgPSBUUlVFOwogCQkJaWYod2lucHV0IT1uaWwg JiYgIXdpbnB1dC0+ZGVsZXRlZCAmJiB3aW5wdXQtPmkhPW5pbCl7CiAJCQkJLyogY29udmVydCB0 byBsb2dpY2FsIGNvb3JkaW5hdGVzICovCiAJCQkJeHkueCA9IG1vdXNlLT54eS54ICsgKHdpbnB1 dC0+aS0+ci5taW4ueC13aW5wdXQtPnNjcmVlbnIubWluLngpOwpAQCAtNTA1LDEwICs1MjksNyBA QAogCQkJCQlzY3JvbGxpbmcgPSBtb3VzZS0+YnV0dG9uczsKIAkJCQllbHNlCiAJCQkJCXNjcm9s bGluZyA9IG1vdXNlLT5idXR0b25zICYmIHB0aW5yZWN0KHh5LCB3aW5wdXQtPnNjcm9sbHIpOwot CQkJCS8qIHRvcHBlZCB3aWxsIGJlIHplcm8gb3IgbGVzcyBpZiB3aW5kb3cgaGFzIGJlZW4gYm90 dG9tZWQgKi8KLQkJCQlpZihzZW5kaW5nID09IEZBTFNFICYmICFzY3JvbGxpbmcgJiYgaW5ib3Jk ZXIod2lucHV0LT5zY3JlZW5yLCBtb3VzZS0+eHkpICYmIHdpbnB1dC0+dG9wcGVkPjApCi0JCQkJ CW1vdmluZyA9IFRSVUU7Ci0JCQkJZWxzZSBpZihpbnNpZGUgJiYgKHNjcm9sbGluZyB8fCB3aW5w dXQtPm1vdXNlb3BlbiB8fCAobW91c2UtPmJ1dHRvbnMmMSkpKQorCQkJCWlmKGluc2lkZSAmJiAo c2Nyb2xsaW5nIHx8IHdpbnB1dC0+bW91c2VvcGVuIHx8IChtb3VzZS0+YnV0dG9ucyYxKSkpCiAJ CQkJCXNlbmRpbmcgPSBUUlVFOwogCQkJfWVsc2UKIAkJCQlzZW5kaW5nID0gRkFMU0U7CkBAIC01 MjMsMjEgKzU0NCwyMCBAQAogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJaWYobW92aW5nICYmICht b3VzZS0+YnV0dG9ucyY3KSl7Ci0JCQkJaW5jcmVmKHdpbnB1dCk7CisJCQkJaW5jcmVmKHcpOwog CQkJCXN3ZWVwaW5nID0gVFJVRTsKIAkJCQlpZihtb3VzZS0+YnV0dG9ucyAmIDMpCi0JCQkJCWkg PSBiYW5kc2l6ZSh3aW5wdXQpOworCQkJCQlpID0gYmFuZHNpemUodyk7CiAJCQkJZWxzZQotCQkJ CQlpID0gZHJhZyh3aW5wdXQpOworCQkJCQlpID0gZHJhZyh3KTsKIAkJCQlzd2VlcGluZyA9IEZB TFNFOwogCQkJCWlmKGkgIT0gbmlsKXsKLQkJCQkJd2N1cnJlbnQod2lucHV0KTsKLQkJCQkJd3Nl bmRjdGxtZXNnKHdpbnB1dCwgUmVzaGFwZWQsIGktPnIsIGkpOworCQkJCQl3Y3VycmVudCh3KTsK KwkJCQkJd3NlbmRjdGxtZXNnKHcsIFJlc2hhcGVkLCBpLT5yLCBpKTsKIAkJCQl9Ci0JCQkJd2Ns b3NlKHdpbnB1dCk7CisJCQkJd2Nsb3NlKHcpOwogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJdyA9 IHdwb2ludHRvKG1vdXNlLT54eSk7CiAJCQlpZih3IT1uaWwgJiYgaW5ib3JkZXIody0+c2NyZWVu ciwgbW91c2UtPnh5KSkKIAkJCQlyaW9zZXRjdXJzb3IoY29ybmVyc1t3aGljaGNvcm5lcih3LT5z Y3JlZW5yLCBtb3VzZS0+eHkpXSk7CiAJCQllbHNlCkBAIC03MTUsNiArNzM1LDcgQEAKIAkJbWVu dTNzdHJbaV0gPSBuaWw7CiAJfQogCXN3ZWVwaW5nID0gVFJVRTsKKwl1cGRhdGVncmFiKCk7CiAJ c3dpdGNoKGkgPSBtZW51aGl0KDMsIG1vdXNlY3RsLCAmbWVudTMsIHdzY3JlZW4pKXsKIAljYXNl IC0xOgogCQlicmVhazsKQEAgLTc0NCw2ICs3NjUsNyBAQAogCQlicmVhazsKIAl9CiAJc3dlZXBp bmcgPSBGQUxTRTsKKwl1cGRhdGVncmFiKCk7CiB9CiAKIHZvaWQKQEAgLTc1Myw2ICs3NzUsOCBA QAogCQltZW51MnN0cltTY3JvbGxdID0gIm5vc2Nyb2xsIjsKIAllbHNlCiAJCW1lbnUyc3RyW1Nj cm9sbF0gPSAic2Nyb2xsIjsKKwlzd2VlcGluZyA9IFRSVUU7CisJdXBkYXRlZ3JhYigpOwogCXN3 aXRjaChtZW51aGl0KDIsIG1vdXNlY3RsLCAmbWVudTIsIHdzY3JlZW4pKXsKIAljYXNlIEN1dDoK IAkJd3NuYXJmKHcpOwpAQCAtNzg3LDYgKzgxMSw4IEBACiAJCQl3c2hvdyh3LCB3LT5ucik7CiAJ CWJyZWFrOwogCX0KKwlzd2VlcGluZyA9IEZBTFNFOworCXVwZGF0ZWdyYWIoKTsKIAlmbHVzaGlt YWdlKGRpc3BsYXksIDEpOwogCXdzZW5kY3RsbWVzZyh3LCBXYWtldXAsIFpSLCBuaWwpOwogfQot LS0gLy8uZ2l0L2ZzL29iamVjdC8yZjhhNTlmNGI1YmZlMDI4YzAyMjg1NWFjYzE5NjY2ZDY5ZWVk OTA5L3RyZWUvL3N5cy9zcmMvY21kL3Jpby93aW5kLmMKKysrIC9zeXMvc3JjL2NtZC9yaW8vd2lu ZC5jCkBAIC0zMDIsNiArMzAyLDExIEBACiAJCQljb2wgPSBob2xkY29sOwogCQllbHNlCiAJCQlj b2wgPSBwYWxlaG9sZGNvbDsKKwl9ZWxzZSBpZih3LT5ncmFiKXsKKwkJaWYodHlwZSA9PSBTZWxi b3JkZXIpCisJCQljb2wgPSBncmFiY29sOworCQllbHNlCisJCQljb2wgPSBsaWdodGdyYWJjb2w7 CiAJfWVsc2V7CiAJCWlmKHR5cGUgPT0gU2VsYm9yZGVyKQogCQkJY29sID0gdGl0bGVjb2w7CkBA IC0zNTgsNiArMzYzLDggQEAKIAl3LT5zY3JvbGxyLm1heC54ID0gci5taW4ueCtTY3JvbGx3aWQ7 CiAJdy0+bGFzdHNyID0gWlI7CiAJci5taW4ueCArPSBTY3JvbGx3aWQrU2Nyb2xsZ2FwOworCXct PmdyYWIgPSBGQUxTRTsKKwl1cGRhdGVncmFiKCk7CiAJZnJjbGVhcih3LCBGQUxTRSk7CiAJZnJp bml0KHcsIHIsIHctPmZvbnQsIHctPmksIGNvbHMpOwogCXdzZXRjb2xzKHcsIHcgPT0gaW5wdXQp OwpAQCAtMTI2NCw2ICsxMjcxLDcgQEAKIAl3LT5nb25lID0gY2hhbmNyZWF0ZShzaXplb2YoY2hh ciopLCAwKTsKIAl3LT5zY3JvbGxyID0gcjsKIAl3LT5zY3JvbGxyLm1heC54ID0gci5taW4ueCtT Y3JvbGx3aWQ7CisJdy0+Z3JhYiA9IEZBTFNFOwogCXctPmxhc3RzciA9IFpSOwogCXIubWluLngg Kz0gU2Nyb2xsd2lkK1Njcm9sbGdhcDsKIAlmcmluaXQodywgciwgZm9udCwgaSwgY29scyk7CkBA IC0xMzA2LDYgKzEzMTQsNyBAQAogCQlpbnB1dCA9IG5pbDsKIAkJcmlvc2V0Y3Vyc29yKG5pbCk7 CiAJfQorCXVwZGF0ZWdyYWIoKTsKIAlpZih3ID09IHdrZXlib2FyZCkKIAkJd2tleWJvYXJkID0g bmlsOwogCWZvcihpPTA7IGk8bmhpZGRlbjsgaSsrKQpAQCAtMTM5MCw2ICsxMzk5LDcgQEAKIAog CQkJc2VuZHAoYywgdyk7CiAJCX0KKwkJdXBkYXRlZ3JhYigpOwogCQlpZih3LT5pPT1uaWwgfHwg RHgody0+c2NyZWVucik8PTApCiAJCQlicmVhazsKIAkJd3JlcGFpbnQodyk7Ci0tLSAvLy5naXQv ZnMvb2JqZWN0LzJmOGE1OWY0YjViZmUwMjhjMDIyODU1YWNjMTk2NjZkNjllZWQ5MDkvdHJlZS8v c3lzL3NyYy9jbWQvcmlvL3hmaWQuYworKysgL3N5cy9zcmMvY21kL3Jpby94ZmlkLmMKQEAgLTE4 LDYgKzE4LDcgQEAKIGNoYXIgRWxvbmdbXSA9IAkJInNuYXJmIGJ1ZmZlciB0b28gbG9uZyI7CiBj aGFyIEV1bmtpZFtdID0gCSJ1bmtub3duIGlkIGluIGF0dGFjaCI7CiBjaGFyIEViYWRyZWN0W10g PSAJImJhZCByZWN0YW5nbGUgaW4gYXR0YWNoIjsKK2NoYXIgRWdyYWJbXSA9CQkiaW52YWxpZCBn cmFiIHJlY3RhbmdsZSI7CiBjaGFyIEV3aW5kb3dbXSA9IAkiY2Fubm90IG1ha2Ugd2luZG93IjsK IGNoYXIgRW5vd2luZG93W10gPSAJIndpbmRvdyBoYXMgbm8gaW1hZ2UiOwogY2hhciBFYmFkbW91 c2VbXSA9IAkiYmFkIGZvcm1hdCBvbiAvZGV2L21vdXNlIjsKQEAgLTM0Miw2ICszNDMsMTQgQEAK IAljYXNlIFFrYmQ6CiAJCXctPmtiZG9wZW4gPSBGQUxTRTsKIAkJYnJlYWs7CisJY2FzZSBRbW91 c2VjdGw6CisJCWlmKHctPmdyYWIgJiYgdy0+Z3JhYmZpZCA9PSB4LT5mKXsKKwkJCXctPmdyYWIg PSBGQUxTRTsKKwkJCXctPmdyYWJmaWQgPSBuaWw7CisJCQl1cGRhdGVncmFiKCk7CisJCQl3c2Vu ZGN0bG1lc2codywgUmVwYWludCwgWlIsIG5pbCk7CisJCX0KKwkJYnJlYWs7CiAJY2FzZSBRbW91 c2U6CiAJCXctPnJlc2l6ZWQgPSBGQUxTRTsKIAkJdy0+bW91c2VvcGVuID0gRkFMU0U7CkBAIC0z NzIsNiArMzgxLDcgQEAKIAlGY2FsbCBmYzsKIAlpbnQgY250LCBxaWQsIG5iLCBvZmYsIG5yOwog CWNoYXIgZXJyW0VSUk1BWF0sICpwOworCVJlY3RhbmdsZSBncmFicjsKIAlQb2ludCBwdDsKIAlX aW5kb3cgKnc7CiAJUnVuZSAqcjsKQEAgLTUwMCw2ICs1MTAsNDYgQEAKIAkJdy0+bGFiZWwgPSBw OwogCQl3LT5sYWJlbFtjbnRdID0gMDsKIAkJbWVtbW92ZSh3LT5sYWJlbCwgeC0+ZGF0YSwgY250 KTsKKwkJYnJlYWs7CisKKwljYXNlIFFtb3VzZWN0bDoKKwkJaWYoc3RybmNtcCh4LT5kYXRhLCAi Y2xpcCIsIDQpPT0wKXsKKwkJCWdyYWJyLm1pbi54ID0gc3RydG9sKHgtPmRhdGErNCwgJnAsIDAp OworCQkJaWYocCA9PSBuaWwpeworCQkJCWZpbHN5c3Jlc3BvbmQoeC0+ZnMsIHgsICZmYywgRWdy YWIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWdyYWJyLm1pbi55ID0gc3RydG9sKHAsICZwLCAw KTsKKwkJCWlmKHAgPT0gbmlsKXsKKwkJCQlmaWxzeXNyZXNwb25kKHgtPmZzLCB4LCAmZmMsIEVn cmFiKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlncmFici5tYXgueCA9IHN0cnRvbChwLCAmcCwg MCk7CisJCQlpZihwID09IG5pbCl7CisJCQkJZmlsc3lzcmVzcG9uZCh4LT5mcywgeCwgJmZjLCBF Z3JhYik7CisJCQkJcmV0dXJuOworCQkJfQorCQkJZ3JhYnIubWF4LnkgPSBzdHJ0b2wocCwgJnAs IDApOworCQkJaWYocCA9PSBuaWwpeworCQkJCWZpbHN5c3Jlc3BvbmQoeC0+ZnMsIHgsICZmYywg RWdyYWIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmKCFyZWN0aW5yZWN0KGdyYWJyLCB3LT5z Y3JlZW5yKSl7CisJCQkJZmlsc3lzcmVzcG9uZCh4LT5mcywgeCwgJmZjLCBFZ3JhYik7CisJCQkJ cmV0dXJuOworCQkJfQorCQkJdy0+Z3JhYnIgPSBncmFicjsKKwkJCXctPmdyYWJmaWQgPSB4LT5m OworCQkJdy0+Z3JhYiA9IFRSVUU7CisJCQl1cGRhdGVncmFiKCk7CisJCQl3c2VuZGN0bG1lc2co dywgUmVwYWludCwgWlIsIG5pbCk7CisJCX1lbHNlIGlmKHN0cm5jbXAoeC0+ZGF0YSwgInJlbGVh c2UiLCA3KT09MCl7CisJCQl3LT5ncmFiID0gRkFMU0U7CisJCQl3LT5ncmFiZmlkID0gbmlsOwor CQkJdXBkYXRlZ3JhYigpOworCQkJd3NlbmRjdGxtZXNnKHcsIFJlcGFpbnQsIFpSLCBuaWwpOwor CQl9ZWxzZQorCQkJd3JpdGUobW91c2VjdGwtPm1jdGxmZCwgeC0+ZGF0YSwgY250KTsKIAkJYnJl YWs7CiAKIAljYXNlIFFtb3VzZToK --0000000000002adf8005c6f27177 Content-Type: application/octet-stream; name="devmouse-grab.diff" Content-Disposition: attachment; filename="devmouse-grab.diff" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_kr11dgfn0 LS0tIC8vLmdpdC9mcy9vYmplY3QvMmY4YTU5ZjRiNWJmZTAyOGMwMjI4NTVhY2MxOTY2NmQ2OWVl ZDkwOS90cmVlLy9zeXMvc3JjLzkvcG9ydC9kZXZtb3VzZS5jCisrKyAvc3lzL3NyYy85L3BvcnQv ZGV2bW91c2UuYwpAQCAtMTgsNiArMTgsOCBAQAogCVNjcm9sbFJpZ2h0ID0gMHg0MCwKIH07CiAK K2NoYXIgRWdyYWJbXSA9ICJpbnZhbGlkIGdyYWIgcmVjdGFuZ2xlIjsKKwogdHlwZWRlZiBzdHJ1 Y3QgTW91c2VpbmZvCU1vdXNlaW5mbzsKIHR5cGVkZWYgc3RydWN0IE1vdXNlc3RhdGUJTW91c2Vz dGF0ZTsKIApAQCAtNTMsNiArNTUsOCBAQAogCUNNYnV0dG9ubWFwLAogCUNNc2Nyb2xsc3dhcCwK IAlDTXN3YXAsCisJQ01jbGlwLAorCUNNcmVsZWFzZSwKIAlDTWJsYW5rLAogCUNNYmxhbmt0aW1l LAogCUNNdHdpdGNoLApAQCAtNjQsNiArNjgsOCBAQAogCUNNYnV0dG9ubWFwLAkiYnV0dG9ubWFw IiwJMCwKIAlDTXNjcm9sbHN3YXAsCSJzY3JvbGxzd2FwIiwJMCwKIAlDTXN3YXAsCQkic3dhcCIs CQkxLAorCUNNY2xpcCwJCSJjbGlwIiwJCTAsCisJQ01yZWxlYXNlLAkicmVsZWFzZSIsCTEsCiAJ Q01ibGFuaywJImJsYW5rIiwJMSwKIAlDTWJsYW5rdGltZSwJImJsYW5rdGltZSIsCTIsCiAJQ010 d2l0Y2gsCSJ0d2l0Y2giLAkxLApAQCAtOTUsNiArMTAxLDkgQEAKIHN0YXRpYyB1Y2hhciBidXR0 b25tYXBbOF0gPSB7CiAJMCwgMSwgMiwgMywgNCwgNSwgNiwgNywKIH07CitzdGF0aWMgUmVjdGFu Z2xlIGdyYWJyOworc3RhdGljIENoYW4gKmdyYWJjaGFuOworc3RhdGljIGludCBncmFiOwogc3Rh dGljIGludCBtb3VzZXN3YXA7CiBzdGF0aWMgaW50IHNjcm9sbHN3YXA7CiBzdGF0aWMgdWxvbmcg bW91c2V0aW1lOwpAQCAtMjA2LDYgKzIxNSwxMCBAQAogCWlmKChjLT5xaWQudHlwZSZRVERJUikh PTAgfHwgKGMtPmZsYWcmQ09QRU4pPT0wKQogCQlyZXR1cm47CiAJc3dpdGNoKCh1bG9uZyljLT5x aWQucGF0aCl7CisJY2FzZSBRbW91c2VjdGw6CisJCWlmKGMgPT0gZ3JhYmNoYW4pCisJCQlncmFi ID0gMDsKKwkJYnJlYWs7CiAJY2FzZSBRbW91c2VpbjoKIAkJbW91c2UuaW5idXR0b25zICY9IH4o KE1vdXNlc3RhdGUqKWMtPmF1eCktPmJ1dHRvbnM7CiAJCWZyZWUoYy0+YXV4KTsJLyogTW91c2Vz dGF0ZSAqLwpAQCAtMzQ0LDYgKzM1Nyw3IEBACiBtb3VzZXdyaXRlKENoYW4gKmMsIHZvaWQgKnZh LCBsb25nIG4sIHZsb25nKQogewogCWNoYXIgKnA7CisJUmVjdGFuZ2xlIHI7CiAJUG9pbnQgcHQ7 CiAJQ21kYnVmICpjYjsKIAlDbWR0YWIgKmN0OwpAQCAtNDAzLDYgKzQxNywzNyBAQAogCQkJbW91 c2VibGFua3NjcmVlbigxKTsKIAkJCWJyZWFrOwogCisJCWNhc2UgQ01jbGlwOgorCQkJaWYoY2It Pm5mIDwgNSkKKwkJCQllcnJvcihFc2hvcnQpOworCQkJaWYoIWdzY3JlZW4pCisJCQkJYnJlYWs7 CisJCQlyLm1pbi54ID0gc3RydG9sKGNiLT5mWzFdLCAmcCwgMCk7CisJCQlpZihwID09IG5pbCkK KwkJCQllcnJvcihFZ3JhYik7CisJCQlyLm1pbi55ID0gc3RydG9sKGNiLT5mWzJdLCAmcCwgMCk7 CisJCQlpZihwID09IG5pbCkKKwkJCQllcnJvcihFZ3JhYik7CisJCQlyLm1heC54ID0gc3RydG9s KGNiLT5mWzNdLCAmcCwgMCk7CisJCQlpZihwID09IG5pbCkKKwkJCQllcnJvcihFZ3JhYik7CisJ CQlyLm1heC55ID0gc3RydG9sKGNiLT5mWzRdLCAmcCwgMCk7CisJCQlpZihwID09IG5pbCkKKwkJ CQllcnJvcihFZ3JhYik7CisJCQlpZighcmVjdGlucmVjdChyLCBnc2NyZWVuLT5jbGlwcikpCisJ CQkJZXJyb3IoRWdyYWIpOworCQkJZ3JhYnIgPSByOworCQkJZ3JhYmNoYW4gPSBjOworCQkJZ3Jh YiA9IDE7CisJCQlpZighcHRpbnJlY3QobW91c2UueHksIGdyYWJyKSkKKwkJCQlhYnNtb3VzZXRy YWNrKG1vdXNlLnh5LngsIG1vdXNlLnh5LnksIDAsIDApOworCQkJYnJlYWs7CisKKwkJY2FzZSBD TXJlbGVhc2U6CisJCQlncmFiID0gMDsKKwkJCWdyYWJjaGFuID0gbmlsOworCQkJYnJlYWs7CisK IAkJY2FzZSBDTWJsYW5rdGltZToKIAkJCWJsYW5rdGltZSA9IHN0cnRvdWwoY2ItPmZbMV0sIDAs IDApOwogCQkJLyogd2V0IGZsb29yICovCkBAIC02MDksNiArNjU0LDE3IEBACiAJCXkgPSBnc2Ny ZWVuLT5jbGlwci5taW4ueTsKIAlpZih5ID49IGdzY3JlZW4tPmNsaXByLm1heC55KQogCQl5ID0g Z3NjcmVlbi0+Y2xpcHIubWF4LnktMTsKKworCWlmKGdyYWIpeworCQlpZih4IDwgZ3JhYnIubWlu LngpCisJCQl4ID0gZ3JhYnIubWluLng7CisJCWlmKHggPj0gZ3JhYnIubWF4LngpCisJCQl4ID0g Z3JhYnIubWF4LngtMTsKKwkJaWYoeSA8IGdyYWJyLm1pbi55KQorCQkJeSA9IGdyYWJyLm1pbi55 OworCQlpZih5ID49IGdyYWJyLm1heC55KQorCQkJeSA9IGdyYWJyLm1heC55LTE7CisJfQogCiAK IAlpbG9jaygmbW91c2UpOwo= --0000000000002adf8005c6f27177--