mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-02-17 10:27:41 +00:00
Be more systematic about user-interface timestamps.
Before, the code sometimes used 'Time', sometimes 'unsigned long', and sometimes 'EMACS_UINT', to represent these timestamps. This change causes it to use 'Time' uniformly, as that's what X uses. This makes the code easier to follow, and makes it easier to catch integer overflow bugs such as Bug#8664. * frame.c (Fmouse_position, Fmouse_pixel_position): Use Time, not unsigned long, for user-interface timestamps. * keyboard.c (last_event_timestamp, kbd_buffer_get_event): Likewise. (button_down_time, make_lispy_position, make_lispy_movement): Likewise. * keyboard.h (last_event_timestamp): Likewise. * menu.c (Fx_popup_menu) [!HAVE_X_WINDOWS]: Likewise. * menu.h (xmenu_show): Likewise. * term.c (term_mouse_position): Likewise. * termhooks.h (struct input_event.timestamp): Likewise. (struct terminal.mouse_position_hook): Likewise. * xmenu.c (create_and_show_popup_menu, xmenu_show): Likewise. * xterm.c (XTmouse_position, x_scroll_bar_report_motion): Likewise. * systime.h (Time): New decl. Pull it in from <X11/X.h> if HAVE_X_WINDOWS, otherwise define it as unsigned long, which is what it was before. * menu.h, termhooks.h: Include "systime.h", for Time.
This commit is contained in:
parent
86db42d223
commit
08dc5ae68e
11 changed files with 58 additions and 25 deletions
|
|
@ -1,5 +1,28 @@
|
|||
2011-05-12 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
Be more systematic about user-interface timestamps.
|
||||
Before, the code sometimes used 'Time', sometimes 'unsigned long',
|
||||
and sometimes 'EMACS_UINT', to represent these timestamps. This
|
||||
change causes it to use 'Time' uniformly, as that's what X uses.
|
||||
This makes the code easier to follow, and makes it easier to catch
|
||||
integer overflow bugs such as Bug#8664.
|
||||
* frame.c (Fmouse_position, Fmouse_pixel_position):
|
||||
Use Time, not unsigned long, for user-interface timestamps.
|
||||
* keyboard.c (last_event_timestamp, kbd_buffer_get_event): Likewise.
|
||||
(button_down_time, make_lispy_position, make_lispy_movement): Likewise.
|
||||
* keyboard.h (last_event_timestamp): Likewise.
|
||||
* menu.c (Fx_popup_menu) [!HAVE_X_WINDOWS]: Likewise.
|
||||
* menu.h (xmenu_show): Likewise.
|
||||
* term.c (term_mouse_position): Likewise.
|
||||
* termhooks.h (struct input_event.timestamp): Likewise.
|
||||
(struct terminal.mouse_position_hook): Likewise.
|
||||
* xmenu.c (create_and_show_popup_menu, xmenu_show): Likewise.
|
||||
* xterm.c (XTmouse_position, x_scroll_bar_report_motion): Likewise.
|
||||
* systime.h (Time): New decl. Pull it in from <X11/X.h> if
|
||||
HAVE_X_WINDOWS, otherwise define it as unsigned long, which is
|
||||
what it was before.
|
||||
* menu.h, termhooks.h: Include "systime.h", for Time.
|
||||
|
||||
* keyboard.c (make_lispy_event): Fix problem in integer overflow.
|
||||
Don't assume that the difference between two unsigned long values
|
||||
can fit into an integer. At this point, we know button_down_time
|
||||
|
|
|
|||
|
|
@ -1631,7 +1631,7 @@ and returns whatever that function returns. */)
|
|||
enum scroll_bar_part party_dummy;
|
||||
Lisp_Object x, y, retval;
|
||||
int col, row;
|
||||
unsigned long long_dummy;
|
||||
Time long_dummy;
|
||||
struct gcpro gcpro1;
|
||||
|
||||
f = SELECTED_FRAME ();
|
||||
|
|
@ -1676,7 +1676,7 @@ and nil for X and Y. */)
|
|||
Lisp_Object lispy_dummy;
|
||||
enum scroll_bar_part party_dummy;
|
||||
Lisp_Object x, y;
|
||||
unsigned long long_dummy;
|
||||
Time long_dummy;
|
||||
|
||||
f = SELECTED_FRAME ();
|
||||
x = y = Qnil;
|
||||
|
|
|
|||
|
|
@ -238,7 +238,7 @@ Lisp_Object internal_last_event_frame;
|
|||
|
||||
/* The timestamp of the last input event we received from the X server.
|
||||
X Windows wants this for selection ownership. */
|
||||
unsigned long last_event_timestamp;
|
||||
Time last_event_timestamp;
|
||||
|
||||
static Lisp_Object Qx_set_selection, Qhandle_switch_frame;
|
||||
Lisp_Object QPRIMARY;
|
||||
|
|
@ -4085,7 +4085,7 @@ kbd_buffer_get_event (KBOARD **kbp,
|
|||
Lisp_Object bar_window;
|
||||
enum scroll_bar_part part;
|
||||
Lisp_Object x, y;
|
||||
unsigned long t;
|
||||
Time t;
|
||||
|
||||
*kbp = current_kboard;
|
||||
/* Note that this uses F to determine which terminal to look at.
|
||||
|
|
@ -5088,7 +5088,7 @@ static Lisp_Object button_down_location;
|
|||
static int last_mouse_button;
|
||||
static int last_mouse_x;
|
||||
static int last_mouse_y;
|
||||
static unsigned long button_down_time;
|
||||
static Time button_down_time;
|
||||
|
||||
/* The number of clicks in this multiple-click. */
|
||||
|
||||
|
|
@ -5099,7 +5099,7 @@ static int double_click_count;
|
|||
|
||||
static Lisp_Object
|
||||
make_lispy_position (struct frame *f, Lisp_Object x, Lisp_Object y,
|
||||
unsigned long t)
|
||||
Time t)
|
||||
{
|
||||
enum window_part part;
|
||||
Lisp_Object posn = Qnil;
|
||||
|
|
@ -5987,7 +5987,7 @@ make_lispy_event (struct input_event *event)
|
|||
|
||||
static Lisp_Object
|
||||
make_lispy_movement (FRAME_PTR frame, Lisp_Object bar_window, enum scroll_bar_part part,
|
||||
Lisp_Object x, Lisp_Object y, unsigned long t)
|
||||
Lisp_Object x, Lisp_Object y, Time t)
|
||||
{
|
||||
/* Is it a scroll bar movement? */
|
||||
if (frame && ! NILP (bar_window))
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ GNU General Public License for more details.
|
|||
You should have received a copy of the GNU General Public License
|
||||
along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include "systime.h" /* for EMACS_TIME */
|
||||
#include "systime.h" /* for EMACS_TIME, Time */
|
||||
#include "coding.h" /* for ENCODE_UTF_8 and ENCODE_SYSTEM */
|
||||
|
||||
/* Lisp fields in struct keyboard are hidden from most code and accessed
|
||||
|
|
@ -459,7 +459,7 @@ extern Lisp_Object Qevent_symbol_element_mask;
|
|||
|
||||
/* The timestamp of the last input event we received from the X server.
|
||||
X Windows wants this for selection ownership. */
|
||||
extern unsigned long last_event_timestamp;
|
||||
extern Time last_event_timestamp;
|
||||
|
||||
extern int quit_char;
|
||||
|
||||
|
|
|
|||
|
|
@ -1147,13 +1147,13 @@ no quit occurs and `x-popup-menu' returns nil. */)
|
|||
#else /* not HAVE_X_WINDOWS */
|
||||
Lisp_Object bar_window;
|
||||
enum scroll_bar_part part;
|
||||
unsigned long time;
|
||||
Time time;
|
||||
void (*mouse_position_hook) (struct frame **, int,
|
||||
Lisp_Object *,
|
||||
enum scroll_bar_part *,
|
||||
Lisp_Object *,
|
||||
Lisp_Object *,
|
||||
unsigned long *) =
|
||||
Time *) =
|
||||
FRAME_TERMINAL (new_f)->mouse_position_hook;
|
||||
|
||||
if (mouse_position_hook)
|
||||
|
|
|
|||
|
|
@ -19,6 +19,8 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
#ifndef MENU_H
|
||||
#define MENU_H
|
||||
|
||||
#include "systime.h" /* for Time */
|
||||
|
||||
extern void x_set_menu_bar_lines (struct frame *f,
|
||||
Lisp_Object value,
|
||||
Lisp_Object oldval);
|
||||
|
|
@ -48,6 +50,5 @@ extern Lisp_Object w32_menu_show (FRAME_PTR, int, int, int, int,
|
|||
extern Lisp_Object ns_menu_show (FRAME_PTR, int, int, int, int,
|
||||
Lisp_Object, const char **);
|
||||
extern Lisp_Object xmenu_show (FRAME_PTR, int, int, int, int,
|
||||
Lisp_Object, const char **, EMACS_UINT);
|
||||
Lisp_Object, const char **, Time);
|
||||
#endif /* MENU_H */
|
||||
|
||||
|
|
|
|||
|
|
@ -30,6 +30,12 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_X_WINDOWS
|
||||
# include <X11/X.h>
|
||||
#else
|
||||
typedef unsigned long Time;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_TZNAME
|
||||
#ifndef tzname /* For SGI. */
|
||||
extern char *tzname[]; /* RS6000 and others want it this way. */
|
||||
|
|
|
|||
|
|
@ -2698,7 +2698,7 @@ term_mouse_movement (FRAME_PTR frame, Gpm_Event *event)
|
|||
static void
|
||||
term_mouse_position (FRAME_PTR *fp, int insist, Lisp_Object *bar_window,
|
||||
enum scroll_bar_part *part, Lisp_Object *x,
|
||||
Lisp_Object *y, unsigned long *timeptr)
|
||||
Lisp_Object *y, Time *timeptr)
|
||||
{
|
||||
struct timeval now;
|
||||
|
||||
|
|
|
|||
|
|
@ -20,6 +20,8 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
|
||||
/* Miscellanea. */
|
||||
|
||||
#include "systime.h" /* for Time */
|
||||
|
||||
struct glyph;
|
||||
struct frame;
|
||||
|
||||
|
|
@ -233,7 +235,7 @@ struct input_event
|
|||
int modifiers; /* See enum below for interpretation. */
|
||||
|
||||
Lisp_Object x, y;
|
||||
unsigned long timestamp;
|
||||
Time timestamp;
|
||||
|
||||
/* This is padding just to put the frame_or_window field
|
||||
past the size of struct selection_input_event. */
|
||||
|
|
@ -463,7 +465,7 @@ struct terminal
|
|||
enum scroll_bar_part *part,
|
||||
Lisp_Object *x,
|
||||
Lisp_Object *y,
|
||||
unsigned long *);
|
||||
Time *);
|
||||
|
||||
/* The window system handling code should set this if the mouse has
|
||||
moved since the last call to the mouse_position_hook. Calling that
|
||||
|
|
|
|||
13
src/xmenu.c
13
src/xmenu.c
|
|
@ -240,7 +240,7 @@ for instance using the window manager, then this produces a quit and
|
|||
FRAME_PTR new_f = SELECTED_FRAME ();
|
||||
Lisp_Object bar_window;
|
||||
enum scroll_bar_part part;
|
||||
unsigned long time;
|
||||
Time time;
|
||||
Lisp_Object x, y;
|
||||
|
||||
(*mouse_position_hook) (&new_f, 1, &bar_window, &part, &x, &y, &time);
|
||||
|
|
@ -1420,7 +1420,8 @@ pop_down_menu (Lisp_Object arg)
|
|||
menu pops down.
|
||||
menu_item_selection will be set to the selection. */
|
||||
static void
|
||||
create_and_show_popup_menu (FRAME_PTR f, widget_value *first_wv, int x, int y, int for_click, EMACS_UINT timestamp)
|
||||
create_and_show_popup_menu (FRAME_PTR f, widget_value *first_wv, int x, int y,
|
||||
int for_click, Time timestamp)
|
||||
{
|
||||
int i;
|
||||
GtkWidget *menu;
|
||||
|
|
@ -1464,7 +1465,7 @@ create_and_show_popup_menu (FRAME_PTR f, widget_value *first_wv, int x, int y, i
|
|||
gtk_widget_show_all (menu);
|
||||
|
||||
gtk_menu_popup (GTK_MENU (menu), 0, 0, pos_func, &popup_x_y, i,
|
||||
timestamp > 0 ? timestamp : gtk_get_current_event_time());
|
||||
timestamp ? timestamp : gtk_get_current_event_time ());
|
||||
|
||||
record_unwind_protect (pop_down_menu, make_save_value (menu, 0));
|
||||
|
||||
|
|
@ -1524,7 +1525,7 @@ pop_down_menu (Lisp_Object arg)
|
|||
menu_item_selection will be set to the selection. */
|
||||
static void
|
||||
create_and_show_popup_menu (FRAME_PTR f, widget_value *first_wv,
|
||||
int x, int y, int for_click, EMACS_UINT timestamp)
|
||||
int x, int y, int for_click, Time timestamp)
|
||||
{
|
||||
int i;
|
||||
Arg av[2];
|
||||
|
|
@ -1598,7 +1599,7 @@ create_and_show_popup_menu (FRAME_PTR f, widget_value *first_wv,
|
|||
|
||||
Lisp_Object
|
||||
xmenu_show (FRAME_PTR f, int x, int y, int for_click, int keymaps,
|
||||
Lisp_Object title, const char **error_name, EMACS_UINT timestamp)
|
||||
Lisp_Object title, const char **error_name, Time timestamp)
|
||||
{
|
||||
int i;
|
||||
widget_value *wv, *save_wv = 0, *first_wv = 0, *prev_wv = 0;
|
||||
|
|
@ -2241,7 +2242,7 @@ pop_down_menu (Lisp_Object arg)
|
|||
|
||||
Lisp_Object
|
||||
xmenu_show (FRAME_PTR f, int x, int y, int for_click, int keymaps,
|
||||
Lisp_Object title, const char **error_name, EMACS_UINT timestamp)
|
||||
Lisp_Object title, const char **error_name, Time timestamp)
|
||||
{
|
||||
Window root;
|
||||
XMenu *menu;
|
||||
|
|
|
|||
|
|
@ -342,7 +342,7 @@ static struct scroll_bar *x_window_to_scroll_bar (Display *, Window);
|
|||
static void x_scroll_bar_report_motion (struct frame **, Lisp_Object *,
|
||||
enum scroll_bar_part *,
|
||||
Lisp_Object *, Lisp_Object *,
|
||||
unsigned long *);
|
||||
Time *);
|
||||
static void x_handle_net_wm_state (struct frame *, XPropertyEvent *);
|
||||
static void x_check_fullscreen (struct frame *);
|
||||
static void x_check_expected_move (struct frame *, int, int);
|
||||
|
|
@ -3799,7 +3799,7 @@ redo_mouse_highlight (void)
|
|||
static void
|
||||
XTmouse_position (FRAME_PTR *fp, int insist, Lisp_Object *bar_window,
|
||||
enum scroll_bar_part *part, Lisp_Object *x, Lisp_Object *y,
|
||||
long unsigned int *timestamp)
|
||||
Time *timestamp)
|
||||
{
|
||||
FRAME_PTR f1;
|
||||
|
||||
|
|
@ -5534,7 +5534,7 @@ x_scroll_bar_note_movement (struct scroll_bar *bar, XEvent *event)
|
|||
static void
|
||||
x_scroll_bar_report_motion (FRAME_PTR *fp, Lisp_Object *bar_window,
|
||||
enum scroll_bar_part *part, Lisp_Object *x,
|
||||
Lisp_Object *y, long unsigned int *timestamp)
|
||||
Lisp_Object *y, Time *timestamp)
|
||||
{
|
||||
struct scroll_bar *bar = XSCROLL_BAR (last_mouse_scroll_bar);
|
||||
Window w = bar->x_window;
|
||||
|
|
|
|||
Loading…
Reference in a new issue