mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-01-05 11:21:04 -08:00
Minor cleanups to X drag-and-drop code
* src/xterm.c (struct x_client_list_window): Write comments describing the meaning of each field. (XM_DRAG_PROTOCOL_VERSION, xm_setup_dnd_targets) (xm_setup_drag_info, xm_read_drag_receiver_info) (x_dnd_compute_toplevels): Don't hard-code the supported Motif protocol version.
This commit is contained in:
parent
8a7d8bb04b
commit
242a4b49cb
1 changed files with 46 additions and 6 deletions
52
src/xterm.c
52
src/xterm.c
|
|
@ -1015,36 +1015,67 @@ static unsigned int x_dnd_keyboard_state;
|
|||
terminating DND as part of the display disconnect handler. */
|
||||
static jmp_buf x_dnd_disconnect_handler;
|
||||
|
||||
/* Structure describing a single window that can be the target of
|
||||
drag-and-drop operations. */
|
||||
struct x_client_list_window
|
||||
{
|
||||
/* The window itself. */
|
||||
Window window;
|
||||
|
||||
/* The display that window is on. */
|
||||
Display *dpy;
|
||||
|
||||
/* Its X and Y coordinates from the root window. */
|
||||
int x, y;
|
||||
|
||||
/* The width and height of the window. */
|
||||
int width, height;
|
||||
|
||||
/* Whether or not the window is mapped. */
|
||||
bool mapped_p;
|
||||
|
||||
/* The event mask for the window before Emacs selected for events on
|
||||
it. */
|
||||
long previous_event_mask;
|
||||
|
||||
/* The window manager state of the window. */
|
||||
unsigned long wm_state;
|
||||
|
||||
/* The next window in this list. */
|
||||
struct x_client_list_window *next;
|
||||
|
||||
/* The Motif protocol style of this window, if any. */
|
||||
uint8_t xm_protocol_style;
|
||||
|
||||
/* The extents of the frame window in each direction. */
|
||||
int frame_extents_left;
|
||||
int frame_extents_right;
|
||||
int frame_extents_top;
|
||||
int frame_extents_bottom;
|
||||
|
||||
#ifdef HAVE_XSHAPE
|
||||
/* The border width of this window. */
|
||||
int border_width;
|
||||
|
||||
/* The rectangles making up the input shape. */
|
||||
XRectangle *input_rects;
|
||||
|
||||
/* The number of rectangles composing the input shape. */
|
||||
int n_input_rects;
|
||||
|
||||
/* The rectangles making up the bounding shape. */
|
||||
XRectangle *bounding_rects;
|
||||
|
||||
/* The number of rectangles composing the bounding shape. */
|
||||
int n_bounding_rects;
|
||||
#endif
|
||||
};
|
||||
|
||||
static struct x_client_list_window *x_dnd_toplevels = NULL;
|
||||
/* List of all toplevels in stacking order, from top to bottom. */
|
||||
static struct x_client_list_window *x_dnd_toplevels;
|
||||
|
||||
/* Whether or not the window manager supports the required features
|
||||
for `x_dnd_toplevels' to work. */
|
||||
static bool x_dnd_use_toplevels;
|
||||
|
||||
/* Motif drag-and-drop protocol support. */
|
||||
|
|
@ -1224,6 +1255,10 @@ typedef struct xm_top_level_leave_message
|
|||
/* #define XM_DROP_SITE_INVALID 2 */
|
||||
#define XM_DROP_SITE_NONE 1
|
||||
|
||||
/* The version of the Motif drag-and-drop protocols that Emacs
|
||||
supports. */
|
||||
#define XM_DRAG_PROTOCOL_VERSION 0
|
||||
|
||||
static uint8_t
|
||||
xm_side_effect_from_action (struct x_display_info *dpyinfo, Atom action)
|
||||
{
|
||||
|
|
@ -1637,7 +1672,7 @@ xm_setup_dnd_targets (struct x_display_info *dpyinfo,
|
|||
if (!rc)
|
||||
{
|
||||
header.byte_order = XM_BYTE_ORDER_CUR_FIRST;
|
||||
header.protocol = 0;
|
||||
header.protocol = XM_DRAG_PROTOCOL_VERSION;
|
||||
header.target_list_count = 1;
|
||||
header.total_data_size = 8 + 2 + ntargets * 4;
|
||||
|
||||
|
|
@ -1682,7 +1717,7 @@ xm_setup_dnd_targets (struct x_display_info *dpyinfo,
|
|||
xfree (recs);
|
||||
|
||||
header.byte_order = XM_BYTE_ORDER_CUR_FIRST;
|
||||
header.protocol = 0;
|
||||
header.protocol = XM_DRAG_PROTOCOL_VERSION;
|
||||
header.target_list_count = 1;
|
||||
header.total_data_size = 8 + 2 + ntargets * 4;
|
||||
|
||||
|
|
@ -1719,7 +1754,7 @@ xm_setup_dnd_targets (struct x_display_info *dpyinfo,
|
|||
data format. To avoid confusing Motif when that happens, set
|
||||
it back to 0. There will probably be no more updates to the
|
||||
protocol either. */
|
||||
header.protocol = 0;
|
||||
header.protocol = XM_DRAG_PROTOCOL_VERSION;
|
||||
xm_write_targets_table (dpyinfo->display, drag_window,
|
||||
dpyinfo->Xatom_MOTIF_DRAG_TARGETS,
|
||||
&header, recs);
|
||||
|
|
@ -1749,7 +1784,7 @@ xm_setup_drag_info (struct x_display_info *dpyinfo,
|
|||
if (idx != -1)
|
||||
{
|
||||
drag_initiator_info.byteorder = XM_BYTE_ORDER_CUR_FIRST;
|
||||
drag_initiator_info.protocol = 0;
|
||||
drag_initiator_info.protocol = XM_DRAG_PROTOCOL_VERSION;
|
||||
drag_initiator_info.table_index = idx;
|
||||
drag_initiator_info.selection = dpyinfo->Xatom_XdndSelection;
|
||||
|
||||
|
|
@ -1977,6 +2012,9 @@ xm_read_drag_receiver_info (struct x_display_info *dpyinfo,
|
|||
rec->byteorder = XM_BYTE_ORDER_CUR_FIRST;
|
||||
}
|
||||
|
||||
if (data[1] > XM_DRAG_PROTOCOL_VERSION)
|
||||
rc = 0;
|
||||
|
||||
if (tmp_data)
|
||||
XFree (tmp_data);
|
||||
|
||||
|
|
@ -2359,7 +2397,9 @@ x_dnd_compute_toplevels (struct x_display_info *dpyinfo)
|
|||
&& xcb_get_property_value_length (xm_property_reply) >= 4)
|
||||
{
|
||||
xmdata = xcb_get_property_value (xm_property_reply);
|
||||
tem->xm_protocol_style = xmdata[2];
|
||||
|
||||
if (xmdata[1] <= XM_DRAG_PROTOCOL_VERSION)
|
||||
tem->xm_protocol_style = xmdata[2];
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue