diff options
author | Jay Sorg <jay.sorg@gmail.com> | 2012-10-21 22:15:31 -0700 |
---|---|---|
committer | Jay Sorg <jay.sorg@gmail.com> | 2012-10-21 22:15:31 -0700 |
commit | 91be5fe9ad8f0ee28fe6744a5a0b39eab4631d17 (patch) | |
tree | fa4b334d219921ad6f7b05d593bdc17671e96a3f | |
parent | b349c03e22c162260f1a392c7ec95bb7120b02fa (diff) | |
download | xrdp-proprietary-91be5fe9ad8f0ee28fe6744a5a0b39eab4631d17.tar.gz xrdp-proprietary-91be5fe9ad8f0ee28fe6744a5a0b39eab4631d17.zip |
chansrv: work on clipboard
-rw-r--r-- | sesman/chansrv/clipboard.c | 20 | ||||
-rw-r--r-- | sesman/chansrv/clipboard_file.c | 43 |
2 files changed, 51 insertions, 12 deletions
diff --git a/sesman/chansrv/clipboard.c b/sesman/chansrv/clipboard.c index 8ef387d5..6708bba2 100644 --- a/sesman/chansrv/clipboard.c +++ b/sesman/chansrv/clipboard.c @@ -86,8 +86,6 @@ extern Screen *g_screen; /* in xcommon.c */ extern int g_screen_num; /* in xcommon.c */ int g_clip_up = 0; -//int g_waiting_for_data_response = 0; -//int g_waiting_for_data_response_time = 0; static Atom g_clipboard_atom = 0; /* CLIPBOARD */ static Atom g_clip_property_atom = 0; /* XRDP_CLIP_PROPERTY_ATOM */ @@ -882,7 +880,9 @@ clipboard_process_format_announce(struct stream *s, int clip_msg_status, } } - if (g_num_formatIds > 0) + if ((g_num_formatIds > 0) && + (g_clip_c2s.incr_in_progress == 0) && /* don't interrupt incr */ + (g_clip_s2c.incr_in_progress == 0)) { if (clipboard_set_selection_owner() != 0) { @@ -1281,11 +1281,8 @@ clipboard_event_selection_owner_notify(XEvent *xevent) { XFixesSelectionNotifyEvent *lxevent; - LLOGLN(0, ("clipboard_event_selection_owner_notify:")); - - //return 0; - lxevent = (XFixesSelectionNotifyEvent *)xevent; + LLOGLN(0, ("clipboard_event_selection_owner_notify: %p", lxevent->owner)); LOGM((LOG_LEVEL_DEBUG, "clipboard_event_selection_owner_notify: " "window %d subtype %d owner %d g_wnd %d", lxevent->window, lxevent->subtype, lxevent->owner, g_wnd)); @@ -1300,8 +1297,11 @@ clipboard_event_selection_owner_notify(XEvent *xevent) } g_got_selection = 0; - XConvertSelection(g_display, g_clipboard_atom, g_targets_atom, - g_clip_property_atom, g_wnd, lxevent->timestamp); + if (lxevent->owner != 0) /* nil owner comes when selection */ + { /* window is closed */ + XConvertSelection(g_display, g_clipboard_atom, g_targets_atom, + g_clip_property_atom, g_wnd, lxevent->timestamp); + } return 0; } @@ -1835,6 +1835,7 @@ clipboard_event_property_notify(XEvent *xevent) XGetAtomName(g_display, xevent->xproperty.atom))); if (g_clip_c2s.incr_in_progress && + (xevent->xproperty.window == g_clip_c2s.window) && (xevent->xproperty.atom == g_clip_c2s.property) && (xevent->xproperty.state == PropertyDelete)) { @@ -1868,6 +1869,7 @@ clipboard_event_property_notify(XEvent *xevent) } } if (g_clip_s2c.incr_in_progress && + (xevent->xproperty.window == g_wnd) && (xevent->xproperty.atom == g_clip_s2c.property) && (xevent->xproperty.state == PropertyNewValue)) { diff --git a/sesman/chansrv/clipboard_file.c b/sesman/chansrv/clipboard_file.c index 33df6f3e..526633d4 100644 --- a/sesman/chansrv/clipboard_file.c +++ b/sesman/chansrv/clipboard_file.c @@ -58,13 +58,48 @@ static int g_num_files = 0; /*****************************************************************************/ static int APP_CC +clipboard_check_file(char *filename) +{ + char lfilename[256]; + char jchr[8]; + int lindex; + int index; + + g_memset(lfilename, 0, 256); + lindex = 0; + index = 0; + while (filename[index] != 0) + { + if (filename[index] == '%') + { + jchr[0] = filename[index + 1]; + jchr[1] = filename[index + 2]; + jchr[2] = 0; + index += 3; + lfilename[lindex] = g_htoi(jchr); + lindex++; + } + else + { + lfilename[lindex] = filename[index]; + lindex++; + index++; + } + } + LLOGLN(0, ("[%s] [%s]", filename, lfilename)); + g_strcpy(filename, lfilename); + return 0; +} + +/*****************************************************************************/ +static int APP_CC clipboard_get_file(char* file, int bytes) { int sindex; int pindex; - char full_fn[256]; - char filename[256]; - char pathname[256]; + char full_fn[256]; /* /etc/xrdp/xrdp.ini */ + char filename[256]; /* xrdp.ini */ + char pathname[256]; /* /etc/xrdp */ sindex = 0; if (g_strncmp(file, "file:///", 8) == 0) @@ -88,6 +123,8 @@ clipboard_get_file(char* file, int bytes) pathname[0] = '/'; } g_memcpy(filename, file + pindex + 1, (bytes - 1) - pindex); + /* this should replace %20 with space */ + clipboard_check_file(filename); g_snprintf(full_fn, 255, "%s/%s", pathname, filename); if (g_directory_exist(full_fn)) { |