summaryrefslogtreecommitdiff
path: root/src/w32fns.c
diff options
context:
space:
mode:
authorJason Rumney <jasonr@gnu.org>2008-03-19 17:04:18 +0000
committerJason Rumney <jasonr@gnu.org>2008-03-19 17:04:18 +0000
commitd148e14dc586e5f94e158c7396588b8183e42ceb (patch)
treec32cad07b7b8aa8404fe26ec522db8de52b26f87 /src/w32fns.c
parentcdf8b62f427dc64e3b70a4d5a5602a69f427f1c8 (diff)
downloademacs-d148e14dc586e5f94e158c7396588b8183e42ceb.tar.gz
* w32fns.c (hourglass_timer, hourglass_hwnd): New variables.
(syms_of_w32fns): Initialize them. (HOURGLASS_ID): New constant. (x_window_to_frame): Don't check hourglass_window. (w32_wnd_proc) <WM_TIMER>: Handle hourglass_timer. (w32_wnd_proc) <WM_EXITMENULOOP>: Set pending hourglass cursor. (w32_wnd_proc) <WM_SETCURSOR>: Set the hourglass or current cursor. (w32_wnd_proc) <WM_EMACS_SETCURSOR>: Set frame's current_cursor. Only change the cursor if hourglass is not active. (Fx_create_frame): Initialize frame's current_cursor. (hourglass_atimer): Remove. (hourglass_started): New function. (start_hourglass, cancel_hourglass, hide_hourglass): Adapt to w32. (show_hourglass): Adapt to w32, changing argument to frame. * w32term.h (struct w32_output): Remove hourglass_window. Add current_cursor. * eval.c (call_debugger, Fsignal): * keyboard.c (recursive_edit_1, cmd_error, Ftop_level) (command_loop_1, Fread_key_sequence, Fread_key_sequence_vector) (Fexecute_extended_command, cancel_hourglass_unwind): * minibuf.c (read_minibuf): * fns.c (Fy_or_n_p): Enable hourglass when HAVE_WINDOW_SYSTEM.
Diffstat (limited to 'src/w32fns.c')
-rw-r--r--src/w32fns.c167
1 files changed, 70 insertions, 97 deletions
diff --git a/src/w32fns.c b/src/w32fns.c
index d88e86d54f6..ed5decdc868 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -154,6 +154,11 @@ Lisp_Object Vx_no_window_manager;
int display_hourglass_p;
+/* If non-zero, a w32 timer that, when it expires, displays an
+ hourglass cursor on all frames. */
+static unsigned hourglass_timer = 0;
+static HWND hourglass_hwnd = NULL;
+
/* The background and shape of the mouse pointer, and shape when not
over text or in the modeline. */
@@ -304,6 +309,7 @@ unsigned int msh_mousewheel = 0;
#define MOUSE_BUTTON_ID 1
#define MOUSE_MOVE_ID 2
#define MENU_FREE_ID 3
+#define HOURGLASS_ID 4
/* The delay (milliseconds) before a menu is freed after WM_EXITMENULOOP
is received. */
#define MENU_FREE_DELAY 1000
@@ -335,6 +341,11 @@ static HWND w32_visible_system_caret_hwnd;
extern HMENU current_popup_menu;
static int menubar_in_use = 0;
+/* Function prototypes for hourglass support. */
+static void show_hourglass P_ ((struct frame *));
+static void hide_hourglass P_ ((void));
+
+
/* Error if we are not connected to MS-Windows. */
void
@@ -423,8 +434,6 @@ x_window_to_frame (dpyinfo, wdesc)
f = XFRAME (frame);
if (!FRAME_W32_P (f) || FRAME_W32_DISPLAY_INFO (f) != dpyinfo)
continue;
- if (f->output_data.w32->hourglass_window == wdesc)
- return f;
if (FRAME_W32_WINDOW (f) == wdesc)
return f;
@@ -3525,6 +3534,12 @@ w32_wnd_proc (hwnd, msg, wParam, lParam)
menubar_in_use = 0;
}
}
+ else if (wParam == hourglass_timer)
+ {
+ KillTimer (hwnd, hourglass_timer);
+ hourglass_timer = 0;
+ show_hourglass (x_window_to_frame (dpyinfo, hwnd));
+ }
return 0;
case WM_NCACTIVATE:
@@ -3590,6 +3605,11 @@ w32_wnd_proc (hwnd, msg, wParam, lParam)
*/
if (f && menubar_in_use && current_popup_menu == NULL)
menu_free_timer = SetTimer (hwnd, MENU_FREE_ID, MENU_FREE_DELAY, NULL);
+
+ /* If hourglass cursor should be displayed, display it now. */
+ if (f && f->output_data.w32->hourglass_p)
+ SetCursor (f->output_data.w32->hourglass_cursor);
+
goto dflt;
case WM_MENUSELECT:
@@ -3858,15 +3878,27 @@ w32_wnd_proc (hwnd, msg, wParam, lParam)
case WM_SETCURSOR:
if (LOWORD (lParam) == HTCLIENT)
- return 0;
-
+ {
+ f = x_window_to_frame (dpyinfo, hwnd);
+ if (f->output_data.w32->hourglass_p && !menubar_in_use
+ && !current_popup_menu)
+ SetCursor (f->output_data.w32->hourglass_cursor);
+ else
+ SetCursor (f->output_data.w32->current_cursor);
+ return 0;
+ }
goto dflt;
case WM_EMACS_SETCURSOR:
{
Cursor cursor = (Cursor) wParam;
- if (cursor)
- SetCursor (cursor);
+ f = x_window_to_frame (dpyinfo, hwnd);
+ if (f && cursor)
+ {
+ f->output_data.w32->current_cursor = cursor;
+ if (!f->output_data.w32->hourglass_p)
+ SetCursor (cursor);
+ }
return 0;
}
@@ -4528,6 +4560,8 @@ This function is an internal primitive--use `make-frame' instead. */)
f->output_data.w32->hourglass_cursor = w32_load_cursor (IDC_WAIT);
f->output_data.w32->horizontal_drag_cursor = w32_load_cursor (IDC_SIZEWE);
+ f->output_data.w32->current_cursor = f->output_data.w32->nontext_cursor;
+
window_prompting = x_figure_window_size (f, parameters, 1);
tem = w32_get_arg (parameters, Qunsplittable, 0, 0, RES_TYPE_BOOLEAN);
@@ -7216,11 +7250,6 @@ value. */)
Busy cursor
***********************************************************************/
-/* If non-null, an asynchronous timer that, when it expires, displays
- an hourglass cursor on all frames. */
-
-static struct atimer *hourglass_atimer;
-
/* Non-zero means an hourglass cursor is currently shown. */
static int hourglass_shown_p;
@@ -7234,20 +7263,22 @@ static Lisp_Object Vhourglass_delay;
#define DEFAULT_HOURGLASS_DELAY 1
-/* Function prototypes. */
-
-static void show_hourglass P_ ((struct atimer *));
-static void hide_hourglass P_ ((void));
+/* Return non-zero if houglass timer has been started or hourglass is shown. */
+int
+hourglass_started ()
+{
+ return hourglass_shown_p || hourglass_timer;
+}
/* Cancel a currently active hourglass timer, and start a new one. */
void
start_hourglass ()
{
-#if 0 /* TODO: cursor shape changes. */
- EMACS_TIME delay;
- int secs, usecs = 0;
+ DWORD delay;
+ int secs, msecs = 0;
+ struct frame * f = SELECTED_FRAME ();
cancel_hourglass ();
@@ -7260,15 +7291,14 @@ start_hourglass ()
Lisp_Object tem;
tem = Ftruncate (Vhourglass_delay, Qnil);
secs = XFASTINT (tem);
- usecs = (XFLOAT_DATA (Vhourglass_delay) - secs) * 1000000;
+ msecs = (XFLOAT_DATA (Vhourglass_delay) - secs) * 1000;
}
else
secs = DEFAULT_HOURGLASS_DELAY;
- EMACS_SET_SECS_USECS (delay, secs, usecs);
- hourglass_atimer = start_atimer (ATIMER_RELATIVE, delay,
- show_hourglass, NULL);
-#endif
+ delay = secs * 1000 + msecs;
+ hourglass_hwnd = FRAME_W32_WINDOW (f);
+ hourglass_timer = SetTimer (hourglass_hwnd, HOURGLASS_ID, delay, NULL);
}
@@ -7278,10 +7308,10 @@ start_hourglass ()
void
cancel_hourglass ()
{
- if (hourglass_atimer)
+ if (hourglass_timer)
{
- cancel_atimer (hourglass_atimer);
- hourglass_atimer = NULL;
+ KillTimer (hourglass_hwnd, hourglass_timer);
+ hourglass_timer = 0;
}
if (hourglass_shown_p)
@@ -7289,62 +7319,22 @@ cancel_hourglass ()
}
-/* Timer function of hourglass_atimer. TIMER is equal to
- hourglass_atimer.
+/* Timer function of hourglass_timer.
- Display an hourglass cursor on all frames by mapping the frames'
- hourglass_window. Set the hourglass_p flag in the frames'
- output_data.x structure to indicate that an hourglass cursor is
- shown on the frames. */
+ Display an hourglass cursor. Set the hourglass_p flag in display info
+ to indicate that an hourglass cursor is shown. */
static void
-show_hourglass (timer)
- struct atimer *timer;
+show_hourglass (f)
+ struct frame *f;
{
-#if 0 /* TODO: cursor shape changes. */
- /* The timer implementation will cancel this timer automatically
- after this function has run. Set hourglass_atimer to null
- so that we know the timer doesn't have to be canceled. */
- hourglass_atimer = NULL;
-
if (!hourglass_shown_p)
{
- Lisp_Object rest, frame;
-
- BLOCK_INPUT;
-
- FOR_EACH_FRAME (rest, frame)
- if (FRAME_W32_P (XFRAME (frame)))
- {
- struct frame *f = XFRAME (frame);
-
- f->output_data.w32->hourglass_p = 1;
-
- if (!f->output_data.w32->hourglass_window)
- {
- unsigned long mask = CWCursor;
- XSetWindowAttributes attrs;
-
- attrs.cursor = f->output_data.w32->hourglass_cursor;
-
- f->output_data.w32->hourglass_window
- = XCreateWindow (FRAME_X_DISPLAY (f),
- FRAME_OUTER_WINDOW (f),
- 0, 0, 32000, 32000, 0, 0,
- InputOnly,
- CopyFromParent,
- mask, &attrs);
- }
-
- XMapRaised (FRAME_X_DISPLAY (f),
- f->output_data.w32->hourglass_window);
- XFlush (FRAME_X_DISPLAY (f));
- }
-
+ f->output_data.w32->hourglass_p = 1;
+ if (!menubar_in_use && !current_popup_menu)
+ SetCursor (f->output_data.w32->hourglass_cursor);
hourglass_shown_p = 1;
- UNBLOCK_INPUT;
}
-#endif
}
@@ -7353,33 +7343,15 @@ show_hourglass (timer)
static void
hide_hourglass ()
{
-#if 0 /* TODO: cursor shape changes. */
if (hourglass_shown_p)
{
- Lisp_Object rest, frame;
-
- BLOCK_INPUT;
- FOR_EACH_FRAME (rest, frame)
- {
- struct frame *f = XFRAME (frame);
-
- if (FRAME_W32_P (f)
- /* Watch out for newly created frames. */
- && f->output_data.x->hourglass_window)
- {
- XUnmapWindow (FRAME_X_DISPLAY (f),
- f->output_data.x->hourglass_window);
- /* Sync here because XTread_socket looks at the
- hourglass_p flag that is reset to zero below. */
- XSync (FRAME_X_DISPLAY (f), False);
- f->output_data.x->hourglass_p = 0;
- }
- }
+ struct frame *f = x_window_to_frame (&one_w32_display_info,
+ hourglass_hwnd);
+ f->output_data.w32->hourglass_p = 0;
+ SetCursor (f->output_data.w32->current_cursor);
hourglass_shown_p = 0;
- UNBLOCK_INPUT;
}
-#endif
}
@@ -9323,7 +9295,8 @@ versions of Windows) characters. */);
check_window_system_func = check_w32;
- hourglass_atimer = NULL;
+ hourglass_timer = 0;
+ hourglass_hwnd = NULL;
hourglass_shown_p = 0;
defsubr (&Sx_show_tip);
defsubr (&Sx_hide_tip);