785: static void HandleSelectionEvents( 786: Widget widget, 787: XtPointer closure, 788: XEvent *event, 789: Boolean *cont) 790: { 791: Select ctx; 792: XSelectionEvent ev; 793: Atom target; 794: int count; 795: Boolean writeback = FALSE; 796: 797: ctx = (Select) closure; 798: switch (event->type) { 799: case SelectionClear: 800: /* if this event is not for the selection we registered for, 801: * don't do anything */ 802: if (ctx->selection != event->xselectionclear.selection || 803: ctx->serial > event->xselectionclear.serial) 804: break; 805: (void) LoseSelection(ctx, widget, event->xselectionclear.selection, 806: event->xselectionclear.time); 807: break; 808: case SelectionRequest: 809: /* if this event is not for the selection we registered for, 810: * don't do anything */ 811: if (ctx->selection != event->xselectionrequest.selection) 812: break; 813: ev.type = SelectionNotify; 814: ev.display = event->xselectionrequest.display; 815: ev.requestor = event->xselectionrequest.requestor; 816: ev.selection = event->xselectionrequest.selection; 817: ev.time = event->xselectionrequest.time; 818: ev.target = event->xselectionrequest.target; 819: if (event->xselectionrequest.property == None) /* obsolete requestor */ 820: event->xselectionrequest.property = event->xselectionrequest.target; 821: if (ctx->widget != widget || ctx->was_disowned 822: || ((event->xselectionrequest.time != CurrentTime) 823: && (event->xselectionrequest.time < ctx->time))) { 824: ev.property = None; 825: StartProtectedSection(ev.display, ev.requestor); 826: } else { 827: if (ev.target == ctx->prop_list->indirect_atom) { 828: IndirectPair *p; 829: int format; 830: unsigned long bytesafter, length; 831: unsigned char *value; 832: ev.property = event->xselectionrequest.property; 833: StartProtectedSection(ev.display, ev.requestor); 834: (void) XGetWindowProperty(ev.display, ev.requestor, 835: event->xselectionrequest.property, 0L, 1000000, 836: False,(Atom)AnyPropertyType, &target, &format, &length, 837: &bytesafter, &value); 838: count = BYTELENGTH(length, format) / sizeof(IndirectPair); 839: for (p = (IndirectPair *)value; count; p++, count--) { 840: EndProtectedSection(ctx->dpy); 841: if (!GetConversion(ctx, (XSelectionRequestEvent*)event, 842: p->target, p->property, widget)) { 843: 844: p->target = None; 845: writeback = TRUE; 846: StartProtectedSection(ctx->dpy, ev.requestor); 847: } 848: } 849: if (writeback) 850: XChangeProperty(ev.display, ev.requestor, 851: event->xselectionrequest.property, target, 852: format, PropModeReplace, value, (int)length); 853: XFree((char *)value); 854: } else /* not multiple */ { 855: if (GetConversion(ctx, (XSelectionRequestEvent*)event, 856: event->xselectionrequest.target, 857: event->xselectionrequest.property, 858: widget)) 859: ev.property = event->xselectionrequest.property; 860: else { 861: ev.property = None; 862: StartProtectedSection(ctx->dpy, ev.requestor); 863: } 864: } 865: } 866: (void) XSendEvent(ctx->dpy, ev.requestor, False, (unsigned long)NULL, 867: (XEvent *) &ev); 868: 869: EndProtectedSection(ctx->dpy); 870: 871: break; 872: } 873: }