From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Po Lu via "Bug reports for GNU Emacs, the Swiss army knife of text editors" Newsgroups: gmane.emacs.bugs Subject: bug#64440: 30.0.50; [PATCH] Highlight on non toolkit menu bar items Date: Tue, 12 Sep 2023 19:26:20 +0800 Message-ID: <87wmwv7hur.fsf@yahoo.com> References: <87zg4d56l8.fsf@ledu-giraud.fr> <87ilaz1wol.fsf@ledu-giraud.fr> <87fs3xo13z.fsf@yahoo.com> <83zg259iwz.fsf@gnu.org> <878r9losil.fsf@ledu-giraud.fr> <83tts2scvp.fsf@gnu.org> <87cyyo28m0.fsf@ledu-giraud.fr> <83cyyorfnr.fsf@gnu.org> <87r0n4sqm8.fsf@ledu-giraud.fr> <835y4gr9ao.fsf@gnu.org> <87jzswsfmi.fsf@ledu-giraud.fr> <83v8cgplqo.fsf@gnu.org> <87sf7kh1rg.fsf@ledu-giraud.fr> Reply-To: Po Lu Mime-Version: 1.0 Content-Type: text/plain Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="7559"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Cc: Eli Zaretskii , stefankangas@gmail.com, 64440@debbugs.gnu.org To: Manuel Giraud Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Tue Sep 12 13:27:10 2023 Return-path: Envelope-to: geb-bug-gnu-emacs@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 1qg1Xy-0001kK-58 for geb-bug-gnu-emacs@m.gmane-mx.org; Tue, 12 Sep 2023 13:27:10 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qg1Xo-0002uj-1e; Tue, 12 Sep 2023 07:27:00 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qg1Xm-0002rc-IR for bug-gnu-emacs@gnu.org; Tue, 12 Sep 2023 07:26:58 -0400 Original-Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qg1Xl-0007xd-R4 for bug-gnu-emacs@gnu.org; Tue, 12 Sep 2023 07:26:57 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1qg1Xq-0004WB-Cf for bug-gnu-emacs@gnu.org; Tue, 12 Sep 2023 07:27:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Po Lu Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 12 Sep 2023 11:27:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 64440 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 64440-submit@debbugs.gnu.org id=B64440.169451800517343 (code B ref 64440); Tue, 12 Sep 2023 11:27:02 +0000 Original-Received: (at 64440) by debbugs.gnu.org; 12 Sep 2023 11:26:45 +0000 Original-Received: from localhost ([127.0.0.1]:56293 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qg1XZ-0004Vf-3n for submit@debbugs.gnu.org; Tue, 12 Sep 2023 07:26:45 -0400 Original-Received: from sonic307-56.consmr.mail.ne1.yahoo.com ([66.163.190.31]:42996) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qg1XX-0004VQ-76 for 64440@debbugs.gnu.org; Tue, 12 Sep 2023 07:26:44 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1694517993; bh=5R2IJfpVT3S8aTuVN5lj0hIcOxdbDeZr8gxXjCHmbIQ=; h=From:To:Cc:Subject:In-Reply-To:References:Date:From:Subject:Reply-To; b=XEMt3MxxCe4YcTjkk+VVda1RqvDqvEFR8PCCjwuEAicWTEhtk2cEVOxzcnyaCOCB5sjYLxV+PFrz0JG4jxcff/HbOz1Q1CKFGez1SNODObiXWXsagDF3YVdul4co7KT9OZBQLS7ITsFHmpKbNzeBeA4yJTt1Z/UxqX5QT5UXxZuTUuQUXwkMTTfa+eA2yZJJfk2T0xuReejAn8WBNcZuv24NMfIS/P2YBbfMVf1cb9cTfx3Ya6zaYQzSUvUa0xHmRkQlqh8BAbc+I13PscEuVt23O8f7QpDPSuqAUE9Ahu+DypKMh5VRPIokEjJmnTpJVUoheVZCL+JDGVUL6UmwTA== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1694517993; bh=o8b5t3R8IB0iTo2gsGGae7cFxxhg9Zq6nSExN8Gw6ns=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=s+K/H9R3HO1ejCDrDhyBM0Qi6gmXr4RspHW073Jf55CO/2HVISnO7dwVdBfKkZqGFjDYvqOWMiy9R704R2nmHm4oMq1w81AQyVc27d1ZGUQIseZVVjBAF6xlZ3RQEEDg+ZMq8aDGPuTcleL/hE88vDzLn8/7hKUZWxRvoFVRcbFzgSv8UsH0VhQ5oT7Nd42w4j9CpGea8d+mU7MGbVKa5fpYJ+tRRgRfmOwDsTj+FxM5vGPnwgMdMRfj6NC9T2FqulANozdPbwnX5uW8UUsLHwK+OvOU+UHPTctssAcXxrLhLxHDd16hikv/qGpsZXbpR4nx94st7DGlc0TpKNE+bg== X-YMail-OSG: KIbhgXkVM1n6frbRO8j3caKIE9n7mCdHCi_DYgzi3o3h9k43xl7zlk_h1FK_i3H mwMOfRQr5KATrGifREgX602iasYSzCkhkxmftX3fhoJEPP0cdIr.e1z2ncX61xmAGONjDrsFcYZQ iu24KeFroWpspZR06WEOFxrLq1MYm.GCVDJwyNdvhZn.ujq4FbmJF.9Mn.si1veADrgKitXbP3t_ MSH0oWaQdZHX7liQuAL4ifN0iXAJc.Q3dO.BZ7bredJymqf.btNcnS9K221zY6LhELrmRarEEwhI izGq5s5g6wQikTB7INXZ0hhUg4LRJq5_L4x6_FBx7NwhKa2oRn789ckUyRftBQFC6P8CS6SmbOeq NLTySaucJfBYmRjKBy3RI1s54voWXSNx46WMq9wr1wZ8kwnGfrUX7USxBDoivKX9OTG2iIt7RSal CgIvlJumPI4ey_Ab9zHCJFHX.UMGzo3lWw54miPwt9y4U_iq5WN.HkXPsSKpfBJloIuvzBBHuKU5 WKDfedrba_eXLjDBs38sE1JuEMCfD9TtYDxrCA83kBBMNRgH7TfgJpccBjEurgZtn9uHcGdQnn2. FNae0_5Oq_kdQg6sL79FvxE8vt6cZKgUZBZ1K74YPrZ4L4rT27XBuGyvWkDgRBWd9A_CtYpzlVWq cB_EKswkEjUzT6Wg29zIWGG1S7RZwud6jqMMpGpnzDnyWRfqCMk4bAKcoQud7lEhw5l4TNo7cM.n BBsuU327NIoCiRK7zCqcyZt1Na2Eh5sj8RDL9AnldhR_XqtmeU6kbEOYOXHOd3jtgVxujywl.FF. zi7fZK_vudu3eliTQ.3yOBLBfzdtqJFGnWS8QHRfIx X-Sonic-MF: X-Sonic-ID: 201f1f3d-a7b2-4fe0-baea-355e8663e1ce Original-Received: from sonic.gate.mail.ne1.yahoo.com by sonic307.consmr.mail.ne1.yahoo.com with HTTP; Tue, 12 Sep 2023 11:26:33 +0000 Original-Received: by hermes--production-sg3-69654d8bd-gltbk (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 97b8181b8f6f70c4bcdeaa373e35626b; Tue, 12 Sep 2023 11:26:26 +0000 (UTC) In-Reply-To: <87sf7kh1rg.fsf@ledu-giraud.fr> (Manuel Giraud's message of "Mon, 11 Sep 2023 22:51:31 +0200") X-Mailer: WebService/1.1.21797 mail.backend.jedi.jws.acl:role.jedi.acl.token.atz.jws.hermes.yahoo X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:270154 Archived-At: Manuel Giraud writes: > +#if defined HAVE_WINDOW_SYSTEM && !defined HAVE_EXT_MENU_BAR > + > +/* Get information about the menu-bar item at position X/Y on frame F. > + Return menu-bar's item char position in H_START/H_END and pixel > + position in X_START/X_END. Value is > + > + -1 if X/Y is not on a menu-bar item > + 0 if X/Y is on the same item that was highlighted before. > + 1 otherwise. */ > + > +static int > +get_menu_bar_item (struct frame *f, int x, int y, int *h_start, int *h_end, > + int *x_start, int *x_end, int *vpos) > +{ > + Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f); > + struct window *w = XWINDOW (f->menu_bar_window); > + struct glyph_row *row; > + int dummy; > + Lisp_Object items; > + int i; > + > + /* Find glyph's hpos and vpos under X/Y. */ > + if (x_y_to_hpos_vpos (w, x, y, h_start, vpos, NULL, NULL, &dummy) == NULL) > + return -1; > + > + /* We do not support R2L menu bar. */ > + row = MATRIX_ROW (w->current_matrix, *vpos); > + if (row->reversed_p) > + return -1; > + > + /* Compute h_start and h_end for this menu bar item. */ > + items = FRAME_MENU_BAR_ITEMS (f); > + for (i = 0; i < ASIZE (items); i += 4) > + { > + Lisp_Object pos, string; > + string = AREF (items, i + 1); > + pos = AREF (items, i + 3); > + if (NILP (string)) > + return -1; > + if (*h_start >= XFIXNUM (pos) > + && *h_start < XFIXNUM (pos) + SCHARS (string)) > + { > + *h_start = XFIXNUM (pos); > + *h_end = *h_start + SCHARS (string); > + break; > + } > + } > + > + /* Convert to pixels bounds. */ > + *x_start = 0; > + for (i = 0; i < *h_start; ++i) > + *x_start += row->glyphs[TEXT_AREA][i].pixel_width; > + > + *x_end = *x_start; > + for (i = *h_start; > + CHARPOS (row->glyphs[TEXT_AREA][i]) != -1 > + && i < row->used[TEXT_AREA]; > + ++i) > + *x_end += row->glyphs[TEXT_AREA][i].pixel_width; > + > + /* Is mouse on the highlighted item? */ > + if (EQ (f->menu_bar_window, hlinfo->mouse_face_window) > + && *vpos >= hlinfo->mouse_face_beg_row > + && *vpos <= hlinfo->mouse_face_end_row > + && (*vpos > hlinfo->mouse_face_beg_row > + || *h_start >= hlinfo->mouse_face_beg_col) > + && (*vpos < hlinfo->mouse_face_end_row > + || *h_end < hlinfo->mouse_face_end_col > + || hlinfo->mouse_face_past_end)) > + return 0; > + > + return 1; > +} > + > +/* Possibly highlight a menu-bar item on frame F when mouse moves to > + menu-bar window-relative coordinates X/Y. Called from > + note_mouse_highlight. */ > + > +static void > +note_menu_bar_highlight (struct frame *f, int x, int y) > +{ > + Lisp_Object window = f->menu_bar_window; > + Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f); > + int h_start, h_end, vpos, x_start, x_end; > + int rc; > + > + /* Function note_mouse_highlight is called with negative X/Y > + values when mouse moves outside of the frame. */ > + if (x <= 0 || y <= 0) > + { > + clear_mouse_face (hlinfo); > + return; > + } > + > + h_start = h_end = 0; > + rc = get_menu_bar_item (f, x, y, &h_start, &h_end, &x_start, &x_end, &vpos); > + if (rc < 0) > + { > + /* Not on menu-bar item. */ > + clear_mouse_face (hlinfo); > + return; > + } > + else if (rc == 0) > + /* On same menu-bar item as before. */ > + return; > + > + if (!NILP (Vmouse_highlight)) > + { > + /* Record this as the current active region. */ > + hlinfo->mouse_face_beg_col = h_start; > + hlinfo->mouse_face_beg_row = vpos; > + hlinfo->mouse_face_beg_x = x_start; > + hlinfo->mouse_face_past_end = false; > + > + hlinfo->mouse_face_end_col = h_end; > + hlinfo->mouse_face_end_row = vpos; > + hlinfo->mouse_face_end_x = x_end; > + hlinfo->mouse_face_window = window; > + hlinfo->mouse_face_face_id = MENU_FACE_ID; > + > + /* Display it as active. */ > + show_mouse_face (hlinfo, DRAW_MOUSE_FACE); > + } > +} > +#endif > > > /*********************************************************************** > @@ -35538,6 +35663,16 @@ note_mouse_highlight (struct frame *f, int x, int y) > w = XWINDOW (window); > frame_to_window_pixel_xy (w, &x, &y); > > +#if defined HAVE_WINDOW_SYSTEM && !defined HAVE_EXT_MENU_BAR > + /* Handle menu-bar window differently since it doesn't display a > + buffer. */ > + if (EQ (window, f->menu_bar_window)) > + { > + note_menu_bar_highlight (f, x, y); > + return; > + } > +#endif > + Thanks, but I'd prefer an option to disable this. Additionally, could you insert the preprocessor condition in a comment after each #endif? Some of the preprocessor blocks are very long.