]> git.eshelyaron.com Git - emacs.git/commitdiff
Avoid unnecessary calculations when handling button events during DND
authorPo Lu <luangruo@yahoo.com>
Sat, 23 Apr 2022 02:04:33 +0000 (10:04 +0800)
committerPo Lu <luangruo@yahoo.com>
Sat, 23 Apr 2022 02:05:13 +0000 (10:05 +0800)
* src/xterm.c (handle_one_xevent): Only calculate DND grab for
button release events.

src/xterm.c

index 7e8d226fb26730bd50481b57b4a28181e69e2bae..1b1074b2f404232356c5d5719ab6a36bdc03e349 100644 (file)
@@ -15972,103 +15972,106 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                goto OTHER;
              }
 
-           for (int i = 1; i < 8; ++i)
+           if (event->xbutton.type == ButtonRelease)
              {
-               if (i != event->xbutton.button
-                   && event->xbutton.state & (Button1Mask << (i - 1)))
-                 dnd_grab = true;
-             }
-
-           if (!dnd_grab && event->xbutton.type == ButtonRelease)
-             {
-               x_dnd_end_window = x_dnd_last_seen_window;
-               x_dnd_in_progress = false;
-
-               if (x_dnd_last_seen_window != None
-                   && x_dnd_last_protocol_version != -1)
+               for (int i = 1; i < 8; ++i)
                  {
-                   x_dnd_pending_finish_target = x_dnd_last_seen_window;
-                   x_dnd_waiting_for_finish_proto = x_dnd_last_protocol_version;
-
-                   x_dnd_waiting_for_finish
-                     = x_dnd_send_drop (x_dnd_frame, x_dnd_last_seen_window,
-                                        x_dnd_selection_timestamp,
-                                        x_dnd_last_protocol_version);
+                   if (i != event->xbutton.button
+                       && event->xbutton.state & (Button1Mask << (i - 1)))
+                     dnd_grab = true;
                  }
-               else if (x_dnd_last_seen_window != None)
+
+               if (!dnd_grab)
                  {
-                   xm_drop_start_message dmsg;
-                   xm_drag_receiver_info drag_receiver_info;
-
-                   if (!xm_read_drag_receiver_info (dpyinfo, x_dnd_last_seen_window,
-                                                    &drag_receiver_info)
-                       && drag_receiver_info.protocol_style != XM_DRAG_STYLE_NONE
-                       && (x_dnd_allow_current_frame
-                           || x_dnd_last_seen_window != FRAME_OUTER_WINDOW (x_dnd_frame)))
+                   x_dnd_end_window = x_dnd_last_seen_window;
+                   x_dnd_in_progress = false;
+
+                   if (x_dnd_last_seen_window != None
+                       && x_dnd_last_protocol_version != -1)
                      {
-                       if (!x_dnd_motif_setup_p)
-                         xm_setup_drag_info (dpyinfo, x_dnd_frame);
+                       x_dnd_pending_finish_target = x_dnd_last_seen_window;
+                       x_dnd_waiting_for_finish_proto = x_dnd_last_protocol_version;
 
-                       if (x_dnd_motif_setup_p)
+                       x_dnd_waiting_for_finish
+                         = x_dnd_send_drop (x_dnd_frame, x_dnd_last_seen_window,
+                                            x_dnd_selection_timestamp,
+                                            x_dnd_last_protocol_version);
+                     }
+                   else if (x_dnd_last_seen_window != None)
+                     {
+                       xm_drop_start_message dmsg;
+                       xm_drag_receiver_info drag_receiver_info;
+
+                       if (!xm_read_drag_receiver_info (dpyinfo, x_dnd_last_seen_window,
+                                                        &drag_receiver_info)
+                           && drag_receiver_info.protocol_style != XM_DRAG_STYLE_NONE
+                           && (x_dnd_allow_current_frame
+                               || x_dnd_last_seen_window != FRAME_OUTER_WINDOW (x_dnd_frame)))
                          {
-                           memset (&dmsg, 0, sizeof dmsg);
-
-                           dmsg.reason = XM_DRAG_REASON (XM_DRAG_ORIGINATOR_INITIATOR,
-                                                         XM_DRAG_REASON_DROP_START);
-                           dmsg.byte_order = XM_BYTE_ORDER_CUR_FIRST;
-                           dmsg.side_effects
-                             = XM_DRAG_SIDE_EFFECT (xm_side_effect_from_action (dpyinfo,
-                                                                                x_dnd_wanted_action),
-                                                    XM_DROP_SITE_VALID,
-                                                    xm_side_effect_from_action (dpyinfo,
-                                                                                x_dnd_wanted_action),
-                                                    (!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;
-                           dmsg.index_atom = dpyinfo->Xatom_XdndSelection;
-                           dmsg.source_window = FRAME_X_WINDOW (x_dnd_frame);
-
-                           if (!XM_DRAG_STYLE_IS_DROP_ONLY (drag_receiver_info.protocol_style))
-                             x_dnd_send_xm_leave_for_drop (FRAME_DISPLAY_INFO (x_dnd_frame),
-                                                           x_dnd_frame, x_dnd_last_seen_window,
-                                                           event->xbutton.time);
-
-                           xm_send_drop_message (dpyinfo, FRAME_X_WINDOW (x_dnd_frame),
-                                                 x_dnd_last_seen_window, &dmsg);
-
-                           x_dnd_waiting_for_finish = true;
-                           x_dnd_waiting_for_motif_finish = 1;
+                           if (!x_dnd_motif_setup_p)
+                             xm_setup_drag_info (dpyinfo, x_dnd_frame);
+
+                           if (x_dnd_motif_setup_p)
+                             {
+                               memset (&dmsg, 0, sizeof dmsg);
+
+                               dmsg.reason = XM_DRAG_REASON (XM_DRAG_ORIGINATOR_INITIATOR,
+                                                             XM_DRAG_REASON_DROP_START);
+                               dmsg.byte_order = XM_BYTE_ORDER_CUR_FIRST;
+                               dmsg.side_effects
+                                 = XM_DRAG_SIDE_EFFECT (xm_side_effect_from_action (dpyinfo,
+                                                                                    x_dnd_wanted_action),
+                                                        XM_DROP_SITE_VALID,
+                                                        xm_side_effect_from_action (dpyinfo,
+                                                                                    x_dnd_wanted_action),
+                                                        (!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;
+                               dmsg.index_atom = dpyinfo->Xatom_XdndSelection;
+                               dmsg.source_window = FRAME_X_WINDOW (x_dnd_frame);
+
+                               if (!XM_DRAG_STYLE_IS_DROP_ONLY (drag_receiver_info.protocol_style))
+                                 x_dnd_send_xm_leave_for_drop (FRAME_DISPLAY_INFO (x_dnd_frame),
+                                                               x_dnd_frame, x_dnd_last_seen_window,
+                                                               event->xbutton.time);
+
+                               xm_send_drop_message (dpyinfo, FRAME_X_WINDOW (x_dnd_frame),
+                                                     x_dnd_last_seen_window, &dmsg);
+
+                               x_dnd_waiting_for_finish = true;
+                               x_dnd_waiting_for_motif_finish = 1;
+                             }
+                         }
+                       else
+                         {
+                           x_set_pending_dnd_time (event->xbutton.time);
+                           x_dnd_send_unsupported_drop (dpyinfo, (x_dnd_last_seen_toplevel != None
+                                                                  ? x_dnd_last_seen_toplevel
+                                                                  : x_dnd_last_seen_window),
+                                                        event->xbutton.x_root, event->xbutton.y_root,
+                                                        event->xbutton.time);
                          }
                      }
-                   else
+                   else if (x_dnd_last_seen_toplevel != None)
                      {
                        x_set_pending_dnd_time (event->xbutton.time);
-                       x_dnd_send_unsupported_drop (dpyinfo, (x_dnd_last_seen_toplevel != None
-                                                              ? x_dnd_last_seen_toplevel
-                                                              : x_dnd_last_seen_window),
-                                                    event->xbutton.x_root, event->xbutton.y_root,
+                       x_dnd_send_unsupported_drop (dpyinfo, x_dnd_last_seen_toplevel,
+                                                    event->xbutton.x_root,
+                                                    event->xbutton.y_root,
                                                     event->xbutton.time);
                      }
-                 }
-               else if (x_dnd_last_seen_toplevel != None)
-                 {
-                   x_set_pending_dnd_time (event->xbutton.time);
-                   x_dnd_send_unsupported_drop (dpyinfo, x_dnd_last_seen_toplevel,
-                                                event->xbutton.x_root,
-                                                event->xbutton.y_root,
-                                                event->xbutton.time);
-                 }
 
 
-               x_dnd_last_protocol_version = -1;
-               x_dnd_last_motif_style = XM_DRAG_STYLE_NONE;
-               x_dnd_last_seen_window = None;
-               x_dnd_last_seen_toplevel = None;
-               x_dnd_frame = NULL;
-               x_set_dnd_targets (NULL, 0);
+                   x_dnd_last_protocol_version = -1;
+                   x_dnd_last_motif_style = XM_DRAG_STYLE_NONE;
+                   x_dnd_last_seen_window = None;
+                   x_dnd_last_seen_toplevel = None;
+                   x_dnd_frame = NULL;
+                   x_set_dnd_targets (NULL, 0);
+                 }
              }
 
            goto OTHER;
@@ -17234,111 +17237,114 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                      goto XI_OTHER;
                    }
 
-                 for (int i = 0; i < xev->buttons.mask_len * 8; ++i)
-                   {
-                     if (i != xev->detail && XIMaskIsSet (xev->buttons.mask, i))
-                       dnd_grab = true;
-                   }
-
-                 if (!dnd_grab && xev->evtype == XI_ButtonRelease)
+                 if (xev->evtype == XI_ButtonRelease)
                    {
-                     x_dnd_end_window = x_dnd_last_seen_window;
-                     x_dnd_in_progress = false;
-
-                     if (x_dnd_last_seen_window != None
-                         && x_dnd_last_protocol_version != -1)
+                     for (int i = 0; i < xev->buttons.mask_len * 8; ++i)
                        {
-                         x_dnd_pending_finish_target = x_dnd_last_seen_window;
-                         x_dnd_waiting_for_finish_proto = x_dnd_last_protocol_version;
-
-                         x_dnd_waiting_for_finish
-                           = x_dnd_send_drop (x_dnd_frame, x_dnd_last_seen_window,
-                                              x_dnd_selection_timestamp,
-                                              x_dnd_last_protocol_version);
+                         if (i != xev->detail && XIMaskIsSet (xev->buttons.mask, i))
+                           dnd_grab = true;
                        }
-                     else if (x_dnd_last_seen_window != None)
+
+                     if (!dnd_grab)
                        {
-                         xm_drop_start_message dmsg;
-                         xm_drag_receiver_info drag_receiver_info;
-
-                         if (!xm_read_drag_receiver_info (dpyinfo, x_dnd_last_seen_window,
-                                                          &drag_receiver_info)
-                             && drag_receiver_info.protocol_style != XM_DRAG_STYLE_NONE
-                             && (x_dnd_allow_current_frame
-                                 || x_dnd_last_seen_window != FRAME_OUTER_WINDOW (x_dnd_frame)))
+                         x_dnd_end_window = x_dnd_last_seen_window;
+                         x_dnd_in_progress = false;
+
+                         if (x_dnd_last_seen_window != None
+                             && x_dnd_last_protocol_version != -1)
                            {
-                             if (!x_dnd_motif_setup_p)
-                               xm_setup_drag_info (dpyinfo, x_dnd_frame);
+                             x_dnd_pending_finish_target = x_dnd_last_seen_window;
+                             x_dnd_waiting_for_finish_proto = x_dnd_last_protocol_version;
 
-                             if (x_dnd_motif_setup_p)
+                             x_dnd_waiting_for_finish
+                               = x_dnd_send_drop (x_dnd_frame, x_dnd_last_seen_window,
+                                                  x_dnd_selection_timestamp,
+                                                  x_dnd_last_protocol_version);
+                           }
+                         else if (x_dnd_last_seen_window != None)
+                           {
+                             xm_drop_start_message dmsg;
+                             xm_drag_receiver_info drag_receiver_info;
+
+                             if (!xm_read_drag_receiver_info (dpyinfo, x_dnd_last_seen_window,
+                                                              &drag_receiver_info)
+                                 && drag_receiver_info.protocol_style != XM_DRAG_STYLE_NONE
+                                 && (x_dnd_allow_current_frame
+                                     || x_dnd_last_seen_window != FRAME_OUTER_WINDOW (x_dnd_frame)))
+                               {
+                                 if (!x_dnd_motif_setup_p)
+                                   xm_setup_drag_info (dpyinfo, x_dnd_frame);
+
+                                 if (x_dnd_motif_setup_p)
+                                   {
+                                     memset (&dmsg, 0, sizeof dmsg);
+
+                                     dmsg.reason = XM_DRAG_REASON (XM_DRAG_ORIGINATOR_INITIATOR,
+                                                                   XM_DRAG_REASON_DROP_START);
+                                     dmsg.byte_order = XM_BYTE_ORDER_CUR_FIRST;
+                                     dmsg.side_effects
+                                       = XM_DRAG_SIDE_EFFECT (xm_side_effect_from_action (dpyinfo,
+                                                                                          x_dnd_wanted_action),
+                                                              XM_DROP_SITE_VALID,
+                                                              xm_side_effect_from_action (dpyinfo,
+                                                                                          x_dnd_wanted_action),
+                                                              (!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);
+                                     /* This atom technically has to be
+                                        unique to each drag-and-drop
+                                        operation, but that isn't easy to
+                                        accomplish, since we cannot
+                                        randomly move data around between
+                                        selections.  Let's hope no two
+                                        instances of Emacs try to drag
+                                        into the same window at the same
+                                        time.  */
+                                     dmsg.index_atom = dpyinfo->Xatom_XdndSelection;
+                                     dmsg.source_window = FRAME_X_WINDOW (x_dnd_frame);
+
+                                     if (!XM_DRAG_STYLE_IS_DROP_ONLY (drag_receiver_info.protocol_style))
+                                       x_dnd_send_xm_leave_for_drop (FRAME_DISPLAY_INFO (x_dnd_frame),
+                                                                     x_dnd_frame, x_dnd_last_seen_window,
+                                                                     xev->time);
+
+                                     xm_send_drop_message (dpyinfo, FRAME_X_WINDOW (x_dnd_frame),
+                                                           x_dnd_last_seen_window, &dmsg);
+
+                                     x_dnd_waiting_for_finish = true;
+                                     x_dnd_waiting_for_motif_finish = 1;
+                                   }
+                               }
+                             else
                                {
-                                 memset (&dmsg, 0, sizeof dmsg);
-
-                                 dmsg.reason = XM_DRAG_REASON (XM_DRAG_ORIGINATOR_INITIATOR,
-                                                               XM_DRAG_REASON_DROP_START);
-                                 dmsg.byte_order = XM_BYTE_ORDER_CUR_FIRST;
-                                 dmsg.side_effects
-                                   = XM_DRAG_SIDE_EFFECT (xm_side_effect_from_action (dpyinfo,
-                                                                                      x_dnd_wanted_action),
-                                                          XM_DROP_SITE_VALID,
-                                                          xm_side_effect_from_action (dpyinfo,
-                                                                                      x_dnd_wanted_action),
-                                                          (!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);
-                                 /* This atom technically has to be
-                                    unique to each drag-and-drop
-                                    operation, but that isn't easy to
-                                    accomplish, since we cannot
-                                    randomly move data around between
-                                    selections.  Let's hope no two
-                                    instances of Emacs try to drag
-                                    into the same window at the same
-                                    time.  */
-                                 dmsg.index_atom = dpyinfo->Xatom_XdndSelection;
-                                 dmsg.source_window = FRAME_X_WINDOW (x_dnd_frame);
-
-                                 if (!XM_DRAG_STYLE_IS_DROP_ONLY (drag_receiver_info.protocol_style))
-                                   x_dnd_send_xm_leave_for_drop (FRAME_DISPLAY_INFO (x_dnd_frame),
-                                                                 x_dnd_frame, x_dnd_last_seen_window,
-                                                                 xev->time);
-
-                                 xm_send_drop_message (dpyinfo, FRAME_X_WINDOW (x_dnd_frame),
-                                                       x_dnd_last_seen_window, &dmsg);
-
-                                 x_dnd_waiting_for_finish = true;
-                                 x_dnd_waiting_for_motif_finish = 1;
+                                 x_set_pending_dnd_time (xev->time);
+                                 x_dnd_send_unsupported_drop (dpyinfo, (x_dnd_last_seen_toplevel != None
+                                                                        ? x_dnd_last_seen_toplevel
+                                                                        : x_dnd_last_seen_window),
+                                                              xev->root_x, xev->root_y, xev->time);
                                }
                            }
-                         else
+                         else if (x_dnd_last_seen_toplevel != None)
                            {
                              x_set_pending_dnd_time (xev->time);
-                             x_dnd_send_unsupported_drop (dpyinfo, (x_dnd_last_seen_toplevel != None
-                                                                    ? x_dnd_last_seen_toplevel
-                                                                    : x_dnd_last_seen_window),
-                                                          xev->root_x, xev->root_y, xev->time);
+                             x_dnd_send_unsupported_drop (dpyinfo,
+                                                          x_dnd_last_seen_toplevel,
+                                                          xev->root_x, xev->root_y,
+                                                          xev->time);
                            }
-                       }
-                     else if (x_dnd_last_seen_toplevel != None)
-                       {
-                         x_set_pending_dnd_time (xev->time);
-                         x_dnd_send_unsupported_drop (dpyinfo,
-                                                      x_dnd_last_seen_toplevel,
-                                                      xev->root_x, xev->root_y,
-                                                      xev->time);
-                       }
 
-                     x_dnd_last_protocol_version = -1;
-                     x_dnd_last_motif_style = XM_DRAG_STYLE_NONE;
-                     x_dnd_last_seen_window = None;
-                     x_dnd_last_seen_toplevel = None;
-                     x_dnd_frame = NULL;
-                     x_set_dnd_targets (NULL, 0);
+                         x_dnd_last_protocol_version = -1;
+                         x_dnd_last_motif_style = XM_DRAG_STYLE_NONE;
+                         x_dnd_last_seen_window = None;
+                         x_dnd_last_seen_toplevel = None;
+                         x_dnd_frame = NULL;
+                         x_set_dnd_targets (NULL, 0);
 
-                     goto XI_OTHER;
+                         goto XI_OTHER;
+                       }
                    }
                }