From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: =?UTF-8?B?6buE5bu65b+g?= Newsgroups: gmane.emacs.devel Subject: Re: A patch for enforcing double-width CJK character display Date: Fri, 13 Apr 2012 01:56:15 +0800 Message-ID: <4F87173F.3070801@i-soft.com.cn> References: <4F85A138.6090900@i-soft.com.cn> <87vcl646c7.fsf@isil.kanru.info> <4F85AE69.9050002@i-soft.com.cn> <4F8698B0.2030703@i-soft.com.cn> <83hawp46p7.fsf@gnu.org> <4F86BA0F.4080301@i-soft.com.cn> <83ehrt3u0p.fsf@gnu.org> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------070404090000020804090509" X-Trace: dough.gmane.org 1334253410 24789 80.91.229.3 (12 Apr 2012 17:56:50 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Thu, 12 Apr 2012 17:56:50 +0000 (UTC) Cc: kanru@kanru.info, emacs-devel@gnu.org To: Eli Zaretskii Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Thu Apr 12 19:56:49 2012 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1SIOGG-0007XQ-Ur for ged-emacs-devel@m.gmane.org; Thu, 12 Apr 2012 19:56:49 +0200 Original-Received: from localhost ([::1]:44527 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SIOGG-0000L2-D1 for ged-emacs-devel@m.gmane.org; Thu, 12 Apr 2012 13:56:48 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:34723) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SIOGC-0000Kw-Sz for emacs-devel@gnu.org; Thu, 12 Apr 2012 13:56:46 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SIOGA-0003NR-Ju for emacs-devel@gnu.org; Thu, 12 Apr 2012 13:56:44 -0400 Original-Received: from mta319.sina.net ([202.108.3.196]:11660) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SIOG2-0003Jf-TG; Thu, 12 Apr 2012 13:56:35 -0400 X-Originating-IP: [111.161.71.1] Original-Received: from unknown (HELO mta319.sina.net) ([10.54.5.137]) by irxd5-208.sina.net with ESMTP; 13 Apr 2012 01:56:23 +0800 Original-Received: by smtp-5-137.sina.net (SINAMAIL, from userid 6663) id 1623C35300C; Fri, 13 Apr 2012 01:56:24 +0800 (CST) Original-Received: from piggy.pure64.org (unknown [111.161.71.1]) by smtp-5-137.sina.net (SINAMAIL) with ESMTPA id CC7AE353020; Fri, 13 Apr 2012 01:56:23 +0800 (CST) User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.2) Gecko/20120327 Thunderbird/10.0.2 In-Reply-To: <83ehrt3u0p.fsf@gnu.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 202.108.3.196 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 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.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:149615 Archived-At: This is a multi-part message in MIME format. --------------070404090000020804090509 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi, Eli, Many many thinks, your suggestion is really very very great. Now we can get the frame font width no matter it is default, remapped or rescaled. I updated the patch as you suggested, other changes also include in attachment: 1, remove "default_font_width" global variable, get font width from FRAME_PTR as you sugguested. 2, pass FRAME_PTR to every xftfont_info structure, we can use it anywhere. 3, add a feild "is_cjk" to "xftfont_info" structure, initialize it when xftfont_open, avoid call "is_cjk_font" many times when draw and extents calculation. Now, it works very well with font remapping, rescaling. 于 2012年04月12日 22:27, Eli Zaretskii 写道: >> Date: Thu, 12 Apr 2012 19:18:39 +0800 >> From: 黄建忠 >> CC: kanru@kanru.info, emacs-devel@gnu.org >> >>>> Can anybody provide a clue how to catch the new width of default font >>>> via FRAME_PTR when scale happened? >>> I don't think there is a way to do that, if all you have is the frame >>> pointer. text-scale-mode does not modify the frame's default font, it >>> remaps the 'default' face to another face which specifies a larger or >>> a smaller font. So the way to find the width of the font after >>> scaling is to get hold of the font itself, or of the face to which >>> 'default' was remapped. Then you can use FONT_WIDTH, I think (but I >>> didn't test this). >> I can get the default font(the first font loaded when frame be >> initialized) via FRAME_FONT, it's great that it can not be changed after >> first font loaded. >> But I still can not get the current width after scale, since the props >> of FRAME_FONT also not be changed. >> [...] >> I noticed there were some global Lisp_Object such as >> "f_Vface_font_rescale_alist"/"f_Vface_remapping_alist"/"f_Vface_new_frame_defaults", >> maybe I can use them, Hope so. > This will retrieve the numerical ID of the default face on frame F: > > int id = lookup_basic_face (F, DEFAULT_FACE_ID); > > lookup_basic_face consults f_Vface_remapping_alist. If the value of > id above is different from DEFAULT_FACE_ID, that means the default > face was remapped. Then you can get the remapped face like this: > > struct face *face = FACE_FROM_ID (F, id); > > Now the font of the face is available as > > struct font *font = face->font; > > And I think FONT_WIDTH (font) will give you the width you want to use > instead of FRAME_COLUMN_WIDTH. > > Again, this is 100% untested. Good luck! > > --------------070404090000020804090509 Content-Type: text/plain; name="emacs-cjk-monospace-v8.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="emacs-cjk-monospace-v8.patch" LS0tIGVtYWNzLTI0LjEuNTAvc3JjL3hmdGZvbnQuYwkyMDEyLTA0LTEzIDAwOjQ3OjE2Ljcw MzU5ODkyOSArMDgwMAorKysgZW1hY3MtMjQuMS41MC5jamsvc3JjL3hmdGZvbnQuYwkyMDEy LTA0LTEzIDAwOjUwOjAyLjkwOTYwODU1MSArMDgwMApAQCAtNjEsNiArNjEsOCBAQAogICBE aXNwbGF5ICpkaXNwbGF5OwogICBpbnQgc2NyZWVuOwogICBYZnRGb250ICp4ZnRmb250Owor ICBGUkFNRV9QVFIgZnJhbWU7IC8qIGhvbGQgZnJhbWUgcHRyLCBjamsgZG91YmxlIHdpZHRo IGZpeCBuZWVkIGl0ICovCisgIGludCBpc19jams7IC8qIEZsYWcgdG8gdGVsbCBpZiBpdCBp cyBDSksgZm9udCBvciBub3QuICovCiB9OwogCiAvKiBTdHJ1Y3R1cmUgcG9pbnRlZCBieSAo c3RydWN0IGZhY2UgKiktPmV4dHJhICAqLwpAQCAtMTM3LDYgKzEzOSw2MiBAQAogfQogCiAK K3N0YXRpYyBpbnQgaXNfY2prX2ZvbnQoc3RydWN0IHhmdGZvbnRfaW5mbyAqKTsKK3N0YXRp YyBpbnQgY2FsY19jamtfcGFkZGluZyhpbnQsIGludCk7CitzdGF0aWMgaW50IGZyYW1lX2Rl ZmF1bHRfZm9udF93aWR0aChGUkFNRV9QVFIpOworCisvKiBDaGVjayB3aGV0aGVyIHRoZSBm b250IGNvbnRhaW5zIENKSyBJZGVvZ3JhcGggJ251bWJlciBvbmUnLCAweDRFMDAsCisgICBJ dCBzaG91bGQgYmUgb2sgZm9yIENoaW5lc2UvSmFwYW5lc2UgZm9udC4KKyAgIE9yIGZvbnQg Y29udGFpbnMgS29yZWFuIHNjcmlwdCBzeWxsYWJsZSAnS2EnLDB4QUMwMCwKKyAgIGJlY2F1 c2UgS29yZWFuIGZvbnRzIG1heSBub3QgaGF2ZSBhbnkgQ2hpbmVzZSBjaGFyYWN0ZXJzIGF0 IGFsbC4KKyAgIGNvZGVzIGZyb20geHRlcm0uKi8KK3N0YXRpYyBpbnQKK2lzX2Nqa19mb250 KHN0cnVjdCB4ZnRmb250X2luZm8gKnhmdGZvbnRfaW5mbykKK3sKKyAgaWYoWGZ0Q2hhckV4 aXN0cyh4ZnRmb250X2luZm8tPmRpc3BsYXksIHhmdGZvbnRfaW5mby0+eGZ0Zm9udCwgMHg0 RTAwKSB8fAorICAgICAgWGZ0Q2hhckV4aXN0cyh4ZnRmb250X2luZm8tPmRpc3BsYXksIHhm dGZvbnRfaW5mby0+eGZ0Zm9udCwgMHhBQzAwKSkKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJu IDA7IAorfQorCisvKiBDYWN1bGF0ZSB0aGUgcGFkZGluZyBhY2NvcmRpbmcgdG8gZGVmYXVs dCBmb250IHdpZHRoICovCitzdGF0aWMgaW50CitjYWxjX2Nqa19wYWRkaW5nKGludCBkZWZh dWx0X2ZvbnRfd2lkdGgsIGludCBjaGFyX3dpZHRoKQoreworICBpbnQgcGFkZGluZyA9IDA7 CisgIGlmKCBkZWZhdWx0X2ZvbnRfd2lkdGggPT0gMCB8fCAvKiBkZWZhdWx0IGZvbnQgaXMg bm90IG1vbm9zcGFjZSAqLworICAgICAgY2hhcl93aWR0aCA8IGRlZmF1bHRfZm9udF93aWR0 aCB8fCAvKiBhbG1vc3QgaW1wb3NzaWJsZSAqLworICAgICAgY2hhcl93aWR0aCA9PSBkZWZh dWx0X2ZvbnRfd2lkdGgpIC8qIGFscmVhZHkgZ29vZCAqLworICAgIHJldHVybiAwOworICAv KiBnZXQgdGhlIHBhZGRpbmcsIGFsbCBjamsgc3ltYm9scyBpcyBET1VCTEUgd2lkdGggKi8K KyAgcGFkZGluZyA9IGRlZmF1bHRfZm9udF93aWR0aCAqIDIgLSBjaGFyX3dpZHRoOworICAv KiAxLCBTb21lIG9sZCBDSksgcGNmIGZvbnRzIG1heSBiaWdnZXIgdGhhbiAyKmRlZmF1bHRf Zm9udF93aWR0aC4KKyAgICAgMiwgVXNlciBtYXkgc2V0IGEgdmVyeSBiaWcgZm9udCBzaXpl IGZvciBzY3JpcHQgSEFOIG1hbnVhbGx5LgorICAgICBLZWVwIGl0IHVuY2hhbmdlZCwgTk9U IGFkanVzdCBkZWZhdWx0IGZvbnQgd2lkdGguICovCisgIHJldHVybiBwYWRkaW5nID4gMCA/ IHBhZGRpbmcgOiAwOyAgICAgICAgICAgICAgICAgICAKK30KKworLyogCisgICBHZXQgdGhl IHdpZHRoIG9mIGRlZmF1bHQgZm9udCBmcm9tIEZSQU1FX1BUUi4KKyAgIElmIGl0IGlzIG1v bm9zcGFjZSBmb250LCByZXR1cm4gdGhlIHNwYWNlX3dpZHRoKGFzIHNhbWUgYXMgZm9udCB3 aWR0aCkKKyAgIGVsc2UgcmV0dXJuIDAuCisgICBmb250IHJlbWFwIGNhbiBiZSBzdXBwb3J0 ZWQgbm93LgorICAgVGhhbmtzIHRvIEVsaS4gKi8KK3N0YXRpYyBpbnQgCitmcmFtZV9kZWZh dWx0X2ZvbnRfd2lkdGgoRlJBTUVfUFRSIGYpCit7CisgIGludCBpZCA9IGxvb2t1cF9iYXNp Y19mYWNlIChmLCBERUZBVUxUX0ZBQ0VfSUQpOworICBzdHJ1Y3QgZmFjZSAqZmFjZSA9IEZB Q0VfRlJPTV9JRCAoZiwgaWQpOworICBpZihmYWNlICYmIGZhY2UtPmZvbnQpIHsKKyAgICBM aXNwX09iamVjdCBmb250X29iamVjdDsKKyAgICBYU0VURk9OVCAoZm9udF9vYmplY3QsIGZh Y2UtPmZvbnQpOworICAgIGlmKFhJTlQoQVJFRiAoZm9udF9vYmplY3QsIEZPTlRfU1BBQ0lO R19JTkRFWCkpICE9IEZPTlRfU1BBQ0lOR19NT05PKQorICAgICAgcmV0dXJuIDA7CisgICAg cmV0dXJuIGZhY2UtPmZvbnQtPnNwYWNlX3dpZHRoOyAKKyAgfQorICByZXR1cm4gMDsKK30K Kwogc3RhdGljIExpc3BfT2JqZWN0IHhmdGZvbnRfbGlzdCAoTGlzcF9PYmplY3QsIExpc3Bf T2JqZWN0KTsKIHN0YXRpYyBMaXNwX09iamVjdCB4ZnRmb250X21hdGNoIChMaXNwX09iamVj dCwgTGlzcF9PYmplY3QpOwogc3RhdGljIExpc3BfT2JqZWN0IHhmdGZvbnRfb3BlbiAoRlJB TUVfUFRSLCBMaXNwX09iamVjdCwgaW50KTsKQEAgLTQzNCw2ICs0OTIsMTQgQEAKICAgICAg IFhmdFRleHRFeHRlbnRzOCAoZGlzcGxheSwgeGZ0Zm9udCwgYXNjaWlfcHJpbnRhYmxlICsg MSwgOTQsICZleHRlbnRzKTsKICAgICAgIGZvbnQtPmF2ZXJhZ2Vfd2lkdGggPSAoZm9udC0+ c3BhY2Vfd2lkdGggKyBleHRlbnRzLnhPZmYpIC8gOTU7CiAgICAgfQorCisgIC8qIHRvIGZp eCBDSksgZG91YmxlIHdpZHRoIGFsaWdubWVudCBpc3N1ZS4KKyAgICAgcGFzcyBGUkFNRV9Q VFIgdG8gZXZlcnkgeGZ0Zm9udF9pbmZvIHN0cnVjdHVyZSwKKyAgICAgd2UgY2FuIG5vdCBn ZXQgaXQgaW4gInhmdGZvbnRfdGV4dF9leHRlbnRzIi4gKi8KKyAgeGZ0Zm9udF9pbmZvLT5m cmFtZSA9IGY7CisgIC8qIG1hcmsgaXQgaXMgQ0pLIGZvbnQgb3Igbm90IHdoZW4gZm9udCBv cGVuZWQsCisgICAgIGF2b2lkIGNhbGxpbmcgImlzX2Nqa19mb250IiBtYW55IHRpbWVzLiAq LworICB4ZnRmb250X2luZm8tPmlzX2NqayA9IGlzX2Nqa19mb250KHhmdGZvbnRfaW5mbyk7 CiAgIFVOQkxPQ0tfSU5QVVQ7CiAKICAgZm9udC0+YXNjZW50ID0geGZ0Zm9udC0+YXNjZW50 OwpAQCAtNTkzLDIwICs2NTksMjcgQEAKIHsKICAgc3RydWN0IHhmdGZvbnRfaW5mbyAqeGZ0 Zm9udF9pbmZvID0gKHN0cnVjdCB4ZnRmb250X2luZm8gKikgZm9udDsKICAgWEdseXBoSW5m byBleHRlbnRzOwotCisgIGludCBjamtfcGFkZGluZyA9IDA7CisgIGludCBsX3BhZGRpbmcg PSAwOworICBpbnQgcl9wYWRkaW5nID0gMDsKICAgQkxPQ0tfSU5QVVQ7CiAgIFhmdEdseXBo RXh0ZW50cyAoeGZ0Zm9udF9pbmZvLT5kaXNwbGF5LCB4ZnRmb250X2luZm8tPnhmdGZvbnQs IGNvZGUsIG5nbHlwaHMsCiAJCSAgICZleHRlbnRzKTsKKyAgaWYoeGZ0Zm9udF9pbmZvLT5p c19jamspCisgICAgY2prX3BhZGRpbmcgPSBjYWxjX2Nqa19wYWRkaW5nKGZyYW1lX2RlZmF1 bHRfZm9udF93aWR0aCh4ZnRmb250X2luZm8tPmZyYW1lKSwgZXh0ZW50cy54T2ZmKTsKKyAg LyogY2prX3BhZGRpbmcgbWF5IGVxdWFscyB0byAwLCB0aGVuIGFsbCBpcyB6ZXJvLCBzdGls bCBvayAqLworICBsX3BhZGRpbmcgPSBjamtfcGFkZGluZyA+PiAxOyAvKiBnZXQgaGFsZiAq LworICByX3BhZGRpbmcgPSBjamtfcGFkZGluZyAtIGxfcGFkZGluZzsgLyogbWF5IG5vdCBk aXZpZGVkIGJ5IDIgZXhhY3RseSAqLyAKICAgVU5CTE9DS19JTlBVVDsKICAgaWYgKG1ldHJp Y3MpCiAgICAgewotICAgICAgbWV0cmljcy0+bGJlYXJpbmcgPSAtIGV4dGVudHMueDsKLSAg ICAgIG1ldHJpY3MtPnJiZWFyaW5nID0gLSBleHRlbnRzLnggKyBleHRlbnRzLndpZHRoOwot ICAgICAgbWV0cmljcy0+d2lkdGggPSBleHRlbnRzLnhPZmY7CisgICAgICBtZXRyaWNzLT5s YmVhcmluZyA9IC0gZXh0ZW50cy54IC0gbF9wYWRkaW5nOworICAgICAgbWV0cmljcy0+cmJl YXJpbmcgPSAtIGV4dGVudHMueCArIGV4dGVudHMud2lkdGggKyByX3BhZGRpbmc7CisgICAg ICBtZXRyaWNzLT53aWR0aCA9IGV4dGVudHMueE9mZiArIGNqa19wYWRkaW5nOwogICAgICAg bWV0cmljcy0+YXNjZW50ID0gZXh0ZW50cy55OwogICAgICAgbWV0cmljcy0+ZGVzY2VudCA9 IGV4dGVudHMuaGVpZ2h0IC0gZXh0ZW50cy55OwogICAgIH0KLSAgcmV0dXJuIGV4dGVudHMu eE9mZjsKKyAgcmV0dXJuIGV4dGVudHMueE9mZiArIGNqa19wYWRkaW5nOwogfQogCiBzdGF0 aWMgWGZ0RHJhdyAqCkBAIC02NjQsOSArNzM3LDI4IEBACiAgICAgZm9yIChpID0gMDsgaSA8 IGxlbjsgaSsrKQogICAgICAgWGZ0RHJhd0dseXBocyAoeGZ0X2RyYXcsICZmZywgeGZ0Zm9u dF9pbmZvLT54ZnRmb250LAogCQkgICAgIHggKyBpLCB5LCBjb2RlICsgaSwgMSk7Ci0gIGVs c2UKLSAgICBYZnREcmF3R2x5cGhzICh4ZnRfZHJhdywgJmZnLCB4ZnRmb250X2luZm8tPnhm dGZvbnQsCi0JCSAgIHgsIHksIGNvZGUsIGxlbik7CisgIGVsc2UgeworICAgICAgaWYoIXhm dGZvbnRfaW5mby0+aXNfY2prKQorICAgICAgICBYZnREcmF3R2x5cGhzICh4ZnRfZHJhdywg JmZnLCB4ZnRmb250X2luZm8tPnhmdGZvbnQsIHgsIHksIGNvZGUsIGxlbik7CisgICAgICBl bHNlIHsgCisgICAgICAgICAvKiBkcmF3IENKSyBnbHlwaHMgb25lIGJ5IG9uZSBhbmQgYWRq dXN0IHRoZSBvZmZzZXQgKi8KKyAgICAgICAgIGludCBkZWZhdWx0X2ZvbnRfd2lkdGggPSBm cmFtZV9kZWZhdWx0X2ZvbnRfd2lkdGgoeGZ0Zm9udF9pbmZvLT5mcmFtZSk7CisgICAgICAg ICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgaW50IGNqa19wYWRk aW5nID0gMDsKKyAgICAgICAgICAgaW50IG9mZnNldCA9IDA7CisgICAgICAgICAgIFhHbHlw aEluZm8gZXh0ZW50czsKKyAgICAgICAgICAgWGZ0R2x5cGhFeHRlbnRzICh4ZnRmb250X2lu Zm8tPmRpc3BsYXksIHhmdGZvbnRfaW5mby0+eGZ0Zm9udCwgY29kZStpLCAxLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICZleHRlbnRzKTsKKyAgICAgICAgICAgY2prX3BhZGRp bmcgPSBjYWxjX2Nqa19wYWRkaW5nKGRlZmF1bHRfZm9udF93aWR0aCxleHRlbnRzLnhPZmYp OworICAgICAgICAgICBpZihjamtfcGFkZGluZykKKyAgICAgICAgICAgICBvZmZzZXQgPSBk ZWZhdWx0X2ZvbnRfd2lkdGggKiBpICogMiArIChjamtfcGFkZGluZz4+MSk7CisgICAgICAg ICAgIGVsc2UgCisgICAgICAgICAgICAgb2Zmc2V0ID0gZXh0ZW50cy54T2ZmICogaTsgCisg ICAgICAgICAgIFhmdERyYXdHbHlwaHMgKHhmdF9kcmF3LCAmZmcsIHhmdGZvbnRfaW5mby0+ eGZ0Zm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4K29mZnNldCwgeSwgY29k ZStpLCAxKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgfQogICBVTkJMT0NLX0lOUFVUOwog CiAgIHJldHVybiBsZW47Cg== --------------070404090000020804090509--