2 Util for external clipboard.
4 Copyright (C) 2009-2014
5 Free Software Foundation, Inc.
8 Ilia Maslakov <il.smind@gmail.com>, 2010.
9 Andrew Borodin <aborodin@vmail.ru>, 2014.
11 This file is part of the Midnight Commander.
13 The Midnight Commander is free software: you can redistribute it
14 and/or modify it under the terms of the GNU General Public License as
15 published by the Free Software Foundation, either version 3 of the License,
16 or (at your option) any later version.
18 The Midnight Commander is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
23 You should have received a copy of the GNU General Public License
24 along with this program. If not, see <http://www.gnu.org/licenses/>.
31 #include <sys/types.h>
34 #include "lib/global.h"
35 #include "lib/fileloc.h"
36 #include "lib/mcconfig.h"
38 #include "lib/event.h"
40 #include "lib/vfs/vfs.h"
42 #include "src/execute.h"
44 #include "clipboard.h"
46 /*** global variables ****************************************************************************/
48 /* path to X clipboard utility */
49 char *clipboard_store_path
= NULL
;
50 char *clipboard_paste_path
= NULL
;
52 /*** file scope macro definitions ****************************************************************/
54 /*** file scope type declarations ****************************************************************/
56 /*** file scope variables ************************************************************************/
58 static const int clip_open_flags
= O_CREAT
| O_WRONLY
| O_TRUNC
| O_BINARY
;
59 static const mode_t clip_open_mode
= S_IRUSR
| S_IWUSR
| S_IRGRP
| S_IROTH
;
61 /* --------------------------------------------------------------------------------------------- */
62 /*** file scope functions ************************************************************************/
63 /* --------------------------------------------------------------------------------------------- */
65 /* --------------------------------------------------------------------------------------------- */
66 /*** public functions ****************************************************************************/
67 /* --------------------------------------------------------------------------------------------- */
71 clipboard_file_to_ext_clip (const gchar
* event_group_name
, const gchar
* event_name
,
72 gpointer init_data
, gpointer data
)
75 const char *d
= getenv ("DISPLAY");
77 (void) event_group_name
;
82 if (d
== NULL
|| clipboard_store_path
== NULL
|| clipboard_store_path
[0] == '\0')
85 tmp
= mc_config_get_full_path (EDIT_CLIP_FILE
);
86 cmd
= g_strconcat (clipboard_store_path
, " ", tmp
, " 2>/dev/null", (char *) NULL
);
89 my_system (EXECUTE_AS_SHELL
, mc_global
.tty
.shell
, cmd
);
96 /* --------------------------------------------------------------------------------------------- */
100 clipboard_file_from_ext_clip (const gchar
* event_group_name
, const gchar
* event_name
,
101 gpointer init_data
, gpointer data
)
105 const char *d
= getenv ("DISPLAY");
107 (void) event_group_name
;
112 if (d
== NULL
|| clipboard_paste_path
== NULL
|| clipboard_paste_path
[0] == '\0')
115 p
= mc_popen (clipboard_paste_path
, NULL
);
117 return TRUE
; /* don't show error message */
119 p
->out
.null_term
= FALSE
;
120 p
->err
.null_term
= TRUE
;
124 GError
*error
= NULL
;
126 p
->out
.len
= MC_PIPE_BUFSIZE
;
127 p
->err
.len
= MC_PIPE_BUFSIZE
;
129 mc_pread (p
, &error
);
133 /* don't show error message */
134 g_error_free (error
);
138 /* ignore stderr and get stdout */
139 if (p
->out
.len
== MC_PIPE_STREAM_EOF
|| p
->out
.len
== MC_PIPE_ERROR_READ
)
148 vfs_path_t
*fname_vpath
;
150 fname_vpath
= mc_config_get_full_vpath (EDIT_CLIP_FILE
);
151 file
= mc_open (fname_vpath
, clip_open_flags
, clip_open_mode
);
152 vfs_path_free (fname_vpath
);
158 nwrite
= mc_write (file
, p
->out
.buf
, p
->out
.len
);
171 /* --------------------------------------------------------------------------------------------- */
175 clipboard_text_to_file (const gchar
* event_group_name
, const gchar
* event_name
,
176 gpointer init_data
, gpointer data
)
179 vfs_path_t
*fname_vpath
= NULL
;
181 const char *text
= (const char *) data
;
183 (void) event_group_name
;
190 fname_vpath
= mc_config_get_full_vpath (EDIT_CLIP_FILE
);
191 file
= mc_open (fname_vpath
, clip_open_flags
, clip_open_mode
);
192 vfs_path_free (fname_vpath
);
197 str_len
= strlen (text
);
201 ret
= mc_write (file
, (char *) text
, str_len
);
208 /* --------------------------------------------------------------------------------------------- */
212 clipboard_text_from_file (const gchar
* event_group_name
, const gchar
* event_name
,
213 gpointer init_data
, gpointer data
)
218 gboolean first
= TRUE
;
219 ev_clipboard_text_from_file_t
*event_data
= (ev_clipboard_text_from_file_t
*) data
;
221 (void) event_group_name
;
225 fname
= mc_config_get_full_path (EDIT_CLIP_FILE
);
226 f
= fopen (fname
, "r");
231 event_data
->ret
= FALSE
;
235 *(event_data
->text
) = NULL
;
237 while (fgets (buf
, sizeof (buf
), f
))
244 if (buf
[len
- 1] == '\n')
250 *(event_data
->text
) = g_strdup (buf
);
254 /* remove \n on EOL */
257 tmp
= g_strconcat (*(event_data
->text
), " ", buf
, (char *) NULL
);
258 g_free (*(event_data
->text
));
259 *(event_data
->text
) = tmp
;
265 event_data
->ret
= (*(event_data
->text
) != NULL
);
269 /* --------------------------------------------------------------------------------------------- */