diff options
Diffstat (limited to 'src/xselect.c')
| -rw-r--r-- | src/xselect.c | 51 |
1 files changed, 49 insertions, 2 deletions
diff --git a/src/xselect.c b/src/xselect.c index 211d207bac4..cd49e05171b 100644 --- a/src/xselect.c +++ b/src/xselect.c | |||
| @@ -2709,8 +2709,48 @@ If the value is 0 or the atom is not known, return the empty string. */) | |||
| 2709 | return ret; | 2709 | return ret; |
| 2710 | } | 2710 | } |
| 2711 | 2711 | ||
| 2712 | /* Convert an XClientMessageEvent to a Lisp event of type DRAG_N_DROP_EVENT. | 2712 | DEFUN ("x-register-dnd-atom", Fx_register_dnd_atom, |
| 2713 | TODO: Check if this client event really is a DND event? */ | 2713 | Sx_register_dnd_atom, 1, 2, 0, |
| 2714 | doc: /* Request that dnd events are made for ClientMessages with ATOM. | ||
| 2715 | ATOM can be a symbol or a string. The ATOM is interned on the display that | ||
| 2716 | FRAME is on. If FRAME is nil, the selected frame is used. */) | ||
| 2717 | (atom, frame) | ||
| 2718 | Lisp_Object atom, frame; | ||
| 2719 | { | ||
| 2720 | Atom x_atom; | ||
| 2721 | struct frame *f = check_x_frame (frame); | ||
| 2722 | size_t i; | ||
| 2723 | struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); | ||
| 2724 | |||
| 2725 | |||
| 2726 | if (SYMBOLP (atom)) | ||
| 2727 | x_atom = symbol_to_x_atom (dpyinfo, FRAME_X_DISPLAY (f), atom); | ||
| 2728 | else if (STRINGP (atom)) | ||
| 2729 | { | ||
| 2730 | BLOCK_INPUT; | ||
| 2731 | x_atom = XInternAtom (FRAME_X_DISPLAY (f), (char *) SDATA (atom), False); | ||
| 2732 | UNBLOCK_INPUT; | ||
| 2733 | } | ||
| 2734 | else | ||
| 2735 | error ("ATOM must be a symbol or a string"); | ||
| 2736 | |||
| 2737 | for (i = 0; i < dpyinfo->x_dnd_atoms_length; ++i) | ||
| 2738 | if (dpyinfo->x_dnd_atoms[i] == x_atom) | ||
| 2739 | return Qnil; | ||
| 2740 | |||
| 2741 | if (dpyinfo->x_dnd_atoms_length == dpyinfo->x_dnd_atoms_size) | ||
| 2742 | { | ||
| 2743 | dpyinfo->x_dnd_atoms_size *= 2; | ||
| 2744 | dpyinfo->x_dnd_atoms = xrealloc (dpyinfo->x_dnd_atoms, | ||
| 2745 | sizeof (*dpyinfo->x_dnd_atoms) | ||
| 2746 | * dpyinfo->x_dnd_atoms_size); | ||
| 2747 | } | ||
| 2748 | |||
| 2749 | dpyinfo->x_dnd_atoms[dpyinfo->x_dnd_atoms_length++] = x_atom; | ||
| 2750 | return Qnil; | ||
| 2751 | } | ||
| 2752 | |||
| 2753 | /* Convert an XClientMessageEvent to a Lisp event of type DRAG_N_DROP_EVENT. */ | ||
| 2714 | 2754 | ||
| 2715 | int | 2755 | int |
| 2716 | x_handle_dnd_message (f, event, dpyinfo, bufp) | 2756 | x_handle_dnd_message (f, event, dpyinfo, bufp) |
| @@ -2726,6 +2766,12 @@ x_handle_dnd_message (f, event, dpyinfo, bufp) | |||
| 2726 | int x, y; | 2766 | int x, y; |
| 2727 | unsigned char *data = (unsigned char *) event->data.b; | 2767 | unsigned char *data = (unsigned char *) event->data.b; |
| 2728 | int idata[5]; | 2768 | int idata[5]; |
| 2769 | size_t i; | ||
| 2770 | |||
| 2771 | for (i = 0; i < dpyinfo->x_dnd_atoms_length; ++i) | ||
| 2772 | if (dpyinfo->x_dnd_atoms[i] == event->message_type) break; | ||
| 2773 | |||
| 2774 | if (i == dpyinfo->x_dnd_atoms_length) return 0; | ||
| 2729 | 2775 | ||
| 2730 | XSETFRAME (frame, f); | 2776 | XSETFRAME (frame, f); |
| 2731 | 2777 | ||
| @@ -2899,6 +2945,7 @@ syms_of_xselect () | |||
| 2899 | 2945 | ||
| 2900 | defsubr (&Sx_get_atom_name); | 2946 | defsubr (&Sx_get_atom_name); |
| 2901 | defsubr (&Sx_send_client_message); | 2947 | defsubr (&Sx_send_client_message); |
| 2948 | defsubr (&Sx_register_dnd_atom); | ||
| 2902 | 2949 | ||
| 2903 | reading_selection_reply = Fcons (Qnil, Qnil); | 2950 | reading_selection_reply = Fcons (Qnil, Qnil); |
| 2904 | staticpro (&reading_selection_reply); | 2951 | staticpro (&reading_selection_reply); |