diff --git a/src/modules/shot/e_mod_main.h b/src/modules/shot/e_mod_main.h
index 279208f61..455c96f68 100644
--- a/src/modules/shot/e_mod_main.h
+++ b/src/modules/shot/e_mod_main.h
@@ -11,7 +11,7 @@ extern E_Module *shot_module;
#define MAXZONES 64
-void share_save (const char *cmd);
+void share_save (const char *cmd, const char *file, Eina_Bool copy);
void share_write_end_watch (void *data);
void share_write_status_watch(void *data);
void share_dialog_show (void);
@@ -22,8 +22,8 @@ void preview_dialog_show (E_Zone *zone, E_Client *ec, const char *pa
Eina_Bool preview_have (void);
void preview_abort (void);
Evas_Object *preview_image_get (void);
-void save_to (const char *file);
-void save_show (void);
+void save_to (const char *file, Eina_Bool copy);
+void save_show (Eina_Bool save);
Evas_Object *ui_edit(Evas_Object *window, Evas_Object *o_bg, E_Zone *zone,
E_Client *ec, void *dst, int sx, int sy, int sw, int sh,
diff --git a/src/modules/shot/e_mod_preview.c b/src/modules/shot/e_mod_preview.c
index 25cc44e92..52fc0418d 100644
--- a/src/modules/shot/e_mod_preview.c
+++ b/src/modules/shot/e_mod_preview.c
@@ -9,7 +9,13 @@ Eina_Rectangle crop = { 0, 0, 0, 0 };
static void
_win_save_cb(void *data EINA_UNUSED, void *data2 EINA_UNUSED)
{
- save_show();
+ save_show(EINA_FALSE);
+}
+
+static void
+_win_copy_cb(void *data EINA_UNUSED, void *data2 EINA_UNUSED)
+{
+ save_show(EINA_TRUE);
}
static void
@@ -88,6 +94,8 @@ preview_dialog_show(E_Zone *zone, E_Client *ec, const char *params, void *dst,
e_widget_list_object_append(o_box, o, 1, 0, 0.5);
o = e_widget_button_add(evas, _("Share"), NULL, _win_share_cb, win, NULL);
e_widget_list_object_append(o_box, o, 1, 0, 0.5);
+ o = e_widget_button_add(evas, _("Copy"), NULL, _win_copy_cb, win, NULL);
+ e_widget_list_object_append(o_box, o, 1, 0, 0.5);
if (!ec)
{
o = e_widget_button_add(evas, _("Delay"), NULL, _win_delay_cb, win, NULL);
diff --git a/src/modules/shot/e_mod_save.c b/src/modules/shot/e_mod_save.c
index fd2f4fbf1..47ed96ca2 100644
--- a/src/modules/shot/e_mod_save.c
+++ b/src/modules/shot/e_mod_save.c
@@ -7,6 +7,7 @@ typedef struct
int w, h, stride, quality;
size_t size;
int fd;
+ Eina_Bool copy;
} Rgba_Writer_Data;
static void
@@ -43,7 +44,7 @@ _cb_rgba_writer_done(void *data, Ecore_Thread *th EINA_UNUSED)
e_module_dir_get(shot_module), MODULE_ARCH,
rdata->path, rdata->w, rdata->h, rdata->stride,
rdata->quality);
- share_save(buf);
+ share_save(buf, rdata->outfile, rdata->copy);
_rgba_data_free(rdata);
}
@@ -55,7 +56,7 @@ _cb_rgba_writer_cancel(void *data, Ecore_Thread *th EINA_UNUSED)
}
void
-save_to(const char *file)
+save_to(const char *file, Eina_Bool copy)
{
int fd;
char tmpf[256] = "e-shot-rgba-XXXXXX";
@@ -71,7 +72,6 @@ save_to(const char *file)
Evas_Object *img = preview_image_get();
ui_edit_prepare();
- printf("C: %i %i %ix%i\n", crop.x, crop.y, crop.w, crop.h);
if ((crop.x == 0) && (crop.y == 0) &&
(crop.w == 0) && (crop.h == 0))
{
@@ -115,7 +115,6 @@ save_to(const char *file)
imh = crop.h;
imstride = imw * 4;
d = data;
- printf("Cpy dat %p -> %p | %ix%i\n", src_data, data, imw, imh);
for (y = crop.y; y < (crop.y + crop.h); y++)
{
s = src_data + (stride * y) + (crop.x * 4);
@@ -144,6 +143,7 @@ save_to(const char *file)
thdat->h = imh;
thdat->stride = imstride;
thdat->quality = quality;
+ thdat->copy = copy;
ecore_thread_run(_cb_rgba_writer_do,
_cb_rgba_writer_done,
_cb_rgba_writer_cancel, thdat);
@@ -167,7 +167,7 @@ save_to(const char *file)
}
void
-save_show(void)
+save_show(Eina_Bool copy)
{
char path[PATH_MAX + 512];
char path2[PATH_MAX + 512];
@@ -185,21 +185,24 @@ save_show(void)
else
strftime(buf, sizeof(buf), "shot-%Y-%m-%d_%H-%M-%S.jpg", tm);
e_user_dir_snprintf(path, sizeof(path), "shots/%s", buf);
- save_to(path);
+ save_to(path, copy);
snprintf(path, sizeof(path), "%s/shots.desktop",
e_module_dir_get(shot_module));
snprintf(path2, sizeof(path2), "%s/fileman/favorites/shots.desktop",
e_user_dir_get());
if (!ecore_file_exists(path2)) ecore_file_cp(path, path2);
- a = e_action_find("fileman_show");
- if (a)
+ if (!copy)
{
- a->func.go(NULL, "$E_HOME_DIR/shots");
+ a = e_action_find("fileman_show");
+ if (a)
+ {
+ a->func.go(NULL, "$E_HOME_DIR/shots");
+ }
+ else
+ e_util_dialog_show
+ (_("Error - No Filemanager"),
+ _("No filemanager action and/or module was found.
"
+ "Cannot show the location of your screenshots."));
}
- else
- e_util_dialog_show
- (_("Error - No Filemanager"),
- _("No filemanager action and/or module was found.
"
- "Cannot show the location of your screenshots."));
preview_abort();
}
diff --git a/src/modules/shot/e_mod_share.c b/src/modules/shot/e_mod_share.c
index c814ab94a..6154ce85b 100644
--- a/src/modules/shot/e_mod_share.c
+++ b/src/modules/shot/e_mod_share.c
@@ -6,6 +6,8 @@ static Evas_Object *o_label = NULL;
static Evas_Object *o_entry = NULL;
static Eina_List *handlers = NULL;
static char *url_ret = NULL;
+static const char *cnp_file = NULL;
+static Eina_Bool cnp = EINA_FALSE;
// clean up and be done
static void
@@ -19,6 +21,47 @@ _share_done(void)
preview_abort();
}
+static void
+_cnp_thread_io(void *data, Ecore_Thread *eth EINA_UNUSED)
+{
+ char *file = data;
+ unsigned char *fdata = NULL;
+ ssize_t fsize = 0;
+ FILE *f = fopen(file, "r");
+
+ if (!f) goto err;
+ fseek(f, 0, SEEK_END);
+ fsize = ftell(f);
+ fseek(f, 0, SEEK_SET);
+ if (fsize > 0)
+ {
+ fdata = malloc(fsize);
+ if (fdata)
+ {
+ if (fread(fdata, fsize, 1, f) == 1)
+ {
+ ecore_thread_main_loop_begin();
+ elm_cnp_selection_set(e_comp->elm,
+ ELM_SEL_TYPE_CLIPBOARD,
+ ELM_SEL_FORMAT_IMAGE,
+ fdata, fsize);
+ ecore_thread_main_loop_end();
+ }
+ free(fdata);
+ }
+ }
+ fclose(f);
+ eina_file_unlink(file);
+err:
+ free(file);
+}
+
+static void
+_cnp_file(const char *file)
+{
+ ecore_thread_run(_cnp_thread_io, NULL, NULL, strdup(file));
+}
+
// the upload dialog
static void
_upload_ok_cb(void *data EINA_UNUSED, E_Dialog *dia)
@@ -46,6 +89,11 @@ _img_write_end_cb(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *event)
if (ev->exe != img_write_exe) return EINA_TRUE;
_share_done();
+ if (cnp)
+ {
+ _cnp_file(cnp_file);
+ eina_stringshare_replace(&cnp_file, NULL);
+ }
return EINA_FALSE;
}
@@ -102,8 +150,13 @@ done:
}
void
-share_save(const char *cmd)
+share_save(const char *cmd, const char *file, Eina_Bool copy)
{
+ if (copy)
+ {
+ eina_stringshare_replace(&cnp_file, file);
+ cnp = copy;
+ }
share_write_end_watch(NULL);
img_write_exe = ecore_exe_pipe_run
(cmd, ECORE_EXE_PIPE_READ | ECORE_EXE_PIPE_READ_LINE_BUFFERED |
@@ -142,7 +195,7 @@ share_dialog_show(void)
E_FREE_LIST(handlers, ecore_event_handler_del);
- save_to(NULL);
+ save_to(NULL, EINA_FALSE);
E_FREE_FUNC(win, evas_object_del);