From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: martin rudalics Newsgroups: gmane.emacs.devel Subject: Proposing changes to adjust_frame_size Date: Sun, 25 Apr 2021 19:11:47 +0200 Message-ID: <93687325-1196-f83a-e6c0-44a5ec624868@gmx.at> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------607A204092882D8F045C76C8" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="7685"; mail-complaints-to="usenet@ciao.gmane.io" Cc: Alan Third , Yuuki Harano To: emacs-devel Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Sun Apr 25 19:13:11 2021 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1laiJj-0001nW-3T for ged-emacs-devel@m.gmane-mx.org; Sun, 25 Apr 2021 19:13:11 +0200 Original-Received: from localhost ([::1]:50036 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1laiJi-0004Wh-4I for ged-emacs-devel@m.gmane-mx.org; Sun, 25 Apr 2021 13:13:10 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:36422) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1laiIi-0003n1-7K for emacs-devel@gnu.org; Sun, 25 Apr 2021 13:12:08 -0400 Original-Received: from mout.gmx.net ([212.227.17.22]:44129) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1laiIb-0005Hf-R9 for emacs-devel@gnu.org; Sun, 25 Apr 2021 13:12:07 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1619370711; bh=EPHEjFf1/FIta2ROpORb8Beg6ok0Az/bvn8aIrMRisc=; h=X-UI-Sender-Class:To:Cc:From:Subject:Date; b=Eqj9fRX1dKktSqXIpf+KPH8RgAlhsMZqY9heTnDaPHFTFi8UtrwwCs4Itl3StkH9f nOAcQhRb5dEysSVofJQogDXH2DRk7sCYZuNU4igG+d5cETeWgW9sEJ3DkO1hiy5XCk U5WuJ9BF7Yx02SHIKBzwqTWo5i2bX89/sr+MZHCw= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Original-Received: from [192.168.1.100] ([212.95.5.118]) by mail.gmx.net (mrgmx105 [212.227.17.168]) with ESMTPSA (Nemesis) id 1N2mFY-1lSvIA0x8G-0137lR; Sun, 25 Apr 2021 19:11:50 +0200 Content-Language: en-US X-Provags-ID: V03:K1:OQUkI+HYQbVeh6h0Anj6maa+kooTs2f7dwOWADwg52Nx3ex8Eoq S3DLerxsvKPHC2Xa2nmlMiWyNlRRpDFEnewoALMcWAPIVExZwLeHLlF0K9nDBN8UY8yTJPR R6DkIBWiWeUCKNYTEKrhXEqzk6CzE481gDLgBvGZ1xBmiHRr6961VkqCOw/u8pVmlxYwXJQ lt64hF3rX3O9O85LIv9nQ== X-UI-Out-Filterresults: notjunk:1;V03:K0:UrXgQlQfmtQ=:F8I82nviXI/YL1WOmZIGfB gxc2ix6YgzB5WUOccfBS3YbFvKG3D8TjNmNqQ32IeJpo9Dh5gvwaFeqvC9k/w8Gs6QSb+NtUj +pBsNAUhrMJ/Yh5K2ZZNSKyJ6xzChtJn/4ktWz3HPxL7RybxWn5FtPtc2XZdZB4jEl30AdQSi e1iw2TxGATsft00HT3ARwct/61fivddmrnd49S5zea2CeuMN5AGJ7Xh1/842Fp5axOe6fbsGF LGgWKG4+ojS4F7lYbl2j/nDT5LYu5Z9dscZZeYdSeQyH6FpXJJUNzTxXklUydiumIkofSEofI AyrQMq8h8bvpcSVqpN9+K2HJRVztQUhptz/d8ocbjekg7udttkq0CGPo258lHFJRLRgcHbjZD 4hu7CdItzZyZuXAkhfAEao5IVO+XFavlI0by8QcZV/L0C5MORjjEFy0M9j0g3oZlMFelltiaw pUDAfHf89oOG7AU+dZn6lJvt/ErnjsWn1HLrDvTCqHm4xFOyDeYOIkEX0eAXpqxMxt4Yah43f 2SzDD0lYGTfzecxESjzBzrWmmy1KVC7loRREGgYEJ0T3hq9LEgrhxLPXWQhV3Zmw/DxREWqta JKWdfEl3gGFmM/TsUleXWphOGru9iT2KyvXMIkuStqZC5GNd5er32AdHyVyolf+eoSfRn46Y1 wnh1PHSvJJWq+ZYagqBfnmvVIh39BDusOgic28CPurZDpMf4beMKtVX4u8bboPgPDHhqmtw+i VyKNjkbSSVUhb4Z7nKSxt5OYManNucjx1dLjkucnj3jF9FOEnf02AF2ABzAPtU+PcYXbRLyc Received-SPF: pass client-ip=212.227.17.22; envelope-from=rudalics@gmx.at; helo=mout.gmx.net X-Spam_score_int: -25 X-Spam_score: -2.6 X-Spam_bar: -- X-Spam_report: (-2.6 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.io gmane.emacs.devel:268395 Archived-At: This is a multi-part message in MIME format. --------------607A204092882D8F045C76C8 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Unless there are objections, I intend to apply the attached changes in the next days. Their purpose is to restrain the handling of the text area size of a frame to the function adjust_frame_size and have the various front/backends setting frame sizes or receiving notifications about them work with native frame sizes only. This has the advantage that storing the history of frame size changes and consequently tracking bugs in the frame sizing code become much simpler. The patch should fix Bug#46827 and I intend to add further bug fixes in the following days. Some of these fixes are controversial and I'd like to push them separately in order to make bisecting easier. Other than that, there should be no user noticeable changes, so if you observe any strange frame sizing behavior, please tell me. I've tested the patch with xfwm4, gnome shell, kde plasma and Windows XP but have given it only light testing with GNUstep. Alan, if you see anything fishy with the NS build, please tell me. Yuuki, if you see any problems with the pgtk build, please tell me too so we can resolve them without causing greater conflicts. Thanks for your attention, martin --------------607A204092882D8F045C76C8 Content-Type: text/plain; charset=UTF-8; name="adjust_frame_size_ChangeLog" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="adjust_frame_size_ChangeLog" SGF2ZSBhZGp1c3RfZnJhbWVfc2l6ZSBwYXNzIG5hdGl2ZSBmcmFtZSBzaXplcyB0byBiYWNr ZW5kcwppbnN0ZWFkIG9mIHRleHQgc2l6ZXMuICBFeHBhbmQgZnJhbWUgc2l6ZSBoaXN0b3J5 IG1hbmFnZW1lbnQuCkRyb3AgUElYRUxXSVNFIGFyZ3VtZW50IGZyb20gY2hhbmdlX2ZyYW1l X3NpemUgYW5kIGNvbnZlcnQKbmF0aXZlIHRvIHRleHQgc2l6ZXMgb25seSB3aGVuIGNhbGxp bmcgYWRqdXN0X2ZyYW1lX3NpemUuICBVc2UKY29udmVudGlvbiBpbiBhcmd1bWVudHMgdGhh dCAtMSBpbnN0ZWFkIG9mIDAgbWVhbnMgdGhhdCBubyBzaXplCmNoYW5nZSBpcyByZXF1aXJl ZC4gIFdoZW4gYWRqdXN0aW5nIGZyYW1lIHNpemVzIHBpY2sgdXAgZGVsYXllZApzaXplIGNo YW5nZXMgKEJ1ZyM0NjgyNykuCgoqIGxpc3AvZnJhbWUuZWwgKGZyYW1lLW5vdGljZS11c2Vy LXNldHRpbmdzLCBtYWtlLWZyYW1lKTogRG9uJ3QKc2V0IGZyYW1lIHNpemUgaGlzdG9yeS4K KGZyYW1lLS1zaXplLWhpc3RvcnkpOiBSZXdyaXRlIGRvYy1zdHJpbmcuICBIYW5kbGUgbmV3 IGZvcm1hdHMKb2YgYGZyYW1lLXNpemUtaGlzdG9yeScgZW50cmllcy4KKiBzcmMvZGlzcGV4 dGVybi5oIChkZWxheWVkX3NpemVfY2hhbmdlKTogRXh0ZXJuIGl0LgooY2hhbmdlX2ZyYW1l X3NpemUpOiBEcm9wIGxhc3QgYXJndW1lbnQgZnJvbSBleHRlcm4uCiogc3JjL2Rpc3BuZXcu YyAoZGVsYXllZF9zaXplX2NoYW5nZSk6IE1ha2UgaXQgZ2xvYmFsLgooaGFuZGxlX3dpbmRv d19jaGFuZ2Vfc2lnbmFsKTogUmVmb3JtYXQuICBEcm9wIGxhc3QgYXJndW1lbnQKZnJvbSBj aGFuZ2VfZnJhbWVfc2l6ZSBjYWxsLgooZG9fcGVuZGluZ193aW5kb3dfY2hhbmdlLCBpbml0 X2Rpc3BsYXlfaW50ZXJhY3RpdmUpOiBEcm9wIGxhc3QKYXJndW1lbnQgZnJvbSBjaGFuZ2Vf ZnJhbWVfc2l6ZSBjYWxsLgooY2hhbmdlX2ZyYW1lX3NpemVfMSk6IE5FV19XSURUSCBhbmQg TkVXX0hFSUdIVCBub3cgc3BlY2lmeQpuYXRpdmUgc2l6ZXMuICBEcm9wIGxhc3QgYXJndW1l bnQgUElYRUxXSVNFLiAgUXVldWUgYSBjaGFuZ2UKd2hlbiBpdCBlaXRoZXIgZGlmZmVycyBm cm9tIEYncyBjdXJyZW50IHBpeGVsIHNpemVzIG9yIEYncwpwcmV2aW91c2x5IHF1ZXVlZCBz aXplcy4gIEluamVjdCBmcmFtZV9zaXplX2hpc3RvcnlfZXh0cmEgY2FsbAp3aGVuIHF1ZXVp bmcuICBBZG9wdCBjb252ZW50aW9uIHRoYXQgZm9yIHF1ZXVlZCBzaXplcyAtMSBtZWFucwp0 aGF0IG5vIHNpemUgY2hhbmdlIGlzIHJlcXVpcmVkLiAgQ29udmVydCBmcm9tIG5hdGl2ZSB0 byB0ZXh0CnNpemVzIHdoZW4gY2FsbGluZyBhZGp1c3RfZnJhbWVfc2l6ZS4KKGNoYW5nZV9m cmFtZV9zaXplKTogRHJvcCBsYXN0IGFyZ3VtZW50IFBJWEVMV0lTRSBhbmQgZHJvcCBpdAph bHNvIGluIGNoYW5nZV9mcmFtZV9zaXplXzEgY2FsbHMuCiogc3JjL2ZyYW1lLmMgKGZyYW1l X3NpemVfaGlzdG9yeV9hZGQpOiBSZW1vdmUuCihmcmFtZV9pbmhpYml0X3Jlc2l6ZSk6IFJl bW92ZSBjYWxsIHRvIGZyYW1lX3NpemVfaGlzdG9yeV9hZGQuCihzZXRfbWVudV9iYXJfbGlu ZXMsIHNldF90YWJfYmFyX2xpbmVzKTogU2ltcGxpZnkuICBEcm9wIGxhc3QKYXJndW1lbnQg ZnJvbSBjaGFuZ2VfZnJhbWVfc2l6ZSBjYWxsLgooZnJhbWVfd2luZG93c19taW5fc2l6ZSk6 IE5vIG1vcmUgc3RhdGljLgooa2VlcF9yYXRpbyk6IE1pbm9yIHJld3JpdGUgdXNpbmcgbWFj cm9zLgooZnJhbWVfc2l6ZV9oaXN0b3J5X2FkanVzdCwgZnJhbWVfc2l6ZV9oaXN0b3J5X3Bs YWluKQooZnJhbWVfc2l6ZV9oaXN0b3J5X2V4dHJhKTogTmV3IGZ1bmN0aW9ucy4KKGFkanVz dF9mcmFtZV9zaXplKTogTWFqb3IgcmV3cml0ZS4gIEFkb3B0IG5ldyBjb252ZW50aW9uIHRo YXQKbmVnYXRpdmUgdmFsdWVzIGZvciBuZXcgc2l6ZXMgbWVhbiBubyBjaGFuZ2UuICBQaWNr IHVwIGRlbGF5ZWQKc2l6ZSBjaGFuZ2VzIGZyb20gRidzIG5ld193aWR0aCBhbmQgbmV3X2hl aWdodCBzbG90cwooQnVnIzQ2ODI3KS4gIENhbGwgc2V0X3dpbmRvd19zaXplX2hvb2sgd2l0 aCBuYXRpdmUgaW5zdGVhZCBvZgp0ZXh0IHNpemVzLiAgRG8gbm90IHNhbml0aXplIHdpbmRv dyBzaXplcyBhbnkgbW9yZS4gIENhbGwKZnJhbWVfc2l6ZV9oaXN0b3J5X2FkanVzdCBpbnN0 ZWFkIG9mIGZyYW1lX3NpemVfaGlzdG9yeV9hZGQuCkFsd2F5cyBzZXQgRidzIHJlc2l6ZWRf cCBzbG90IHRvIHRydWUuCihtYWtlX2ZyYW1lKTogSW5pdGlhbGl6ZSBuZXdfd2lkdGggYW5k IG5ld19oZWlnaHQgc2xvdHMgdG8gLTEuClNpbXBsaWZ5IHNldHVwIG9mIGluaXRpYWwgc2l6 ZXMgYW5kIGFuIGFkanVzdF9mcmFtZV9zaXplIGNhbGwuCihGZnJhbWVfcGFyYW1ldGVycyk6 IERyb3AgcHJvY2Vzc2luZyBGJ3MgbmV3X3BpeGVsd2lzZSBzbG90LgooY2hlY2tfZnJhbWVf cGl4ZWxzKTogUmVvcmRlciB0byBtYWtlIGRlY2xhcmF0aW9ucyBhcHBlYXIgZmlyc3QuCihG c2V0X2ZyYW1lX2hlaWdodCwgRnNldF9mcmFtZV93aWR0aCwgRnNldF9mcmFtZV9zaXplKTog UGFzcwpleHBsaWNpdCB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcyB0byBhZGp1c3RfZnJhbWVf c2l6ZSBpbnN0ZWFkIG9mCi0xLgooZ3VpX3NldF9mcmFtZV9wYXJhbWV0ZXJzKTogTWlub3Ig cmV3cml0ZSBtYWtpbmcgc3VyZSB0aGF0CmV4cGxpY2l0IHNpemVzIGFuZCB0aGUgY29ycmVz cG9uZGluZyBwYXJhbWV0ZXIgYXJlIHBhc3NlZCB0bwphZGp1c3RfZnJhbWVfc2l6ZS4gIFJl bW92ZSBmcmFtZV9zaXplX2hpc3RvcnlfYWRkIGNhbGwuCihndWlfZmlndXJlX3dpbmRvd19z aXplKTogRHJvcCBsYXN0IHR3byBhcmd1bWVudHMuICBTaW1wbGlmeQphc3NpZ25tZW50IG9m IGluaXRpYWwgc2l6ZS4gIFNldCBuZXdfaGVpZ2h0IGFuZCBuZXdfd2lkdGggc2xvdHMKdG8g LTEuICBVc2UgYWRqdXN0X2ZyYW1lX3NpemUgdG8gc2V0IHNpemVzIGluc3RlYWQgb2YgcmV0 dXJuaW5nCnRoZW0gdG8gY2FsbGVyLgooc3ltc19vZl9mcmFtZSk6IERyb3Agc3ltYm9scyB1 c2VkIGJ5IGZyYW1lIHNpemUgaGlzdG9yeTsgdGhlc2UKYXJlIG5vdyBidWlsdCBvbi10aGUt Zmx5LiAgQWxzbyBkcm9wIHNvbWUgbWVudSBiYXIgcmVsYXRlZApzeW1ib2xzIGluIGZhdm9y IG9mIFFtZW51X2Jhcl9saW5lcy4KKiBzcmMvZnJhbWUuaCAoc3RydWN0IGZyYW1lKTogUmVt b3ZlIG5ld19waXhlbHdpc2UuCihTRVRfRlJBTUVfQ09MUywgU0VUX0ZSQU1FX0xJTkVTLCBT RVRfRlJBTUVfV0lEVEgpCihTRVRfRlJBTUVfSEVJR0hUKTogUmVtb3ZlIG1hY3Jvcy4KKGZy YW1lX3NpemVfaGlzdG9yeV9hZGQpOiBSZW1vdmUgZXh0ZXJucy4KKGZyYW1lX3dpbmRvd3Nf bWluX3NpemUsIGZyYW1lX3NpemVfaGlzdG9yeV9wbGFpbikKKGZyYW1lX3NpemVfaGlzdG9y eV9leHRyYSk6IEFkZCBleHRlcm5zLgooRlJBTUVfV0lORE9XU19XSURUSCwgRlJBTUVfV0lO RE9XU19IRUlHSFQpOiBSZW5hbWUgdG8KRlJBTUVfSU5ORVJfV0lEVEggYW5kIEZSQU1FX0lO TkVSX0hFSUdIVC4KKGd1aV9maWd1cmVfd2luZG93X3NpemUpOiBEcm9wIGxhc3QgdHdvIGFy Z3VtZW50cyBmcm9tCmV4dGVybi4KKiBzcmMvZ3RrdXRpbC5jICh4Z19mcmFtZV9yZXNpemVk KTogUmVuYW1lIGFyZ3VtZW50cyB0byBXSURUSAphbmQgSEVJR0hULiAgQ29uc3VsdCBkZWxh eWVkX3NpemVfY2hhbmdlIHRvIGhhbmRsZSBjYXNlIHdoZXJlCldJRFRIIGFuZCBIRUlHSFQg ZG8gbm90IG1hdGNoIEYncyBuZXdfd2lkdGggYW5kIG5ld19oZWlnaHQKdmFsdWVzLiAgQ2Fs bCBjaGFuZ2VfZnJhbWVfc2l6ZSB3aXRoIG5hdGl2ZSBzaXplcyBhbmQgd2l0aG91dApQSVhF TFdJU0UgYXJndW1lbnQuICBJbnN0ZWFkIG9mIGZyYW1lX3NpemVfaGlzdG9yeV9hZGQgY2Fs bApmcmFtZV9zaXplX2hpc3RvcnlfZXh0cmEuCih4Z19mcmFtZV9zZXRfY2hhcl9zaXplKTog V0lEVEggYW5kIEhFSUdIVCBhcmUgbmF0aXZlIHNpemVzIG5vdzsKZml4IGFkanVzdF9mcmFt ZV9zaXplIGNhbGwgYWNjb3JkaW5nbHkuICBJbnN0ZWFkIG9mCmZyYW1lX3NpemVfaGlzdG9y eV9hZGQgY2FsbCBmcmFtZV9zaXplX2hpc3RvcnlfZXh0cmEuCihzdHlsZV9jaGFuZ2VkX2Ni KTogQ2FsbCB4Z19mcmFtZV9zZXRfY2hhcl9zaXplIHdpdGggbmF0aXZlCmluc3RlYWQgb2Yg dGV4dCBzaXplcy4KKHRiX3NpemVfY2IpOiBSZW1vdmUgZnJhbWVfc2l6ZV9oaXN0b3J5X2Fk ZCBjYWxsLiAgQ2FsbAphZGp1c3RfZnJhbWVfc2l6ZSB3aXRoIElOSElCSVQgNS4KKGZyZWVf ZnJhbWVfdG9vbF9iYXIsIHhnX2NoYW5nZV90b29sYmFyX3Bvc2l0aW9uKTogUmVtb3ZlCmZy YW1lX3NpemVfaGlzdG9yeV9hZGQgY2FsbC4KKHVwZGF0ZV9mcmFtZV90b29sX2Jhcik6IENh bGwgYWRqdXN0X2ZyYW1lX3NpemUgd2l0aCBJTkhJQklUIDIKYW5kIGxldCBpdCBoYW5kbGUg ZnJhbWVfaW5oaWJpdF9pbXBsaWVkX3Jlc2l6ZSBhbmQKZnVsbGhlaWdodC8td2lkdGguICBS ZW1vdmUgZnJhbWVfc2l6ZV9oaXN0b3J5X2FkZCBjYWxsLgoqIHNyYy9rZXlib2FyZC5jIChG c3VzcGVuZF9lbWFjcyk6IENhbGwgY2hhbmdlX2ZyYW1lX3NpemUgd2l0aApuYXRpdmUgc2l6 ZXMuCiogc3JjL25zZm5zLm0gKG5zX3NldF90b29sX2Jhcl9saW5lcyk6IENhbGwgYWRqdXN0 X2ZyYW1lX3NpemUKd2l0aCBJTkhJQklUIDIgYW5kIGxldCBpdCBoYW5kbGUgZnJhbWVfaW5o aWJpdF9pbXBsaWVkX3Jlc2l6ZQphbmQgZnVsbGhlaWdodC8td2lkdGguICBSZW1vdmUgZnJh bWVfc2l6ZV9oaXN0b3J5X2FkZCBjYWxsLgooRnhfY3JlYXRlX2ZyYW1lKTogRHJvcCB0d28g bGFzdCBhcmd1bWVudHMgaW4KZ3VpX2ZpZ3VyZV93aW5kb3dfc2l6ZSBjYWxsLiAgRG8gbm90 IFNFVF9GUkFNRV9XSURUSCBhbmQKU0VUX0ZSQU1FX0hFSUdIVCwgdGhlIGFkanVzdF9mcmFt ZV9zaXplIGluCmd1aV9maWd1cmVfd2luZG93X3NpemUgZGlkIHRoYXQgYWxyZWFkeS4KKiBz cmMvbnN0ZXJtLm0gKG5zX3NldF93aW5kb3dfc2l6ZSk6IERyb3AgUElYRUxXSVNFIGFyZ3Vt ZW50IGFuZAppdHMgcHJvY2Vzc2luZzsgV0lEVEggYW5kIEhFSUdIVCByZXByZXNlbnQgbmF0 aXZlIHBpeGVsIHNpemVzCm5vdy4gIENhbGwgY2hhbmdlX2ZyYW1lX3NpemUgd2l0aCBuYXRp dmUgc2l6ZXMuICBSZW1vdmUgY2FsbCB0bwpmcmFtZV9zaXplX2hpc3RvcnlfYWRkLgooW0Vt YWNzVmlldyB2aWV3RGlkUmVzaXplOl0pOiBDYWxsIGNoYW5nZV9mcmFtZV9zaXplIHdpdGgg bmF0aXZlCnNpemVzLgoqIHNyYy90ZXJtLmMgKEZyZXN1bWVfdHR5KTogQ2FsbCBjaGFuZ2Vf ZnJhbWVfc2l6ZSB3aXRoIG5hdGl2ZQpzaXplcy4KKiBzcmMvdGVybWhvb2tzLmggKCpzZXRf d2luZG93X3NpemVfaG9vayk6IERyb3AgbGFzdCBhcmd1bWVudApQSVhFTFdJU0UuCiogc3Jj L3czMmZucy5jICh3MzJfY2hhbmdlX3RhYl9iYXJfaGVpZ2h0KQoodzMyX2NoYW5nZV90b29s X2Jhcl9oZWlnaHQpOiBGaXggaGFuZGxpbmcgb2YgdGhlc2UgaW4gdGhlIGluaXRpYWwKcGhh c2UgYmVmb3JlIHRoZXkgaGF2ZSBiZWVuIHJlc2l6ZWQgYXQgbGVhc3Qgb25jZS4KKEZ4X2Ny ZWF0ZV9mcmFtZSwgdzMyX2NyZWF0ZV90aXBfZnJhbWUpOiBEcm9wIHR3byBsYXN0IGFyZ3Vt ZW50cwppbiBndWlfZmlndXJlX3dpbmRvd19zaXplIGNhbGwuICBEbyBub3QgU0VUX0ZSQU1F X1dJRFRIIGFuZApTRVRfRlJBTUVfSEVJR0hUIChvciBTRVRfRlJBTUVfQ09MUyBhbmQgU0VU X0ZSQU1FX0xJTkVTKSwgdGhlCmFkanVzdF9mcmFtZV9zaXplIGluIGd1aV9maWd1cmVfd2lu ZG93X3NpemUgZGlkIHRoYXQgYWxyZWFkeS4KKiBzcmMvdzMyaW5ldnQuYyAocmVzaXplX2V2 ZW50LCBtYXliZV9nZW5lcmF0ZV9yZXNpemVfZXZlbnQpOgpQYXNzIG5hdGl2ZSBzaXplcyB0 byBjaGFuZ2VfZnJhbWVfc2l6ZS4KKiBzcmMvdzMydGVybS5jICh3MzJfcmVhZF9zb2NrZXQp OiBXaGVuIFdNX1dJTkRPV1BPU0NIQU5HRUQgcGFzcwpuYXRpdmUgc2l6ZXMgdG8gY2hhbmdl X2ZyYW1lX3NpemUuCih3MzJfbmV3X2ZvbnQpOiBSZWNhbGN1bGF0ZSBGUkFNRV9UQUJfQkFS X0hFSUdIVC4gIFNpbXBsaWZ5CmNvZGUuCih3MzJmdWxsc2NyZWVuX2hvb2spOiBDYWxsIGNo YW5nZV9mcmFtZV9zaXplIHdpdGggbmF0aXZlIHNpemVzLgoodzMyX3NldF93aW5kb3dfc2l6 ZSk6IERyb3AgYXJndW1lbnQgUElYRUxXSVNFIGFuZCBpdHMKcHJvY2Vzc2luZzsgV0lEVEgg YW5kIEhFSUdIVCBhcmUgbmF0aXZlIHNpemVzIG5vdy4gIFJlbW92ZQpmcmFtZV9zaXplX2hp c3RvcnlfYWRkIGNhbGxzLiAgUGFzcyBuYXRpdmUgc2l6ZXMgdG8KY2hhbmdlX2ZyYW1lX3Np emUuCiogc3JjL3dpZGdldC5jIChzZXRfZnJhbWVfc2l6ZSk6IFNldCB3aWR0aCBhbmQgaGVp Z2h0IG9mIHdpZGdldApkaXJlY3RseS4gIENhbGwgZnJhbWVfc2l6ZV9oaXN0b3J5X3BsYWlu IGluc3RlYWQgb2YKZnJhbWVfc2l6ZV9oaXN0b3J5X2FkZC4KKHVwZGF0ZV9mcm9tX3Zhcmlv dXNfZnJhbWVfc2xvdHMpOiBDYWxsCmZyYW1lX3NpemVfaGlzdG9yeV9leHRyYS4KKEVtYWNz RnJhbWVSZWFsaXplKTogQ2FsbCBmcmFtZV9zaXplX2hpc3RvcnlfcGxhaW4uCihFbWFjc0Zy YW1lUmVzaXplKTogQ2FsbCBjaGFuZ2VfZnJhbWVfc2l6ZSB3aXRoIG5hdGl2ZSBzaXplcy4K Q2FsbCBmcmFtZV9zaXplX2hpc3RvcnlfZXh0cmEgaW5zdGVhZCBvZiBmcmFtZV9zaXplX2hp c3RvcnlfYWRkLgooRW1hY3NGcmFtZVNldENoYXJTaXplKTogQ2FsbCBmcmFtZV9zaXplX2hp c3RvcnlfZXh0cmEuICBEcm9wClBJWEVMV0lTRSBhcmd1bWVudCBpbiB4X3NldF93aW5kb3df c2l6ZSBjYWxsIGFuZCBzcGVjaWZ5IHBpeGVscy4KKHBpeGVsX3RvX3RleHRfc2l6ZSk6IFJl bW92ZSBmdW5jdGlvbi4KKiBzcmMveGRpc3AuYyAocmVzaXplX21pbmlfd2luZG93KTogUmVw bGFjZSBGUkFNRV9XSU5ET1dTX0hFSUdIVAp3aXRoIEZSQU1FX0lOTkVSX0hFSUdIVC4KKHJl ZGlzcGxheV90YWJfYmFyKTogRG9uJ3Qgc2V0IHRhYl9iYXJfcmVkaXNwbGF5ZWQgd2hlbiB3 ZSBkaWQKbm90IHJlZGlzcGxheSBpdC4KKHJlZGlzcGxheV90b29sX2Jhcik6IERvbid0IGNh bGwgaXQgZm9yIGV4dGVybmFsIHRvb2wgYmFyLgpEb24ndCBzZXQgdG9vbF9iYXJfcmVkaXNw bGF5ZWQgd2hlbiB3ZSBkaWQgbm90IHJlZGlzcGxheSBpdC4KKHJlZGlzcGxheV93aW5kb3cp OiBXaGVuIHRoZSB0b29sIGJhciBpcyBleHRlcm5hbCBjYWxsCnVwZGF0ZV9mcmFtZV90b29s X2JhciBkaXJlY3RseS4KKiBzcmMveGZucy5jICh4X3NldF9tZW51X2Jhcl9saW5lcyk6IENh bGwgYWRqdXN0X2ZyYW1lX3NpemUgb25seQppZiBudW1iZXIgb2YgbWVudSBiYXIgbGluZXMg Y2hhbmdlZCBhbmQgZml4IDZ0aCBhcmd1bWVudC4KKHhfY2hhbmdlX3RhYl9iYXJfaGVpZ2h0 LCB4X2NoYW5nZV90b29sX2Jhcl9oZWlnaHQpOiBGaXgKaGFuZGxpbmcgb2YgdGhlc2UgaW4g dGhlIGluaXRpYWwgcGhhc2UgYmVmb3JlIHRoZXkgaGF2ZSBiZWVuCnJlc2l6ZWQgYXQgbGVh c3Qgb25jZS4KKEZ4X2NyZWF0ZV9mcmFtZSwgeF9jcmVhdGVfdGlwX2ZyYW1lKTogRHJvcCB0 d28gbGFzdCBhcmd1bWVudHMKaW4gZ3VpX2ZpZ3VyZV93aW5kb3dfc2l6ZSBjYWxsLiAgRG8g bm90IFNFVF9GUkFNRV9XSURUSCBhbmQKU0VUX0ZSQU1FX0hFSUdIVCAob3IgU0VUX0ZSQU1F X0NPTFMgYW5kIFNFVF9GUkFNRV9MSU5FUyksIHRoZQphZGp1c3RfZnJhbWVfc2l6ZSBpbiBn dWlfZmlndXJlX3dpbmRvd19zaXplIGRpZCB0aGF0IGFscmVhZHkuCiogc3JjL3htZW51LmMg KHVwZGF0ZV9mcmFtZV9tZW51YmFyKTogRml4IDZ0aCBhcmcgb2YKYWRqdXN0X2ZyYW1lX3Np emUgY2FsbC4KKGZyZWVfZnJhbWVfbWVudWJhcik6IEZvciBNb3RpZiBmcmFtZXMgZml4IGZ1 bGxzY3JlZW4gYW5kCmBmcmFtZS1pbmhpYml0LWltcGxpZWQtcmVzaXplJyBoYW5kbGluZy4g IEZpeCA2dGggYXJnIG9mCmFkanVzdF9mcmFtZV9zaXplIGNhbGxzLgoqIHNyYy94dGVybS5j ICh4X25ldF93bV9zdGF0ZSk6IFJlbW92ZSBjYWxsIHRvCmZyYW1lX3NpemVfaGlzdG9yeV9h ZGQuCihoYW5kbGVfb25lX3hldmVudCk6IEZvciBQcm9wZXJ0eU5vdGlmeSBhbmQgVW5tYXBO b3RpZnkgZXZlbnRzCmFkZCBmcmFtZV9zaXplX2hpc3RvcnlfcGxhaW4gY2FsbHMuICBGb3Ig TWFwTm90aWZ5IGFuZApDb25maWd1cmVOb3RpZnkgZXZlbnRzIGFkZCBhIGZyYW1lX3NpemVf aGlzdG9yeV9leHRyYSBjYWxsLiAgRm9yCkNvbmZpZ3VyZU5vdGlmeSBldmVudHMgYWxzbyBo YW5kbGUgZGVsYXllZCBzaXplIGNoYW5nZXMgYW5kIGNhbGwKY2hhbmdlX2ZyYW1lX3NpemUg d2l0aCBuYXRpdmUgc2l6ZXMuCih4X25ld19mb250KTogUmVjYWxjdWxhdGUgRlJBTUVfVEFC X0JBUl9IRUlHSFQuICBTaW1wbGlmeSBjb2RlLgooeF9oYW5kbGVfbmV0X3dtX3N0YXRlKTog UmVtb3ZlIGZyYW1lX3NpemVfaGlzdG9yeV9hZGQgY2FsbC4KKHhfY2hlY2tfZnVsbHNjcmVl bik6IFJlbW92ZSBmcmFtZV9zaXplX2hpc3RvcnlfYWRkIGNhbGwuICBDYWxsCmNoYW5nZV9m cmFtZV9zaXplIHdpdGggbmF0aXZlIGhlaWdodC4KKHhfc2V0X3dpbmRvd19zaXplXzEpOiBX SURUSCBhbmQgSEVJR0hUIGFyZSBub3cgbmF0aXZlLiAgUmVtb3ZlCnNvbWUgZnJhbWVfc2l6 ZV9oaXN0b3J5X2FkZCBjYWxscyBhbmQgYWRkIGZyYW1lX3NpemVfaGlzdG9yeV9leHRyYQpj YWxscyBpbnN0ZWFkLiAgSWYgdGhlIGZyYW1lIGlzIG5vdCB2aXNpYmxlIGNhbGwgYWRqdXN0 X2ZyYW1lX3NpemUKZGlyZWN0bHkgaW5zdGVhZCBvZiBjYWxsaW5nIGNoYW5nZV9mcmFtZV9z aXplLgooeF9zZXRfd2luZG93X3NpemUpOiBEcm9wIFBJWEVMV0lTRSBhcmd1bWVudC4gIFdJ RFRIIGFuZCBIRUlHSFQKcmVwcmVzZW50IG5hdGl2ZSBzaXplcyBub3cuCih4X21ha2VfZnJh bWVfdmlzaWJsZSwgeF9tYWtlX2ZyYW1lX2ludmlzaWJsZSk6IENhbGwKZnJhbWVfc2l6ZV9o aXN0b3J5X3BsYWluLgoqIHNyYy94dGVybS5oICh4X3NldF93aW5kb3dfc2l6ZSk6IERyb3Ag bGFzdCBhcmd1bWVudCBmcm9tCmV4dGVybiBkZWNsYXJhdGlvbi4K --------------607A204092882D8F045C76C8 Content-Type: text/x-patch; name="adjust_frame_size.diff" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="adjust_frame_size.diff" diff --git a/lisp/frame.el b/lisp/frame.el index bca160175a..aff1d479ec 100644 --- a/lisp/frame.el +++ b/lisp/frame.el @@ -615,15 +615,6 @@ frame-notice-user-settings (face-set-after-frame-default frame-initial-frame) (setq newparms (delq new-bg newparms))) =20 - (when (numberp (car frame-size-history)) - (setq frame-size-history - (cons (1- (car frame-size-history)) - (cons - (list frame-initial-frame - "FRAME-NOTICE-USER" - nil newparms) - (cdr frame-size-history))))) - (modify-frame-parameters frame-initial-frame newparms))))) =20 ;; Restore the original buffer. @@ -926,12 +917,6 @@ make-frame (let ((val (frame-parameter oldframe param))) (when val (set-frame-parameter frame param val))))) =20 - (when (numberp (car frame-size-history)) - (setq frame-size-history - (cons (1- (car frame-size-history)) - (cons (list frame "MAKE-FRAME") - (cdr frame-size-history))))) - ;; We can run `window-configuration-change-hook' for this frame now.= (frame-after-make-frame frame t) (run-hook-with-args 'after-make-frame-functions frame) @@ -1695,26 +1680,104 @@ frame-geometry =20 (defun frame--size-history (&optional frame) "Print history of resize operations for FRAME. -Print prettified version of `frame-size-history' into a buffer -called *frame-size-history*. Optional argument FRAME denotes the -frame whose history will be printed. FRAME defaults to the -selected frame." +This function dumps a prettified version of `frame-size-history' +into a buffer called *frame-size-history*. The optional argument +FRAME denotes the frame whose history will be dumped; it defaults +to the selected frame. + +Storing information about resize operations is off by default. +If you set the variable `frame-size-history' like this + +(setq frame-size-history '(100)) + +then Emacs will save information about the next 100 significant +operations affecting any frame's size in that variable. This +function prints the entries for FRAME stored in that variable in +a more legible way. + +All lines start with an indication of the requested action. An +entry like `menu-bar-lines' or `scroll-bar-width' indicates that +a change of the corresponding frame parameter or Lisp variable +was requested. An entry like gui_figure_window_size indicates +that that C function was executed, an entry like ConfigureNotify +indicates that that event was received. + +In long entries, a number in parentheses displays the INHIBIT +parameter passed to the C function adjust_frame_size. Such +entries may also display changes of frame rectangles in a form +like R=3Dn1xn2~>n3xn4 where R denotes the rectangle type (TS for +text, NS for native and IS for inner frame rectangle sizes, all +in pixels, TC for text rectangle sizes in frame columns and +lines), n1 and n2 denote the old width and height and n3 and n4 +the new width and height in the according units. MS stands for +the minimum inner frame size in pixels, IH and IV, if present, +indicate that resizing horizontally and/or vertically was +inhibited (either by `frame-inhibit-implied-resize' or because of +the frame's fullscreen state). + +Shorter entries represent C functions that process width and +height changes of the native rectangle where PS stands for the +frame's present pixel width and height, XS for a requested pixel +width and height and DS for some earlier requested but so far +delayed pixel width and height. + +Very short entries represent calls of C functions that do not +directly ask for size changes but may indirectly affect the size +of frames like calls to map a frame or change its visibility." (let ((history (reverse frame-size-history)) - entry) + entry item) (setq frame (window-normalize-frame frame)) (with-current-buffer (get-buffer-create "*frame-size-history*") (erase-buffer) (insert (format "Frame size history of %s\n" frame)) (while (consp (setq entry (pop history))) - (when (eq (car entry) frame) - (pop entry) - (insert (format "%s" (pop entry))) - (move-to-column 24 t) - (while entry - (insert (format " %s" (pop entry)))) - (insert "\n"))) - (unless frame-size-history - (insert "Frame size history is nil.\n"))))) + (setq item (car entry)) + (cond + ((not (consp item)) + ;; An item added quickly for debugging purposes. + (insert (format "%s\n" entry))) + ((and (eq (nth 0 item) frame) (=3D (nth 1 item) 1)) + ;; Length 1 is a "plain event". + (insert (format "%s\n" (nth 2 item)))) + ((and (eq (nth 0 item) frame) (=3D (nth 1 item) 2)) + ;; Length 2 is an "extra" item. + (insert (format "%s" (nth 2 item))) + (setq item (nth 0 (cdr entry))) + (insert (format ", PS=3D%sx%s" (nth 0 item) (nth 1 item))) + (when (or (>=3D (nth 2 item) 0) (>=3D (nth 3 item) 0)) + (insert (format ", XS=3D%sx%s" (nth 2 item) (nth 3 item)))) + (setq item (nth 1 (cdr entry))) + (when (or (>=3D (nth 0 item) 0) (>=3D (nth 1 item) 0)) + (insert (format ", DS=3D%sx%s" (nth 0 item) (nth 1 item)))) + (insert "\n")) + ((and (eq (nth 0 item) frame) (=3D (nth 1 item) 5)) + ;; Length 5 is an `adjust-frame-size' item. + (insert (format "%s (%s)" (nth 3 item) (nth 2 item))) + (setq item (nth 0 (cdr entry))) + (unless (and (=3D (nth 0 item) (nth 2 item)) + (=3D (nth 1 item) (nth 3 item))) + (insert (format ", TS=3D%sx%s~>%sx%s" + (nth 0 item) (nth 1 item) (nth 2 item) (nth = 3 item)))) + (setq item (nth 1 (cdr entry))) + (unless (and (=3D (nth 0 item) (nth 2 item)) + (=3D (nth 1 item) (nth 3 item))) + (insert (format ", TC=3D%sx%s~>%sx%s" + (nth 0 item) (nth 1 item) (nth 2 item) (nth = 3 item)))) + (setq item (nth 2 (cdr entry))) + (unless (and (=3D (nth 0 item) (nth 2 item)) + (=3D (nth 1 item) (nth 3 item))) + (insert (format ", NS=3D%sx%s~>%sx%s" + (nth 0 item) (nth 1 item) (nth 2 item) (nth = 3 item)))) + (setq item (nth 3 (cdr entry))) + (unless (and (=3D (nth 0 item) (nth 2 item)) + (=3D (nth 1 item) (nth 3 item))) + (insert (format ", IS=3D%sx%s~>%sx%s" + (nth 0 item) (nth 1 item) (nth 2 item) (nth = 3 item)))) + (setq item (nth 4 (cdr entry))) + (insert (format ", MS=3D%sx%s" (nth 0 item) (nth 1 item))) + (when (nth 2 item) (insert " IH")) + (when (nth 3 item) (insert " IV")) + (insert "\n"))))))) =20 (declare-function x-frame-edges "xfns.c" (&optional frame type)) (declare-function w32-frame-edges "w32fns.c" (&optional frame type)) diff --git a/src/dispextern.h b/src/dispextern.h index a2ebd04f23..213032d4de 100644 --- a/src/dispextern.h +++ b/src/dispextern.h @@ -1262,7 +1262,7 @@ #define MATRIX_ROW_OVERLAPS_SUCC_P(ROW) \ /* True means last display completed. False means it was preempted. */= =20 extern bool display_completed; - +extern bool delayed_size_change; =20 =0C /***********************************************************************= * @@ -3641,7 +3641,7 @@ #define IMAGE_BACKGROUND_TRANSPARENT(img, f, mask) = \ extern void gui_update_window_end (struct window *, bool, bool); #endif void do_pending_window_change (bool); -void change_frame_size (struct frame *, int, int, bool, bool, bool, bool= ); +void change_frame_size (struct frame *, int, int, bool, bool, bool); void init_display (void); void syms_of_display (void); extern void spec_glyph_lookup_face (struct window *, GLYPH *); diff --git a/src/dispnew.c b/src/dispnew.c index f613f7b656..b3f7be67e0 100644 --- a/src/dispnew.c +++ b/src/dispnew.c @@ -102,7 +102,7 @@ Copyright (C) 1985-1988, 1993-1995, 1997-2021 Free So= ftware Foundation, =20 /* True means SIGWINCH happened when not safe. */ =20 -static bool delayed_size_change; +bool delayed_size_change; =20 /* A glyph for a space. */ =20 @@ -5770,32 +5770,34 @@ handle_window_change_signal (int sig) termcap-controlled terminal, but we can't decide which. Therefore, we resize the frames corresponding to each tty. */ - for (tty =3D tty_list; tty; tty =3D tty->next) { + for (tty =3D tty_list; tty; tty =3D tty->next) + { + if (! tty->term_initted) + continue; =20 - if (! tty->term_initted) - continue; + /* Suspended tty frames have tty->input =3D=3D NULL avoid trying t= o + use it. */ + if (!tty->input) + continue; =20 - /* Suspended tty frames have tty->input =3D=3D NULL avoid trying to - use it. */ - if (!tty->input) - continue; + get_tty_size (fileno (tty->input), &width, &height); =20 - get_tty_size (fileno (tty->input), &width, &height); + if (width > 5 && height > 2) + { + Lisp_Object tail, frame; =20 - if (width > 5 && height > 2) { - Lisp_Object tail, frame; + FOR_EACH_FRAME (tail, frame) + { + struct frame *f =3D XFRAME (frame); =20 - FOR_EACH_FRAME (tail, frame) - if (FRAME_TERMCAP_P (XFRAME (frame)) && FRAME_TTY (XFRAME (frame= )) =3D=3D tty) - /* Record the new sizes, but don't reallocate the data - structures now. Let that be done later outside of the - signal handler. */ - change_frame_size (XFRAME (frame), width, - height - FRAME_MENU_BAR_LINES (XFRAME (frame)) - - FRAME_TAB_BAR_LINES (XFRAME (frame)), - 0, 1, 0, 0); + if (FRAME_TERMCAP_P (f) && FRAME_TTY (f) =3D=3D tty) + /* Record the new sizes, but don't reallocate the data + structures now. Let that be done later outside of the + signal handler. */ + change_frame_size (f, width, height, false, true, false); + } + } } - } } =20 static void @@ -5821,15 +5823,17 @@ do_pending_window_change (bool safe) { Lisp_Object tail, frame; =20 - delayed_size_change =3D 0; + delayed_size_change =3D false; =20 FOR_EACH_FRAME (tail, frame) { struct frame *f =3D XFRAME (frame); =20 - if (f->new_height !=3D 0 || f->new_width !=3D 0) + /* Negative new_width or new_height values mean no change is + required (a native size can never drop below zero). */ + if (f->new_height >=3D 0 || f->new_width >=3D 0) change_frame_size (f, f->new_width, f->new_height, - 0, 0, safe, f->new_pixelwise); + false, false, safe); } } } @@ -5837,47 +5841,43 @@ do_pending_window_change (bool safe) =20 static void change_frame_size_1 (struct frame *f, int new_width, int new_height, - bool pretend, bool delay, bool safe, bool pixelwise) + bool pretend, bool delay, bool safe) { - /* If we can't deal with the change now, queue it for later. */ if (delay || (redisplaying_p && !safe)) { + if (CONSP (frame_size_history) + && ((new_width !=3D f->new_width + || new_height !=3D f->new_height + || new_width !=3D FRAME_PIXEL_WIDTH (f) + || new_height !=3D FRAME_PIXEL_HEIGHT (f)))) + frame_size_history_extra + (f, build_string ("change_frame_size_1, delayed"), + FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f), + new_width, new_height, f->new_width, f->new_height); + + /* We can't deal with the change now, queue it for later. */ f->new_width =3D new_width; f->new_height =3D new_height; - f->new_pixelwise =3D pixelwise; - delayed_size_change =3D 1; + delayed_size_change =3D true; } else { - /* This size-change overrides any pending one for this frame. */ - f->new_height =3D 0; - f->new_width =3D 0; - f->new_pixelwise =3D 0; - - /* If an argument is zero, set it to the current value. */ - if (pixelwise) - { - new_width =3D (new_width <=3D 0) ? FRAME_TEXT_WIDTH (f) : new_width; - new_height =3D (new_height <=3D 0) ? FRAME_TEXT_HEIGHT (f) : new_heig= ht; - } - else - { - new_width =3D (((new_width <=3D 0) ? FRAME_COLS (f) : new_width) - * FRAME_COLUMN_WIDTH (f)); - new_height =3D (((new_height <=3D 0) ? FRAME_LINES (f) : new_height) - * FRAME_LINE_HEIGHT (f)); - } - - /* Adjust frame size but make sure set_window_size_hook does not - get called. */ - adjust_frame_size (f, new_width, new_height, 5, pretend, - Qchange_frame_size); + /* Storing -1 in the new_width/new_height slots means that no size= + change is pending. Native sizes are always non-negative. */ + f->new_height =3D -1; + f->new_width =3D -1; + /* adjust_frame_size wants its arguments in terms of text_width + and text_height, so convert them here. For pathologically + small frames, the resulting values may be negative though. */ + adjust_frame_size (f, FRAME_PIXEL_TO_TEXT_WIDTH (f, new_width), + FRAME_PIXEL_TO_TEXT_HEIGHT (f, new_height), 5, + pretend, Qchange_frame_size); } } =20 =20 -/* Change text height/width of frame F. Values may be given as zero to - indicate that no change is needed. +/* Change native height/width of frame F to NEW_WIDTH/NEW_HEIGHT pixels.= + Values may be given as -1 to indicate that no change is needed. =20 If DELAY, assume we're being called from a signal handler, and queue the change for later - perhaps the next redisplay. Since this tries @@ -5887,7 +5887,7 @@ change_frame_size_1 (struct frame *f, int new_width= , int new_height, change frame sizes while a redisplay is in progress. */ void change_frame_size (struct frame *f, int new_width, int new_height, - bool pretend, bool delay, bool safe, bool pixelwise) + bool pretend, bool delay, bool safe) { Lisp_Object tail, frame; =20 @@ -5897,13 +5897,12 @@ change_frame_size (struct frame *f, int new_width= , int new_height, size affects all frames. Termcap now supports multiple ttys. */ FOR_EACH_FRAME (tail, frame) - if (! FRAME_WINDOW_P (XFRAME (frame))) + if (!FRAME_WINDOW_P (XFRAME (frame))) change_frame_size_1 (XFRAME (frame), new_width, new_height, - pretend, delay, safe, pixelwise); + pretend, delay, safe); } else - change_frame_size_1 (f, new_width, new_height, pretend, delay, safe,= - pixelwise); + change_frame_size_1 (f, new_width, new_height, pretend, delay, safe)= ; } =0C /***********************************************************************= @@ -6492,9 +6491,8 @@ init_display_interactive (void) t->display_info.tty->top_frame =3D selected_frame; change_frame_size (XFRAME (selected_frame), FrameCols (t->display_info.tty), - FrameRows (t->display_info.tty) - - FRAME_MENU_BAR_LINES (f) - - FRAME_TAB_BAR_LINES (f), 0, 0, 1, 0); + FrameRows (t->display_info.tty), + false, false, true); =20 /* Delete the initial terminal. */ if (--initial_terminal->reference_count =3D=3D 0 diff --git a/src/frame.c b/src/frame.c index 097cd555c6..4129a70aa5 100644 --- a/src/frame.c +++ b/src/frame.c @@ -150,29 +150,6 @@ get_frame_param (struct frame *frame, Lisp_Object pr= op) } =20 =20 -void -frame_size_history_add (struct frame *f, Lisp_Object fun_symbol, - int width, int height, Lisp_Object rest) -{ - Lisp_Object frame; - - XSETFRAME (frame, f); - if (CONSP (frame_size_history) - && FIXNUMP (XCAR (frame_size_history)) - && 0 < XFIXNUM (XCAR (frame_size_history))) - frame_size_history =3D - Fcons (make_fixnum (XFIXNUM (XCAR (frame_size_history)) - 1), - Fcons (list4 - (frame, fun_symbol, - ((width > 0) - ? list4i (FRAME_TEXT_WIDTH (f), FRAME_TEXT_HEIGHT (f), - width, height) - : Qnil), - rest), - XCDR (frame_size_history))); -} - - /* Return 1 if `frame-inhibit-implied-resize' is non-nil or fullscreen state of frame F would be affected by a vertical (horizontal if HORIZONTAL is true) resize. PARAMETER is the symbol of the frame @@ -193,78 +170,54 @@ frame_inhibit_resize (struct frame *f, bool horizon= tal, Lisp_Object parameter) || FRAME_TERMCAP_P (f) || FRAME_MSDOS_P (f)) : ((horizontal && f->inhibit_horizontal_resize) || (!horizontal && f->inhibit_vertical_resize))); - if (inhibit && !FRAME_TERMCAP_P (f) && !FRAME_MSDOS_P (f)) - frame_size_history_add - (f, Qframe_inhibit_resize, 0, 0, - list5 (horizontal ? Qt : Qnil, parameter, - f->after_make_frame ? Qt : Qnil, - frame_inhibit_implied_resize, - fullscreen)); =20 return inhibit; } =20 + +/** Set menu bar lines for a TTY frame. */ static void set_menu_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldv= al) { - int nlines; int olines =3D FRAME_MENU_BAR_LINES (f); + int nlines =3D TYPE_RANGED_FIXNUMP (int, value) ? XFIXNUM (value) : 0;= =20 /* Right now, menu bars don't work properly in minibuf-only frames; most of the commands try to apply themselves to the minibuffer frame itself, and get an error because you can't switch buffers in or split the minibuffer window. */ - if (FRAME_MINIBUF_ONLY_P (f)) - return; - - if (TYPE_RANGED_FIXNUMP (int, value)) - nlines =3D XFIXNUM (value); - else - nlines =3D 0; - - if (nlines !=3D olines) + if (!FRAME_MINIBUF_ONLY_P (f) && nlines !=3D olines) { windows_or_buffers_changed =3D 14; - FRAME_MENU_BAR_LINES (f) =3D nlines; - FRAME_MENU_BAR_HEIGHT (f) =3D nlines * FRAME_LINE_HEIGHT (f); - change_frame_size (f, FRAME_COLS (f), - FRAME_LINES (f) + olines - nlines, - 0, 1, 0, 0); + FRAME_MENU_BAR_LINES (f) =3D FRAME_MENU_BAR_HEIGHT (f) =3D nlines;= + change_frame_size (f, FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f= ), + false, true, false); } } =20 + +/** Set tab bar lines for a TTY frame. */ static void set_tab_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldva= l) { - int nlines; int olines =3D FRAME_TAB_BAR_LINES (f); + int nlines =3D TYPE_RANGED_FIXNUMP (int, value) ? XFIXNUM (value) : 0;= =20 /* Right now, tab bars don't work properly in minibuf-only frames; most of the commands try to apply themselves to the minibuffer frame itself, and get an error because you can't switch buffers in or split the minibuffer window. */ - if (FRAME_MINIBUF_ONLY_P (f)) - return; - - if (TYPE_RANGED_FIXNUMP (int, value)) - nlines =3D XFIXNUM (value); - else - nlines =3D 0; - - if (nlines !=3D olines) + if (!FRAME_MINIBUF_ONLY_P (f) && nlines !=3D olines) { windows_or_buffers_changed =3D 14; - FRAME_TAB_BAR_LINES (f) =3D nlines; - FRAME_TAB_BAR_HEIGHT (f) =3D nlines * FRAME_LINE_HEIGHT (f); - change_frame_size (f, FRAME_COLS (f), - FRAME_LINES (f) + olines - nlines, - 0, 1, 0, 0); + FRAME_TAB_BAR_LINES (f) =3D FRAME_TAB_BAR_HEIGHT (f) =3D nlines; + change_frame_size (f, FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f= ), + false, true, false); } } =0C Lisp_Object Vframe_list; =20 -=0C DEFUN ("framep", Fframep, Sframep, 1, 1, 0, doc: /* Return non-nil if OBJECT is a frame. Value is: @@ -366,14 +319,15 @@ DEFUN ("frame-windows-min-size", Fframe_windows_min= _size, * * If `frame-windows-min-size' is called, it will make sure that the * return value accommodates all windows of FRAME respecting the values - * of `window-min-height' (`window-min-width' if HORIZONTAL is non-nil).= - * With IGNORE non-nil the values of these variables are ignored. + * of `window-min-height' (`window-min-width' if HORIZONTAL is + * non-nil) and `window-safe-min-height' (`window-safe-min-width') + * according to IGNORE (see `window-min-size'). * * In either case, never return a value less than 1. For TTY frames, * additionally limit the minimum frame height to a value large enough - * to support the menu bar, the mode line, and the echo area. + * to support menu bar, tab bar, mode line and echo area. */ -static int +int frame_windows_min_size (Lisp_Object frame, Lisp_Object horizontal, Lisp_Object ignore, Lisp_Object pixelwise) { @@ -405,6 +359,7 @@ frame_windows_min_size (Lisp_Object frame, Lisp_Objec= t horizontal, else retval =3D XFIXNUM (call4 (Qframe_windows_min_size, frame, horizonta= l, ignore, pixelwise)); + /* Don't allow too small height of text-mode frames, or else cm.c might abort in cmcheckmagic. */ if ((FRAME_TERMCAP_P (f) || FRAME_MSDOS_P (f)) && NILP (horizontal)) @@ -413,6 +368,7 @@ frame_windows_min_size (Lisp_Object frame, Lisp_Objec= t horizontal, + FRAME_TAB_BAR_LINES (f) + FRAME_WANTS_MODELINE_P (f) + 2); /* one text line and one echo-area line */ + if (retval < min_height) retval =3D min_height; } @@ -474,9 +430,10 @@ keep_ratio (struct frame *f, struct frame *p, int ol= d_width, int old_height, if (CONSP (keep_ratio) && (NILP (Fcar (keep_ratio)) || EQ (Fcar (keep_ratio), Qheight_only)) - && p->pixel_width - f->pixel_width < pos_x) + && FRAME_PIXEL_WIDTH (p) - FRAME_PIXEL_WIDTH (f) < pos_x) { - int p_f_width =3D p->pixel_width - f->pixel_width; + int p_f_width + =3D FRAME_PIXEL_WIDTH (p) - FRAME_PIXEL_WIDTH (f); =20 if (p_f_width <=3D 0) pos_x =3D 0; @@ -496,14 +453,15 @@ keep_ratio (struct frame *f, struct frame *p, int o= ld_width, int old_height, if (CONSP (keep_ratio) && (NILP (Fcar (keep_ratio)) || EQ (Fcar (keep_ratio), Qwidth_only)) - && p->pixel_height - f->pixel_height < pos_y) + && FRAME_PIXEL_HEIGHT (p) - FRAME_PIXEL_HEIGHT (f) < pos_y) /* When positional adjustment was requested and the width of F should remain unaltered, try to constrain F to its parent. This means that when the parent frame is enlarged later the child's original position won't get restored. */ { - int p_f_height =3D p->pixel_height - f->pixel_height; + int p_f_height + =3D FRAME_PIXEL_HEIGHT (p) - FRAME_PIXEL_HEIGHT (f); =20 if (p_f_height <=3D 0) pos_y =3D 0; @@ -523,60 +481,143 @@ keep_ratio (struct frame *f, struct frame *p, int = old_width, int old_height, if (CONSP (keep_ratio) && EQ (Fcar (keep_ratio), Qheight_only)) pixel_width =3D -1; else - { - pixel_width =3D (int)(f->pixel_width * width_factor + 0.5); - pixel_width =3D FRAME_PIXEL_TO_TEXT_WIDTH (f, pixel_width); - } + pixel_width + =3D (int)(FRAME_PIXEL_WIDTH (f) * width_factor + 0.5); =20 if (CONSP (keep_ratio) && EQ (Fcar (keep_ratio), Qwidth_only)) pixel_height =3D -1; else - { - pixel_height =3D (int)(f->pixel_height * height_factor + 0.5); - pixel_height =3D FRAME_PIXEL_TO_TEXT_HEIGHT (f, pixel_height); - } + pixel_height + =3D (int)(FRAME_PIXEL_HEIGHT (f) * height_factor + 0.5); =20 - adjust_frame_size (f, pixel_width, pixel_height, 1, 0, - Qkeep_ratio); + adjust_frame_size (f, FRAME_PIXEL_TO_TEXT_WIDTH (f, pixel_width), + FRAME_PIXEL_TO_TEXT_HEIGHT (f, pixel_height), 1, + false, Qkeep_ratio); } } } #endif =20 =20 +static void +frame_size_history_adjust (struct frame *f, int inhibit, Lisp_Object par= ameter, + int old_text_width, int old_text_height, + int new_text_width, int new_text_height, + int old_text_cols, int old_text_lines, + int new_text_cols, int new_text_lines, + int old_native_width, int old_native_height, + int new_native_width, int new_native_height, + int old_inner_width, int old_inner_height, + int new_inner_width, int new_inner_height, + int min_inner_width, int min_inner_height, + bool inhibit_horizontal, bool inhibit_vertical) +{ + Lisp_Object frame; + + XSETFRAME (frame, f); + if (CONSP (frame_size_history) + && FIXNUMP (XCAR (frame_size_history)) + && 0 < XFIXNUM (XCAR (frame_size_history))) + frame_size_history =3D + Fcons (make_fixnum (XFIXNUM (XCAR (frame_size_history)) - 1), + Fcons (Fcons (list4 (frame, make_fixnum (5), + make_fixnum (inhibit), parameter), + list5 (list4i (old_text_width, old_text_height, + new_text_width, new_text_height), + list4i (old_text_cols, old_text_lines, + new_text_cols, new_text_lines), + list4i (old_native_width, old_native_height, + new_native_width, new_native_height), + list4i (old_inner_width, old_inner_height, + new_inner_width, new_inner_height), + list4 (make_fixnum (min_inner_width), + make_fixnum (min_inner_height), + inhibit_horizontal ? Qt : Qnil, + inhibit_vertical ? Qt : Qnil))), + XCDR (frame_size_history))); +} + + +void +frame_size_history_plain (struct frame *f, Lisp_Object parameter) +{ + Lisp_Object frame; + + XSETFRAME (frame, f); + if (CONSP (frame_size_history) + && FIXNUMP (XCAR (frame_size_history)) + && 0 < XFIXNUM (XCAR (frame_size_history))) + frame_size_history =3D + Fcons (make_fixnum (XFIXNUM (XCAR (frame_size_history)) - 1), + Fcons (Fcons (list3 (frame, make_fixnum (1), parameter), Qt), + XCDR (frame_size_history))); +} + + +void +frame_size_history_extra (struct frame *f, Lisp_Object parameter, + int pixel_width, int pixel_height, + int extra_width, int extra_height, + int delayed_width, int delayed_height) +{ + Lisp_Object frame; + + XSETFRAME (frame, f); + if (CONSP (frame_size_history) + && FIXNUMP (XCAR (frame_size_history)) + && 0 < XFIXNUM (XCAR (frame_size_history))) + frame_size_history =3D + Fcons (make_fixnum (XFIXNUM (XCAR (frame_size_history)) - 1), + Fcons (Fcons (list3 (frame, make_fixnum (2), parameter), + list2 (list4i (pixel_width, pixel_height, + extra_width, extra_height), + list2i (delayed_width, delayed_height))), + XCDR (frame_size_history))); +} + + /** * adjust_frame_size: * - * Adjust size of frame F. NEW_WIDTH and NEW_HEIGHT specify the new - * text size of F in pixels. A value of -1 means no change is requested= - * for that direction (but the frame may still have to be resized to - * accommodate windows with their minimum sizes). This can either issue= - * a request to resize the frame externally (via set_window_size_hook), = to - * resize the frame internally (via resize_frame_windows) or do nothing - * at all. + * Adjust size of frame F. NEW_TEXT_WIDTH and NEW_TEXT_HEIGHT specify + * the new text size of F in pixels. When INHIBIT equals 2, 3 or 4, a + * value of -1 means to leave the text size of F unchanged and adjust, + * if necessary and possible, F's native size accordingly. When INHIBIT= + * equals 0, 1 or 5, a negative value means that the frame has been (or + * should be) made pathologically small which usually means that parts + * of the frame's windows may not be entirely visible. * - * The argument INHIBIT can assume the following values: + * The effect of calling this function can be to either issue a request + * to resize the frame externally (via set_window_size_hook), to resize + * the frame internally (via resize_frame_windows) or to do nothing. + * + * The argument INHIBIT controls whether set_window_size_hook may be + * called and can assume the following values: * * 0 means to unconditionally call set_window_size_hook even if sizes * apparently do not change. Fx_create_frame uses this to pass the * initial size to the window manager. * - * 1 means to call set_window_size_hook if the native frame size really - * changes. Fset_frame_size, Fset_frame_height, ... use this. + * 1 means to call set_window_size_hook if the native frame size should + * change. Fset_frame_size and friends and width and height parameter= + * changes use this. * * 2 means to call set_window_size_hook provided frame_inhibit_resize - * allows it. The menu and tool bar code use this ("3" won't work - * here in general because menu and tool bar are often not counted in - * the frame's text height). + * allows it. The code updating external menu and tool bars uses this= + * to keep the height of the native frame unaltered when one of these + * bars is added or removed. This means that Emacs has to work + * against the window manager which usually tries to keep the combined= + * height (native frame plus bar) unaltered. * - * 3 means call set_window_size_hook if window minimum sizes must be - * preserved or frame_inhibit_resize allows it. - * gui_set_left_fringe, gui_set_scroll_bar_width, gui_new_font - * ... use (or should use) this. + * 3 means to call set_window_size_hook if window minimum sizes must be + * preserved or frame_inhibit_resize allows it. This is the default + * for parameters accounted for in a frame's text size like fringes, + * scroll bars, internal border, tab bar, internal tool and menu bars.= + * It's also used when the frame's default font changes. * - * 4 means call set_window_size_hook only if window minimum sizes must - * be preserved. x_set_right_divider_width, x_set_border_width and - * the code responsible for wrapping the tool bar use this. + * 4 means to call set_window_size_hook only if window minimum sizes + * must be preserved. The code for setting up window dividers and + * that responsible for wrapping the (internal) tool bar use this. * * 5 means to never call set_window_size_hook. change_frame_size uses * this. @@ -588,146 +629,172 @@ keep_ratio (struct frame *f, struct frame *p, int= old_width, int old_height, * PRETEND is as for change_frame_size. PARAMETER, if non-nil, is the * symbol of the parameter changed (like `menu-bar-lines', `font', ...).= * This is passed on to frame_inhibit_resize to let the latter decide on= - * a case-by-case basis whether the frame may be resized externally. + * a case-by-case basis whether set_window_size_hook should be called. */ void -adjust_frame_size (struct frame *f, int new_width, int new_height, int i= nhibit, - bool pretend, Lisp_Object parameter) +adjust_frame_size (struct frame *f, int new_text_width, int new_text_hei= ght, + int inhibit, bool pretend, Lisp_Object parameter) { int unit_width =3D FRAME_COLUMN_WIDTH (f); int unit_height =3D FRAME_LINE_HEIGHT (f); - int old_pixel_width =3D FRAME_PIXEL_WIDTH (f); - int old_pixel_height =3D FRAME_PIXEL_HEIGHT (f); - int old_cols =3D FRAME_COLS (f); - int old_lines =3D FRAME_LINES (f); - int new_pixel_width, new_pixel_height; - /* The following two values are calculated from the old frame pixel - sizes and any "new" settings for tool bar, menu bar and internal - borders. We do it this way to detect whether we have to call - set_window_size_hook as consequence of the new settings. */ - int windows_width =3D FRAME_WINDOWS_WIDTH (f); - int windows_height =3D FRAME_WINDOWS_HEIGHT (f); - int min_windows_width, min_windows_height; - /* These are a bit tedious, maybe we should use a macro. */ + int old_native_width =3D FRAME_PIXEL_WIDTH (f); + int old_native_height =3D FRAME_PIXEL_HEIGHT (f); + int new_native_width, new_native_height; + /* The desired minimum inner width and height of the frame calculated + via 'frame-windows-min-size'. */ + int min_inner_width, min_inner_height; + /* Get the "old" inner width, height and position of F via its root + window and the minibuffer window. We cannot use FRAME_INNER_WIDTH + and FRAME_INNER_HEIGHT here since the internal border and the top + margin may have been already set to new values. */ struct window *r =3D XWINDOW (FRAME_ROOT_WINDOW (f)); - int old_windows_width =3D WINDOW_PIXEL_WIDTH (r); - int old_windows_height + int old_inner_width =3D WINDOW_PIXEL_WIDTH (r); + int old_inner_height =3D (WINDOW_PIXEL_HEIGHT (r) + ((FRAME_HAS_MINIBUF_P (f) && !FRAME_MINIBUF_ONLY_P (f)) ? WINDOW_PIXEL_HEIGHT (XWINDOW (FRAME_MINIBUF_WINDOW (f))) : 0)); - int new_windows_width, new_windows_height; + int new_inner_width, new_inner_height; + int old_text_cols =3D FRAME_COLS (f); + int old_text_lines =3D FRAME_LINES (f); + int new_text_cols, new_text_lines; int old_text_width =3D FRAME_TEXT_WIDTH (f); int old_text_height =3D FRAME_TEXT_HEIGHT (f); - /* If a size is < 0 use the old value. */ - int new_text_width =3D (new_width >=3D 0) ? new_width : old_text_width= ; - int new_text_height =3D (new_height >=3D 0) ? new_height : old_text_he= ight; - int new_cols, new_lines; bool inhibit_horizontal, inhibit_vertical; Lisp_Object frame; =20 XSETFRAME (frame, f); =20 - frame_size_history_add - (f, Qadjust_frame_size_1, new_text_width, new_text_height, - list2 (parameter, make_fixnum (inhibit))); - - /* The following two values are calculated from the old window body - sizes and any "new" settings for scroll bars, dividers, fringes and= - margins (though the latter should have been processed already). */= - min_windows_width - =3D frame_windows_min_size (frame, Qt, (inhibit =3D=3D 5) ? Qt : Qni= l, Qt); - min_windows_height - =3D frame_windows_min_size (frame, Qnil, (inhibit =3D=3D 5) ? Qt : Q= nil, Qt); + min_inner_width + =3D frame_windows_min_size (frame, Qt, (inhibit =3D=3D 5) ? Qsafe : = Qnil, Qt); + min_inner_height + =3D frame_windows_min_size (frame, Qnil, (inhibit =3D=3D 5) ? Qsafe = : Qnil, Qt); =20 if (inhibit >=3D 2 && inhibit <=3D 4) /* When INHIBIT is in [2..4] inhibit if the "old" window sizes stay within the limits and either resizing is inhibited or INHIBIT equals 4. */ { - inhibit_horizontal =3D (windows_width >=3D min_windows_width + if (new_text_width =3D=3D -1) + new_text_width =3D FRAME_TEXT_WIDTH (f); + if (new_text_height =3D=3D -1) + new_text_height =3D FRAME_TEXT_HEIGHT (f); + + inhibit_horizontal =3D (FRAME_INNER_WIDTH (f) >=3D min_inner_width= && (inhibit =3D=3D 4 || frame_inhibit_resize (f, true, parame= ter))); - inhibit_vertical =3D (windows_height >=3D min_windows_height + inhibit_vertical =3D (FRAME_INNER_HEIGHT (f) >=3D min_inner_height= && (inhibit =3D=3D 4 || frame_inhibit_resize (f, false, paramet= er))); } else - /* Otherwise inhibit if INHIBIT equals 5. */ + /* Otherwise inhibit if INHIBIT equals 5. If we wanted to overrule + the WM do that here (could lead to some sort of eternal fight + with the WM). */ inhibit_horizontal =3D inhibit_vertical =3D inhibit =3D=3D 5; =20 - new_pixel_width =3D ((inhibit_horizontal && (inhibit < 5)) - ? old_pixel_width - : max (FRAME_TEXT_TO_PIXEL_WIDTH (f, new_text_width), - min_windows_width - + 2 * FRAME_INTERNAL_BORDER_WIDTH (f))); - new_windows_width =3D new_pixel_width - 2 * FRAME_INTERNAL_BORDER_WIDT= H (f); - new_text_width =3D FRAME_PIXEL_TO_TEXT_WIDTH (f, new_pixel_width); - new_cols =3D new_text_width / unit_width; - - new_pixel_height =3D ((inhibit_vertical && (inhibit < 5)) - ? old_pixel_height - : max (FRAME_TEXT_TO_PIXEL_HEIGHT (f, new_text_height), - min_windows_height - + FRAME_TOP_MARGIN_HEIGHT (f) + new_native_width =3D ((inhibit_horizontal && inhibit < 5) + ? old_native_width + : max (FRAME_TEXT_TO_PIXEL_WIDTH (f, new_text_width), + min_inner_width + 2 * FRAME_INTERNAL_BORDER_WIDTH (f))); - new_windows_height =3D (new_pixel_height - - FRAME_TOP_MARGIN_HEIGHT (f) - - 2 * FRAME_INTERNAL_BORDER_WIDTH (f)); - new_text_height =3D FRAME_PIXEL_TO_TEXT_HEIGHT (f, new_pixel_height); - new_lines =3D new_text_height / unit_height; + new_inner_width =3D new_native_width - 2 * FRAME_INTERNAL_BORDER_WIDTH= (f); + new_text_width =3D FRAME_PIXEL_TO_TEXT_WIDTH (f, new_native_width); + new_text_cols =3D new_text_width / unit_width; + + new_native_height =3D ((inhibit_vertical && inhibit < 5) + ? old_native_height + : max (FRAME_TEXT_TO_PIXEL_HEIGHT (f, new_text_height), + min_inner_height + + FRAME_TOP_MARGIN_HEIGHT (f) + + 2 * FRAME_INTERNAL_BORDER_WIDTH (f))); + new_inner_height =3D (new_native_height + - FRAME_TOP_MARGIN_HEIGHT (f) + - 2 * FRAME_INTERNAL_BORDER_WIDTH (f)); + new_text_height =3D FRAME_PIXEL_TO_TEXT_HEIGHT (f, new_native_height);= + new_text_lines =3D new_text_height / unit_height; =20 -#ifdef HAVE_WINDOW_SYSTEM if (FRAME_WINDOW_P (f) && f->can_set_window_size && ((!inhibit_horizontal - && (new_pixel_width !=3D old_pixel_width + && (new_native_width !=3D old_native_width || inhibit =3D=3D 0 || inhibit =3D=3D 2)) || (!inhibit_vertical - && (new_pixel_height !=3D old_pixel_height + && (new_native_height !=3D old_native_height || inhibit =3D=3D 0 || inhibit =3D=3D 2)))) - /* We are either allowed to change the frame size or the minimum - sizes request such a change. Do not care for fixing minimum - sizes here, we do that eventually when we're called from - change_frame_size. */ { /* Make sure we respect fullheight and fullwidth. */ if (inhibit_horizontal) - new_text_width =3D old_text_width; + new_native_width =3D old_native_width; else if (inhibit_vertical) - new_text_height =3D old_text_height; + new_native_height =3D old_native_height; + + if (inhibit =3D=3D 2 && f->new_width > 0 && f->new_height > 0) + /* For implied resizes with inhibit 2 (external menu and tool + bar) pick up any new sizes the display engine has not + processed yet. Otherwsie, we would request the old sizes + which will make this request appear as a request to set new + sizes and have the WM react accordingly which is not TRT. */ + { + /* But don't that for the external menu bar on Motif. + Otherwise, switching off the menu bar will shrink the frame + and switching it on will not enlarge it. */ +#ifdef USE_MOTIF + if (!EQ (parameter, Qmenu_bar_lines)) +#endif + { + new_native_width =3D f->new_width; + new_native_height =3D f->new_height; + } + } =20 - frame_size_history_add - (f, Qadjust_frame_size_2, new_text_width, new_text_height, - list2 (inhibit_horizontal ? Qt : Qnil, - inhibit_vertical ? Qt : Qnil)); + if (CONSP (frame_size_history)) + frame_size_history_adjust (f, inhibit, parameter, + old_text_width, old_text_height, + new_text_width, new_text_height, + old_text_cols, old_text_lines, + new_text_cols, new_text_lines, + old_native_width, old_native_height, + new_native_width, new_native_height, + old_inner_width, old_inner_height, + new_inner_width, new_inner_height, + min_inner_width, min_inner_height, + inhibit_horizontal, inhibit_vertical); =20 if (FRAME_TERMINAL (f)->set_window_size_hook) FRAME_TERMINAL (f)->set_window_size_hook - (f, 0, new_text_width, new_text_height, 1); + (f, 0, new_native_width, new_native_height); f->resized_p =3D true; =20 return; } -#endif + + if (CONSP (frame_size_history)) + frame_size_history_adjust (f, inhibit, parameter, + old_text_width, old_text_height, + new_text_width, new_text_height, + old_text_cols, old_text_lines, + new_text_cols, new_text_lines, + old_native_width, old_native_height, + new_native_width, new_native_height, + old_inner_width, old_inner_height, + new_inner_width, new_inner_height, + min_inner_width, min_inner_height, + inhibit_horizontal, inhibit_vertical); =20 if ((XWINDOW (FRAME_ROOT_WINDOW (f))->pixel_top =3D=3D FRAME_TOP_MARGIN_HEIGHT (f)) && new_text_width =3D=3D old_text_width && new_text_height =3D=3D old_text_height - && new_windows_width =3D=3D old_windows_width - && new_windows_height =3D=3D old_windows_height - && new_pixel_width =3D=3D old_pixel_width - && new_pixel_height =3D=3D old_pixel_height - && new_cols =3D=3D old_cols - && new_lines =3D=3D old_lines) - /* No change. Sanitize window sizes and return. */ - { - sanitize_window_sizes (Qt); - sanitize_window_sizes (Qnil); - - return; - } + && new_inner_width =3D=3D old_inner_width + && new_inner_height =3D=3D old_inner_height + /* We might be able to drop these but some doubts remain. */ + && new_native_width =3D=3D old_native_width + && new_native_height =3D=3D old_native_height + && new_text_cols =3D=3D old_text_cols + && new_text_lines =3D=3D old_text_lines) + /* No change. */ + return; =20 block_input (); =20 @@ -736,69 +803,67 @@ adjust_frame_size (struct frame *f, int new_width, = int new_height, int inhibit, our video hardware. Try to find the smallest size greater or equal to the requested dimensions, while accounting for the fact that the menu-bar lines are not counted in the frame height. */ - int dos_new_lines =3D new_lines + FRAME_TOP_MARGIN (f); - dos_set_window_size (&dos_new_lines, &new_cols); - new_lines =3D dos_new_lines - FRAME_TOP_MARGIN (f); + int dos_new_text_lines =3D new_text_lines + FRAME_TOP_MARGIN (f); + + dos_set_window_size (&dos_new_text_lines, &new_text_cols); + new_text_lines =3D dos_new_text_lines - FRAME_TOP_MARGIN (f); #endif =20 - if (new_windows_width !=3D old_windows_width) + if (new_inner_width !=3D old_inner_width) { - resize_frame_windows (f, new_windows_width, true); + resize_frame_windows (f, new_inner_width, true); =20 /* MSDOS frames cannot PRETEND, as they change frame size by manipulating video hardware. */ if ((FRAME_TERMCAP_P (f) && !pretend) || FRAME_MSDOS_P (f)) - FrameCols (FRAME_TTY (f)) =3D new_cols; + FrameCols (FRAME_TTY (f)) =3D new_text_cols; =20 #if defined (HAVE_WINDOW_SYSTEM) if (WINDOWP (f->tab_bar_window)) { - XWINDOW (f->tab_bar_window)->pixel_width =3D new_windows_width; + XWINDOW (f->tab_bar_window)->pixel_width =3D new_inner_width; XWINDOW (f->tab_bar_window)->total_cols - =3D new_windows_width / unit_width; + =3D new_inner_width / unit_width; } #endif =20 #if defined (HAVE_WINDOW_SYSTEM) && ! defined (HAVE_EXT_TOOL_BAR) if (WINDOWP (f->tool_bar_window)) { - XWINDOW (f->tool_bar_window)->pixel_width =3D new_windows_width; + XWINDOW (f->tool_bar_window)->pixel_width =3D new_inner_width; XWINDOW (f->tool_bar_window)->total_cols - =3D new_windows_width / unit_width; + =3D new_inner_width / unit_width; } #endif } - else if (new_cols !=3D old_cols) + else if (new_text_cols !=3D old_text_cols) call2 (Qwindow__pixel_to_total, frame, Qt); =20 - if (new_windows_height !=3D old_windows_height + if (new_inner_height !=3D old_inner_height /* When the top margin has changed we have to recalculate the top edges of all windows. No such calculation is necessary for the left edges. */ || WINDOW_TOP_PIXEL_EDGE (r) !=3D FRAME_TOP_MARGIN_HEIGHT (f)) { - resize_frame_windows (f, new_windows_height, false); + resize_frame_windows (f, new_inner_height, false); =20 /* MSDOS frames cannot PRETEND, as they change frame size by manipulating video hardware. */ if ((FRAME_TERMCAP_P (f) && !pretend) || FRAME_MSDOS_P (f)) - FrameRows (FRAME_TTY (f)) =3D new_lines + FRAME_TOP_MARGIN (f); + FrameRows (FRAME_TTY (f)) =3D new_text_lines + FRAME_TOP_MARGIN (f); } - else if (new_lines !=3D old_lines) + else if (new_text_lines !=3D old_text_lines) call2 (Qwindow__pixel_to_total, frame, Qnil); =20 - frame_size_history_add - (f, Qadjust_frame_size_3, new_text_width, new_text_height, - list4i (old_pixel_width, old_pixel_height, - new_pixel_width, new_pixel_height)); - /* Assign new sizes. */ + FRAME_COLS (f) =3D new_text_cols; + FRAME_LINES (f) =3D new_text_lines; FRAME_TEXT_WIDTH (f) =3D new_text_width; FRAME_TEXT_HEIGHT (f) =3D new_text_height; - FRAME_PIXEL_WIDTH (f) =3D new_pixel_width; - FRAME_PIXEL_HEIGHT (f) =3D new_pixel_height; - SET_FRAME_COLS (f, new_cols); - SET_FRAME_LINES (f, new_lines); + FRAME_PIXEL_WIDTH (f) =3D new_native_width; + FRAME_PIXEL_HEIGHT (f) =3D new_native_height; + FRAME_TOTAL_COLS (f) =3D FRAME_PIXEL_WIDTH (f) / FRAME_COLUMN_WIDTH (f= ); + FRAME_TOTAL_LINES (f) =3D FRAME_PIXEL_HEIGHT (f) / FRAME_LINE_HEIGHT (= f); =20 { struct window *w =3D XWINDOW (FRAME_SELECTED_WINDOW (f)); @@ -812,18 +877,18 @@ adjust_frame_size (struct frame *f, int new_width, = int new_height, int inhibit, w->cursor.vpos =3D w->cursor.y =3D 0; } =20 - /* Sanitize window sizes. */ - sanitize_window_sizes (Qt); - sanitize_window_sizes (Qnil); - adjust_frame_glyphs (f); calculate_costs (f); SET_FRAME_GARBAGED (f); + /* We now say here that F was resized instead of using the old + condition below. Some resizing must have taken place and if it was= + only shifting the root window's position (paranoia?). */ + f->resized_p =3D true; =20 - /* A frame was "resized" if one of its pixelsizes changed, even if its= - X window wasn't resized at all. */ - f->resized_p =3D (new_pixel_width !=3D old_pixel_width - || new_pixel_height !=3D old_pixel_height); +/** /\* A frame was "resized" if its native size changed, even if its = X **/ +/** window wasn't resized at all. *\/ **/ +/** f->resized_p =3D (new_native_width !=3D old_native_width **/ +/** || new_native_height !=3D old_native_height); **/ =20 unblock_input (); =20 @@ -834,8 +899,8 @@ adjust_frame_size (struct frame *f, int new_width, in= t new_height, int inhibit, =20 FOR_EACH_FRAME (frames, frame1) if (FRAME_PARENT_FRAME (XFRAME (frame1)) =3D=3D f) - keep_ratio (XFRAME (frame1), f, old_pixel_width, old_pixel_height, - new_pixel_width, new_pixel_height); + keep_ratio (XFRAME (frame1), f, old_native_width, old_native_height, + new_native_width, new_native_height); } #endif } @@ -884,6 +949,8 @@ make_frame (bool mini_p) f->tool_bar_resized =3D false; f->column_width =3D 1; /* !FRAME_WINDOW_P value. */ f->line_height =3D 1; /* !FRAME_WINDOW_P value. */ + f->new_width =3D -1; + f->new_height =3D -1; #ifdef HAVE_WINDOW_SYSTEM f->vertical_scroll_bar_type =3D vertical_scroll_bar_none; f->horizontal_scroll_bars =3D false; @@ -932,17 +999,14 @@ make_frame (bool mini_p) =20 wset_frame (rw, frame); =20 - /* 80/25 is arbitrary, - just so that there is "something there." + /* 80/25 is arbitrary, just so that there is "something there." Correct size will be set up later with adjust_frame_size. */ + FRAME_COLS (f) =3D FRAME_TOTAL_COLS (f) =3D rw->total_cols =3D 80; + FRAME_TEXT_WIDTH (f) =3D FRAME_PIXEL_WIDTH (f) =3D rw->pixel_width + =3D 80 * FRAME_COLUMN_WIDTH (f); + FRAME_LINES (f) =3D FRAME_TOTAL_LINES (f) =3D 25; + FRAME_TEXT_HEIGHT (f) =3D FRAME_PIXEL_HEIGHT (f) =3D 25 * FRAME_LINE_H= EIGHT (f); =20 - SET_FRAME_COLS (f, 80); - SET_FRAME_LINES (f, 25); - SET_FRAME_WIDTH (f, FRAME_COLS (f) * FRAME_COLUMN_WIDTH (f)); - SET_FRAME_HEIGHT (f, FRAME_LINES (f) * FRAME_LINE_HEIGHT (f)); - - rw->total_cols =3D FRAME_COLS (f); - rw->pixel_width =3D rw->total_cols * FRAME_COLUMN_WIDTH (f); rw->total_lines =3D FRAME_LINES (f) - (mini_p ? 1 : 0); rw->pixel_height =3D rw->total_lines * FRAME_LINE_HEIGHT (f); =20 @@ -1316,8 +1380,8 @@ DEFUN ("make-terminal-frame", Fmake_terminal_frame,= Smake_terminal_frame, { int width, height; get_tty_size (fileno (FRAME_TTY (f)->input), &width, &height); - adjust_frame_size (f, width, height - FRAME_MENU_BAR_LINES (f) - - FRAME_TAB_BAR_LINES (f), + /* With INHIBIT 5 pass correct text height to adjust_frame_size. */= + adjust_frame_size (f, width, height - FRAME_TOP_MARGIN (f), 5, 0, Qterminal_frame); } =20 @@ -3220,21 +3284,23 @@ DEFUN ("frame-parameters", Fframe_parameters, Sfr= ame_parameters, 0, 1, 0, : FRAME_W32_P (f) ? "w32term" :"tty")); } + store_in_alist (&alist, Qname, f->name); - height =3D (f->new_height - ? (f->new_pixelwise - ? (f->new_height / FRAME_LINE_HEIGHT (f)) - : f->new_height) + /* It's questionable whether here we should report the value of + f->new_height (and f->new_width below) but we've done that in the + past, so let's keep it. Note that a value of -1 for either of + these means that no new size was requested. */ + height =3D (f->new_height >=3D 0 + ? f->new_height / FRAME_LINE_HEIGHT (f) : FRAME_LINES (f)); store_in_alist (&alist, Qheight, make_fixnum (height)); - width =3D (f->new_width - ? (f->new_pixelwise - ? (f->new_width / FRAME_COLUMN_WIDTH (f)) - : f->new_width) - : FRAME_COLS (f)); + width =3D (f->new_width >=3D 0 + ? f->new_width / FRAME_COLUMN_WIDTH (f) + : FRAME_COLS(f)); store_in_alist (&alist, Qwidth, make_fixnum (width)); - store_in_alist (&alist, Qmodeline, (FRAME_WANTS_MODELINE_P (f) ? Qt : = Qnil)); - store_in_alist (&alist, Qunsplittable, (FRAME_NO_SPLIT_P (f) ? Qt : Qn= il)); + + store_in_alist (&alist, Qmodeline, FRAME_WANTS_MODELINE_P (f) ? Qt : Q= nil); + store_in_alist (&alist, Qunsplittable, FRAME_NO_SPLIT_P (f) ? Qt : Qni= l); store_in_alist (&alist, Qbuffer_list, f->buffer_list); store_in_alist (&alist, Qburied_buffer_list, f->buried_buffer_list); =20 @@ -3247,6 +3313,7 @@ DEFUN ("frame-parameters", Fframe_parameters, Sfram= e_parameters, 0, 1, 0, { /* This ought to be correct in f->param_alist for an X frame. */ Lisp_Object lines; + XSETFASTINT (lines, FRAME_MENU_BAR_LINES (f)); store_in_alist (&alist, Qmenu_bar_lines, lines); XSETFASTINT (lines, FRAME_TAB_BAR_LINES (f)); @@ -3593,15 +3660,18 @@ DEFUN ("frame-bottom-divider-width", Fbottom_divi= der_width, Sbottom_divider_widt static int check_frame_pixels (Lisp_Object size, Lisp_Object pixelwise, int item_si= ze) { + intmax_t sz; + int pixel_size; /* size * item_size */ + CHECK_INTEGER (size); if (!NILP (pixelwise)) item_size =3D 1; - intmax_t sz; - int pixel_size; /* size * item_size */ - if (! integer_to_intmax (size, &sz) + + if (!integer_to_intmax (size, &sz) || INT_MULTIPLY_WRAPV (sz, item_size, &pixel_size)) args_out_of_range_3 (size, make_int (INT_MIN / item_size), make_int (INT_MAX / item_size)); + return pixel_size; } =20 @@ -3624,9 +3694,13 @@ DEFUN ("set-frame-height", Fset_frame_height, Sset= _frame_height, 2, 4, (Lisp_Object frame, Lisp_Object height, Lisp_Object pretend, Lisp_Obje= ct pixelwise) { struct frame *f =3D decode_live_frame (frame); - int pixel_height =3D check_frame_pixels (height, pixelwise, - FRAME_LINE_HEIGHT (f)); - adjust_frame_size (f, -1, pixel_height, 1, !NILP (pretend), Qheight); + int text_height + =3D check_frame_pixels (height, pixelwise, FRAME_LINE_HEIGHT (f)); + + /* With INHIBIT 1 pass correct text width to adjust_frame_size. */ + adjust_frame_size + (f, FRAME_TEXT_WIDTH (f), text_height, 1, !NILP (pretend), Qheight);= + return Qnil; } =20 @@ -3649,9 +3723,13 @@ DEFUN ("set-frame-width", Fset_frame_width, Sset_f= rame_width, 2, 4, (Lisp_Object frame, Lisp_Object width, Lisp_Object pretend, Lisp_Objec= t pixelwise) { struct frame *f =3D decode_live_frame (frame); - int pixel_width =3D check_frame_pixels (width, pixelwise, - FRAME_COLUMN_WIDTH (f)); - adjust_frame_size (f, pixel_width, -1, 1, !NILP (pretend), Qwidth); + int text_width + =3D check_frame_pixels (width, pixelwise, FRAME_COLUMN_WIDTH (f)); + + /* With INHIBIT 1 pass correct text height to adjust_frame_size. */ + adjust_frame_size + (f, text_width, FRAME_TEXT_HEIGHT (f), 1, !NILP (pretend), Qwidth); + return Qnil; } =20 @@ -3667,11 +3745,14 @@ DEFUN ("set-frame-size", Fset_frame_size, Sset_fr= ame_size, 3, 4, 0, (Lisp_Object frame, Lisp_Object width, Lisp_Object height, Lisp_Object= pixelwise) { struct frame *f =3D decode_live_frame (frame); - int pixel_width =3D check_frame_pixels (width, pixelwise, - FRAME_COLUMN_WIDTH (f)); - int pixel_height =3D check_frame_pixels (height, pixelwise, - FRAME_LINE_HEIGHT (f)); - adjust_frame_size (f, pixel_width, pixel_height, 1, 0, Qsize); + int text_width + =3D check_frame_pixels (width, pixelwise, FRAME_COLUMN_WIDTH (f)); + int text_height + =3D check_frame_pixels (height, pixelwise, FRAME_LINE_HEIGHT (f)); + + /* PRETEND is always false here. */ + adjust_frame_size (f, text_width, text_height, 1, false, Qsize); + return Qnil; } =20 @@ -4035,11 +4116,9 @@ gui_set_frame_parameters (struct frame *f, Lisp_Ob= ject alist) { Lisp_Object tail, frame; =20 - - /* If both of these parameters are present, it's more efficient to - set them both at once. So we wait until we've looked at the - entire list before we set them. */ - int width =3D -1, height =3D -1; /* -1 denotes they were not changed.= */ + /* Neither of these values should be used. */ + int width =3D -1, height =3D -1; + bool width_change =3D false, height_change =3D false; =20 /* Same here. */ Lisp_Object left, top; @@ -4117,6 +4196,8 @@ gui_set_frame_parameters (struct frame *f, Lisp_Obj= ect alist) =20 if (EQ (prop, Qwidth)) { + width_change =3D true; + if (RANGED_FIXNUMP (0, val, INT_MAX)) width =3D XFIXNAT (val) * FRAME_COLUMN_WIDTH (f) ; else if (CONSP (val) && EQ (XCAR (val), Qtext_pixels) @@ -4125,9 +4206,13 @@ gui_set_frame_parameters (struct frame *f, Lisp_Ob= ject alist) else if (FLOATP (val)) width =3D frame_float (f, val, FRAME_FLOAT_WIDTH, &parent_done, &outer_done, -1); + else + width_change =3D false; } else if (EQ (prop, Qheight)) { + height_change =3D true; + if (RANGED_FIXNUMP (0, val, INT_MAX)) height =3D XFIXNAT (val) * FRAME_LINE_HEIGHT (f); else if (CONSP (val) && EQ (XCAR (val), Qtext_pixels) @@ -4136,6 +4221,8 @@ gui_set_frame_parameters (struct frame *f, Lisp_Obj= ect alist) else if (FLOATP (val)) height =3D frame_float (f, val, FRAME_FLOAT_HEIGHT, &parent_done, &outer_done, -1); + else + height_change =3D false; } else if (EQ (prop, Qtop)) top =3D val; @@ -4204,23 +4291,28 @@ gui_set_frame_parameters (struct frame *f, Lisp_O= bject alist) XSETINT (icon_top, 0); } =20 - /* Don't set these parameters unless they've been explicitly - specified. The window might be mapped or resized while we're in - this function, and we don't want to override that unless the lisp - code has asked for it. - - Don't set these parameters unless they actually differ from the - window's current parameters; the window may not actually exist - yet. */ - if ((width !=3D -1 && width !=3D FRAME_TEXT_WIDTH (f)) - || (height !=3D -1 && height !=3D FRAME_TEXT_HEIGHT (f))) - /* We could consider checking f->after_make_frame here, but I - don't have the faintest idea why the following is needed at - all. With the old setting it can get a Heisenbug when - EmacsFrameResize intermittently provokes a delayed - change_frame_size in the middle of adjust_frame_size. */ - /** || (f->can_set_window_size && (f->new_height || f->new_width)))= **/ - adjust_frame_size (f, width, height, 1, 0, Qx_set_frame_parameters);= + if (width_change || height_change) + { + Lisp_Object parameter; + + if (width_change) + { + if (height_change) + parameter =3D Qsize; + else + { + height =3D FRAME_TEXT_HEIGHT (f); + parameter =3D Qwidth; + } + } + else + { + width =3D FRAME_TEXT_WIDTH (f); + parameter =3D Qheight; + } + + adjust_frame_size (f, width, height, 1, 0, parameter); + } =20 if ((!NILP (left) || !NILP (top)) && ! (left_no_change && top_no_change) @@ -4293,9 +4385,6 @@ gui_set_frame_parameters (struct frame *f, Lisp_Obj= ect alist) { Lisp_Object old_value =3D get_frame_param (f, Qfullscreen); =20 - frame_size_history_add - (f, Qx_set_fullscreen, 0, 0, list2 (old_value, fullscreen)); - store_frame_param (f, Qfullscreen, fullscreen); if (!EQ (fullscreen, old_value)) gui_set_fullscreen (f, fullscreen, old_value); @@ -5504,25 +5593,16 @@ DEFUN ("x-parse-geometry", Fx_parse_geometry, Sx_= parse_geometry, 1, 1, 0, =20 This function does not make the coordinates positive. */ =20 -#define DEFAULT_ROWS 36 -#define DEFAULT_COLS 80 - long gui_figure_window_size (struct frame *f, Lisp_Object parms, bool tabbar_= p, - bool toolbar_p, int *x_width, int *x_height) + bool toolbar_p) { Lisp_Object height, width, user_size, top, left, user_position; long window_prompting =3D 0; Display_Info *dpyinfo =3D FRAME_DISPLAY_INFO (f); int parent_done =3D -1, outer_done =3D -1; - - /* Default values if we fall through. - Actually, if that happens we should get - window manager prompting. */ - SET_FRAME_WIDTH (f, DEFAULT_COLS * FRAME_COLUMN_WIDTH (f)); - SET_FRAME_COLS (f, DEFAULT_COLS); - SET_FRAME_HEIGHT (f, DEFAULT_ROWS * FRAME_LINE_HEIGHT (f)); - SET_FRAME_LINES (f, DEFAULT_ROWS); + int text_width =3D 80 * FRAME_COLUMN_WIDTH (f); + int text_height =3D 36 * FRAME_LINE_HEIGHT (f); =20 /* Window managers expect that if program-specified positions are not (0,0), they're intentional, not defaults. */ @@ -5537,8 +5617,12 @@ gui_figure_window_size (struct frame *f, Lisp_Obje= ct parms, bool tabbar_p, if (tabbar_p && FRAME_TAB_BAR_LINES (f)) { if (frame_default_tab_bar_height) + /* A default tab bar height was already set by the display code + for some other frame, use that. */ FRAME_TAB_BAR_HEIGHT (f) =3D frame_default_tab_bar_height; else + /* Calculate the height from various other settings. For some + reason, these are usually off by 2 hence of no use. */ { int margin, relief; =20 @@ -5591,7 +5675,7 @@ gui_figure_window_size (struct frame *f, Lisp_Objec= t parms, bool tabbar_p, =20 /* Ensure that earlier new_width and new_height settings won't override what we specify below. */ - f->new_width =3D f->new_height =3D 0; + f->new_width =3D f->new_height =3D -1; =20 height =3D gui_display_get_arg (dpyinfo, parms, Qheight, 0, 0, RES_TYP= E_NUMBER); width =3D gui_display_get_arg (dpyinfo, parms, Qwidth, 0, 0, RES_TYPE_= NUMBER); @@ -5605,9 +5689,8 @@ gui_figure_window_size (struct frame *f, Lisp_Objec= t parms, bool tabbar_p, if ((XFIXNUM (XCDR (width)) < 0 || XFIXNUM (XCDR (width)) > INT_M= AX)) xsignal1 (Qargs_out_of_range, XCDR (width)); =20 - SET_FRAME_WIDTH (f, XFIXNUM (XCDR (width))); + text_width =3D XFIXNUM (XCDR (width)); f->inhibit_horizontal_resize =3D true; - *x_width =3D XFIXNUM (XCDR (width)); } else if (FLOATP (width)) { @@ -5621,7 +5704,7 @@ gui_figure_window_size (struct frame *f, Lisp_Objec= t parms, bool tabbar_p, &parent_done, &outer_done, -1); =20 if (new_width > -1) - SET_FRAME_WIDTH (f, new_width); + text_width =3D new_width; } } else @@ -5630,7 +5713,7 @@ gui_figure_window_size (struct frame *f, Lisp_Objec= t parms, bool tabbar_p, if ((XFIXNUM (width) < 0 || XFIXNUM (width) > INT_MAX)) xsignal1 (Qargs_out_of_range, width); =20 - SET_FRAME_WIDTH (f, XFIXNUM (width) * FRAME_COLUMN_WIDTH (f)); + text_width =3D XFIXNUM (width) * FRAME_COLUMN_WIDTH (f); } } =20 @@ -5642,9 +5725,8 @@ gui_figure_window_size (struct frame *f, Lisp_Objec= t parms, bool tabbar_p, if ((XFIXNUM (XCDR (height)) < 0 || XFIXNUM (XCDR (height)) > INT= _MAX)) xsignal1 (Qargs_out_of_range, XCDR (height)); =20 - SET_FRAME_HEIGHT (f, XFIXNUM (XCDR (height))); + text_height =3D XFIXNUM (XCDR (height)); f->inhibit_vertical_resize =3D true; - *x_height =3D XFIXNUM (XCDR (height)); } else if (FLOATP (height)) { @@ -5658,7 +5740,7 @@ gui_figure_window_size (struct frame *f, Lisp_Objec= t parms, bool tabbar_p, &parent_done, &outer_done, -1); =20 if (new_height > -1) - SET_FRAME_HEIGHT (f, new_height); + text_height =3D new_height; } } else @@ -5667,7 +5749,7 @@ gui_figure_window_size (struct frame *f, Lisp_Objec= t parms, bool tabbar_p, if ((XFIXNUM (height) < 0) || (XFIXNUM (height) > INT_MAX)) xsignal1 (Qargs_out_of_range, height); =20 - SET_FRAME_HEIGHT (f, XFIXNUM (height) * FRAME_LINE_HEIGHT (f)); + text_height =3D XFIXNUM (height) * FRAME_LINE_HEIGHT (f); } } =20 @@ -5679,6 +5761,9 @@ gui_figure_window_size (struct frame *f, Lisp_Objec= t parms, bool tabbar_p, window_prompting |=3D PSize; } =20 + adjust_frame_size (f, text_width, text_height, 5, false, + Qgui_figure_window_size); + top =3D gui_display_get_arg (dpyinfo, parms, Qtop, 0, 0, RES_TYPE_NUMB= ER); left =3D gui_display_get_arg (dpyinfo, parms, Qleft, 0, 0, RES_TYPE_NU= MBER); user_position =3D gui_display_get_arg (dpyinfo, parms, Quser_position,= 0, 0, @@ -5986,39 +6071,17 @@ syms_of_frame (void) DEFSYM (Qtab_bar_size, "tab-bar-size"); DEFSYM (Qtool_bar_external, "tool-bar-external"); DEFSYM (Qtool_bar_size, "tool-bar-size"); - /* The following are used for frame_size_history. */ - DEFSYM (Qadjust_frame_size_1, "adjust-frame-size-1"); - DEFSYM (Qadjust_frame_size_2, "adjust-frame-size-2"); - DEFSYM (Qadjust_frame_size_3, "adjust-frame-size-3"); - DEFSYM (Qx_set_frame_parameters, "x-set-frame-parameters"); - DEFSYM (QEmacsFrameResize, "EmacsFrameResize"); - DEFSYM (Qset_frame_size, "set-frame-size"); - DEFSYM (Qframe_inhibit_resize, "frame-inhibit-resize"); - DEFSYM (Qx_set_fullscreen, "x-set-fullscreen"); - DEFSYM (Qx_check_fullscreen, "x-check-fullscreen"); - DEFSYM (Qxg_frame_resized, "xg-frame-resized"); - DEFSYM (Qxg_frame_set_char_size_1, "xg-frame-set-char-size-1"); - DEFSYM (Qxg_frame_set_char_size_2, "xg-frame-set-char-size-2"); - DEFSYM (Qxg_frame_set_char_size_3, "xg-frame-set-char-size-3"); - DEFSYM (Qxg_frame_set_char_size_4, "xg-frame-set-char-size-4"); - DEFSYM (Qx_set_window_size_1, "x-set-window-size-1"); - DEFSYM (Qx_set_window_size_2, "x-set-window-size-2"); - DEFSYM (Qx_set_window_size_3, "x-set-window-size-3"); - DEFSYM (Qxg_change_toolbar_position, "xg-change-toolbar-position"); - DEFSYM (Qx_net_wm_state, "x-net-wm-state"); - DEFSYM (Qx_handle_net_wm_state, "x-handle-net-wm-state"); - DEFSYM (Qtb_size_cb, "tb-size-cb"); - DEFSYM (Qupdate_frame_tab_bar, "update-frame-tab-bar"); - DEFSYM (Qupdate_frame_tool_bar, "update-frame-tool-bar"); - DEFSYM (Qfree_frame_tab_bar, "free-frame-tab-bar"); - DEFSYM (Qfree_frame_tool_bar, "free-frame-tool-bar"); - DEFSYM (Qx_set_menu_bar_lines, "x-set-menu-bar-lines"); - DEFSYM (Qchange_frame_size, "change-frame-size"); - DEFSYM (Qxg_frame_set_char_size, "xg-frame-set-char-size"); - DEFSYM (Qset_window_configuration, "set-window-configuration"); - DEFSYM (Qx_create_frame_1, "x-create-frame-1"); - DEFSYM (Qx_create_frame_2, "x-create-frame-2"); - DEFSYM (Qterminal_frame, "terminal-frame"); + /* The following are passed to adjust_frame_size. */ + DEFSYM (Qx_set_menu_bar_lines, "x_set_menu_bar_lines"); + DEFSYM (Qchange_frame_size, "change_frame_size"); + DEFSYM (Qxg_frame_set_char_size, "xg_frame_set_char_size"); + DEFSYM (Qx_set_window_size_1, "x_set_window_size_1"); + DEFSYM (Qset_window_configuration, "set_window_configuration"); + DEFSYM (Qx_create_frame_1, "x_create_frame_1"); + DEFSYM (Qx_create_frame_2, "x_create_frame_2"); + DEFSYM (Qgui_figure_window_size, "gui_figure_window_size"); + DEFSYM (Qtip_frame, "tip_frame"); + DEFSYM (Qterminal_frame, "terminal_frame"); =20 #ifdef HAVE_NS DEFSYM (Qns_parse_geometry, "ns-parse-geometry"); @@ -6047,9 +6110,7 @@ syms_of_frame (void) DEFSYM (Qleft_fringe, "left-fringe"); DEFSYM (Qline_spacing, "line-spacing"); DEFSYM (Qmenu_bar_lines, "menu-bar-lines"); - DEFSYM (Qupdate_frame_menubar, "update-frame-menubar"); - DEFSYM (Qfree_frame_menubar_1, "free-frame-menubar-1"); - DEFSYM (Qfree_frame_menubar_2, "free-frame-menubar-2"); + DEFSYM (Qtab_bar_lines, "tab-bar-lines"); DEFSYM (Qmouse_color, "mouse-color"); DEFSYM (Qname, "name"); DEFSYM (Qright_divider_width, "right-divider-width"); @@ -6061,7 +6122,6 @@ syms_of_frame (void) DEFSYM (Qscroll_bar_width, "scroll-bar-width"); DEFSYM (Qsticky, "sticky"); DEFSYM (Qtitle, "title"); - DEFSYM (Qtab_bar_lines, "tab-bar-lines"); DEFSYM (Qtool_bar_lines, "tool-bar-lines"); DEFSYM (Qtool_bar_position, "tool-bar-position"); DEFSYM (Qunsplittable, "unsplittable"); diff --git a/src/frame.h b/src/frame.h index 0fd95e4dd3..19ee6ac10e 100644 --- a/src/frame.h +++ b/src/frame.h @@ -256,8 +256,8 @@ #define EMACS_FRAME_H be used for output. */ bool_bf glyphs_initialized_p : 1; =20 - /* Set to true in change_frame_size when size of frame changed - Clear the frame in clear_garbaged_frames if set. */ + /* Set to true in adjust_frame_size when one of the frame's sizes + changed. Clear the frame in clear_garbaged_frames if set. */ bool_bf resized_p : 1; =20 /* Set to true if the default face for the frame has been @@ -415,10 +415,6 @@ #define EMACS_FRAME_H bool_bf no_special_glyphs : 1; #endif /* HAVE_WINDOW_SYSTEM */ =20 - /* Whether new_height and new_width shall be interpreted - in pixels. */ - bool_bf new_pixelwise : 1; - /* True means set_window_size_hook requests can be processed for this frame. */ bool_bf can_set_window_size : 1; @@ -426,11 +422,23 @@ #define EMACS_FRAME_H /* Set to true after this frame was made by `make-frame'. */ bool_bf after_make_frame : 1; =20 - /* Whether the tab bar height change should be taken into account. */= + /* Two sticky flags, that are both false when a frame is created. + 'display_tab_bar' sets the former to true the first time it + displays the tab bar. When the former is true, the next call of + 'x_change_tab_bar_height' and associates sets the latter true and + tries to adjust the frame height in a way that the now valid pixel + height of the tab bar is taken into account by the frame's native + height. */ bool_bf tab_bar_redisplayed : 1; bool_bf tab_bar_resized : 1; =20 - /* Whether the tool bar height change should be taken into account. *= / + /* Two sticky flags, that are both false when a frame is created. + 'redisplay_tool_bar' sets the former to true the first time it + displays the tool bar. When the former is true, the next call of + 'x_change_tool_bar_height' and associates sets the latter true and + tries to adjust the frame height in a way that the now valid pixel + height of the tool bar is taken into account by the frame's native + height. */ bool_bf tool_bar_redisplayed : 1; bool_bf tool_bar_resized : 1; =20 @@ -461,7 +469,7 @@ #define EMACS_FRAME_H last time run_window_change_functions was called on it. */ ptrdiff_t number_of_windows; =20 - /* Number of lines (rounded up) of tab bar. REMOVE THIS */ + /* Number of frame lines (rounded up) of tab bar. */ int tab_bar_lines; =20 /* Height of frame internal tab bar in pixels. */ @@ -470,7 +478,7 @@ #define EMACS_FRAME_H int n_tab_bar_rows; int n_tab_bar_items; =20 - /* Number of lines (rounded up) of tool bar. REMOVE THIS */ + /* Number of frame lines (rounded up) of tool bar. */ int tool_bar_lines; =20 /* Height of frame internal tool bar in pixels. */ @@ -492,39 +500,24 @@ #define EMACS_FRAME_H /* Cost of deleting n lines on this frame. */ int *delete_n_lines_cost; =20 - /* Text width of this frame (excluding fringes, vertical scroll bar - and internal border widths) and text height (excluding menu bar, - tool bar, horizontal scroll bar and internal border widths) in - units of canonical characters. */ + /* Text width and height of this frame in (and maybe rounded to) frame= + columns and lines. */ int text_cols, text_lines; - - /* Total width of this frame (including fringes, vertical scroll bar - and internal border widths) and total height (including menu bar, - tool bar, horizontal scroll bar and internal border widths) in - units of canonical characters. */ - int total_cols, total_lines; - - /* Text width of this frame (excluding fringes, vertical scroll bar - and internal border widths) and text height (excluding menu bar, - tool bar, horizontal scroll bar and internal border widths) in - pixels. */ + /* Text width and height of this frame in pixels. */ int text_width, text_height; =20 - /* New text height and width for pending size change. 0 if no change - pending. These values represent pixels or canonical character unit= s - according to the value of new_pixelwise and correlate to the - text width/height of the frame. */ + /* Native width of this frame in (and maybe rounded to) frame columns + and lines. */ + int total_cols, total_lines; + /* Native width and height of this frame in pixels. */ + int pixel_width, pixel_height; + /* New native width and height of this frame for pending size change, + in pixels. -1 if no change pending. */ int new_width, new_height; =20 /* Pixel position of the frame window (x and y offsets in root window)= =2E */ int left_pos, top_pos; =20 - /* Total width of this frame (including fringes, vertical scroll bar - and internal border widths) and total height (including internal - menu and tool bars, horizontal scroll bar and internal border - widths) in pixels. */ - int pixel_width, pixel_height; - /* This is the gravity value for the specified window position. */ int win_gravity; =20 @@ -848,7 +841,6 @@ #define FRAME_NS_P(f) ((f)->output_method =3D=3D outp= ut_ns) =20 /* FRAME_WINDOW_P tests whether the frame is a graphical window system frame. */ - #ifdef HAVE_X_WINDOWS #define FRAME_WINDOW_P(f) FRAME_X_P (f) #endif @@ -914,45 +906,36 @@ #define FRAME_HAS_MINIBUF_P(f) \ # define FRAME_SCALE_FACTOR(f) 1 #endif =20 -/* Pixel width of frame F. */ +/* Native width and height of frame F, in pixels and frame + columns/lines. */ #define FRAME_PIXEL_WIDTH(f) ((f)->pixel_width) - -/* Pixel height of frame F. */ #define FRAME_PIXEL_HEIGHT(f) ((f)->pixel_height) +#define FRAME_TOTAL_COLS(f) ((f)->total_cols) +#define FRAME_TOTAL_LINES(f) ((f)->total_lines) =20 -/* Width of frame F, measured in canonical character columns, - not including scroll bars if any. */ -#define FRAME_COLS(f) (f)->text_cols - -/* Height of frame F, measured in canonical lines, including - non-toolkit menu bar and non-toolkit tool bar lines. */ -#define FRAME_LINES(f) (f)->text_lines - -/* Width of frame F, measured in pixels not including the width for - fringes, scroll bar, and internal borders. */ +/* Text width and height of frame F, in pixels and frame + columns/lines. */ #define FRAME_TEXT_WIDTH(f) (f)->text_width - -/* Height of frame F, measured in pixels not including the height - for scroll bar and internal borders. */ #define FRAME_TEXT_HEIGHT(f) (f)->text_height +#define FRAME_COLS(f) ((f)->text_cols) +#define FRAME_LINES(f) ((f)->text_lines) =20 -/* Number of lines of frame F used for menu bar. - This is relevant on terminal frames and on - X Windows when not using the X toolkit. - These lines are counted in FRAME_LINES. */ -#define FRAME_MENU_BAR_LINES(f) (f)->menu_bar_lines +/* True if this frame should display an external menu bar. */ +#ifdef HAVE_EXT_MENU_BAR +#define FRAME_EXTERNAL_MENU_BAR(f) (f)->external_menu_bar +#else +#define FRAME_EXTERNAL_MENU_BAR(f) false +#endif =20 -/* Pixel height of frame F's menu bar. */ +/* Size of frame F's internal menu bar in frame lines and pixels. */ +#define FRAME_MENU_BAR_LINES(f) (f)->menu_bar_lines #define FRAME_MENU_BAR_HEIGHT(f) (f)->menu_bar_height =20 -/* Number of lines of frame F used for the tab-bar. */ +/* Size of frame F's tab bar in frame lines and pixels. */ #define FRAME_TAB_BAR_LINES(f) (f)->tab_bar_lines - -/* Pixel height of frame F's tab-bar. */ #define FRAME_TAB_BAR_HEIGHT(f) (f)->tab_bar_height =20 -/* True if this frame should display a tool bar - in a way that does not use any text lines. */ +/* True if this frame should display an external tool bar. */ #ifdef HAVE_EXT_TOOL_BAR #define FRAME_EXTERNAL_TOOL_BAR(f) (f)->external_tool_bar #else @@ -966,27 +949,21 @@ #define FRAME_TOOL_BAR_POSITION(f) (f)->tool_bar_po= sition #define FRAME_TOOL_BAR_POSITION(f) ((void) (f), Qtop) #endif =20 -/* Number of lines of frame F used for the tool-bar. */ +/* Size of frame F's internal tool bar in frame lines and pixels. */ #define FRAME_TOOL_BAR_LINES(f) (f)->tool_bar_lines - -/* Pixel height of frame F's tool-bar. */ #define FRAME_TOOL_BAR_HEIGHT(f) (f)->tool_bar_height =20 -/* Lines above the top-most window in frame F. */ -#define FRAME_TOP_MARGIN(F) \ - (FRAME_MENU_BAR_LINES (F) + FRAME_TAB_BAR_LINES (F) + FRAME_TOOL_BAR_L= INES (F)) +/* Height of frame F's top margin in frame lines. */ +#define FRAME_TOP_MARGIN(F) \ + (FRAME_MENU_BAR_LINES (F) \ + + FRAME_TAB_BAR_LINES (F) \ + + FRAME_TOOL_BAR_LINES (F)) =20 /* Pixel height of frame F's top margin. */ -#define FRAME_TOP_MARGIN_HEIGHT(F) \ - (FRAME_MENU_BAR_HEIGHT (F) + FRAME_TAB_BAR_HEIGHT (F) + FRAME_TOOL_BAR= _HEIGHT (F)) - -/* True if this frame should display a menu bar - in a way that does not use any text lines. */ -#ifdef HAVE_EXT_MENU_BAR -#define FRAME_EXTERNAL_MENU_BAR(f) (f)->external_menu_bar -#else -#define FRAME_EXTERNAL_MENU_BAR(f) false -#endif +#define FRAME_TOP_MARGIN_HEIGHT(F) \ + (FRAME_MENU_BAR_HEIGHT (F) \ + + FRAME_TAB_BAR_HEIGHT (F) \ + + FRAME_TOOL_BAR_HEIGHT (F)) =20 /* True if frame F is currently visible. */ #define FRAME_VISIBLE_P(f) (f)->visible @@ -1183,48 +1160,6 @@ #define FRAME_SCROLL_BAR_LINES(f) \ ? FRAME_CONFIG_SCROLL_BAR_LINES (f) \ : 0) =20 -/* Total width of frame F, in columns (characters), - including the width used by scroll bars if any. */ -#define FRAME_TOTAL_COLS(f) ((f)->total_cols) - -/* Total height of frame F, in lines (characters), - including the height used by scroll bars if any. */ -#define FRAME_TOTAL_LINES(f) ((f)->total_lines) - -/* Set the character widths of frame F. WIDTH specifies a nominal - character text width. */ -#define SET_FRAME_COLS(f, width) \ - ((f)->text_cols =3D (width), \ - (f)->total_cols =3D ((width) \ - + FRAME_SCROLL_BAR_COLS (f) \ - + FRAME_FRINGE_COLS (f))) - -/* Set the character heights of frame F. HEIGHT specifies a nominal - character text height. */ -#define SET_FRAME_LINES(f, height) \ - ((f)->text_lines =3D (height), \ - (f)->total_lines =3D ((height) \ - + FRAME_TOP_MARGIN (f) \ - + FRAME_SCROLL_BAR_LINES (f))) - -/* Set the widths of frame F. WIDTH specifies a nominal pixel text - width. */ -#define SET_FRAME_WIDTH(f, width) \ - ((f)->text_width =3D (width), \ - (f)->pixel_width =3D ((width) \ - + FRAME_SCROLL_BAR_AREA_WIDTH (f) \ - + FRAME_TOTAL_FRINGE_WIDTH (f) \ - + 2 * FRAME_INTERNAL_BORDER_WIDTH (f))) - -/* Set the heights of frame F. HEIGHT specifies a nominal pixel text - height. */ -#define SET_FRAME_HEIGHT(f, height) \ - ((f)->text_height =3D (height), \ - (f)->pixel_height =3D ((height) \ - + FRAME_TOP_MARGIN_HEIGHT (f) \ - + FRAME_SCROLL_BAR_AREA_HEIGHT (f) \ - + 2 * FRAME_INTERNAL_BORDER_WIDTH (f))) - /* Maximum + 1 legitimate value for FRAME_CURSOR_X. */ #define FRAME_CURSOR_X_LIMIT(f) \ (FRAME_COLS (f) + FRAME_LEFT_SCROLL_BAR_COLS (f)) @@ -1245,7 +1180,6 @@ #define FRAME_FOREGROUND_PIXEL(f) ((f)->foreground_= pixel) #define FRAME_BACKGROUND_PIXEL(f) ((f)->background_pixel) =20 /* Return a pointer to the face cache of frame F. */ - #define FRAME_FACE_CACHE(F) (F)->face_cache =20 /* Return the size of message_buf of the frame F. We multiply the @@ -1271,15 +1205,13 @@ #define CHECK_LIVE_FRAME(x) \ This macro is a holdover from a time when multiple frames weren't alw= ays supported. An alternate definition of the macro would expand to something which executes the statement once. */ - -#define FOR_EACH_FRAME(list_var, frame_var) \ - for ((list_var) =3D Vframe_list; \ - (CONSP (list_var) \ +#define FOR_EACH_FRAME(list_var, frame_var) \ + for ((list_var) =3D Vframe_list; \ + (CONSP (list_var) \ && (frame_var =3D XCAR (list_var), true)); \ list_var =3D XCDR (list_var)) =20 /* Reflect mouse movement when a complete frame update is performed. */= - #define FRAME_MOUSE_UPDATE(frame) \ do { \ Mouse_HLInfo *hlinfo =3D MOUSE_HL_INFO (frame); \ @@ -1294,8 +1226,7 @@ #define FRAME_MOUSE_UPDATE(frame) \ } while (false) =20 /* Handy macro to construct an argument to Fmodify_frame_parameters. */= - -#define AUTO_FRAME_ARG(name, parameter, value) \ +#define AUTO_FRAME_ARG(name, parameter, value) \ AUTO_LIST1 (name, AUTO_CONS_EXPR (parameter, value)) =20 /* False means there are no visible garbaged frames. */ @@ -1305,7 +1236,6 @@ #define AUTO_FRAME_ARG(name, parameter, value) \ We call redisplay_other_windows to make sure the frame gets redisplay= ed if some changes were applied to it while it wasn't visible (and hence= wasn't redisplayed). */ - INLINE void SET_FRAME_VISIBLE (struct frame *f, int v) { @@ -1320,9 +1250,8 @@ SET_FRAME_VISIBLE (struct frame *f, int v) f->visible =3D v; } =20 -/* Set iconify of frame F. */ - -#define SET_FRAME_ICONIFIED(f, i) \ +/* Set iconified status of frame F. */ +#define SET_FRAME_ICONIFIED(f, i) \ (f)->iconified =3D (eassert (0 <=3D (i) && (i) <=3D 1), (i)) =20 extern Lisp_Object selected_frame; @@ -1369,11 +1298,14 @@ window_system_available (struct frame *f) extern void frame_make_pointer_visible (struct frame *); extern Lisp_Object delete_frame (Lisp_Object, Lisp_Object); extern bool frame_inhibit_resize (struct frame *, bool, Lisp_Object); -extern void adjust_frame_size (struct frame *, int, int, int, bool, Lisp= _Object); -extern void frame_size_history_add (struct frame *f, Lisp_Object fun_sym= bol, - int width, int height, Lisp_Object rest); +extern void adjust_frame_size (struct frame *, int, int, int, bool, + Lisp_Object); extern Lisp_Object mouse_position (bool); - +extern int frame_windows_min_size (Lisp_Object, Lisp_Object, Lisp_Object= , + Lisp_Object); +extern void frame_size_history_plain (struct frame *, Lisp_Object); +extern void frame_size_history_extra (struct frame *, Lisp_Object, + int, int, int, int, int, int); extern Lisp_Object Vframe_list; =20 /* Value is a pointer to the selected frame. If the selected frame @@ -1652,12 +1584,11 @@ #define FRAME_PIXEL_TO_TEXT_HEIGHT(f, height) \ - FRAME_SCROLL_BAR_AREA_HEIGHT (f) \ - 2 * FRAME_INTERNAL_BORDER_WIDTH (f)) =20 -/* Return the width/height reserved for the windows of frame F. */ -#define FRAME_WINDOWS_WIDTH(f) \ +#define FRAME_INNER_WIDTH(f) \ (FRAME_PIXEL_WIDTH (f) \ - 2 * FRAME_INTERNAL_BORDER_WIDTH (f)) =20 -#define FRAME_WINDOWS_HEIGHT(f) \ +#define FRAME_INNER_HEIGHT(f) \ (FRAME_PIXEL_HEIGHT (f) \ - FRAME_TOP_MARGIN_HEIGHT (f) \ - 2 * FRAME_INTERNAL_BORDER_WIDTH (f)) @@ -1701,7 +1632,7 @@ #define EMACS_CLASS "Emacs" extern void gui_set_scroll_bar_width (struct frame *, Lisp_Object, Lisp_= Object); extern void gui_set_scroll_bar_height (struct frame *, Lisp_Object, Lisp= _Object); =20 -extern long gui_figure_window_size (struct frame *, Lisp_Object, bool, b= ool, int *, int *); +extern long gui_figure_window_size (struct frame *, Lisp_Object, bool, b= ool); =20 extern void gui_set_alpha (struct frame *, Lisp_Object, Lisp_Object); extern void gui_set_no_special_glyphs (struct frame *, Lisp_Object, Lisp= _Object); diff --git a/src/gtkutil.c b/src/gtkutil.c index 4634c35dd4..4ad172bb48 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c @@ -910,70 +910,58 @@ xg_set_geometry (struct frame *f) } } =20 -/* Function to handle resize of our frame. As we have a Gtk+ tool bar - and a Gtk+ menu bar, we get resize events for the edit part of the - frame only. We let Gtk+ deal with the Gtk+ parts. - F is the frame to resize. - PIXELWIDTH, PIXELHEIGHT is the new size in pixels. */ - +/** Function to handle resize of native frame F to WIDTH and HEIGHT + pixels after we got a ConfigureNotify event. */ void -xg_frame_resized (struct frame *f, int pixelwidth, int pixelheight) +xg_frame_resized (struct frame *f, int width, int height) { - int width, height; - - if (pixelwidth =3D=3D -1 && pixelheight =3D=3D -1) + /* Ignore case where size of native rectangle didn't change. */ + if (width !=3D FRAME_PIXEL_WIDTH (f) || height !=3D FRAME_PIXEL_HEIGHT= (f) + || (delayed_size_change + && (width !=3D f->new_width || height !=3D f->new_height))) { - if (FRAME_GTK_WIDGET (f) && gtk_widget_get_mapped (FRAME_GTK_WIDGE= T (f))) - gdk_window_get_geometry (gtk_widget_get_window (FRAME_GTK_WIDGET (f)), - 0, 0, &pixelwidth, &pixelheight); - else - return; - } + if (CONSP (frame_size_history)) + frame_size_history_extra + (f, build_string ("xg_frame_resized, changed"), + FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f), width, height, + delayed_size_change ? f->new_width : -1, + delayed_size_change ? f->new_height : -1); =20 - width =3D FRAME_PIXEL_TO_TEXT_WIDTH (f, pixelwidth); - height =3D FRAME_PIXEL_TO_TEXT_HEIGHT (f, pixelheight); - - frame_size_history_add - (f, Qxg_frame_resized, width, height, Qnil); - - if (width !=3D FRAME_TEXT_WIDTH (f) - || height !=3D FRAME_TEXT_HEIGHT (f) - || pixelwidth !=3D FRAME_PIXEL_WIDTH (f) - || pixelheight !=3D FRAME_PIXEL_HEIGHT (f)) - { FRAME_RIF (f)->clear_under_internal_border (f); - change_frame_size (f, width, height, 0, 1, 0, 1); + change_frame_size (f, width, height, false, true, false); SET_FRAME_GARBAGED (f); cancel_mouse_face (f); } + else if (CONSP (frame_size_history)) + frame_size_history_extra + (f, build_string ("xg_frame_resized, unchanged"), + FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f), width, height, + delayed_size_change ? f->new_width : -1, + delayed_size_change ? f->new_height : -1); + } =20 /** Resize the outer window of frame F. WIDTH and HEIGHT are the new - pixel sizes of F's text area. */ + native pixel sizes of F. */ void xg_frame_set_char_size (struct frame *f, int width, int height) { - int pixelwidth =3D FRAME_TEXT_TO_PIXEL_WIDTH (f, width); - int pixelheight =3D FRAME_TEXT_TO_PIXEL_HEIGHT (f, height); Lisp_Object fullscreen =3D get_frame_param (f, Qfullscreen); gint gwidth, gheight; - int totalheight - =3D pixelheight + FRAME_TOOLBAR_HEIGHT (f) + FRAME_MENUBAR_HEIGHT (f= ); - int totalwidth =3D pixelwidth + FRAME_TOOLBAR_WIDTH (f); + int outer_height + =3D height + FRAME_TOOLBAR_HEIGHT (f) + FRAME_MENUBAR_HEIGHT (f); + int outer_width =3D width + FRAME_TOOLBAR_WIDTH (f); bool was_visible =3D false; bool hide_child_frame; =20 - if (FRAME_PIXEL_HEIGHT (f) =3D=3D 0) - return; - gtk_window_get_size (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)), &gwidth, &gheight); =20 /* Do this before resize, as we don't know yet if we will be resized. = */ FRAME_RIF (f)->clear_under_internal_border (f); =20 - totalheight /=3D xg_get_scale (f); - totalwidth /=3D xg_get_scale (f); + outer_height /=3D xg_get_scale (f); + outer_width /=3D xg_get_scale (f); =20 x_wm_set_size_hint (f, 0, 0); =20 @@ -986,35 +974,19 @@ xg_frame_set_char_size (struct frame *f, int width,= int height) manager will abolish it. At least the respective size should remain unchanged but giving the frame back its normal size will be broken ... */ - if (EQ (fullscreen, Qfullwidth) && width =3D=3D FRAME_TEXT_WIDTH (f)) - { - frame_size_history_add - (f, Qxg_frame_set_char_size_1, width, height, - list2i (gheight, totalheight)); - - gtk_window_resize (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)), - gwidth, totalheight); - } - else if (EQ (fullscreen, Qfullheight) && height =3D=3D FRAME_TEXT_HEIG= HT (f)) - { - frame_size_history_add - (f, Qxg_frame_set_char_size_2, width, height, - list2i (gwidth, totalwidth)); - - gtk_window_resize (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)), - totalwidth, gheight); - } + if (EQ (fullscreen, Qfullwidth) && width =3D=3D FRAME_PIXEL_WIDTH (f))= + gtk_window_resize (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)), + gwidth, outer_height); + else if (EQ (fullscreen, Qfullheight) && height =3D=3D FRAME_PIXEL_HEI= GHT (f)) + gtk_window_resize (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)), + outer_width, gheight); else if (FRAME_PARENT_FRAME (f) && FRAME_VISIBLE_P (f)) { was_visible =3D true; hide_child_frame =3D EQ (x_gtk_resize_child_frames, Qhide); =20 - if (totalwidth !=3D gwidth || totalheight !=3D gheight) + if (outer_width !=3D gwidth || outer_height !=3D gheight) { - frame_size_history_add - (f, Qxg_frame_set_char_size_4, width, height, - list2i (totalwidth, totalheight)); - if (hide_child_frame) { block_input (); @@ -1023,7 +995,7 @@ xg_frame_set_char_size (struct frame *f, int width, = int height) } =20 gtk_window_resize (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)), - totalwidth, totalheight); + outer_width, outer_height); =20 if (hide_child_frame) { @@ -1037,11 +1009,8 @@ xg_frame_set_char_size (struct frame *f, int width= , int height) } else { - frame_size_history_add - (f, Qxg_frame_set_char_size_3, width, height, - list2i (totalwidth, totalheight)); gtk_window_resize (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)), - totalwidth, totalheight); + outer_width, outer_height); fullscreen =3D Qnil; } =20 @@ -1062,6 +1031,12 @@ xg_frame_set_char_size (struct frame *f, int width= , int height) gdk_flush (); x_wait_for_event (f, ConfigureNotify); =20 + if (CONSP (frame_size_history)) + frame_size_history_extra + (f, build_string ("xg_frame_set_char_size, visible"), + FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f), width, height, + f->new_width, f->new_height); + if (!NILP (fullscreen)) /* Try to restore fullscreen state. */ { @@ -1070,8 +1045,17 @@ xg_frame_set_char_size (struct frame *f, int width= , int height) } } else - adjust_frame_size (f, width, height, 5, 0, Qxg_frame_set_char_size);= - + { + if (CONSP (frame_size_history)) + frame_size_history_extra + (f, build_string ("xg_frame_set_char_size, invisible"), + FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f), width, height, + f->new_width, f->new_height); + + adjust_frame_size (f, FRAME_PIXEL_TO_TEXT_WIDTH (f, width), + FRAME_PIXEL_TO_TEXT_HEIGHT (f, height), + 5, 0, Qxg_frame_set_char_size); + } } =20 /* Handle height/width changes (i.e. add/remove/move menu/toolbar). @@ -1186,7 +1170,8 @@ style_changed_cb (GObject *go, { FRAME_TERMINAL (f)->set_scroll_bar_default_width_hook (f);= FRAME_TERMINAL (f)->set_scroll_bar_default_height_hook (f)= ; - xg_frame_set_char_size (f, FRAME_TEXT_WIDTH (f), FRAME_TEX= T_HEIGHT (f)); + xg_frame_set_char_size (f, FRAME_PIXEL_WIDTH (f), + FRAME_PIXEL_HEIGHT (f)); } } } @@ -4589,10 +4574,7 @@ tb_size_cb (GtkWidget *widget, struct frame *f =3D user_data; =20 if (xg_update_tool_bar_sizes (f)) - { - frame_size_history_add (f, Qtb_size_cb, 0, 0, Qnil); - adjust_frame_size (f, -1, -1, 5, 0, Qtool_bar_lines); - } + adjust_frame_size (f, -1, -1, 2, false, Qtool_bar_lines); } =20 /* Create a tool bar for frame F. */ @@ -5219,23 +5201,10 @@ update_frame_tool_bar (struct frame *f) xg_pack_tool_bar (f, FRAME_TOOL_BAR_POSITION (f)); gtk_widget_show_all (x->toolbar_widget); if (xg_update_tool_bar_sizes (f)) - { - int inhibit - =3D ((f->after_make_frame - && !f->tool_bar_resized - && (EQ (frame_inhibit_implied_resize, Qt) - || (CONSP (frame_inhibit_implied_resize) - && !NILP (Fmemq (Qtool_bar_lines, - frame_inhibit_implied_resize)))) - /* This will probably fail to DTRT in the - fullheight/-width cases. */ - && NILP (get_frame_param (f, Qfullscreen))) - ? 0 - : 2); - - frame_size_history_add (f, Qupdate_frame_tool_bar, 0, 0, Qnil); - adjust_frame_size (f, -1, -1, inhibit, 0, Qtool_bar_lines); - } + /* It's not entirely clear whether here we want a treatment + similar to that for frames with internal tool bar. */ + adjust_frame_size (f, -1, -1, 2, 0, Qtool_bar_lines); + f->tool_bar_resized =3D f->tool_bar_redisplayed; } =20 @@ -5284,7 +5253,6 @@ free_frame_tool_bar (struct frame *f) NULL); } =20 - frame_size_history_add (f, Qfree_frame_tool_bar, 0, 0, Qnil); adjust_frame_size (f, -1, -1, 2, 0, Qtool_bar_lines); =20 unblock_input (); @@ -5316,11 +5284,7 @@ xg_change_toolbar_position (struct frame *f, Lisp_= Object pos) g_object_unref (top_widget); =20 if (xg_update_tool_bar_sizes (f)) - { - frame_size_history_add (f, Qxg_change_toolbar_position, 0, 0, Qnil= ); - adjust_frame_size (f, -1, -1, 2, 0, Qtool_bar_lines); - } - + adjust_frame_size (f, -1, -1, 2, 0, Qtool_bar_lines); =20 unblock_input (); } diff --git a/src/keyboard.c b/src/keyboard.c index 5db45ce8e5..7f0342b00c 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -10665,10 +10665,7 @@ DEFUN ("suspend-emacs", Fsuspend_emacs, Ssuspend= _emacs, 0, 1, "", with a window system; but suspend should be disabled in that case. = */ get_tty_size (fileno (CURTTY ()->input), &width, &height); if (width !=3D old_width || height !=3D old_height) - change_frame_size (SELECTED_FRAME (), width, - height - FRAME_MENU_BAR_LINES (SELECTED_FRAME ()) - - FRAME_TAB_BAR_LINES (SELECTED_FRAME ()), - 0, 0, 0, 0); + change_frame_size (SELECTED_FRAME (), width, height, false, false, f= alse); =20 run_hook (intern ("suspend-resume-hook")); =20 diff --git a/src/nsfns.m b/src/nsfns.m index 5c4cc915e7..054777aa66 100644 --- a/src/nsfns.m +++ b/src/nsfns.m @@ -669,21 +669,9 @@ Turn the input menu (an NSMenu) into a lisp list for= tracking on lisp side. } =20 { - int inhibit - =3D ((f->after_make_frame - && !f->tool_bar_resized - && (EQ (frame_inhibit_implied_resize, Qt) - || (CONSP (frame_inhibit_implied_resize) - && !NILP (Fmemq (Qtool_bar_lines, - frame_inhibit_implied_resize)))) - && NILP (get_frame_param (f, Qfullscreen))) - ? 0 - : 2); - NSTRACE_MSG ("inhibit:%d", inhibit); =20 - frame_size_history_add (f, Qupdate_frame_tool_bar, 0, 0, Qnil); - adjust_frame_size (f, -1, -1, inhibit, 0, Qtool_bar_lines); + adjust_frame_size (f, -1, -1, 2, false, Qtool_bar_lines); } } =20 @@ -1332,8 +1320,7 @@ Turn the input menu (an NSMenu) into a lisp list fo= r tracking on lisp side. RES_TYPE_STRING); =20 parms =3D get_geometry_from_preferences (dpyinfo, parms); - window_prompting =3D gui_figure_window_size (f, parms, false, true, - &x_width, &x_height); + window_prompting =3D gui_figure_window_size (f, parms, false, true); =20 tem =3D gui_display_get_arg (dpyinfo, parms, Qunsplittable, 0, 0, RES_TYPE_BOOLEAN); @@ -1400,13 +1387,8 @@ Turn the input menu (an NSMenu) into a lisp list f= or tracking on lisp side. /* Allow set_window_size_hook, now. */ f->can_set_window_size =3D true; =20 - if (x_width > 0) - SET_FRAME_WIDTH (f, x_width); - if (x_height > 0) - SET_FRAME_HEIGHT (f, x_height); - - adjust_frame_size (f, FRAME_TEXT_WIDTH (f), FRAME_TEXT_HEIGHT (f), 0, = 1, - Qx_create_frame_2); + adjust_frame_size (f, FRAME_TEXT_WIDTH (f), FRAME_TEXT_HEIGHT (f), + 0, true, Qx_create_frame_2); =20 if (! f->output_data.ns->explicit_parent) { diff --git a/src/nsterm.m b/src/nsterm.m index a6501100ca..b135e359f5 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -1876,10 +1876,9 @@ Hide the window (X11 semantics) ns_set_window_size (struct frame *f, bool change_gravity, int width, - int height, - bool pixelwise) + int height) /* ---------------------------------------------------------------------= ----- - Adjust window pixel size based on given character grid size + Adjust window pixel size based on native sizes WIDTH and HEIGHT. Impl is a bit more complex than other terms, need to do some internal clipping. ---------------------------------------------------------------------= ----- */ @@ -1887,7 +1886,6 @@ Hide the window (X11 semantics) EmacsView *view =3D FRAME_NS_VIEW (f); NSWindow *window =3D [view window]; NSRect wr =3D [window frame]; - int pixelwidth, pixelheight; int orig_height =3D wr.size.height; =20 NSTRACE ("ns_set_window_size"); @@ -1896,24 +1894,13 @@ Hide the window (X11 semantics) return; =20 NSTRACE_RECT ("current", wr); - NSTRACE_MSG ("Width:%d Height:%d Pixelwise:%d", width, height, pixelwi= se); + NSTRACE_MSG ("Width:%d Height:%d", width, height); NSTRACE_MSG ("Font %d x %d", FRAME_COLUMN_WIDTH (f), FRAME_LINE_HEIGHT= (f)); =20 block_input (); =20 - if (pixelwise) - { - pixelwidth =3D FRAME_TEXT_TO_PIXEL_WIDTH (f, width); - pixelheight =3D FRAME_TEXT_TO_PIXEL_HEIGHT (f, height); - } - else - { - pixelwidth =3D FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, width); - pixelheight =3D FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, height); - } - - wr.size.width =3D pixelwidth + f->border_width; - wr.size.height =3D pixelheight; + wr.size.width =3D width + f->border_width; + wr.size.height =3D height; if (! [view isFullscreen]) wr.size.height +=3D FRAME_NS_TITLEBAR_HEIGHT (f) + FRAME_TOOLBAR_HEIGHT (f); @@ -1926,21 +1913,10 @@ Hide the window (X11 semantics) else wr.origin.y +=3D orig_height - wr.size.height; =20 - frame_size_history_add - (f, Qx_set_window_size_1, width, height, - list5 (Fcons (make_fixnum (pixelwidth), make_fixnum (pixelheight)), - Fcons (make_fixnum (wr.size.width), make_fixnum (wr.size.height)), - make_fixnum (f->border_width), - make_fixnum (FRAME_NS_TITLEBAR_HEIGHT (f)), - make_fixnum (FRAME_TOOLBAR_HEIGHT (f)))); - /* Usually it seems safe to delay changing the frame size, but when a series of actions are taken with no redisplay between them then we can end up using old values so don't delay here. */ - change_frame_size (f, - FRAME_PIXEL_TO_TEXT_WIDTH (f, pixelwidth), - FRAME_PIXEL_TO_TEXT_HEIGHT (f, pixelheight), - 0, NO, 0, 1); + change_frame_size (f, width, height, false, NO, false); =20 [window setFrame:wr display:NO]; =20 @@ -7359,10 +7335,7 @@ - (void)viewDidResize:(NSNotification *)notificati= on changes size, as Emacs may already know about the change. Unfortunately there doesn't seem to be a bullet-proof method of determining whether we need to call it or not. */ - change_frame_size (emacsframe, - FRAME_PIXEL_TO_TEXT_WIDTH (emacsframe, neww), - FRAME_PIXEL_TO_TEXT_HEIGHT (emacsframe, newh), - 0, YES, 0, 1); + change_frame_size (emacsframe, neww, newh, false, YES, false); =20 SET_FRAME_GARBAGED (emacsframe); cancel_mouse_face (emacsframe); diff --git a/src/term.c b/src/term.c index 1059b0669a..c995a4499c 100644 --- a/src/term.c +++ b/src/term.c @@ -2356,9 +2356,7 @@ DEFUN ("resume-tty", Fresume_tty, Sresume_tty, 0, 1= , 0, was suspended. */ get_tty_size (fileno (t->display_info.tty->input), &width, &height); if (width !=3D old_width || height !=3D old_height) - change_frame_size (f, width, height - FRAME_MENU_BAR_LINES (f) - - FRAME_TAB_BAR_LINES (f), - 0, 0, 0, 0); + change_frame_size (f, width, height, false, false, false); SET_FRAME_VISIBLE (XFRAME (t->display_info.tty->top_frame), 1); } =20 diff --git a/src/termhooks.h b/src/termhooks.h index 3800679e80..1d3cdc8fe8 100644 --- a/src/termhooks.h +++ b/src/termhooks.h @@ -583,7 +583,7 @@ #define EVENT_INIT(event) memset (&(event), 0, sizeof= (struct input_event)) window gravity for this size change and subsequent size changes. Otherwise we leave the window gravity unchanged. */ void (*set_window_size_hook) (struct frame *f, bool change_gravity, - int width, int height, bool pixelwise); + int width, int height); =20 /* CHANGE_GRAVITY is 1 when calling from Fset_frame_position, to really change the position, and 0 when calling from diff --git a/src/w32fns.c b/src/w32fns.c index c07f32ab0c..66baeaecbd 100644 --- a/src/w32fns.c +++ b/src/w32fns.c @@ -1701,7 +1701,7 @@ w32_change_tab_bar_height (struct frame *f, int hei= ght) int unit =3D FRAME_LINE_HEIGHT (f); int old_height =3D FRAME_TAB_BAR_HEIGHT (f); int lines =3D (height + unit - 1) / unit; - Lisp_Object fullscreen; + Lisp_Object fullscreen =3D get_frame_param (f, Qfullscreen); =20 /* Make sure we redisplay all windows in this frame. */ fset_redisplay (f); @@ -1728,25 +1728,21 @@ w32_change_tab_bar_height (struct frame *f, int h= eight) if ((height < old_height) && WINDOWP (f->tab_bar_window)) clear_glyph_matrix (XWINDOW (f->tab_bar_window)->current_matrix); =20 - /* Recalculate tabbar height. */ - f->n_tab_bar_rows =3D 0; - if (old_height =3D=3D 0 - && (!f->after_make_frame - || NILP (frame_inhibit_implied_resize) - || (CONSP (frame_inhibit_implied_resize) - && NILP (Fmemq (Qtab_bar_lines, frame_inhibit_implied_resize)))))= - f->tab_bar_redisplayed =3D f->tab_bar_resized =3D false; - - adjust_frame_size (f, -1, -1, - ((!f->tab_bar_resized - && (NILP (fullscreen =3D - get_frame_param (f, Qfullscreen)) - || EQ (fullscreen, Qfullwidth))) ? 1 - : (old_height =3D=3D 0 || height =3D=3D 0) ? 2 - : 4), - false, Qtab_bar_lines); - - f->tab_bar_resized =3D f->tab_bar_redisplayed; + if (!f->tab_bar_resized) + { + /* As long as tab_bar_resized is false, effectively try to change + F's native height. */ + if (NILP (fullscreen) || EQ (fullscreen, Qfullwidth)) + adjust_frame_size (f, FRAME_TEXT_WIDTH (f), FRAME_TEXT_HEIGHT (f), + 1, false, Qtab_bar_lines); + else + adjust_frame_size (f, -1, -1, 4, false, Qtab_bar_lines); + + f->tab_bar_resized =3D f->tab_bar_redisplayed; + } + else + /* Any other change may leave the native size of F alone. */ + adjust_frame_size (f, -1, -1, 3, false, Qtab_bar_lines); =20 /* adjust_frame_size might not have done anything, garbage frame here. */ @@ -1790,7 +1786,7 @@ w32_change_tool_bar_height (struct frame *f, int he= ight) int unit =3D FRAME_LINE_HEIGHT (f); int old_height =3D FRAME_TOOL_BAR_HEIGHT (f); int lines =3D (height + unit - 1) / unit; - Lisp_Object fullscreen; + Lisp_Object fullscreen =3D get_frame_param (f, Qfullscreen); =20 /* Make sure we redisplay all windows in this frame. */ windows_or_buffers_changed =3D 23; @@ -1811,25 +1807,21 @@ w32_change_tool_bar_height (struct frame *f, int = height) if ((height < old_height) && WINDOWP (f->tool_bar_window)) clear_glyph_matrix (XWINDOW (f->tool_bar_window)->current_matrix); =20 - /* Recalculate toolbar height. */ - f->n_tool_bar_rows =3D 0; - if (old_height =3D=3D 0 - && (!f->after_make_frame - || NILP (frame_inhibit_implied_resize) - || (CONSP (frame_inhibit_implied_resize) - && NILP (Fmemq (Qtool_bar_lines, frame_inhibit_implied_resize))))= ) - f->tool_bar_redisplayed =3D f->tool_bar_resized =3D false; - - adjust_frame_size (f, -1, -1, - ((!f->tool_bar_resized - && (NILP (fullscreen =3D - get_frame_param (f, Qfullscreen)) - || EQ (fullscreen, Qfullwidth))) ? 1 - : (old_height =3D=3D 0 || height =3D=3D 0) ? 2 - : 4), - false, Qtool_bar_lines); - - f->tool_bar_resized =3D f->tool_bar_redisplayed; + if (!f->tool_bar_resized) + { + /* As long as tool_bar_resized is false, effectively try to change= + F's native height. */ + if (NILP (fullscreen) || EQ (fullscreen, Qfullwidth)) + adjust_frame_size (f, FRAME_TEXT_WIDTH (f), FRAME_TEXT_HEIGHT (f), + 1, false, Qtool_bar_lines); + else + adjust_frame_size (f, -1, -1, 4, false, Qtool_bar_lines); + + f->tool_bar_resized =3D f->tool_bar_redisplayed; + } + else + /* Any other change may leave the native size of F alone. */ + adjust_frame_size (f, -1, -1, 3, false, Qtool_bar_lines); =20 /* adjust_frame_size might not have done anything, garbage frame here. */ @@ -5718,7 +5710,6 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create= _frame, struct w32_display_info *dpyinfo =3D NULL; Lisp_Object parent, parent_frame; struct kboard *kb; - int x_width =3D 0, x_height =3D 0; =20 if (!FRAME_W32_P (SELECTED_FRAME ()) && !FRAME_INITIAL_P (SELECTED_FRAME ())) @@ -6045,8 +6036,7 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create= _frame, =20 f->output_data.w32->current_cursor =3D f->output_data.w32->nontext_cur= sor; =20 - window_prompting =3D gui_figure_window_size (f, parameters, true, true= , - &x_width, &x_height); + window_prompting =3D gui_figure_window_size (f, parameters, true, true= ); =20 tem =3D gui_display_get_arg (dpyinfo, parameters, Qunsplittable, 0, 0,= RES_TYPE_BOOLEAN); @@ -6081,11 +6071,6 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_creat= e_frame, /* Allow set_window_size_hook, now. */ f->can_set_window_size =3D true; =20 - if (x_width > 0) - SET_FRAME_WIDTH (f, x_width); - if (x_height > 0) - SET_FRAME_HEIGHT (f, x_height); - /* Tell the server what size and position, etc, we want, and how badly we want them. This should be done after we have the menu bar so that its size can be taken into account. */ @@ -6093,8 +6078,8 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create= _frame, w32_wm_set_size_hint (f, window_prompting, false); unblock_input (); =20 - adjust_frame_size (f, FRAME_TEXT_WIDTH (f), FRAME_TEXT_HEIGHT (f), 0, = true, - Qx_create_frame_2); + adjust_frame_size (f, FRAME_TEXT_WIDTH (f), FRAME_TEXT_HEIGHT (f), + 0, true, Qx_create_frame_2); =20 /* Process fullscreen parameter here in the hope that normalizing a fullheight/fullwidth frame will produce the size set by the last @@ -6888,11 +6873,9 @@ w32_create_tip_frame (struct w32_display_info *dpy= info, Lisp_Object parms) struct frame *f; Lisp_Object frame; Lisp_Object name; - int width, height; ptrdiff_t count =3D SPECPDL_INDEX (); struct kboard *kb; bool face_change_before =3D face_change; - int x_width =3D 0, x_height =3D 0; =20 /* Use this general default value to start with until we know if this frame has a specified name. */ @@ -7013,7 +6996,7 @@ w32_create_tip_frame (struct w32_display_info *dpyi= nfo, Lisp_Object parms) f->output_data.w32->parent_desc =3D FRAME_DISPLAY_INFO (f)->root_windo= w; f->output_data.w32->explicit_parent =3D false; =20 - gui_figure_window_size (f, parms, true, true, &x_width, &x_height); + gui_figure_window_size (f, parms, true, true); =20 /* No fringes on tip frame. */ f->fringe_cols =3D 0; @@ -7039,15 +7022,6 @@ w32_create_tip_frame (struct w32_display_info *dpy= info, Lisp_Object parms) gui_default_parameter (f, parms, Qalpha, Qnil, "alpha", "Alpha", RES_TYPE_NUMBER); =20 - /* Dimensions, especially FRAME_LINES (f), must be done via - change_frame_size. Change will not be effected unless different - from the current FRAME_LINES (f). */ - width =3D FRAME_COLS (f); - height =3D FRAME_LINES (f); - SET_FRAME_COLS (f, 0); - SET_FRAME_LINES (f, 0); - adjust_frame_size (f, width * FRAME_COLUMN_WIDTH (f), - height * FRAME_LINE_HEIGHT (f), 0, true, Qtip_frame); /* Add `tooltip' frame parameter's default value. */ if (NILP (Fframe_parameter (frame, Qtooltip))) Fmodify_frame_parameters (frame, Fcons (Fcons (Qtooltip, Qt), Qnil))= ; @@ -7088,6 +7062,8 @@ w32_create_tip_frame (struct w32_display_info *dpyi= nfo, Lisp_Object parms) visible won't work. */ Vframe_list =3D Fcons (frame, Vframe_list); f->can_set_window_size =3D true; + adjust_frame_size (f, FRAME_TEXT_WIDTH (f), FRAME_TEXT_HEIGHT (f), + 0, true, Qtip_frame); =20 /* Setting attributes of faces of the tooltip frame from resources and similar will set face_change, which leads to the diff --git a/src/w32inevt.c b/src/w32inevt.c index 1a80a00197..1255072b7f 100644 --- a/src/w32inevt.c +++ b/src/w32inevt.c @@ -608,9 +608,7 @@ resize_event (WINDOW_BUFFER_SIZE_RECORD *event) { struct frame *f =3D get_frame (); =20 - change_frame_size (f, event->dwSize.X, event->dwSize.Y - - FRAME_MENU_BAR_LINES (f) - - FRAME_TAB_BAR_LINES (f), 0, 1, 0, 0); + change_frame_size (f, event->dwSize.X, event->dwSize.Y, false, true, f= alse); SET_FRAME_GARBAGED (f); } =20 @@ -624,11 +622,9 @@ maybe_generate_resize_event (void) =20 /* It is okay to call this unconditionally, since it will do nothing if the size hasn't actually changed. */ - change_frame_size (f, - 1 + info.srWindow.Right - info.srWindow.Left, - 1 + info.srWindow.Bottom - info.srWindow.Top - - FRAME_MENU_BAR_LINES (f) - - FRAME_TAB_BAR_LINES (f), 0, 1, 0, 0); + change_frame_size (f, 1 + info.srWindow.Right - info.srWindow.Left, + 1 + info.srWindow.Bottom - info.srWindow.Top, + false, true, false); } =20 #if HAVE_W32NOTIFY diff --git a/src/w32term.c b/src/w32term.c index 361cf33c02..4f910296ec 100644 --- a/src/w32term.c +++ b/src/w32term.c @@ -5352,7 +5352,7 @@ w32_read_socket (struct terminal *terminal, if (f) { RECT rect; - int /* rows, columns, */ width, height, text_width, text_height; + int /* rows, columns, */ width, height; =20 if (GetClientRect (msg.msg.hwnd, &rect) /* GetClientRect evidently returns (0, 0, 0, 0) if @@ -5365,23 +5365,11 @@ w32_read_socket (struct terminal *terminal, { height =3D rect.bottom - rect.top; width =3D rect.right - rect.left; - text_width =3D FRAME_PIXEL_TO_TEXT_WIDTH (f, width); - text_height =3D FRAME_PIXEL_TO_TEXT_HEIGHT (f, height); - /* rows =3D FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, height); */ - /* columns =3D FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, width); */ - - /* TODO: Clip size to the screen dimensions. */ - - /* Even if the number of character rows and columns - has not changed, the font size may have changed, - so we need to check the pixel dimensions as well. */ - if (width !=3D FRAME_PIXEL_WIDTH (f) - || height !=3D FRAME_PIXEL_HEIGHT (f) - || text_width !=3D FRAME_TEXT_WIDTH (f) - || text_height !=3D FRAME_TEXT_HEIGHT (f)) + || height !=3D FRAME_PIXEL_HEIGHT (f)) { - change_frame_size (f, text_width, text_height, 0, 1, 0, 1); + change_frame_size + (f, width, height, false, true, false); SET_FRAME_GARBAGED (f); cancel_mouse_face (f); f->win_gravity =3D NorthWestGravity; @@ -5565,7 +5553,7 @@ w32_read_socket (struct terminal *terminal, if (f && !FRAME_ICONIFIED_P (f) && msg.msg.wParam !=3D SIZE_MINIMIZED= ) { RECT rect; - int /* rows, columns, */ width, height, text_width, text_height; + int /* rows, columns, */ width, height; =20 if (GetClientRect (msg.msg.hwnd, &rect) /* GetClientRect evidently returns (0, 0, 0, 0) if @@ -5578,23 +5566,12 @@ w32_read_socket (struct terminal *terminal, { height =3D rect.bottom - rect.top; width =3D rect.right - rect.left; - text_width =3D FRAME_PIXEL_TO_TEXT_WIDTH (f, width); - text_height =3D FRAME_PIXEL_TO_TEXT_HEIGHT (f, height); - /* rows =3D FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, height); */ - /* columns =3D FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, width); */ - - /* TODO: Clip size to the screen dimensions. */ - - /* Even if the number of character rows and columns - has not changed, the font size may have changed, - so we need to check the pixel dimensions as well. */ =20 if (width !=3D FRAME_PIXEL_WIDTH (f) - || height !=3D FRAME_PIXEL_HEIGHT (f) - || text_width !=3D FRAME_TEXT_WIDTH (f) - || text_height !=3D FRAME_TEXT_HEIGHT (f)) + || height !=3D FRAME_PIXEL_HEIGHT (f)) { - change_frame_size (f, text_width, text_height, 0, 1, 0, 1); + change_frame_size + (f, width, height, false, true, false); SET_FRAME_GARBAGED (f); cancel_mouse_face (f); f->win_gravity =3D NorthWestGravity; @@ -6267,17 +6244,15 @@ w32_new_font (struct frame *f, Lisp_Object font_o= bject, int fontset) FRAME_CONFIG_SCROLL_BAR_COLS (f) * unit; } =20 - /* Now make the frame display the given font. */ - if (FRAME_NATIVE_WINDOW (f) !=3D 0) - { - /* Don't change the size of a tip frame; there's no point in - doing it because it's done in Fx_show_tip, and it leads to - problems because the tip frame has no widget. */ - if (!FRAME_TOOLTIP_P (f)) - adjust_frame_size (f, FRAME_COLS (f) * FRAME_COLUMN_WIDTH (f), - FRAME_LINES (f) * FRAME_LINE_HEIGHT (f), 3, - false, Qfont); - } + FRAME_TAB_BAR_HEIGHT (f) =3D FRAME_TAB_BAR_LINES (f) * FRAME_LINE_HEIG= HT (f); + +/* Don't change the size of a tip frame; there's no point in + doing it because it's done in Fx_show_tip, and it leads to + problems because the tip frame has no widget. */ + if (FRAME_NATIVE_WINDOW (f) !=3D 0 && !FRAME_TOOLTIP_P (f)) + adjust_frame_size + (f, FRAME_COLS (f) * FRAME_COLUMN_WIDTH (f), + FRAME_LINES (f) * FRAME_LINE_HEIGHT (f), 3, false, Qfont); =20 /* X version sets font of input methods here also. */ =20 @@ -6490,7 +6465,8 @@ w32fullscreen_hook (struct frame *f) ShowWindow (hwnd, SW_SHOWNORMAL); else if (f->want_fullscreen =3D=3D FULLSCREEN_MAXIMIZED) { - if (prev_fsmode =3D=3D FULLSCREEN_BOTH || prev_fsmode =3D=3D FULLSCRE= EN_WIDTH + if (prev_fsmode =3D=3D FULLSCREEN_BOTH + || prev_fsmode =3D=3D FULLSCREEN_WIDTH || prev_fsmode =3D=3D FULLSCREEN_HEIGHT) /* Make window normal since otherwise the subsequent maximization might fail in some cases. */ @@ -6499,52 +6475,31 @@ w32fullscreen_hook (struct frame *f) } else if (f->want_fullscreen =3D=3D FULLSCREEN_BOTH) { - int menu_bar_height =3D GetSystemMetrics (SM_CYMENU); - - w32_fullscreen_rect (hwnd, f->want_fullscreen, - FRAME_NORMAL_PLACEMENT (f).rcNormalPosition, &rect); + w32_fullscreen_rect + (hwnd, f->want_fullscreen, + FRAME_NORMAL_PLACEMENT (f).rcNormalPosition, &rect); if (!FRAME_UNDECORATED (f)) SetWindowLong (hwnd, GWL_STYLE, dwStyle & ~WS_OVERLAPPEDWINDOW); SetWindowPos (hwnd, HWND_TOP, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOOWNERZORDER | SWP_FRAMECHANGED); change_frame_size - (f, FRAME_PIXEL_TO_TEXT_WIDTH (f, rect.right - rect.left), - FRAME_PIXEL_TO_TEXT_HEIGHT (f, (rect.bottom - rect.top - - menu_bar_height)), - 0, 1, 0, 1); + (f, rect.right - rect.left, rect.bottom - rect.top, + false, true, false); } else { ShowWindow (hwnd, SW_SHOWNORMAL); - w32_fullscreen_rect (hwnd, f->want_fullscreen, - FRAME_NORMAL_PLACEMENT (f).rcNormalPosition, &rect); + w32_fullscreen_rect + (hwnd, f->want_fullscreen, + FRAME_NORMAL_PLACEMENT (f).rcNormalPosition, &rect); SetWindowPos (hwnd, HWND_TOP, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, = 0); =20 - if (f->want_fullscreen =3D=3D FULLSCREEN_WIDTH) - { - int border_width =3D GetSystemMetrics (SM_CXFRAME); - - change_frame_size - (f, (FRAME_PIXEL_TO_TEXT_WIDTH - (f, rect.right - rect.left - 2 * border_width)), - 0, 0, 1, 0, 1); - } - else - { - int border_height =3D GetSystemMetrics (SM_CYFRAME); - /* Won't work for wrapped menu bar. */ - int menu_bar_height =3D GetSystemMetrics (SM_CYMENU); - int title_height =3D GetSystemMetrics (SM_CYCAPTION); - - change_frame_size - (f, 0, (FRAME_PIXEL_TO_TEXT_HEIGHT - (f, rect.bottom - rect.top - 2 * border_height - - title_height - menu_bar_height)), - 0, 1, 0, 1); - } - } + change_frame_size + (f, rect.right - rect.left, rect.bottom - rect.top, + false, true, false); + } =20 f->want_fullscreen =3D FULLSCREEN_NONE; unblock_input (); @@ -6559,16 +6514,14 @@ w32fullscreen_hook (struct frame *f) f->want_fullscreen |=3D FULLSCREEN_WAIT; } =20 -/* Call this to change the size of frame F's native window. - If CHANGE_GRAVITY, change to top-left-corner window gravity - for this size change and subsequent size changes. - Otherwise we leave the window gravity unchanged. */ - +/* Change the size of frame F's Windows window to WIDTH and HEIGHT + pixels. If CHANGE_GRAVITY, change to top-left-corner window gravity + for this size change and subsequent size changes. Otherwise leave + the window gravity unchanged. */ static void w32_set_window_size (struct frame *f, bool change_gravity, - int width, int height, bool pixelwise) + int width, int height) { - int pixelwidth, pixelheight; Lisp_Object fullscreen =3D get_frame_param (f, Qfullscreen); RECT rect; MENUBARINFO info; @@ -6584,17 +6537,6 @@ w32_set_window_size (struct frame *f, bool change_= gravity, GetMenuBarInfo (FRAME_W32_WINDOW (f), 0xFFFFFFFD, 0, &info); menu_bar_height =3D info.rcBar.bottom - info.rcBar.top; =20 - if (pixelwise) - { - pixelwidth =3D FRAME_TEXT_TO_PIXEL_WIDTH (f, width); - pixelheight =3D FRAME_TEXT_TO_PIXEL_HEIGHT (f, height); - } - else - { - pixelwidth =3D FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, width); - pixelheight =3D FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, height); - } - if (w32_add_wrapped_menu_bar_lines) { /* When the menu bar wraps sending a SetWindowPos shrinks the @@ -6610,15 +6552,15 @@ w32_set_window_size (struct frame *f, bool change= _gravity, if ((default_menu_bar_height > 0) && (menu_bar_height > default_menu_bar_height) && ((menu_bar_height % default_menu_bar_height) =3D=3D 0)) - pixelheight =3D pixelheight + menu_bar_height - default_menu_bar_height= ; + height =3D height + menu_bar_height - default_menu_bar_height; } =20 f->win_gravity =3D NorthWestGravity; w32_wm_set_size_hint (f, (long) 0, false); =20 rect.left =3D rect.top =3D 0; - rect.right =3D pixelwidth; - rect.bottom =3D pixelheight; + rect.right =3D width; + rect.bottom =3D height; =20 AdjustWindowRect (&rect, f->output_data.w32->dwStyle, menu_bar_height = > 0); =20 @@ -6636,7 +6578,7 @@ w32_set_window_size (struct frame *f, bool change_g= ravity, { rect.left =3D window_rect.left; rect.right =3D window_rect.right; - pixelwidth =3D 0; + width =3D -1; } if (EQ (fullscreen, Qmaximized) || EQ (fullscreen, Qfullboth) @@ -6644,19 +6586,12 @@ w32_set_window_size (struct frame *f, bool change= _gravity, { rect.top =3D window_rect.top; rect.bottom =3D window_rect.bottom; - pixelheight =3D 0; + height =3D -1; } } =20 - if (pixelwidth > 0 || pixelheight > 0) + if (width > 0 || height > 0) { - frame_size_history_add - (f, Qx_set_window_size_1, width, height, - list2 (Fcons (make_fixnum (pixelwidth), - make_fixnum (pixelheight)), - Fcons (make_fixnum (rect.right - rect.left), - make_fixnum (rect.bottom - rect.top)))); - if (!FRAME_PARENT_FRAME (f)) my_set_window_pos (FRAME_W32_WINDOW (f), NULL, 0, 0, @@ -6670,12 +6605,7 @@ w32_set_window_size (struct frame *f, bool change_= gravity, rect.bottom - rect.top, SWP_NOMOVE | SWP_NOACTIVATE); =20 - change_frame_size (f, - ((pixelwidth =3D=3D 0) - ? 0 : FRAME_PIXEL_TO_TEXT_WIDTH (f, pixelwidth)), - ((pixelheight =3D=3D 0) - ? 0 : FRAME_PIXEL_TO_TEXT_HEIGHT (f, pixelheight)), - 0, 1, 0, 1); + change_frame_size (f, width, height, false, true, false); SET_FRAME_GARBAGED (f); =20 /* If cursor was outside the new size, mark it as off. */ diff --git a/src/widget.c b/src/widget.c index 43f0307b4e..dd43fd1c46 100644 --- a/src/widget.c +++ b/src/widget.c @@ -168,14 +168,6 @@ pixel_to_char_size (EmacsFrame ew, Dimension pixel_w= idth, Dimension pixel_height *char_height =3D FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, (int) pixel_heig= ht); } =20 -static void -pixel_to_text_size (EmacsFrame ew, Dimension pixel_width, Dimension pixe= l_height, int *text_width, int *text_height) -{ - struct frame *f =3D ew->emacs_frame.frame; - *text_width =3D FRAME_PIXEL_TO_TEXT_WIDTH (f, (int) pixel_width); - *text_height =3D FRAME_PIXEL_TO_TEXT_HEIGHT (f, (int) pixel_height); -} - static void char_to_pixel_size (EmacsFrame ew, int char_width, int char_height, Dime= nsion *pixel_width, Dimension *pixel_height) { @@ -257,27 +249,14 @@ set_frame_size (EmacsFrame ew) =20 */ =20 - /* Hairily merged geometry */ struct frame *f =3D ew->emacs_frame.frame; - int w =3D FRAME_COLS (f); - int h =3D FRAME_LINES (f); - Widget wmshell =3D get_wm_shell ((Widget) ew); - Dimension pixel_width, pixel_height; - /* Each Emacs shell is now independent and top-level. */ - - if (! XtIsSubclass (wmshell, shellWidgetClass)) emacs_abort (); - - char_to_pixel_size (ew, w, h, &pixel_width, &pixel_height); - ew->core.width =3D (frame_resize_pixelwise - ? FRAME_PIXEL_WIDTH (f) - : pixel_width); - ew->core.height =3D (frame_resize_pixelwise - ? FRAME_PIXEL_HEIGHT (f) - : pixel_height); - - frame_size_history_add - (f, Qset_frame_size, FRAME_TEXT_WIDTH (f), FRAME_TEXT_HEIGHT (f), - list2i (ew->core.width, ew->core.height)); + + ew->core.width =3D FRAME_PIXEL_WIDTH (f); + ew->core.height =3D FRAME_PIXEL_HEIGHT (f); + + if (CONSP (frame_size_history)) + frame_size_history_plain + (f, build_string ("set_frame_size")); } =20 static void @@ -350,6 +329,13 @@ update_from_various_frame_slots (EmacsFrame ew) ew->emacs_frame.foreground_pixel =3D FRAME_FOREGROUND_PIXEL (f); ew->emacs_frame.cursor_color =3D x->cursor_pixel; ew->core.border_pixel =3D x->border_pixel; + + if (CONSP (frame_size_history)) + frame_size_history_extra + (f, build_string ("update_from_various_frame_slots"), + FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f), + ew->core.width, ew->core.height, + f->new_width, f->new_height); } =20 static void @@ -381,6 +367,7 @@ resize_cb (Widget widget, EmacsFrameRealize (Widget widget, XtValueMask *mask, XSetWindowAttribute= s *attrs) { EmacsFrame ew =3D (EmacsFrame) widget; + struct frame *f =3D ew->emacs_frame.frame; =20 /* This used to contain SubstructureRedirectMask, but this turns out to be a problem with XIM on Solaris, and events from that mask @@ -394,6 +381,11 @@ EmacsFrameRealize (Widget widget, XtValueMask *mask,= XSetWindowAttributes *attrs /* Some ConfigureNotify events does not end up in EmacsFrameResize so make sure we get them all. Seen with xfcwm4 for example. */ XtAddRawEventHandler (widget, StructureNotifyMask, False, resize_cb, N= ULL); + + if (CONSP (frame_size_history)) + frame_size_history_plain + (f, build_string ("EmacsFrameRealize")); + update_wm_hints (ew); } =20 @@ -408,18 +400,15 @@ EmacsFrameResize (Widget widget) { EmacsFrame ew =3D (EmacsFrame) widget; struct frame *f =3D ew->emacs_frame.frame; - int width, height; - - pixel_to_text_size (ew, ew->core.width, ew->core.height, &width, &heig= ht); =20 - frame_size_history_add - (f, QEmacsFrameResize, width, height, - list5 (make_fixnum (ew->core.width), make_fixnum (ew->core.height),= - make_fixnum (FRAME_TOP_MARGIN_HEIGHT (f)), - make_fixnum (FRAME_SCROLL_BAR_AREA_HEIGHT (f)), - make_fixnum (2 * FRAME_INTERNAL_BORDER_WIDTH (f)))); + if (CONSP (frame_size_history)) + frame_size_history_extra + (f, build_string ("EmacsFrameResize"), + FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f), + ew->core.width, ew->core.height, + f->new_width, f->new_height); =20 - change_frame_size (f, width, height, 0, 1, 0, 1); + change_frame_size (f, ew->core.width, ew->core.height, false, true, fa= lse); =20 update_wm_hints (ew); update_various_frame_slots (ew); @@ -463,9 +452,17 @@ EmacsFrameSetCharSize (Widget widget, int columns, i= nt rows) EmacsFrame ew =3D (EmacsFrame) widget; struct frame *f =3D ew->emacs_frame.frame; =20 + if (CONSP (frame_size_history)) + frame_size_history_extra + (f, build_string ("EmacsFrameSetCharSize"), + FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f), + columns, rows, + f->new_width, f->new_height); + if (!frame_inhibit_resize (f, 0, Qfont) && !frame_inhibit_resize (f, 1, Qfont)) - x_set_window_size (f, 0, columns, rows, 0); + x_set_window_size (f, 0, columns * FRAME_COLUMN_WIDTH (f), + rows * FRAME_LINE_HEIGHT (f)); } =20 =0C diff --git a/src/xdisp.c b/src/xdisp.c index 7a89089958..23b4ba5c39 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -11860,7 +11860,7 @@ resize_mini_window (struct window *w, bool exact_= p) int height, max_height; struct text_pos start; struct buffer *old_current_buffer =3D NULL; - int windows_height =3D FRAME_WINDOWS_HEIGHT (f); + int windows_height =3D FRAME_INNER_HEIGHT (f); =20 if (current_buffer !=3D XBUFFER (w->contents)) { @@ -13477,8 +13477,6 @@ DEFUN ("tab-bar-height", Ftab_bar_height, Stab_ba= r_height, static bool redisplay_tab_bar (struct frame *f) { - f->tab_bar_redisplayed =3D true; - struct window *w; struct it it; struct glyph_row *row; @@ -13492,6 +13490,8 @@ redisplay_tab_bar (struct frame *f) WINDOW_TOTAL_LINES (w) =3D=3D 0)) return false; =20 + f->tab_bar_redisplayed =3D true; + /* Set up an iterator for the tab-bar window. */ init_iterator (&it, w, -1, -1, w->desired_matrix->rows, TAB_BAR_FACE_I= D); it.first_visible_x =3D 0; @@ -14402,21 +14402,13 @@ DEFUN ("tool-bar-height", Ftool_bar_height, Sto= ol_bar_height, return make_fixnum (height); } =20 +#ifndef HAVE_EXT_TOOL_BAR =20 -/* Display the tool-bar of frame F. Value is true if tool-bar's - height should be changed. */ +/* Display the internal tool-bar of frame F. Value is true if + tool-bar's height should be changed. */ static bool redisplay_tool_bar (struct frame *f) { - f->tool_bar_redisplayed =3D true; -#ifdef HAVE_EXT_TOOL_BAR - - if (FRAME_EXTERNAL_TOOL_BAR (f)) - update_frame_tool_bar (f); - return false; - -#else /* ! (HAVE_EXT_TOOL_BAR) */ - struct window *w; struct it it; struct glyph_row *row; @@ -14430,6 +14422,8 @@ redisplay_tool_bar (struct frame *f) WINDOW_TOTAL_LINES (w) =3D=3D 0)) return false; =20 + f->tool_bar_redisplayed =3D true; + /* Set up an iterator for the tool-bar window. */ init_iterator (&it, w, -1, -1, w->desired_matrix->rows, TOOL_BAR_FACE_= ID); it.first_visible_x =3D 0; @@ -14565,13 +14559,10 @@ redisplay_tool_bar (struct frame *f) } =20 f->minimize_tool_bar_window_p =3D false; - return false; =20 -#endif /* HAVE_EXT_TOOL_BAR */ + return false; } =20 -#ifndef HAVE_EXT_TOOL_BAR - /* Get information about the tool-bar item which is displayed in GLYPH on frame F. Return in *PROP_IDX the index where tool-bar item properties start in F->tool_bar_items. Value is false if @@ -19334,7 +19325,7 @@ redisplay_window (Lisp_Object window, bool just_t= his_one_p) =20 #ifdef HAVE_EXT_TOOL_BAR if (FRAME_EXTERNAL_TOOL_BAR (f)) - redisplay_tool_bar (f); + update_frame_tool_bar (f); #else if (WINDOWP (f->tool_bar_window) && (FRAME_TOOL_BAR_LINES (f) > 0 diff --git a/src/xfns.c b/src/xfns.c index f120653ee7..2c95065d3e 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -1563,7 +1563,6 @@ x_set_menu_bar_lines (struct frame *f, Lisp_Object = value, Lisp_Object oldval) #else /* not USE_X_TOOLKIT && not USE_GTK */ FRAME_MENU_BAR_LINES (f) =3D nlines; FRAME_MENU_BAR_HEIGHT (f) =3D nlines * FRAME_LINE_HEIGHT (f); - adjust_frame_size (f, -1, -1, 2, true, Qx_set_menu_bar_lines); if (FRAME_X_WINDOW (f)) x_clear_under_internal_border (f); =20 @@ -1577,6 +1576,8 @@ x_set_menu_bar_lines (struct frame *f, Lisp_Object = value, Lisp_Object oldval) int width =3D FRAME_PIXEL_WIDTH (f); int y; =20 + adjust_frame_size (f, -1, -1, 3, true, Qmenu_bar_lines); + /* height can be zero here. */ if (FRAME_X_WINDOW (f) && height > 0 && width > 0) { @@ -1637,7 +1638,7 @@ x_change_tab_bar_height (struct frame *f, int heigh= t) int unit =3D FRAME_LINE_HEIGHT (f); int old_height =3D FRAME_TAB_BAR_HEIGHT (f); int lines =3D (height + unit - 1) / unit; - Lisp_Object fullscreen; + Lisp_Object fullscreen =3D get_frame_param (f, Qfullscreen); =20 /* Make sure we redisplay all windows in this frame. */ fset_redisplay (f); @@ -1645,16 +1646,8 @@ x_change_tab_bar_height (struct frame *f, int heig= ht) /* Recalculate tab bar and frame text sizes. */ FRAME_TAB_BAR_HEIGHT (f) =3D height; FRAME_TAB_BAR_LINES (f) =3D lines; - /* Store the `tab-bar-lines' and `height' frame parameters. */ store_frame_param (f, Qtab_bar_lines, make_fixnum (lines)); - store_frame_param (f, Qheight, make_fixnum (FRAME_LINES (f))); - - /* We also have to make sure that the internal border at the top of - the frame, below the menu bar or tab bar, is redrawn when the - tab bar disappears. This is so because the internal border is - below the tab bar if one is displayed, but is below the menu bar - if there isn't a tab bar. The tab bar draws into the area - below the menu bar. */ + if (FRAME_X_WINDOW (f) && FRAME_TAB_BAR_HEIGHT (f) =3D=3D 0) { clear_frame (f); @@ -1664,25 +1657,21 @@ x_change_tab_bar_height (struct frame *f, int hei= ght) if ((height < old_height) && WINDOWP (f->tab_bar_window)) clear_glyph_matrix (XWINDOW (f->tab_bar_window)->current_matrix); =20 - /* Recalculate tabbar height. */ - f->n_tab_bar_rows =3D 0; - if (old_height =3D=3D 0 - && (!f->after_make_frame - || NILP (frame_inhibit_implied_resize) - || (CONSP (frame_inhibit_implied_resize) - && NILP (Fmemq (Qtab_bar_lines, frame_inhibit_implied_resize)))))= - f->tab_bar_redisplayed =3D f->tab_bar_resized =3D false; - - adjust_frame_size (f, -1, -1, - ((!f->tab_bar_resized - && (NILP (fullscreen =3D - get_frame_param (f, Qfullscreen)) - || EQ (fullscreen, Qfullwidth))) ? 1 - : (old_height =3D=3D 0 || height =3D=3D 0) ? 2 - : 4), - false, Qtab_bar_lines); - - f->tab_bar_resized =3D f->tab_bar_redisplayed; + if (!f->tab_bar_resized) + { + /* As long as tab_bar_resized is false, effectively try to change + F's native height. */ + if (NILP (fullscreen) || EQ (fullscreen, Qfullwidth)) + adjust_frame_size (f, FRAME_TEXT_WIDTH (f), FRAME_TEXT_HEIGHT (f), + 1, false, Qtab_bar_lines); + else + adjust_frame_size (f, -1, -1, 4, false, Qtab_bar_lines); + + f->tab_bar_resized =3D f->tab_bar_redisplayed; + } + else + /* Any other change may leave the native size of F alone. */ + adjust_frame_size (f, -1, -1, 3, false, Qtab_bar_lines); =20 /* adjust_frame_size might not have done anything, garbage frame here. */ @@ -1743,24 +1732,15 @@ x_change_tool_bar_height (struct frame *f, int he= ight) int unit =3D FRAME_LINE_HEIGHT (f); int old_height =3D FRAME_TOOL_BAR_HEIGHT (f); int lines =3D (height + unit - 1) / unit; - Lisp_Object fullscreen; + Lisp_Object fullscreen =3D get_frame_param (f, Qfullscreen); =20 /* Make sure we redisplay all windows in this frame. */ fset_redisplay (f); =20 - /* Recalculate tool bar and frame text sizes. */ FRAME_TOOL_BAR_HEIGHT (f) =3D height; FRAME_TOOL_BAR_LINES (f) =3D lines; - /* Store the `tool-bar-lines' and `height' frame parameters. */ store_frame_param (f, Qtool_bar_lines, make_fixnum (lines)); - store_frame_param (f, Qheight, make_fixnum (FRAME_LINES (f))); - - /* We also have to make sure that the internal border at the top of - the frame, below the menu bar or tool bar, is redrawn when the - tool bar disappears. This is so because the internal border is - below the tool bar if one is displayed, but is below the menu bar - if there isn't a tool bar. The tool bar draws into the area - below the menu bar. */ + if (FRAME_X_WINDOW (f) && FRAME_TOOL_BAR_HEIGHT (f) =3D=3D 0) { clear_frame (f); @@ -1770,25 +1750,21 @@ x_change_tool_bar_height (struct frame *f, int he= ight) if ((height < old_height) && WINDOWP (f->tool_bar_window)) clear_glyph_matrix (XWINDOW (f->tool_bar_window)->current_matrix); =20 - /* Recalculate toolbar height. */ - f->n_tool_bar_rows =3D 0; - if (old_height =3D=3D 0 - && (!f->after_make_frame - || NILP (frame_inhibit_implied_resize) - || (CONSP (frame_inhibit_implied_resize) - && NILP (Fmemq (Qtool_bar_lines, frame_inhibit_implied_resize))))= ) - f->tool_bar_redisplayed =3D f->tool_bar_resized =3D false; - - adjust_frame_size (f, -1, -1, - ((!f->tool_bar_resized - && (NILP (fullscreen =3D - get_frame_param (f, Qfullscreen)) - || EQ (fullscreen, Qfullwidth))) ? 1 - : (old_height =3D=3D 0 || height =3D=3D 0) ? 2 - : 4), - false, Qtool_bar_lines); - - f->tool_bar_resized =3D f->tool_bar_redisplayed; + if (!f->tool_bar_resized) + { + /* As long as tool_bar_resized is false, effectively try to change= + F's native height. */ + if (NILP (fullscreen) || EQ (fullscreen, Qfullwidth)) + adjust_frame_size (f, FRAME_TEXT_WIDTH (f), FRAME_TEXT_HEIGHT (f), + 1, false, Qtool_bar_lines); + else + adjust_frame_size (f, -1, -1, 4, false, Qtool_bar_lines); + + f->tool_bar_resized =3D f->tool_bar_redisplayed; + } + else + /* Any other change may leave the native size of F alone. */ + adjust_frame_size (f, -1, -1, 3, false, Qtool_bar_lines); =20 /* adjust_frame_size might not have done anything, garbage frame here. */ @@ -3687,7 +3663,6 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create= _frame, struct x_display_info *dpyinfo =3D NULL; Lisp_Object parent, parent_frame; struct kboard *kb; - int x_width =3D 0, x_height =3D 0; =20 parms =3D Fcopy_alist (parms); =20 @@ -3999,18 +3974,6 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_creat= e_frame, init_iterator with a null face cache, which should not happen. */ init_frame_faces (f); =20 - /* We have to call adjust_frame_size here since otherwise - x_set_tool_bar_lines will already work with the character sizes - installed by init_frame_faces while the frame's pixel size is still= - calculated from a character size of 1 and we subsequently hit the - (height >=3D 0) assertion in window_box_height. - - The non-pixelwise code apparently worked around this because it - had one frame line vs one toolbar line which left us with a zero - root window height which was obviously wrong as well ... - - Also process `min-width' and `min-height' parameters right here - because `frame-windows-min-size' needs them. */ tem =3D gui_display_get_arg (dpyinfo, parms, Qmin_width, NULL, NULL, RES_TYPE_NUMBER); if (FIXNUMP (tem)) @@ -4019,6 +3982,7 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create= _frame, RES_TYPE_NUMBER); if (FIXNUMP (tem)) store_frame_param (f, Qmin_height, tem); + adjust_frame_size (f, FRAME_COLS (f) * FRAME_COLUMN_WIDTH (f), FRAME_LINES (f) * FRAME_LINE_HEIGHT (f), 5, true, Qx_create_frame_1); @@ -4055,8 +4019,7 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create= _frame, RES_TYPE_BOOLEAN); =20 /* Compute the size of the X window. */ - window_prompting =3D gui_figure_window_size (f, parms, true, true, - &x_width, &x_height); + window_prompting =3D gui_figure_window_size (f, parms, true, true); =20 tem =3D gui_display_get_arg (dpyinfo, parms, Qunsplittable, 0, 0, RES_TYPE_BOOLEAN); @@ -4140,11 +4103,6 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_creat= e_frame, /* Consider frame official, now. */ f->can_set_window_size =3D true; =20 - if (x_width > 0) - SET_FRAME_WIDTH (f, x_width); - if (x_height > 0) - SET_FRAME_HEIGHT (f, x_height); - /* Tell the server what size and position, etc, we want, and how badly we want them. This should be done after we have the menu bar so that its size can be taken into account. */ @@ -6291,10 +6249,8 @@ x_create_tip_frame (struct x_display_info *dpyinfo= , Lisp_Object parms) struct frame *f; Lisp_Object frame; Lisp_Object name; - int width, height; ptrdiff_t count =3D SPECPDL_INDEX (); bool face_change_before =3D face_change; - int x_width =3D 0, x_height =3D 0; =20 if (!dpyinfo->terminal->name) error ("Terminal is not live, can't create new frames on it"); @@ -6418,7 +6374,7 @@ x_create_tip_frame (struct x_display_info *dpyinfo,= Lisp_Object parms) gui_default_parameter (f, parms, Qborder_width, make_fixnum (0), "borderWidth", "BorderWidth", RES_TYPE_NUMBER);= =20 - /* This defaults to 2 in order to match xterm. We recognize either + /* This defaults to 1 in order to match xterm. We recognize either internalBorderWidth or internalBorder (which is what xterm calls it). */ if (NILP (Fassq (Qinternal_border_width, parms))) @@ -6466,7 +6422,7 @@ x_create_tip_frame (struct x_display_info *dpyinfo,= Lisp_Object parms) "inhibitDoubleBuffering", "InhibitDoubleBufferi= ng", RES_TYPE_BOOLEAN); =20 - gui_figure_window_size (f, parms, false, false, &x_width, &x_height); + gui_figure_window_size (f, parms, false, false); =20 { XSetWindowAttributes attrs; @@ -6518,15 +6474,6 @@ x_create_tip_frame (struct x_display_info *dpyinfo= , Lisp_Object parms) gui_default_parameter (f, parms, Qalpha, Qnil, "alpha", "Alpha", RES_TYPE_NUMBER); =20 - /* Dimensions, especially FRAME_LINES (f), must be done via change_fra= me_size. - Change will not be effected unless different from the current - FRAME_LINES (f). */ - width =3D FRAME_COLS (f); - height =3D FRAME_LINES (f); - SET_FRAME_COLS (f, 0); - SET_FRAME_LINES (f, 0); - change_frame_size (f, width, height, true, false, false, false); - /* Add `tooltip' frame parameter's default value. */ if (NILP (Fframe_parameter (frame, Qtooltip))) { @@ -6588,6 +6535,8 @@ x_create_tip_frame (struct x_display_info *dpyinfo,= Lisp_Object parms) visible won't work. */ Vframe_list =3D Fcons (frame, Vframe_list); f->can_set_window_size =3D true; + adjust_frame_size (f, FRAME_TEXT_WIDTH (f), FRAME_TEXT_HEIGHT (f), + 0, true, Qtip_frame); =20 /* Setting attributes of faces of the tooltip frame from resources and similar will set face_change, which leads to the clearing of diff --git a/src/xmenu.c b/src/xmenu.c index a83fffbf1c..a6762236bc 100644 --- a/src/xmenu.c +++ b/src/xmenu.c @@ -641,7 +641,7 @@ update_frame_menubar (struct frame *f) lw_refigure_widget (x->column_widget, True); =20 /* Force the pane widget to resize itself. */ - adjust_frame_size (f, -1, -1, 2, false, Qupdate_frame_menubar); + adjust_frame_size (f, -1, -1, 2, false, Qmenu_bar_lines); unblock_input (); #endif /* USE_GTK */ } @@ -1044,6 +1044,7 @@ free_frame_menubar (struct frame *f) /* Motif automatically shrinks the frame in lw_destroy_all_widgets. If we want to preserve the old height, calculate it now so we can restore it below. */ + int old_width =3D FRAME_TEXT_WIDTH (f); int old_height =3D FRAME_TEXT_HEIGHT (f) + FRAME_MENUBAR_HEIGHT (f); #endif =20 @@ -1077,26 +1078,43 @@ free_frame_menubar (struct frame *f) lw_destroy_all_widgets ((LWLIB_ID) f->output_data.x->id); f->output_data.x->menubar_widget =3D NULL; =20 + /* When double-buffering is enabled and the frame shall not be + resized either because resizing is inhibited or the frame is + fullheight, some (usually harmless) display artifacts like a + doubled mode line may show up. Sometimes the configuration + gets messed up in a more serious fashion though and you may + have to resize the frame to get it back in a normal state. */ if (f->output_data.x->widget) { #ifdef USE_MOTIF XtVaGetValues (f->output_data.x->widget, XtNx, &x1, XtNy, &y1, NULL);= if (x1 =3D=3D 0 && y1 =3D=3D 0) XtVaSetValues (f->output_data.x->widget, XtNx, x0, XtNy, y0, NULL);= - if (frame_inhibit_resize (f, false, Qmenu_bar_lines)) - adjust_frame_size (f, -1, old_height, 1, false, Qfree_frame_menubar= _1); + /* When resizing is inhibited and a normal Motif frame is not + fullheight, we have to explicitly request its old sizes + here since otherwise turning off the menu bar will shrink + the frame but turning them on again will not resize it + back. For a fullheight frame we let the window manager + deal with this problem. */ + if (frame_inhibit_resize (f, false, Qmenu_bar_lines) + && !EQ (get_frame_param (f, Qfullscreen), Qfullheight)) + adjust_frame_size (f, old_width, old_height, 1, false, + Qmenu_bar_lines); else - adjust_frame_size (f, -1, -1, 2, false, Qfree_frame_menubar_1); + adjust_frame_size (f, -1, -1, 2, false, Qmenu_bar_lines); #else - adjust_frame_size (f, -1, -1, 2, false, Qfree_frame_menubar_1); + adjust_frame_size (f, -1, -1, 2, false, Qmenu_bar_lines); #endif /* USE_MOTIF */ } else { #ifdef USE_MOTIF if (WINDOWP (FRAME_ROOT_WINDOW (f)) - && frame_inhibit_resize (f, false, Qmenu_bar_lines)) - adjust_frame_size (f, -1, old_height, 1, false, Qfree_frame_menubar= _2); + /* See comment above. */ + && frame_inhibit_resize (f, false, Qmenu_bar_lines) + && !EQ (get_frame_param (f, Qfullscreen), Qfullheight)) + adjust_frame_size (f, old_width, old_height, 1, false, + Qmenu_bar_lines); #endif } =20 diff --git a/src/xterm.c b/src/xterm.c index 744b80c68a..220d611b78 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -7833,10 +7833,6 @@ x_net_wm_state (struct frame *f, Window window) break; } =20 - frame_size_history_add - (f, Qx_net_wm_state, 0, 0, - list2 (get_frame_param (f, Qfullscreen), lval)); - store_frame_param (f, Qfullscreen, lval); /** store_frame_param (f, Qsticky, sticky ? Qt : Qnil); **/ } @@ -8167,19 +8163,29 @@ handle_one_xevent (struct x_display_info *dpyinfo= , if (f && event->xproperty.atom =3D=3D dpyinfo->Xatom_net_wm_state)= { bool not_hidden =3D x_handle_net_wm_state (f, &event->xpropert= y); + if (not_hidden && FRAME_ICONIFIED_P (f)) { + if (CONSP (frame_size_history)) + frame_size_history_plain + (f, build_string ("PropertyNotify, not hidden & iconified")); + /* Gnome shell does not iconify us when C-z is pressed. It hides the frame. So if our state says we aren't hidden anymore, treat it as deiconified. */ SET_FRAME_VISIBLE (f, 1); SET_FRAME_ICONIFIED (f, false); + f->output_data.x->has_been_visible =3D true; inev.ie.kind =3D DEICONIFY_EVENT; XSETFRAME (inev.ie.frame_or_window, f); } - else if (! not_hidden && ! FRAME_ICONIFIED_P (f)) + else if (!not_hidden && !FRAME_ICONIFIED_P (f)) { + if (CONSP (frame_size_history)) + frame_size_history_plain + (f, build_string ("PropertyNotify, hidden & not iconified")); + SET_FRAME_VISIBLE (f, 0); SET_FRAME_ICONIFIED (f, true); inev.ie.kind =3D ICONIFY_EVENT; @@ -8357,10 +8363,17 @@ handle_one_xevent (struct x_display_info *dpyinfo= , and that way, we know the window is not iconified now. */ if (visible || FRAME_ICONIFIED_P (f)) { + if (CONSP (frame_size_history)) + frame_size_history_plain + (f, build_string ("UnmapNotify, visible | iconified")); + SET_FRAME_ICONIFIED (f, true); - inev.ie.kind =3D ICONIFY_EVENT; + inev.ie.kind =3D ICONIFY_EVENT; XSETFRAME (inev.ie.frame_or_window, f); } + else if (CONSP (frame_size_history)) + frame_size_history_plain + (f, build_string ("UnmapNotify, not visible & not iconified")); } goto OTHER; =20 @@ -8372,8 +8385,24 @@ handle_one_xevent (struct x_display_info *dpyinfo,= if (f) { bool iconified =3D FRAME_ICONIFIED_P (f); - - /* Check if fullscreen was specified before we where mapped th= e + int value; + bool sticky; + bool not_hidden =3D x_get_current_wm_state (f, event->xmap.win= dow, &value, &sticky); + + if (CONSP (frame_size_history)) + frame_size_history_extra + (f, + iconified + ? (not_hidden + ? build_string ("MapNotify, not hidden & iconified") + : build_string ("MapNotify, hidden & iconified")) + : (not_hidden + ? build_string ("MapNotify, not hidden & not iconified") + : build_string ("MapNotify, hidden & not iconified")), + FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f), + -1, -1, f->new_width, f->new_height); + + /* Check if fullscreen was specified before we where mapped the first time, i.e. from the command line. */ if (!f->output_data.x->has_been_visible) { @@ -8974,7 +9003,16 @@ handle_one_xevent (struct x_display_info *dpyinfo,= || !(configureEvent.xconfigure.width <=3D 1 && configureEvent.xconfigure.height <=3D 1))) { - block_input (); + + if (CONSP (frame_size_history)) + frame_size_history_extra + (f, build_string ("ConfigureNotify"), + FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f), + configureEvent.xconfigure.width, + configureEvent.xconfigure.height, + f->new_width, f->new_height); + + block_input (); if (FRAME_X_DOUBLE_BUFFERED_P (f)) font_drop_xrender_surfaces (f); unblock_input (); @@ -9015,24 +9053,28 @@ handle_one_xevent (struct x_display_info *dpyinfo= , =20 #ifndef USE_X_TOOLKIT #ifndef USE_GTK - int width =3D - FRAME_PIXEL_TO_TEXT_WIDTH (f, configureEvent.xconfigure.width); - int height =3D - FRAME_PIXEL_TO_TEXT_HEIGHT (f, configureEvent.xconfigure.height); + int width =3D configureEvent.xconfigure.width; + int height =3D configureEvent.xconfigure.height; + + if (CONSP (frame_size_history)) + frame_size_history_extra + (f, build_string ("ConfigureNotify"), + FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f), + width, height, f->new_width, f->new_height); =20 - /* In the toolkit version, change_frame_size + /* In the toolkit version, change_frame_size is called by the code that handles resizing of the EmacsFrame widget. */ =20 /* Even if the number of character rows and columns has not changed, the font size may have changed, so we need to check the pixel dimensions as well. */ - if (width !=3D FRAME_TEXT_WIDTH (f) - || height !=3D FRAME_TEXT_HEIGHT (f) - || configureEvent.xconfigure.width !=3D FRAME_PIXEL_WIDTH = (f) - || configureEvent.xconfigure.height !=3D FRAME_PIXEL_HEIGH= T (f)) + if (width !=3D FRAME_PIXEL_WIDTH (f) + || height !=3D FRAME_PIXEL_HEIGHT (f) + || (delayed_size_change + && (width !=3D f->new_width || height !=3D f->new_height))) { - change_frame_size (f, width, height, false, true, false, t= rue); + change_frame_size (f, width, height, false, true, false); x_clear_under_internal_border (f); SET_FRAME_GARBAGED (f); cancel_mouse_face (f); @@ -10217,11 +10259,6 @@ x_new_font (struct frame *f, Lisp_Object font_ob= ject, int fontset) { struct font *font =3D XFONT_OBJECT (font_object); int unit, font_ascent, font_descent; -#ifndef USE_X_TOOLKIT - int old_menu_bar_height =3D FRAME_MENU_BAR_HEIGHT (f); - int old_tab_bar_height =3D FRAME_TAB_BAR_HEIGHT (f); - Lisp_Object fullscreen; -#endif =20 if (fontset < 0) fontset =3D fontset_from_font (font_object); @@ -10239,8 +10276,9 @@ x_new_font (struct frame *f, Lisp_Object font_obj= ect, int fontset) =20 #ifndef USE_X_TOOLKIT FRAME_MENU_BAR_HEIGHT (f) =3D FRAME_MENU_BAR_LINES (f) * FRAME_LINE_HE= IGHT (f); - FRAME_TAB_BAR_HEIGHT (f) =3D FRAME_TAB_BAR_LINES (f) * FRAME_LINE_HEIG= HT (f); #endif + /* We could use a more elaborate calculation here. */ + FRAME_TAB_BAR_HEIGHT (f) =3D FRAME_TAB_BAR_LINES (f) * FRAME_LINE_HEIG= HT (f); =20 /* Compute character columns occupied by scrollbar. =20 @@ -10253,34 +10291,14 @@ x_new_font (struct frame *f, Lisp_Object font_o= bject, int fontset) else FRAME_CONFIG_SCROLL_BAR_COLS (f) =3D (14 + unit - 1) / unit; =20 - if (FRAME_X_WINDOW (f) !=3D 0) - { - /* Don't change the size of a tip frame; there's no point in - doing it because it's done in Fx_show_tip, and it leads to - problems because the tip frame has no widget. */ - if (!FRAME_TOOLTIP_P (f)) - { - adjust_frame_size (f, FRAME_COLS (f) * FRAME_COLUMN_WIDTH (f), - FRAME_LINES (f) * FRAME_LINE_HEIGHT (f), 3, - false, Qfont); -#ifndef USE_X_TOOLKIT - if ((FRAME_MENU_BAR_HEIGHT (f) !=3D old_menu_bar_height - || FRAME_TAB_BAR_HEIGHT (f) !=3D old_tab_bar_height) - && !f->after_make_frame - && (EQ (frame_inhibit_implied_resize, Qt) - || (CONSP (frame_inhibit_implied_resize) - && NILP (Fmemq (Qfont, frame_inhibit_implied_resize)))) - && (NILP (fullscreen =3D get_frame_param (f, Qfullscreen)) - || EQ (fullscreen, Qfullwidth))) - /* If the menu/tab bar height changes, try to keep text height - constant. */ - adjust_frame_size - (f, -1, FRAME_TEXT_HEIGHT (f) + FRAME_MENU_BAR_HEIGHT (f) - + FRAME_TAB_BAR_HEIGHT (f) - - old_menu_bar_height - old_tab_bar_height, 1, false, Qfont); -#endif /* USE_X_TOOLKIT */ - } - } + + /* Don't change the size of a tip frame; there's no point in doing it + because it's done in Fx_show_tip, and it leads to problems because + the tip frame has no widget. */ + if (FRAME_X_WINDOW (f) !=3D 0 && !FRAME_TOOLTIP_P (f)) + adjust_frame_size + (f, FRAME_COLS (f) * FRAME_COLUMN_WIDTH (f), + FRAME_LINES (f) * FRAME_LINE_HEIGHT (f), 3, false, Qfont); =20 #ifdef HAVE_X_I18N if (FRAME_XIC (f) @@ -11164,10 +11182,6 @@ x_handle_net_wm_state (struct frame *f, const XP= ropertyEvent *event) break; } =20 - frame_size_history_add - (f, Qx_handle_net_wm_state, 0, 0, - list2 (get_frame_param (f, Qfullscreen), lval)); - store_frame_param (f, Qfullscreen, lval); store_frame_param (f, Qsticky, sticky ? Qt : Qnil); =20 @@ -11222,9 +11236,6 @@ x_check_fullscreen (struct frame *f) emacs_abort (); } =20 - frame_size_history_add - (f, Qx_check_fullscreen, width, height, Qnil); - x_wm_set_size_hint (f, 0, false); =20 XResizeWindow (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), @@ -11234,8 +11245,7 @@ x_check_fullscreen (struct frame *f) x_wait_for_event (f, ConfigureNotify); else { - change_frame_size (f, width, height - FRAME_MENUBAR_HEIGHT (f), - false, true, false, true); + change_frame_size (f, width, height, false, true, false); x_sync (f); } } @@ -11389,57 +11399,12 @@ x_wait_for_event (struct frame *f, int eventtyp= e) x_set_window_size_1 (struct frame *f, bool change_gravity, int width, int height) { - int pixelwidth =3D FRAME_TEXT_TO_PIXEL_WIDTH (f, width); - int pixelheight =3D FRAME_TEXT_TO_PIXEL_HEIGHT (f, height); - int old_width =3D FRAME_PIXEL_WIDTH (f); - int old_height =3D FRAME_PIXEL_HEIGHT (f); - Lisp_Object fullscreen =3D get_frame_param (f, Qfullscreen); - if (change_gravity) f->win_gravity =3D NorthWestGravity; x_wm_set_size_hint (f, 0, false); =20 - /* When the frame is fullheight and we only want to change the width - or it is fullwidth and we only want to change the height we should - be able to preserve the fullscreen property. However, due to the - fact that we have to send a resize request anyway, the window - manager will abolish it. At least the respective size should - remain unchanged but giving the frame back its normal size will - be broken ... */ - if (EQ (fullscreen, Qfullwidth) && width =3D=3D FRAME_TEXT_WIDTH (f)) - { - frame_size_history_add - (f, Qx_set_window_size_1, width, height, - list2i (old_height, pixelheight + FRAME_MENUBAR_HEIGHT (f))); - - XResizeWindow (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), - old_width, pixelheight + FRAME_MENUBAR_HEIGHT (f)); - } - else if (EQ (fullscreen, Qfullheight) && height =3D=3D FRAME_TEXT_HEIG= HT (f)) - { - frame_size_history_add - (f, Qx_set_window_size_2, width, height, - list2i (old_width, pixelwidth)); - - XResizeWindow (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), - pixelwidth, old_height); - } - - else - { - frame_size_history_add - (f, Qx_set_window_size_3, width, height, - list3i (pixelwidth + FRAME_TOOLBAR_WIDTH (f), - (pixelheight + FRAME_TOOLBAR_HEIGHT (f) - + FRAME_MENUBAR_HEIGHT (f)), - FRAME_MENUBAR_HEIGHT (f))); - - XResizeWindow (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), - pixelwidth, pixelheight + FRAME_MENUBAR_HEIGHT (f)); - fullscreen =3D Qnil; - } - - + XResizeWindow (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), + width, height + FRAME_MENUBAR_HEIGHT (f)); =20 /* We've set {FRAME,PIXEL}_{WIDTH,HEIGHT} to the values we hope to receive in the ConfigureNotify event; if we get what we asked @@ -11468,66 +11433,42 @@ x_set_window_size_1 (struct frame *f, bool chan= ge_gravity, { x_wait_for_event (f, ConfigureNotify); =20 - if (!NILP (fullscreen)) - /* Try to restore fullscreen state. */ - { - store_frame_param (f, Qfullscreen, fullscreen); - gui_set_fullscreen (f, fullscreen, fullscreen); - } + if (CONSP (frame_size_history)) + frame_size_history_extra + (f, build_string ("x_set_window_size_1, visible"), + FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f), width, height, + f->new_width, f->new_height); } else { - change_frame_size (f, width, height, false, true, false, true); + if (CONSP (frame_size_history)) + frame_size_history_extra + (f, build_string ("x_set_window_size_1, invisible"), + FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f), width, height, + f->new_width, f->new_height); + + /* Call adjust_frame_size right away as with GTK. It might be + tempting to clear out f->new_width and f->new_height here. */ + adjust_frame_size (f, FRAME_PIXEL_TO_TEXT_WIDTH (f, width), + FRAME_PIXEL_TO_TEXT_HEIGHT (f, height), + 5, 0, Qx_set_window_size_1); + x_sync (f); } } =20 =20 -/* Call this to change the size of frame F's x-window. - If CHANGE_GRAVITY, change to top-left-corner window gravity - for this size change and subsequent size changes. - Otherwise we leave the window gravity unchanged. */ +/* Change the size of frame F's X window to WIDTH and HEIGHT pixels. If= + CHANGE_GRAVITY, change to top-left-corner window gravity for this + size change and subsequent size changes. Otherwise we leave the + window gravity unchanged. */ =20 void x_set_window_size (struct frame *f, bool change_gravity, - int width, int height, bool pixelwise) + int width, int height) { block_input (); =20 - /* The following breaks our calculations. If it's really needed, - think of something else. */ -#if false - if (!FRAME_TOOLTIP_P (f)) - { - int text_width, text_height; - - /* When the frame is maximized/fullscreen or running under for - example Xmonad, x_set_window_size_1 will be a no-op. - In that case, the right thing to do is extend rows/width to - the current frame size. We do that first if x_set_window_size_= 1 - turns out to not be a no-op (there is no way to know). - The size will be adjusted again if the frame gets a - ConfigureNotify event as a result of x_set_window_size. */ - int pixelh =3D FRAME_PIXEL_HEIGHT (f); -#ifdef USE_X_TOOLKIT - /* The menu bar is not part of text lines. The tool bar - is however. */ - pixelh -=3D FRAME_MENUBAR_HEIGHT (f); -#endif - text_width =3D FRAME_PIXEL_TO_TEXT_WIDTH (f, FRAME_PIXEL_WIDTH (f)= ); - text_height =3D FRAME_PIXEL_TO_TEXT_HEIGHT (f, pixelh); - - change_frame_size (f, text_width, text_height, false, true, false,= true); - } -#endif - - /* Pixelize width and height, if necessary. */ - if (! pixelwise) - { - width =3D width * FRAME_COLUMN_WIDTH (f); - height =3D height * FRAME_LINE_HEIGHT (f); - } - #ifdef USE_GTK if (FRAME_GTK_WIDGET (f)) xg_frame_set_char_size (f, width, height); @@ -11880,6 +11821,11 @@ x_make_frame_visible (struct frame *f) poll_for_input_1 (); poll_suppress_count =3D old_poll_suppress_count; #endif + + if (CONSP (frame_size_history)) + frame_size_history_plain + (f, build_string ("x_make_frame_visible")); + if (! FRAME_VISIBLE_P (f)) x_wait_for_event (f, MapNotify); } @@ -11937,6 +11883,10 @@ x_make_frame_invisible (struct frame *f) SET_FRAME_VISIBLE (f, 0); SET_FRAME_ICONIFIED (f, false); =20 + if (CONSP (frame_size_history)) + frame_size_history_plain + (f, build_string ("x_make_frame_invisible")); + unblock_input (); } =20 diff --git a/src/xterm.h b/src/xterm.h index ebc42b7dd5..de6ea50385 100644 --- a/src/xterm.h +++ b/src/xterm.h @@ -1079,7 +1079,7 @@ #define SELECTION_EVENT_TIME(eventp) \ extern void x_uncatch_errors (void); extern void x_uncatch_errors_after_check (void); extern void x_clear_errors (Display *); -extern void x_set_window_size (struct frame *f, bool, int, int, bool); +extern void x_set_window_size (struct frame *f, bool, int, int); extern void x_make_frame_visible (struct frame *f); extern void x_make_frame_invisible (struct frame *f); extern void x_iconify_frame (struct frame *f); --------------607A204092882D8F045C76C8--