mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-12-04 08:47:11 +00:00
Support for menu bar in window_from_coordinates
* src/window.h: * src/window.c (window_from_coordinates): In the no toolkit build, add support for the menu bar window. Add a new 'menu_bar_p' argument so the function's signature has changed. All callers changed. * src/androidterm.c (handle_one_android_event): * src/haikuterm.c (haiku_read_socket): * src/keyboard.c (make_lispy_position): * src/nsterm.m ([EmacsView mouseDown:]): * src/pgtkterm.c (button_event): * src/w32term.c (w32_read_socket): * src/xdisp.c (note_mouse_highlight): * src/xterm.c (handle_one_xevent): Set menu_bar_p to true.
This commit is contained in:
parent
1e5760ed78
commit
6b229ffc6f
@ -1141,7 +1141,7 @@ handle_one_android_event (struct android_display_info *dpyinfo,
|
||||
Lisp_Object window
|
||||
= window_from_coordinates (f, event->xmotion.x,
|
||||
event->xmotion.y, 0,
|
||||
false, false);
|
||||
false, false, false);
|
||||
|
||||
/* A window will be autoselected only when it is not
|
||||
selected now and the last mouse movement event was
|
||||
@ -1290,7 +1290,7 @@ handle_one_android_event (struct android_display_info *dpyinfo,
|
||||
int x = event->xbutton.x;
|
||||
int y = event->xbutton.y;
|
||||
|
||||
window = window_from_coordinates (f, x, y, 0, true, true);
|
||||
window = window_from_coordinates (f, x, y, 0, true, true, true);
|
||||
tab_bar_p = EQ (window, f->tab_bar_window);
|
||||
|
||||
if (tab_bar_p)
|
||||
@ -1312,7 +1312,7 @@ handle_one_android_event (struct android_display_info *dpyinfo,
|
||||
int x = event->xbutton.x;
|
||||
int y = event->xbutton.y;
|
||||
|
||||
window = window_from_coordinates (f, x, y, 0, true, true);
|
||||
window = window_from_coordinates (f, x, y, 0, true, true, true);
|
||||
tool_bar_p = (EQ (window, f->tool_bar_window)
|
||||
&& ((event->xbutton.type
|
||||
!= ANDROID_BUTTON_RELEASE)
|
||||
@ -1408,7 +1408,7 @@ handle_one_android_event (struct android_display_info *dpyinfo,
|
||||
int y = event->touch.y;
|
||||
|
||||
window = window_from_coordinates (any, x, y, 0, true,
|
||||
true);
|
||||
true, true);
|
||||
|
||||
/* If this touch has started in the tool bar, do not
|
||||
send it to Lisp. Instead, simulate a tool bar
|
||||
@ -1605,7 +1605,7 @@ handle_one_android_event (struct android_display_info *dpyinfo,
|
||||
/* Figure out how much to scale the deltas by. */
|
||||
window = window_from_coordinates (any, event->wheel.x,
|
||||
event->wheel.y, NULL,
|
||||
false, false);
|
||||
false, false, false);
|
||||
|
||||
if (WINDOWP (window))
|
||||
scroll_height = XWINDOW (window)->pixel_height;
|
||||
|
@ -3472,7 +3472,7 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit)
|
||||
if (!NILP (Vmouse_autoselect_window))
|
||||
{
|
||||
static Lisp_Object last_mouse_window;
|
||||
Lisp_Object window = window_from_coordinates (f, b->x, b->y, 0, 0, 0);
|
||||
Lisp_Object window = window_from_coordinates (f, b->x, b->y, 0, 0, 0, 0);
|
||||
|
||||
if (WINDOWP (window)
|
||||
&& !EQ (window, last_mouse_window)
|
||||
@ -3555,7 +3555,7 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit)
|
||||
int x = b->x;
|
||||
int y = b->y;
|
||||
|
||||
window = window_from_coordinates (f, x, y, 0, true, true);
|
||||
window = window_from_coordinates (f, x, y, 0, true, true, true);
|
||||
tab_bar_p = EQ (window, f->tab_bar_window);
|
||||
|
||||
if (tab_bar_p)
|
||||
@ -3573,7 +3573,7 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit)
|
||||
int x = b->x;
|
||||
int y = b->y;
|
||||
|
||||
window = window_from_coordinates (f, x, y, 0, true, true);
|
||||
window = window_from_coordinates (f, x, y, 0, true, true, true);
|
||||
tool_bar_p = (EQ (window, f->tool_bar_window)
|
||||
&& (type != BUTTON_UP
|
||||
|| f->last_tool_bar_item != -1));
|
||||
@ -3834,7 +3834,7 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit)
|
||||
|
||||
BView_get_mouse (FRAME_HAIKU_VIEW (f), &x, &y);
|
||||
|
||||
wheel_window = window_from_coordinates (f, x, y, 0, false, false);
|
||||
wheel_window = window_from_coordinates (f, x, y, 0, false, false, false);
|
||||
|
||||
if (NILP (wheel_window))
|
||||
{
|
||||
|
@ -5562,7 +5562,7 @@ make_lispy_position (struct frame *f, Lisp_Object x, Lisp_Object y,
|
||||
int xret = 0, yret = 0;
|
||||
/* The window or frame under frame pixel coordinates (x,y) */
|
||||
Lisp_Object window_or_frame = f
|
||||
? window_from_coordinates (f, mx, my, &part, true, true)
|
||||
? window_from_coordinates (f, mx, my, &part, true, true, true)
|
||||
: Qnil;
|
||||
#ifdef HAVE_WINDOW_SYSTEM
|
||||
bool tool_bar_p = false;
|
||||
|
@ -2662,7 +2662,7 @@ dos_rawgetc (void)
|
||||
static Lisp_Object last_mouse_window;
|
||||
|
||||
mouse_window = window_from_coordinates
|
||||
(SELECTED_FRAME (), mouse_last_x, mouse_last_y, 0, 0, 0);
|
||||
(SELECTED_FRAME (), mouse_last_x, mouse_last_y, 0, 0, 0, 0);
|
||||
/* A window will be selected only when it is not
|
||||
selected now, and the last mouse movement event was
|
||||
not in it. A minibuffer window will be selected iff
|
||||
|
@ -7412,7 +7412,7 @@ - (void)mouseDown: (NSEvent *)theEvent
|
||||
int x = lrint (p.x);
|
||||
int y = lrint (p.y);
|
||||
|
||||
window = window_from_coordinates (emacsframe, x, y, 0, true, true);
|
||||
window = window_from_coordinates (emacsframe, x, y, 0, true, true, true);
|
||||
tab_bar_p = EQ (window, emacsframe->tab_bar_window);
|
||||
|
||||
if (tab_bar_p)
|
||||
@ -7518,7 +7518,7 @@ - (void)mouseMoved: (NSEvent *)e
|
||||
NSTRACE_MSG ("mouse_autoselect_window");
|
||||
static Lisp_Object last_mouse_window;
|
||||
Lisp_Object window
|
||||
= window_from_coordinates (emacsframe, pt.x, pt.y, 0, 0, 0);
|
||||
= window_from_coordinates (emacsframe, pt.x, pt.y, 0, 0, 0, 0);
|
||||
|
||||
if (WINDOWP (window)
|
||||
&& !EQ (window, last_mouse_window)
|
||||
|
@ -5894,7 +5894,7 @@ motion_notify_event (GtkWidget *widget, GdkEvent *event,
|
||||
{
|
||||
static Lisp_Object last_mouse_window;
|
||||
Lisp_Object window = window_from_coordinates
|
||||
(f, event->motion.x, event->motion.y, 0, false, false);
|
||||
(f, event->motion.x, event->motion.y, 0, false, false, false);
|
||||
|
||||
/* A window will be autoselected only when it is not
|
||||
selected now and the last mouse movement event was
|
||||
@ -6047,7 +6047,7 @@ button_event (GtkWidget *widget, GdkEvent *event,
|
||||
int x = event->button.x;
|
||||
int y = event->button.y;
|
||||
|
||||
window = window_from_coordinates (f, x, y, 0, true, true);
|
||||
window = window_from_coordinates (f, x, y, 0, true, true, true);
|
||||
tab_bar_p = EQ (window, f->tab_bar_window);
|
||||
|
||||
if (tab_bar_p)
|
||||
|
@ -496,7 +496,7 @@ do_mouse_event (MOUSE_EVENT_RECORD *event,
|
||||
if (!NILP (Vmouse_autoselect_window))
|
||||
{
|
||||
Lisp_Object mouse_window = window_from_coordinates (f, mx, my,
|
||||
0, 0, 0);
|
||||
0, 0, 0, 0);
|
||||
/* A window will be selected only when it is not
|
||||
selected now, and the last mouse movement event was
|
||||
not in it. A minibuffer window will be selected iff
|
||||
|
@ -3376,7 +3376,7 @@ w32_construct_mouse_wheel (struct input_event *result, W32Msg *msg,
|
||||
if (w32_wheel_scroll_lines == UINT_MAX)
|
||||
{
|
||||
Lisp_Object window = window_from_coordinates (f, p.x, p.y, NULL,
|
||||
false, false);
|
||||
false, false, false);
|
||||
if (!WINDOWP (window))
|
||||
{
|
||||
result->kind = NO_EVENT;
|
||||
@ -5335,7 +5335,7 @@ w32_read_socket (struct terminal *terminal,
|
||||
{
|
||||
static Lisp_Object last_mouse_window;
|
||||
Lisp_Object window = window_from_coordinates
|
||||
(f, LOWORD (msg.msg.lParam), HIWORD (msg.msg.lParam), 0, 0, 0);
|
||||
(f, LOWORD (msg.msg.lParam), HIWORD (msg.msg.lParam), 0, 0, 0, 0);
|
||||
|
||||
/* Window will be selected only when it is not
|
||||
selected now and last mouse movement event was
|
||||
@ -5407,7 +5407,7 @@ w32_read_socket (struct terminal *terminal,
|
||||
int x = XFIXNAT (inev.x);
|
||||
int y = XFIXNAT (inev.y);
|
||||
|
||||
window = window_from_coordinates (f, x, y, 0, 1, 1);
|
||||
window = window_from_coordinates (f, x, y, 0, 1, 1, 1);
|
||||
|
||||
if (EQ (window, f->tab_bar_window))
|
||||
{
|
||||
@ -5435,7 +5435,7 @@ w32_read_socket (struct terminal *terminal,
|
||||
int x = XFIXNAT (inev.x);
|
||||
int y = XFIXNAT (inev.y);
|
||||
|
||||
window = window_from_coordinates (f, x, y, 0, 1, 1);
|
||||
window = window_from_coordinates (f, x, y, 0, 1, 1, 1);
|
||||
|
||||
if (EQ (window, f->tool_bar_window)
|
||||
/* Make sure the tool bar was previously
|
||||
|
20
src/window.c
20
src/window.c
@ -1680,7 +1680,8 @@ check_window_containing (struct window *w, void *user_data)
|
||||
|
||||
Lisp_Object
|
||||
window_from_coordinates (struct frame *f, int x, int y,
|
||||
enum window_part *part, bool tab_bar_p, bool tool_bar_p)
|
||||
enum window_part *part, bool menu_bar_p,
|
||||
bool tab_bar_p, bool tool_bar_p)
|
||||
{
|
||||
Lisp_Object window;
|
||||
struct check_window_data cw;
|
||||
@ -1693,6 +1694,21 @@ window_from_coordinates (struct frame *f, int x, int y,
|
||||
cw.window = &window, cw.x = x, cw.y = y; cw.part = part;
|
||||
foreach_window (f, check_window_containing, &cw);
|
||||
|
||||
#if defined (HAVE_WINDOW_SYSTEM) && ! defined (HAVE_EXT_MENU_BAR)
|
||||
/* If not found above, see if it's in the menu bar window, if a menu
|
||||
bar exists. */
|
||||
if (NILP (window)
|
||||
&& menu_bar_p
|
||||
&& WINDOWP (f->menu_bar_window)
|
||||
&& WINDOW_TOTAL_LINES (XWINDOW (f->menu_bar_window)) > 0
|
||||
&& (coordinates_in_window (XWINDOW (f->menu_bar_window), x, y)
|
||||
!= ON_NOTHING))
|
||||
{
|
||||
*part = ON_TEXT;
|
||||
window = f->menu_bar_window;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined (HAVE_WINDOW_SYSTEM)
|
||||
/* If not found above, see if it's in the tab bar window, if a tab
|
||||
bar exists. */
|
||||
@ -1746,7 +1762,7 @@ function returns nil. */)
|
||||
+ FRAME_INTERNAL_BORDER_WIDTH (f)),
|
||||
(FRAME_PIXEL_Y_FROM_CANON_Y (f, y)
|
||||
+ FRAME_INTERNAL_BORDER_WIDTH (f)),
|
||||
0, false, false);
|
||||
0, false, false, false);
|
||||
}
|
||||
|
||||
ptrdiff_t
|
||||
|
@ -1111,7 +1111,7 @@ extern Lisp_Object minibuf_selected_window;
|
||||
|
||||
extern Lisp_Object make_window (void);
|
||||
extern Lisp_Object window_from_coordinates (struct frame *, int, int,
|
||||
enum window_part *, bool, bool);
|
||||
enum window_part *, bool, bool, bool);
|
||||
extern void resize_frame_windows (struct frame *, int, bool);
|
||||
extern void restore_window_configuration (Lisp_Object);
|
||||
extern void delete_all_child_windows (Lisp_Object);
|
||||
|
@ -2778,7 +2778,7 @@ remember_mouse_glyph (struct frame *f, int gx, int gy, NativeRectangle *rect)
|
||||
goto virtual_glyph;
|
||||
}
|
||||
else if (!f->glyphs_initialized_p
|
||||
|| (window = window_from_coordinates (f, gx, gy, &part, false, false),
|
||||
|| (window = window_from_coordinates (f, gx, gy, &part, false, false, false),
|
||||
NILP (window)))
|
||||
{
|
||||
width = FRAME_SMALLEST_CHAR_WIDTH (f);
|
||||
@ -35438,7 +35438,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
|
||||
return;
|
||||
|
||||
/* Which window is that in? */
|
||||
window = window_from_coordinates (f, x, y, &part, true, true);
|
||||
window = window_from_coordinates (f, x, y, &part, true, true, true);
|
||||
|
||||
/* If displaying active text in another window, clear that. */
|
||||
if (! EQ (window, hlinfo->mouse_face_window)
|
||||
|
17
src/xterm.c
17
src/xterm.c
@ -21171,7 +21171,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
|
||||
}
|
||||
|
||||
Lisp_Object window = window_from_coordinates
|
||||
(f, xmotion.x, xmotion.y, 0, false, false);
|
||||
(f, xmotion.x, xmotion.y, 0, false, false, false);
|
||||
|
||||
/* A window will be autoselected only when it is not
|
||||
selected now and the last mouse movement event was
|
||||
@ -21902,7 +21902,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
|
||||
int x = event->xbutton.x;
|
||||
int y = event->xbutton.y;
|
||||
|
||||
window = window_from_coordinates (f, x, y, 0, true, true);
|
||||
window = window_from_coordinates (f, x, y, 0, true, true, true);
|
||||
tab_bar_p = EQ (window, f->tab_bar_window);
|
||||
|
||||
if (tab_bar_p)
|
||||
@ -21923,7 +21923,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
|
||||
int x = event->xbutton.x;
|
||||
int y = event->xbutton.y;
|
||||
|
||||
window = window_from_coordinates (f, x, y, 0, true, true);
|
||||
window = window_from_coordinates (f, x, y, 0, true, true, true);
|
||||
tool_bar_p = (EQ (window, f->tool_bar_window)
|
||||
&& (event->xbutton.type != ButtonRelease
|
||||
|| f->last_tool_bar_item != -1));
|
||||
@ -22656,7 +22656,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
|
||||
continue;
|
||||
|
||||
window = window_from_coordinates (f, real_x, real_y, NULL,
|
||||
false, false);
|
||||
false, false, false);
|
||||
|
||||
if (WINDOWP (window))
|
||||
scroll_height = XWINDOW (window)->pixel_height;
|
||||
@ -23099,7 +23099,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
|
||||
|| !NILP (focus_follows_mouse)))
|
||||
{
|
||||
static Lisp_Object last_mouse_window;
|
||||
Lisp_Object window = window_from_coordinates (f, ev.x, ev.y, 0, false, false);
|
||||
Lisp_Object window = window_from_coordinates (f, ev.x, ev.y, 0, false, false,
|
||||
false);
|
||||
|
||||
/* A window will be autoselected only when it is not
|
||||
selected now and the last mouse movement event was
|
||||
@ -23677,7 +23678,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
|
||||
int x = bv.x;
|
||||
int y = bv.y;
|
||||
|
||||
window = window_from_coordinates (f, x, y, 0, true, true);
|
||||
window = window_from_coordinates (f, x, y, 0, true, true, true);
|
||||
tab_bar_p = EQ (window, f->tab_bar_window);
|
||||
|
||||
if (tab_bar_p)
|
||||
@ -23698,7 +23699,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
|
||||
int x = bv.x;
|
||||
int y = bv.y;
|
||||
|
||||
window = window_from_coordinates (f, x, y, 0, true, true);
|
||||
window = window_from_coordinates (f, x, y, 0, true, true, true);
|
||||
/* Ignore button release events if the mouse
|
||||
wasn't previously pressed on the tool bar.
|
||||
We do this because otherwise selecting some
|
||||
@ -24704,7 +24705,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
|
||||
int x = xev->event_x;
|
||||
int y = xev->event_y;
|
||||
|
||||
window = window_from_coordinates (f, x, y, 0, true, true);
|
||||
window = window_from_coordinates (f, x, y, 0, true, true, true);
|
||||
/* Ignore button release events if the mouse
|
||||
wasn't previously pressed on the tool bar.
|
||||
We do this because otherwise selecting some
|
||||
|
Loading…
Reference in New Issue
Block a user