From 9a650e62c8bd9ab1040db70e22683bc94e918cc8 Mon Sep 17 00:00:00 2001 From: Dmitry Antipov Date: Fri, 13 Sep 2013 10:00:20 +0400 Subject: [PATCH] * xterm.h (x_window_to_frame, x_any_window_to_frame) (x_menubar_window_to_frame): Remove prototypes. * xfns.c (x_window_to_frame, x_any_window_to_frame) (x_menubar_window_to_frame, x_top_window_to_frame): Move from here... * xterm.c (x_window_to_frame, x_any_window_to_frame) (x_menubar_window_to_frame, x_top_window_to_frame): ...to here and convert all but the last to static. --- src/ChangeLog | 11 +++ src/xfns.c | 181 -------------------------------------------------- src/xterm.c | 175 ++++++++++++++++++++++++++++++++++++++++++++++++ src/xterm.h | 16 +---- 4 files changed, 187 insertions(+), 196 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index f08395ae24f..960165a22f9 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,14 @@ +2013-09-13 Dmitry Antipov + + * xterm.h (x_window_to_frame, x_any_window_to_frame) + (x_menubar_window_to_frame): Remove prototypes. + * xfns.c (x_window_to_frame, x_any_window_to_frame) + (x_menubar_window_to_frame, x_top_window_to_frame): + Move from here... + * xterm.c (x_window_to_frame, x_any_window_to_frame) + (x_menubar_window_to_frame, x_top_window_to_frame): + ...to here and convert all but the last to static. + 2013-09-12 Eli Zaretskii * lisp.mk (lisp): Add w32-common-fns.elc. diff --git a/src/xfns.c b/src/xfns.c index 74bc7a8b1d0..fa83b6faf1a 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -179,187 +179,6 @@ check_x_display_info (Lisp_Object object) return dpyinfo; } - -/* Return the Emacs frame-object corresponding to an X window. - It could be the frame's main window or an icon window. */ - -/* This function can be called during GC, so use GC_xxx type test macros. */ - -struct frame * -x_window_to_frame (struct x_display_info *dpyinfo, int wdesc) -{ - Lisp_Object tail, frame; - struct frame *f; - - if (wdesc == None) - return NULL; - - FOR_EACH_FRAME (tail, frame) - { - f = XFRAME (frame); - if (!FRAME_X_P (f) || FRAME_X_DISPLAY_INFO (f) != dpyinfo) - continue; - if (f->output_data.x->hourglass_window == wdesc) - return f; -#ifdef USE_X_TOOLKIT - if ((f->output_data.x->edit_widget - && XtWindow (f->output_data.x->edit_widget) == wdesc) - /* A tooltip frame? */ - || (!f->output_data.x->edit_widget - && FRAME_X_WINDOW (f) == wdesc) - || f->output_data.x->icon_desc == wdesc) - return f; -#else /* not USE_X_TOOLKIT */ -#ifdef USE_GTK - if (f->output_data.x->edit_widget) - { - GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc); - struct x_output *x = f->output_data.x; - if (gwdesc != 0 && gwdesc == x->edit_widget) - return f; - } -#endif /* USE_GTK */ - if (FRAME_X_WINDOW (f) == wdesc - || f->output_data.x->icon_desc == wdesc) - return f; -#endif /* not USE_X_TOOLKIT */ - } - return 0; -} - -#if defined (USE_X_TOOLKIT) || defined (USE_GTK) -/* Like x_window_to_frame but also compares the window with the widget's - windows. */ - -struct frame * -x_any_window_to_frame (struct x_display_info *dpyinfo, int wdesc) -{ - Lisp_Object tail, frame; - struct frame *f, *found = NULL; - struct x_output *x; - - if (wdesc == None) - return NULL; - - FOR_EACH_FRAME (tail, frame) - { - if (found) - break; - f = XFRAME (frame); - if (FRAME_X_P (f) && FRAME_X_DISPLAY_INFO (f) == dpyinfo) - { - /* This frame matches if the window is any of its widgets. */ - x = f->output_data.x; - if (x->hourglass_window == wdesc) - found = f; - else if (x->widget) - { -#ifdef USE_GTK - GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc); - if (gwdesc != 0 - && gtk_widget_get_toplevel (gwdesc) == x->widget) - found = f; -#else - if (wdesc == XtWindow (x->widget) - || wdesc == XtWindow (x->column_widget) - || wdesc == XtWindow (x->edit_widget)) - found = f; - /* Match if the window is this frame's menubar. */ - else if (lw_window_is_in_menubar (wdesc, x->menubar_widget)) - found = f; -#endif - } - else if (FRAME_X_WINDOW (f) == wdesc) - /* A tooltip frame. */ - found = f; - } - } - - return found; -} - -/* Likewise, but consider only the menu bar widget. */ - -struct frame * -x_menubar_window_to_frame (struct x_display_info *dpyinfo, XEvent *event) -{ - Window wdesc = event->xany.window; - Lisp_Object tail, frame; - struct frame *f; - struct x_output *x; - - if (wdesc == None) - return NULL; - - FOR_EACH_FRAME (tail, frame) - { - f = XFRAME (frame); - if (!FRAME_X_P (f) || FRAME_X_DISPLAY_INFO (f) != dpyinfo) - continue; - x = f->output_data.x; -#ifdef USE_GTK - if (x->menubar_widget && xg_event_is_for_menubar (f, event)) - return f; -#else - /* Match if the window is this frame's menubar. */ - if (x->menubar_widget - && lw_window_is_in_menubar (wdesc, x->menubar_widget)) - return f; -#endif - } - return 0; -} - -/* Return the frame whose principal (outermost) window is WDESC. - If WDESC is some other (smaller) window, we return 0. */ - -struct frame * -x_top_window_to_frame (struct x_display_info *dpyinfo, int wdesc) -{ - Lisp_Object tail, frame; - struct frame *f; - struct x_output *x; - - if (wdesc == None) - return NULL; - - FOR_EACH_FRAME (tail, frame) - { - f = XFRAME (frame); - if (!FRAME_X_P (f) || FRAME_X_DISPLAY_INFO (f) != dpyinfo) - continue; - x = f->output_data.x; - - if (x->widget) - { - /* This frame matches if the window is its topmost widget. */ -#ifdef USE_GTK - GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc); - if (gwdesc == x->widget) - return f; -#else - if (wdesc == XtWindow (x->widget)) - return f; -#if 0 /* I don't know why it did this, - but it seems logically wrong, - and it causes trouble for MapNotify events. */ - /* Match if the window is this frame's menubar. */ - if (x->menubar_widget - && wdesc == XtWindow (x->menubar_widget)) - return f; -#endif -#endif - } - else if (FRAME_X_WINDOW (f) == wdesc) - /* Tooltip frame. */ - return f; - } - return 0; -} -#endif /* USE_X_TOOLKIT || USE_GTK */ - - - /* Store the screen positions of frame F into XPTR and YPTR. These are the positions of the containing window manager window, not Emacs's own window. */ diff --git a/src/xterm.c b/src/xterm.c index c28ca824063..ef800461185 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -3389,6 +3389,181 @@ x_focus_changed (int type, int state, struct x_display_info *dpyinfo, struct fra } } +/* Return the Emacs frame-object corresponding to an X window. + It could be the frame's main window or an icon window. */ + +static struct frame * +x_window_to_frame (struct x_display_info *dpyinfo, int wdesc) +{ + Lisp_Object tail, frame; + struct frame *f; + + if (wdesc == None) + return NULL; + + FOR_EACH_FRAME (tail, frame) + { + f = XFRAME (frame); + if (!FRAME_X_P (f) || FRAME_X_DISPLAY_INFO (f) != dpyinfo) + continue; + if (f->output_data.x->hourglass_window == wdesc) + return f; +#ifdef USE_X_TOOLKIT + if ((f->output_data.x->edit_widget + && XtWindow (f->output_data.x->edit_widget) == wdesc) + /* A tooltip frame? */ + || (!f->output_data.x->edit_widget + && FRAME_X_WINDOW (f) == wdesc) + || f->output_data.x->icon_desc == wdesc) + return f; +#else /* not USE_X_TOOLKIT */ +#ifdef USE_GTK + if (f->output_data.x->edit_widget) + { + GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc); + struct x_output *x = f->output_data.x; + if (gwdesc != 0 && gwdesc == x->edit_widget) + return f; + } +#endif /* USE_GTK */ + if (FRAME_X_WINDOW (f) == wdesc + || f->output_data.x->icon_desc == wdesc) + return f; +#endif /* not USE_X_TOOLKIT */ + } + return 0; +} + +#if defined (USE_X_TOOLKIT) || defined (USE_GTK) + +/* Like x_window_to_frame but also compares the window with the widget's + windows. */ + +static struct frame * +x_any_window_to_frame (struct x_display_info *dpyinfo, int wdesc) +{ + Lisp_Object tail, frame; + struct frame *f, *found = NULL; + struct x_output *x; + + if (wdesc == None) + return NULL; + + FOR_EACH_FRAME (tail, frame) + { + if (found) + break; + f = XFRAME (frame); + if (FRAME_X_P (f) && FRAME_X_DISPLAY_INFO (f) == dpyinfo) + { + /* This frame matches if the window is any of its widgets. */ + x = f->output_data.x; + if (x->hourglass_window == wdesc) + found = f; + else if (x->widget) + { +#ifdef USE_GTK + GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc); + if (gwdesc != 0 + && gtk_widget_get_toplevel (gwdesc) == x->widget) + found = f; +#else + if (wdesc == XtWindow (x->widget) + || wdesc == XtWindow (x->column_widget) + || wdesc == XtWindow (x->edit_widget)) + found = f; + /* Match if the window is this frame's menubar. */ + else if (lw_window_is_in_menubar (wdesc, x->menubar_widget)) + found = f; +#endif + } + else if (FRAME_X_WINDOW (f) == wdesc) + /* A tooltip frame. */ + found = f; + } + } + + return found; +} + +/* Likewise, but consider only the menu bar widget. */ + +static struct frame * +x_menubar_window_to_frame (struct x_display_info *dpyinfo, XEvent *event) +{ + Window wdesc = event->xany.window; + Lisp_Object tail, frame; + struct frame *f; + struct x_output *x; + + if (wdesc == None) + return NULL; + + FOR_EACH_FRAME (tail, frame) + { + f = XFRAME (frame); + if (!FRAME_X_P (f) || FRAME_X_DISPLAY_INFO (f) != dpyinfo) + continue; + x = f->output_data.x; +#ifdef USE_GTK + if (x->menubar_widget && xg_event_is_for_menubar (f, event)) + return f; +#else + /* Match if the window is this frame's menubar. */ + if (x->menubar_widget + && lw_window_is_in_menubar (wdesc, x->menubar_widget)) + return f; +#endif + } + return 0; +} + +/* Return the frame whose principal (outermost) window is WDESC. + If WDESC is some other (smaller) window, we return 0. */ + +struct frame * +x_top_window_to_frame (struct x_display_info *dpyinfo, int wdesc) +{ + Lisp_Object tail, frame; + struct frame *f; + struct x_output *x; + + if (wdesc == None) + return NULL; + + FOR_EACH_FRAME (tail, frame) + { + f = XFRAME (frame); + if (!FRAME_X_P (f) || FRAME_X_DISPLAY_INFO (f) != dpyinfo) + continue; + x = f->output_data.x; + + if (x->widget) + { + /* This frame matches if the window is its topmost widget. */ +#ifdef USE_GTK + GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc); + if (gwdesc == x->widget) + return f; +#else + if (wdesc == XtWindow (x->widget)) + return f; +#endif + } + else if (FRAME_X_WINDOW (f) == wdesc) + /* Tooltip frame. */ + return f; + } + return 0; +} + +#else /* !USE_X_TOOLKIT && !USE_GTK */ + +#define x_any_window_to_frame(d, i) x_window_to_frame (d, i) +#define x_top_window_to_frame(d, i) x_window_to_frame (d, i) + +#endif /* USE_X_TOOLKIT || USE_GTK */ + /* The focus may have changed. Figure out if it is a real focus change, by checking both FocusIn/Out and Enter/LeaveNotify events. diff --git a/src/xterm.h b/src/xterm.h index bdc8523009a..2f29667684d 100644 --- a/src/xterm.h +++ b/src/xterm.h @@ -376,20 +376,6 @@ struct x_display_info extern int use_xim; #endif -extern struct frame *x_window_to_frame (struct x_display_info *, int); -extern struct frame *x_any_window_to_frame (struct x_display_info *, int); -extern struct frame *x_menubar_window_to_frame (struct x_display_info *, - XEvent *); -extern struct frame *x_top_window_to_frame (struct x_display_info *, int); - -extern struct frame *x_menubar_window_to_frame (struct x_display_info *, - XEvent *); - -#if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK) -#define x_any_window_to_frame x_window_to_frame -#define x_top_window_to_frame x_window_to_frame -#endif - /* This is a chain of structures for all the X displays currently in use. */ extern struct x_display_info *x_display_list; @@ -400,7 +386,7 @@ extern struct x_display_info *x_display_list; extern Lisp_Object x_display_name_list; extern struct x_display_info *x_display_info_for_display (Display *); - +extern struct frame *x_top_window_to_frame (struct x_display_info *, int); extern struct x_display_info *x_term_init (Lisp_Object, char *, char *); extern bool x_display_ok (const char *); -- 2.39.2