add cursor autohide
[uwplayer.git] / application / window.c
index 26092cd..fe81481 100644 (file)
@@ -150,7 +150,7 @@ static void playerEH(Widget widget, XtPointer data, XEvent *event, Boolean *disp
     
     if(!win->player || win->player->window == 0) return;
     
-    WindowPlayerWidgetEvent(win, event);
+    WindowHandlePlayerEvent(win, event);
     
     if(pass) {
         // redirect key events to the player window
@@ -165,15 +165,35 @@ static void playerEH(Widget widget, XtPointer data, XEvent *event, Boolean *disp
     }
 }
 
-void WindowPlayerWidgetEvent(MainWindow *win, XEvent *event) {
+#define IGNORE_MOTION_THRESHOLD_MS 1000
+#define MOTION_POS_THRESHOLD_PIX   5
+
+void WindowHandlePlayerEvent(MainWindow *win, XEvent *event) {
+    // event handler for intercepted player mouse events
+    // win->player is not NULL
+    
     int etype = event->type;
     
     if(etype == MotionNotify) {
-        
+        Time cur_motion_time = event->xmotion.time;
+        int x = event->xmotion.x;
+        int y = event->xmotion.y;
+        if(win->cursorhidden && cur_motion_time - win->player_event_time < IGNORE_MOTION_THRESHOLD_MS) {
+            int diff_x = abs(x - win->mouse_x_orig);
+            int diff_y = abs(y - win->mouse_y_orig);
+            if(diff_x > MOTION_POS_THRESHOLD_PIX || diff_y > MOTION_POS_THRESHOLD_PIX) {
+                WindowShowPlayerCursor(win);
+            }
+        } else {
+            win->mouse_x_orig = x;
+            win->mouse_y_orig = y;
+        }
+        win->player_event_time = cur_motion_time;
+        win->motion_playback_time = win->player->playback_time;
     } else if(etype == ButtonPress) {
-        
+        win->player_event_time = event->xbutton.time;
     } else if(etype == ButtonRelease) {
-        
+        win->player_event_time = event->xbutton.time;
     }
 }
 
@@ -499,11 +519,12 @@ void WindowClosePlayer(MainWindow *win) {
         PlayerDestroy(win->player);
     }
     win->player = NULL;
+    WindowShowPlayerCursor(win);
 }
 
 void WindowHidePlayerCursor(MainWindow *win) {
     if(!win->cursorhidden && win->player && win->player->window != 0) {
-        //XDefineCursor(XtDisplay(win->player_widget), XtWindow(win->player_widget), blank_cursor);
+        XDefineCursor(XtDisplay(win->player_widget), XtWindow(win->player_widget), blank_cursor);
         win->cursorhidden = True;
         XFlush(XtDisplay(win->player_widget));
     }