From: Po Lu Date: Fri, 1 Apr 2022 03:50:14 +0000 (+0800) Subject: Support Motif DND help X-Git-Tag: emacs-29.0.90~1931^2~843 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=52c31f9e13c349609091620ecf56ac42747c1652;p=emacs.git Support Motif DND help * src/xterm.c (x_dnd_xm_use_help): New state variable. (x_dnd_begin_drag_and_drop): Clear new variable. (handle_one_xevent): Set new variable if we get a key press event F1 during the drag-and-drop session, and use help action when dropping onto a Motif program if it is set. --- diff --git a/src/xterm.c b/src/xterm.c index 07074d19cb8..b2059e69aa5 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -851,6 +851,7 @@ static bool x_dnd_waiting_for_finish; target to convert one of the special selections XmTRANSFER_SUCCESS or XmTRANSFER_FAILURE. */ static int x_dnd_waiting_for_motif_finish; +static bool x_dnd_xm_use_help; static Window x_dnd_pending_finish_target; static int x_dnd_waiting_for_finish_proto; static bool x_dnd_allow_current_frame; @@ -1011,7 +1012,7 @@ typedef struct xm_drag_receiver_info #define XM_DRAG_LINK (1L << 2) #define XM_DROP_ACTION_DROP 0 -/* #define XM_DROP_ACTION_DROP_HELP 1 */ +#define XM_DROP_ACTION_DROP_HELP 1 #define XM_DROP_ACTION_DROP_CANCEL 2 #define XM_DRAG_REASON(originator, code) ((code) | ((originator) << 7)) @@ -8648,6 +8649,7 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, Atom xaction, x_dnd_return_frame = 0; x_dnd_waiting_for_finish = false; x_dnd_waiting_for_motif_finish = 0; + x_dnd_xm_use_help = false; x_dnd_end_window = None; x_dnd_use_toplevels = x_wm_supports (f, FRAME_DISPLAY_INFO (f)->Xatom_net_client_list_stacking); @@ -12597,7 +12599,8 @@ handle_one_xevent (struct x_display_info *dpyinfo, } if (status != XM_DROP_SITE_VALID - || action == XM_DROP_ACTION_DROP_CANCEL) + || (action == XM_DROP_ACTION_DROP_CANCEL + || action == XM_DROP_ACTION_DROP_HELP)) { x_dnd_waiting_for_finish = false; goto OTHER; @@ -13542,6 +13545,14 @@ handle_one_xevent (struct x_display_info *dpyinfo, &compose_status); #endif +#ifdef XK_F1 + if (x_dnd_in_progress && keysym == XK_F1) + { + x_dnd_xm_use_help = true; + goto done_keysym; + } +#endif + /* If not using XIM/XIC, and a compose sequence is in progress, we break here. Otherwise, chars_matched is always 0. */ if (compose_status.chars_matched > 0 && nbytes == 0) @@ -14441,7 +14452,9 @@ handle_one_xevent (struct x_display_info *dpyinfo, = XM_DRAG_SIDE_EFFECT (xm_side_effect_from_action (dpyinfo, x_dnd_wanted_action), XM_DROP_SITE_VALID, XM_DRAG_NOOP, - XM_DROP_ACTION_DROP); + (x_dnd_xm_use_help + ? XM_DROP_ACTION_DROP + : XM_DROP_ACTION_DROP_HELP)); dmsg.timestamp = event->xbutton.time; dmsg.x = event->xbutton.x_root; dmsg.y = event->xbutton.y_root; @@ -15495,7 +15508,9 @@ handle_one_xevent (struct x_display_info *dpyinfo, XM_DROP_SITE_VALID, xm_side_effect_from_action (dpyinfo, x_dnd_wanted_action), - XM_DROP_ACTION_DROP); + (x_dnd_xm_use_help + ? XM_DROP_ACTION_DROP + : XM_DROP_ACTION_DROP_HELP)); dmsg.timestamp = xev->time; dmsg.x = lrint (xev->root_x); dmsg.y = lrint (xev->root_y); @@ -16115,6 +16130,14 @@ handle_one_xevent (struct x_display_info *dpyinfo, } } +#ifdef XK_F1 + if (x_dnd_in_progress && keysym == XK_F1) + { + x_dnd_xm_use_help = true; + goto xi_done_keysym; + } +#endif + /* First deal with keysyms which have defined translations to characters. */ if (keysym >= 32 && keysym < 128)