Commit 08dc5ae6 authored by Paul Eggert's avatar Paul Eggert
Browse files

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.
parent 86db42d2
2011-05-12 Paul Eggert <eggert@cs.ucla.edu> 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. * keyboard.c (make_lispy_event): Fix problem in integer overflow.
Don't assume that the difference between two unsigned long values Don't assume that the difference between two unsigned long values
can fit into an integer. At this point, we know button_down_time can fit into an integer. At this point, we know button_down_time
......
...@@ -1631,7 +1631,7 @@ and returns whatever that function returns. */) ...@@ -1631,7 +1631,7 @@ and returns whatever that function returns. */)
enum scroll_bar_part party_dummy; enum scroll_bar_part party_dummy;
Lisp_Object x, y, retval; Lisp_Object x, y, retval;
int col, row; int col, row;
unsigned long long_dummy; Time long_dummy;
struct gcpro gcpro1; struct gcpro gcpro1;
f = SELECTED_FRAME (); f = SELECTED_FRAME ();
...@@ -1676,7 +1676,7 @@ and nil for X and Y. */) ...@@ -1676,7 +1676,7 @@ and nil for X and Y. */)
Lisp_Object lispy_dummy; Lisp_Object lispy_dummy;
enum scroll_bar_part party_dummy; enum scroll_bar_part party_dummy;
Lisp_Object x, y; Lisp_Object x, y;
unsigned long long_dummy; Time long_dummy;
f = SELECTED_FRAME (); f = SELECTED_FRAME ();
x = y = Qnil; x = y = Qnil;
......
...@@ -238,7 +238,7 @@ Lisp_Object internal_last_event_frame; ...@@ -238,7 +238,7 @@ Lisp_Object internal_last_event_frame;
/* The timestamp of the last input event we received from the X server. /* The timestamp of the last input event we received from the X server.
X Windows wants this for selection ownership. */ 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; static Lisp_Object Qx_set_selection, Qhandle_switch_frame;
Lisp_Object QPRIMARY; Lisp_Object QPRIMARY;
...@@ -4085,7 +4085,7 @@ kbd_buffer_get_event (KBOARD **kbp, ...@@ -4085,7 +4085,7 @@ kbd_buffer_get_event (KBOARD **kbp,
Lisp_Object bar_window; Lisp_Object bar_window;
enum scroll_bar_part part; enum scroll_bar_part part;
Lisp_Object x, y; Lisp_Object x, y;
unsigned long t; Time t;
*kbp = current_kboard; *kbp = current_kboard;
/* Note that this uses F to determine which terminal to look at. /* Note that this uses F to determine which terminal to look at.
...@@ -5088,7 +5088,7 @@ static Lisp_Object button_down_location; ...@@ -5088,7 +5088,7 @@ static Lisp_Object button_down_location;
static int last_mouse_button; static int last_mouse_button;
static int last_mouse_x; static int last_mouse_x;
static int last_mouse_y; static int last_mouse_y;
static unsigned long button_down_time; static Time button_down_time;
/* The number of clicks in this multiple-click. */ /* The number of clicks in this multiple-click. */
...@@ -5099,7 +5099,7 @@ static int double_click_count; ...@@ -5099,7 +5099,7 @@ static int double_click_count;
static Lisp_Object static Lisp_Object
make_lispy_position (struct frame *f, Lisp_Object x, Lisp_Object y, make_lispy_position (struct frame *f, Lisp_Object x, Lisp_Object y,
unsigned long t) Time t)
{ {
enum window_part part; enum window_part part;
Lisp_Object posn = Qnil; Lisp_Object posn = Qnil;
...@@ -5987,7 +5987,7 @@ make_lispy_event (struct input_event *event) ...@@ -5987,7 +5987,7 @@ make_lispy_event (struct input_event *event)
static Lisp_Object static Lisp_Object
make_lispy_movement (FRAME_PTR frame, Lisp_Object bar_window, enum scroll_bar_part part, 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? */ /* Is it a scroll bar movement? */
if (frame && ! NILP (bar_window)) if (frame && ! NILP (bar_window))
......
...@@ -16,7 +16,7 @@ GNU General Public License for more details. ...@@ -16,7 +16,7 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ 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 */ #include "coding.h" /* for ENCODE_UTF_8 and ENCODE_SYSTEM */
/* Lisp fields in struct keyboard are hidden from most code and accessed /* Lisp fields in struct keyboard are hidden from most code and accessed
...@@ -459,7 +459,7 @@ extern Lisp_Object Qevent_symbol_element_mask; ...@@ -459,7 +459,7 @@ extern Lisp_Object Qevent_symbol_element_mask;
/* The timestamp of the last input event we received from the X server. /* The timestamp of the last input event we received from the X server.
X Windows wants this for selection ownership. */ X Windows wants this for selection ownership. */
extern unsigned long last_event_timestamp; extern Time last_event_timestamp;
extern int quit_char; extern int quit_char;
......
...@@ -1147,13 +1147,13 @@ no quit occurs and `x-popup-menu' returns nil. */) ...@@ -1147,13 +1147,13 @@ no quit occurs and `x-popup-menu' returns nil. */)
#else /* not HAVE_X_WINDOWS */ #else /* not HAVE_X_WINDOWS */
Lisp_Object bar_window; Lisp_Object bar_window;
enum scroll_bar_part part; enum scroll_bar_part part;
unsigned long time; Time time;
void (*mouse_position_hook) (struct frame **, int, void (*mouse_position_hook) (struct frame **, int,
Lisp_Object *, Lisp_Object *,
enum scroll_bar_part *, enum scroll_bar_part *,
Lisp_Object *, Lisp_Object *,
Lisp_Object *, Lisp_Object *,
unsigned long *) = Time *) =
FRAME_TERMINAL (new_f)->mouse_position_hook; FRAME_TERMINAL (new_f)->mouse_position_hook;
if (mouse_position_hook) if (mouse_position_hook)
......
...@@ -19,6 +19,8 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ ...@@ -19,6 +19,8 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
#ifndef MENU_H #ifndef MENU_H
#define MENU_H #define MENU_H
#include "systime.h" /* for Time */
extern void x_set_menu_bar_lines (struct frame *f, extern void x_set_menu_bar_lines (struct frame *f,
Lisp_Object value, Lisp_Object value,
Lisp_Object oldval); Lisp_Object oldval);
...@@ -48,6 +50,5 @@ extern Lisp_Object w32_menu_show (FRAME_PTR, int, int, int, int, ...@@ -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, extern Lisp_Object ns_menu_show (FRAME_PTR, int, int, int, int,
Lisp_Object, const char **); Lisp_Object, const char **);
extern Lisp_Object xmenu_show (FRAME_PTR, int, int, int, int, 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 */ #endif /* MENU_H */
...@@ -30,6 +30,12 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ ...@@ -30,6 +30,12 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
#endif #endif
#endif #endif
#ifdef HAVE_X_WINDOWS
# include <X11/X.h>
#else
typedef unsigned long Time;
#endif
#ifdef HAVE_TZNAME #ifdef HAVE_TZNAME
#ifndef tzname /* For SGI. */ #ifndef tzname /* For SGI. */
extern char *tzname[]; /* RS6000 and others want it this way. */ extern char *tzname[]; /* RS6000 and others want it this way. */
......
...@@ -2698,7 +2698,7 @@ term_mouse_movement (FRAME_PTR frame, Gpm_Event *event) ...@@ -2698,7 +2698,7 @@ term_mouse_movement (FRAME_PTR frame, Gpm_Event *event)
static void static void
term_mouse_position (FRAME_PTR *fp, int insist, Lisp_Object *bar_window, term_mouse_position (FRAME_PTR *fp, int insist, Lisp_Object *bar_window,
enum scroll_bar_part *part, Lisp_Object *x, enum scroll_bar_part *part, Lisp_Object *x,
Lisp_Object *y, unsigned long *timeptr) Lisp_Object *y, Time *timeptr)
{ {
struct timeval now; struct timeval now;
......
...@@ -20,6 +20,8 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ ...@@ -20,6 +20,8 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
/* Miscellanea. */ /* Miscellanea. */
#include "systime.h" /* for Time */
struct glyph; struct glyph;
struct frame; struct frame;
...@@ -233,7 +235,7 @@ struct input_event ...@@ -233,7 +235,7 @@ struct input_event
int modifiers; /* See enum below for interpretation. */ int modifiers; /* See enum below for interpretation. */
Lisp_Object x, y; Lisp_Object x, y;
unsigned long timestamp; Time timestamp;
/* This is padding just to put the frame_or_window field /* This is padding just to put the frame_or_window field
past the size of struct selection_input_event. */ past the size of struct selection_input_event. */
...@@ -463,7 +465,7 @@ struct terminal ...@@ -463,7 +465,7 @@ struct terminal
enum scroll_bar_part *part, enum scroll_bar_part *part,
Lisp_Object *x, Lisp_Object *x,
Lisp_Object *y, Lisp_Object *y,
unsigned long *); Time *);
/* The window system handling code should set this if the mouse has /* The window system handling code should set this if the mouse has
moved since the last call to the mouse_position_hook. Calling that moved since the last call to the mouse_position_hook. Calling that
......
...@@ -240,7 +240,7 @@ for instance using the window manager, then this produces a quit and ...@@ -240,7 +240,7 @@ for instance using the window manager, then this produces a quit and
FRAME_PTR new_f = SELECTED_FRAME (); FRAME_PTR new_f = SELECTED_FRAME ();
Lisp_Object bar_window; Lisp_Object bar_window;
enum scroll_bar_part part; enum scroll_bar_part part;
unsigned long time; Time time;
Lisp_Object x, y; Lisp_Object x, y;
(*mouse_position_hook) (&new_f, 1, &bar_window, &part, &x, &y, &time); (*mouse_position_hook) (&new_f, 1, &bar_window, &part, &x, &y, &time);
...@@ -1420,7 +1420,8 @@ pop_down_menu (Lisp_Object arg) ...@@ -1420,7 +1420,8 @@ pop_down_menu (Lisp_Object arg)
menu pops down. menu pops down.
menu_item_selection will be set to the selection. */ menu_item_selection will be set to the selection. */
static void 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; int i;
GtkWidget *menu; GtkWidget *menu;
...@@ -1464,7 +1465,7 @@ create_and_show_popup_menu (FRAME_PTR f, widget_value *first_wv, int x, int y, i ...@@ -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_widget_show_all (menu);
gtk_menu_popup (GTK_MENU (menu), 0, 0, pos_func, &popup_x_y, i, 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)); record_unwind_protect (pop_down_menu, make_save_value (menu, 0));
...@@ -1524,7 +1525,7 @@ pop_down_menu (Lisp_Object arg) ...@@ -1524,7 +1525,7 @@ pop_down_menu (Lisp_Object arg)
menu_item_selection will be set to the selection. */ menu_item_selection will be set to the selection. */
static void static void
create_and_show_popup_menu (FRAME_PTR f, widget_value *first_wv, 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; int i;
Arg av[2]; Arg av[2];
...@@ -1598,7 +1599,7 @@ create_and_show_popup_menu (FRAME_PTR f, widget_value *first_wv, ...@@ -1598,7 +1599,7 @@ create_and_show_popup_menu (FRAME_PTR f, widget_value *first_wv,
Lisp_Object Lisp_Object
xmenu_show (FRAME_PTR f, int x, int y, int for_click, int keymaps, 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; int i;
widget_value *wv, *save_wv = 0, *first_wv = 0, *prev_wv = 0; widget_value *wv, *save_wv = 0, *first_wv = 0, *prev_wv = 0;
...@@ -2241,7 +2242,7 @@ pop_down_menu (Lisp_Object arg) ...@@ -2241,7 +2242,7 @@ pop_down_menu (Lisp_Object arg)
Lisp_Object Lisp_Object
xmenu_show (FRAME_PTR f, int x, int y, int for_click, int keymaps, 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; Window root;
XMenu *menu; XMenu *menu;
......
...@@ -342,7 +342,7 @@ static struct scroll_bar *x_window_to_scroll_bar (Display *, Window); ...@@ -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 *, static void x_scroll_bar_report_motion (struct frame **, Lisp_Object *,
enum scroll_bar_part *, enum scroll_bar_part *,
Lisp_Object *, Lisp_Object *, Lisp_Object *, Lisp_Object *,
unsigned long *); Time *);
static void x_handle_net_wm_state (struct frame *, XPropertyEvent *); static void x_handle_net_wm_state (struct frame *, XPropertyEvent *);
static void x_check_fullscreen (struct frame *); static void x_check_fullscreen (struct frame *);
static void x_check_expected_move (struct frame *, int, int); static void x_check_expected_move (struct frame *, int, int);
...@@ -3799,7 +3799,7 @@ redo_mouse_highlight (void) ...@@ -3799,7 +3799,7 @@ redo_mouse_highlight (void)
static void static void
XTmouse_position (FRAME_PTR *fp, int insist, Lisp_Object *bar_window, XTmouse_position (FRAME_PTR *fp, int insist, Lisp_Object *bar_window,
enum scroll_bar_part *part, Lisp_Object *x, Lisp_Object *y, enum scroll_bar_part *part, Lisp_Object *x, Lisp_Object *y,
long unsigned int *timestamp) Time *timestamp)
{ {
FRAME_PTR f1; FRAME_PTR f1;
...@@ -5534,7 +5534,7 @@ x_scroll_bar_note_movement (struct scroll_bar *bar, XEvent *event) ...@@ -5534,7 +5534,7 @@ x_scroll_bar_note_movement (struct scroll_bar *bar, XEvent *event)
static void static void
x_scroll_bar_report_motion (FRAME_PTR *fp, Lisp_Object *bar_window, x_scroll_bar_report_motion (FRAME_PTR *fp, Lisp_Object *bar_window,
enum scroll_bar_part *part, Lisp_Object *x, 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); struct scroll_bar *bar = XSCROLL_BAR (last_mouse_scroll_bar);
Window w = bar->x_window; Window w = bar->x_window;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment