all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Paul Eggert <eggert@cs.ucla.edu>
To: 8664@debbugs.gnu.org
Subject: bug#8664: Being more-systematic about user-interface timestamps
Date: Thu, 12 May 2011 13:26:06 -0700	[thread overview]
Message-ID: <4DCC425E.2070608@cs.ucla.edu> (raw)
In-Reply-To: <4DCC3BD6.3000200@cs.ucla.edu>

Here's a further patch, to make it easier to catch bugs like
Bug#8664 in the future.


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.
=== modified file 'src/frame.c'
--- src/frame.c	2011-04-19 01:15:59 +0000
+++ src/frame.c	2011-05-12 17:15:05 +0000
@@ -1631,7 +1631,7 @@
   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 @@
   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;

=== modified file 'src/keyboard.c'
--- src/keyboard.c	2011-05-12 19:37:40 +0000
+++ src/keyboard.c	2011-05-12 19:59:08 +0000
@@ -238,7 +238,7 @@

 /* 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 @@
       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 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 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 @@

 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))

=== modified file 'src/keyboard.h'
--- src/keyboard.h	2011-04-14 01:36:53 +0000
+++ src/keyboard.h	2011-05-12 17:08:48 +0000
@@ -16,7 +16,7 @@
 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 @@

 /* 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;


=== modified file 'src/menu.c'
--- src/menu.c	2011-05-12 06:48:32 +0000
+++ src/menu.c	2011-05-12 16:55:07 +0000
@@ -1147,13 +1147,13 @@
 #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)

=== modified file 'src/menu.h'
--- src/menu.h	2011-01-25 04:08:28 +0000
+++ src/menu.h	2011-05-12 20:09:02 +0000
@@ -19,6 +19,8 @@
 #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 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 */
-

=== modified file 'src/systime.h'
--- src/systime.h	2011-03-11 20:24:09 +0000
+++ src/systime.h	2011-05-12 17:07:49 +0000
@@ -30,6 +30,12 @@
 #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.  */

=== modified file 'src/term.c'
--- src/term.c	2011-05-04 07:20:46 +0000
+++ src/term.c	2011-05-12 20:16:21 +0000
@@ -2698,7 +2698,7 @@
 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;


=== modified file 'src/termhooks.h'
--- src/termhooks.h	2011-04-25 19:40:22 +0000
+++ src/termhooks.h	2011-05-12 17:13:37 +0000
@@ -20,6 +20,8 @@
 \f
 /* Miscellanea.   */

+#include "systime.h" /* for Time */
+
 struct glyph;
 struct frame;
 \f
@@ -233,7 +235,7 @@
   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 @@
                                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

=== modified file 'src/xmenu.c'
--- src/xmenu.c	2011-05-12 16:16:40 +0000
+++ src/xmenu.c	2011-05-12 16:32:07 +0000
@@ -240,7 +240,7 @@
       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 @@
    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 @@
   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 @@
    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 @@

 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 @@

 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;

=== modified file 'src/xterm.c'
--- src/xterm.c	2011-05-11 23:16:52 +0000
+++ src/xterm.c	2011-05-12 17:01:31 +0000
@@ -342,7 +342,7 @@
 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 @@
 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 @@
 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;






  reply	other threads:[~2011-05-12 20:26 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-05-12 19:58 bug#8664: * keyboard.c (make_lispy_event): Fix problem in integer overflow Paul Eggert
2011-05-12 20:26 ` Paul Eggert [this message]
2011-05-13  8:53   ` bug#8664: Being more-systematic about user-interface timestamps Eli Zaretskii
2011-05-14  9:10     ` Paul Eggert
2011-05-14  9:41       ` Eli Zaretskii
2011-05-14 19:09         ` Paul Eggert
2011-05-14 20:47           ` Eli Zaretskii
  -- strict thread matches above, loose matches on Subject: below --
2011-05-16  5:07 bug#8675: lisp_string_width and strings wider than INT_MAX Paul Eggert
2011-05-16  5:30 ` Eli Zaretskii
2011-05-16  5:33   ` Paul Eggert
2011-05-16  7:57     ` Eli Zaretskii
2011-05-16 16:37       ` Paul Eggert
2011-05-16 16:48       ` Stefan Monnier
2011-05-17  9:52         ` Eli Zaretskii
2011-05-17 10:30         ` merge-commits policy (was: bug#8675: lisp_string_width and strings wider than INT_MAX) Eli Zaretskii
2011-05-17 13:42           ` merge-commits policy Stefan Monnier
2011-05-17 17:57             ` Eli Zaretskii
2011-05-17 19:50               ` Stefan Monnier
2011-05-18  1:33 ` bug#8675: committed fix into trunk Paul Eggert
2011-05-18  2:26   ` Christoph Scholtes
2011-05-18  2:48     ` Paul Eggert
2011-05-18  3:19       ` Christoph Scholtes
2011-05-18 12:39       ` Andreas Schwab
2011-05-18 19:55         ` bug#8675: error: token "@" is not valid in preprocessor expressions Paul Eggert
     [not found]         ` <4DD42421.6090906@cs.ucla.edu>
2011-05-18 20:35           ` Andreas Schwab
     [not found]           ` <m262p7u4ph.fsf@igel.home>
2011-05-18 22:59             ` Paul Eggert
     [not found]             ` <4DD44F42.1050405@cs.ucla.edu>
2011-05-19  0:27               ` Bruno Haible
     [not found]               ` <201105190227.26215.bruno@clisp.org>
2011-05-19  1:47                 ` Christoph Scholtes
2011-05-19  7:39                   ` Paul Eggert
2011-05-18  6:54   ` bug#8664: committed fix into trunk Eli Zaretskii

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4DCC425E.2070608@cs.ucla.edu \
    --to=eggert@cs.ucla.edu \
    --cc=8664@debbugs.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.