From 0dee85d9825ee50c7379dd2c79a32490de7a4cd6 Mon Sep 17 00:00:00 2001 From: jsorg71 Date: Mon, 31 Aug 2009 21:25:06 +0000 Subject: [PATCH] clipboard work --- sesman/chansrv/clipboard.c | 171 ++++++++++++++++++------------------- 1 file changed, 81 insertions(+), 90 deletions(-) diff --git a/sesman/chansrv/clipboard.c b/sesman/chansrv/clipboard.c index 7d11a315..7e370165 100644 --- a/sesman/chansrv/clipboard.c +++ b/sesman/chansrv/clipboard.c @@ -61,19 +61,16 @@ static int g_selection_request_event_count = 0; static char* g_data_in = 0; static int g_data_in_size = 0; static int g_data_in_time = 0; +static int g_data_in_up_to_date = 0; +static int g_got_format_announce = 0; extern int g_cliprdr_chan_id; /* in chansrv.c */ extern Display* g_display; /* in chansrv.c */ -/* returns time in miliseconds - this is like g_time2 in os_calls, but not miliseconds since machine was - up, something else - this is a time value similar to what the xserver uses */ - /*****************************************************************************/ /* this is one way to get the current time from the x server */ static Time APP_CC -clipboard_get_time(void) +clipboard_get_server_time(void) { XEvent xevent; @@ -88,6 +85,17 @@ clipboard_get_time(void) return xevent.xproperty.time; } +/*****************************************************************************/ +/* returns time in miliseconds + this is like g_time2 in os_calls, but not miliseconds since machine was + up, something else + this is a time value similar to what the xserver uses */ +static int APP_CC +clipboard_get_local_time(void) +{ + return g_time3(); +} + /*****************************************************************************/ /* returns error */ int APP_CC @@ -227,6 +235,12 @@ clipboard_send_data_request(void) int num_chars; LOG(1, ("clipboard_send_data_request:")); + if (!g_got_format_announce) + { + LOG(0, ("clipboard_send_data_request: error, no format announce")); + return 0; + } + g_got_format_announce = 0; make_stream(s); init_stream(s, 8192); out_uint16_le(s, 4); /* CLIPRDR_DATA_REQUEST */ @@ -374,15 +388,11 @@ clipboard_process_format_announce(struct stream* s, int clip_msg_status, Window owner; LOG(1, ("clipboard_process_format_announce: CLIPRDR_FORMAT_ANNOUNCE")); - g_hexdump(s->p, s->end - s->p); + //g_hexdump(s->p, s->end - s->p); clipboard_send_format_ack(); - owner = XGetSelectionOwner(g_display, g_clipboard_atom); - if (owner == g_wnd) - { - LOG(1, ("clipboard_process_format_announce: skipping, owner == g_wnd")); - return 0; - } - g_selection_time = clipboard_get_time(); + g_got_format_announce = 1; + g_data_in_up_to_date = 0; + g_selection_time = clipboard_get_server_time(); XSetSelectionOwner(g_display, g_clipboard_atom, g_wnd, g_selection_time); //XSetSelectionOwner(g_display, XA_PRIMARY, g_wnd, g_selection_time); g_got_selection = 1; @@ -422,7 +432,7 @@ clipboard_process_data_response(struct stream* s, int clip_msg_status, int clip_msg_len) { XEvent xev; - XSelectionRequestEvent* lev; + XSelectionRequestEvent* lxev; twchar* wtext; twchar wchr; int len; @@ -469,29 +479,28 @@ clipboard_process_data_response(struct stream* s, int clip_msg_status, g_data_in_size = len; g_wcstombs(g_data_in, wtext, len + 1); len = g_strlen(g_data_in); - g_data_in_time = g_time3(); + g_data_in_time = clipboard_get_local_time(); + g_data_in_up_to_date = 1; } if (g_data_in != 0) { for (index = 0; index < g_selection_request_event_count; index++) { - lev = &(g_selection_request_event[index]); - XChangeProperty(g_display, lev->requestor, lev->property, - XA_STRING, 8, PropModeReplace, "hi", - 3); -// XA_STRING, 8, PropModeReplace, g_data_in, -// g_strlen(g_data_in)); + lxev = &(g_selection_request_event[index]); + XChangeProperty(g_display, lxev->requestor, lxev->property, + XA_STRING, 8, PropModeReplace, g_data_in, + g_strlen(g_data_in)); g_memset(&xev, 0, sizeof(xev)); xev.xselection.type = SelectionNotify; xev.xselection.send_event = True; - xev.xselection.display = lev->display; - xev.xselection.requestor = lev->requestor; - xev.xselection.selection = lev->selection; - xev.xselection.target = lev->target; - xev.xselection.property = lev->property; + xev.xselection.display = lxev->display; + xev.xselection.requestor = lxev->requestor; + xev.xselection.selection = lxev->selection; + xev.xselection.target = lxev->target; + xev.xselection.property = lxev->property; xev.xselection.time = CurrentTime; - XSendEvent(g_display, lev->requestor, False, NoEventMask, &xev); - LOG(1, ("clipboard_process_data_response: %d", lev->requestor)); + XSendEvent(g_display, lxev->requestor, False, NoEventMask, &xev); + LOG(1, ("clipboard_process_data_response: %d", lxev->requestor)); } } g_selection_request_event_count = 0; @@ -818,7 +827,7 @@ static int APP_CC clipboard_event_selection_request(XEvent* xevent) { XEvent xev; - XSelectionRequestEvent* lxevent; + XSelectionRequestEvent* lxev; tui32 ui32[4]; Atom type; int fmt; @@ -826,16 +835,16 @@ clipboard_event_selection_request(XEvent* xevent) int xdata_size; char* xdata; - lxevent = (XSelectionRequestEvent*)xevent; + lxev = (XSelectionRequestEvent*)xevent; LOG(1, ("clipboard_event_selection_request: g_wnd %d, " ".requestor %d .owner %d .select %d .target %d .property %d", - g_wnd, lxevent->requestor, lxevent->owner, lxevent->selection, - lxevent->target, lxevent->property)); - if (lxevent->property == None) + g_wnd, lxev->requestor, lxev->owner, lxev->selection, + lxev->target, lxev->property)); + if (lxev->property == None) { - LOG(1, ("clipboard_event_selection_request: lxevent->property is None")); + LOG(1, ("clipboard_event_selection_request: lxev->property is None")); } - else if (lxevent->target == g_targets_atom) + else if (lxev->target == g_targets_atom) { /* requestor is asking what the selection can be converted to */ LOG(1, ("clipboard_event_selection_request: g_targets_atom")); @@ -843,40 +852,40 @@ clipboard_event_selection_request(XEvent* xevent) ui32[1] = g_timestamp_atom; ui32[2] = g_multiple_atom; ui32[3] = XA_STRING; - XChangeProperty(g_display, lxevent->requestor, lxevent->property, + XChangeProperty(g_display, lxev->requestor, lxev->property, XA_ATOM, 32, PropModeReplace, (tui8*)ui32, 4); g_memset(&xev, 0, sizeof(xev)); xev.xselection.type = SelectionNotify; xev.xselection.send_event = True; - xev.xselection.display = lxevent->display; - xev.xselection.requestor = lxevent->requestor; - xev.xselection.selection = lxevent->selection; - xev.xselection.target = lxevent->target; - xev.xselection.property = lxevent->property; - xev.xselection.time = lxevent->time; - XSendEvent(g_display, lxevent->requestor, False, NoEventMask, &xev); + xev.xselection.display = lxev->display; + xev.xselection.requestor = lxev->requestor; + xev.xselection.selection = lxev->selection; + xev.xselection.target = lxev->target; + xev.xselection.property = lxev->property; + xev.xselection.time = lxev->time; + XSendEvent(g_display, lxev->requestor, False, NoEventMask, &xev); return 0; } - else if (lxevent->target == g_timestamp_atom) + else if (lxev->target == g_timestamp_atom) { /* requestor is asking the time I got the selection */ LOG(1, ("clipboard_event_selection_request: g_timestamp_atom")); ui32[0] = g_selection_time; - XChangeProperty(g_display, lxevent->requestor, lxevent->property, + XChangeProperty(g_display, lxev->requestor, lxev->property, XA_INTEGER, 32, PropModeReplace, (tui8*)ui32, 1); g_memset(&xev, 0, sizeof(xev)); xev.xselection.type = SelectionNotify; xev.xselection.send_event = True; - xev.xselection.display = lxevent->display; - xev.xselection.requestor = lxevent->requestor; - xev.xselection.selection = lxevent->selection; - xev.xselection.target = lxevent->target; - xev.xselection.property = lxevent->property; - xev.xselection.time = lxevent->time; - XSendEvent(g_display, lxevent->requestor, False, NoEventMask, &xev); + xev.xselection.display = lxev->display; + xev.xselection.requestor = lxev->requestor; + xev.xselection.selection = lxev->selection; + xev.xselection.target = lxev->target; + xev.xselection.property = lxev->property; + xev.xselection.time = lxev->time; + XSendEvent(g_display, lxev->requestor, False, NoEventMask, &xev); return 0; } - else if (lxevent->target == g_multiple_atom) + else if (lxev->target == g_multiple_atom) { /* target, property pairs */ LOG(1, ("clipboard_event_selection_request: g_multiple_atom")); @@ -891,44 +900,26 @@ clipboard_event_selection_request(XEvent* xevent) g_free(xdata); } } - else if (lxevent->target == XA_STRING) + else if (lxev->target == XA_STRING) { LOG(1, ("clipboard_event_selection_request: XA_STRING")); -/* - if (g_abs((g_time3() - g_data_in_time)) < 1000) + if (g_data_in_up_to_date) { - LOG(1, ("clipboard_event_selection_request: XA_STRING---------------------------")); - XChangeProperty(g_display, lxevent->requestor, lxevent->property, + XChangeProperty(g_display, lxev->requestor, lxev->property, XA_STRING, 8, PropModeReplace, g_data_in, g_strlen(g_data_in)); g_memset(&xev, 0, sizeof(xev)); xev.xselection.type = SelectionNotify; xev.xselection.send_event = True; - xev.xselection.display = lxevent->display; - xev.xselection.requestor = lxevent->requestor; - xev.xselection.selection = lxevent->selection; - xev.xselection.target = lxevent->target; - xev.xselection.property = lxevent->property; - xev.xselection.time = lxevent->time; - XSendEvent(g_display, lxevent->requestor, False, NoEventMask, &xev); + xev.xselection.display = lxev->display; + xev.xselection.requestor = lxev->requestor; + xev.xselection.selection = lxev->selection; + xev.xselection.target = lxev->target; + xev.xselection.property = lxev->property; + xev.xselection.time = CurrentTime; + XSendEvent(g_display, lxev->requestor, False, NoEventMask, &xev); return 0; } -*/ -/* - XChangeProperty(g_display, lxevent->requestor, lxevent->property, - XA_STRING, 8, PropModeReplace, "Jay--", 5); - g_memset(&xev, 0, sizeof(xev)); - xev.xselection.type = SelectionNotify; - xev.xselection.send_event = True; - xev.xselection.display = lxevent->display; - xev.xselection.requestor = lxevent->requestor; - xev.xselection.selection = lxevent->selection; - xev.xselection.target = lxevent->target; - xev.xselection.property = lxevent->property; - xev.xselection.time = lxevent->time; - XSendEvent(g_display, lxevent->requestor, False, NoEventMask, &xev); - return 0; -*/ if (g_selection_request_event_count > 10) { LOG(0, ("clipboard_event_selection_request: error, too many requests")); @@ -936,7 +927,7 @@ clipboard_event_selection_request(XEvent* xevent) else { g_memcpy(&(g_selection_request_event[g_selection_request_event_count]), - lxevent, sizeof(g_selection_request_event[0])); + lxev, sizeof(g_selection_request_event[0])); if (g_selection_request_event_count == 0) { clipboard_send_data_request(); @@ -948,18 +939,18 @@ clipboard_event_selection_request(XEvent* xevent) else { LOG(1, ("clipboard_event_selection_request: unknown " - "target %s", XGetAtomName(g_display, lxevent->target))); + "target %s", XGetAtomName(g_display, lxev->target))); } g_memset(&xev, 0, sizeof(xev)); xev.xselection.type = SelectionNotify; xev.xselection.send_event = True; - xev.xselection.display = lxevent->display; - xev.xselection.requestor = lxevent->requestor; - xev.xselection.selection = lxevent->selection; - xev.xselection.target = lxevent->target; + xev.xselection.display = lxev->display; + xev.xselection.requestor = lxev->requestor; + xev.xselection.selection = lxev->selection; + xev.xselection.target = lxev->target; xev.xselection.property = None; - xev.xselection.time = lxevent->time; - XSendEvent(g_display, lxevent->requestor, False, NoEventMask, &xev); + xev.xselection.time = lxev->time; + XSendEvent(g_display, lxev->requestor, False, NoEventMask, &xev); return 0; }