From af018e6b988a895b29ae2d4fb1d4c16ee28e1975 Mon Sep 17 00:00:00 2001 From: Hyoyoung Chang Date: Tue, 23 Nov 2010 21:08:19 +0900 Subject: [PATCH] screen capture by clientmessage, replace imagelist icon to evas obj --- data/themes/cbhmdrawer.edc | 6 ++-- src/clipdrawer.c | 73 +++++++++++++++++++++++++++++++++++++++++++++- src/scrcapture.c | 2 +- src/scrcapture.h | 1 + src/xcnphandler.c | 48 ++++++++++++++++++++++++++++++ 5 files changed, 126 insertions(+), 4 deletions(-) diff --git a/data/themes/cbhmdrawer.edc b/data/themes/cbhmdrawer.edc index e932729..6426fb1 100644 --- a/data/themes/cbhmdrawer.edc +++ b/data/themes/cbhmdrawer.edc @@ -113,8 +113,10 @@ collections description { state: "default" 0.0; - rel1 { relative: 0.0916666666 0.0656716418; to: background; } - rel2 { relative: 1.0 .3771493537; to: background; } + //rel1 { relative: 0.0916666666 0.0656716418; to: background; } + //rel2 { relative: 1.0 .3771493537; to: background; } + rel1 { relative: 0.0916666666 0.1056716418; to: background; } + rel2 { relative: 1.0 0.4171493537; to: background; } color: 0 0 0 0; } } diff --git a/src/clipdrawer.c b/src/clipdrawer.c index da41395..dfa9b6a 100644 --- a/src/clipdrawer.c +++ b/src/clipdrawer.c @@ -148,10 +148,66 @@ Evas_Object* _grid_icon_get(const void *data, Evas_Object *obj, const char *part gridimgitem_t *ti = (gridimgitem_t *)data; if (!strcmp(part, "elm.swallow.icon")) { +/* Evas_Object *icon = elm_icon_add(obj); elm_icon_file_set(icon, ti->path, NULL); evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); evas_object_show(icon); +*/ + Ecore_Evas *my_ee; + Evas *my_e; + Evas_Object *fgimg; + Evas_Object *bgrect; + Evas_Object *delbtn; + Evas_Object *icon; + my_ee = ecore_evas_buffer_new(GRID_ITEM_SIZE, GRID_ITEM_SIZE); + my_e = ecore_evas_get(my_ee); + + bgrect = evas_object_rectangle_add(my_e); + evas_object_color_set(bgrect, 119, 116, 100, 255); + evas_object_resize(bgrect, GRID_ITEM_SIZE, GRID_ITEM_SIZE); + evas_object_move(bgrect, 0, 0); + evas_object_show(bgrect); + + #define BORDER_SIZE 10 + fgimg = evas_object_image_add(my_e); + evas_object_image_load_size_set(fgimg, GRID_ITEM_SIZE-BORDER_SIZE*2, GRID_ITEM_SIZE-BORDER_SIZE*2); + evas_object_image_file_set(fgimg, ti->path, NULL); + evas_object_image_fill_set(fgimg, 0, 0, GRID_ITEM_SIZE-BORDER_SIZE*2, GRID_ITEM_SIZE-BORDER_SIZE*2); + evas_object_image_filled_set(fgimg, 1); + evas_object_resize(fgimg, GRID_ITEM_SIZE-BORDER_SIZE*2, GRID_ITEM_SIZE-BORDER_SIZE*2); + evas_object_move(fgimg, BORDER_SIZE, BORDER_SIZE); + evas_object_show(fgimg); + +/* + if (delete_mode) + { + delbtn = evas_object_image_add(my_e); + evas_object_image_load_size_set(delbtn, 33, 33); + evas_object_image_file_set(delbtn, DELETE_ICON_PATH, NULL); + evas_object_image_fill_set(delbtn, 0, 0, 33, 33); + evas_object_image_filled_set(delbtn, 1); + evas_object_resize(delbtn, 33, 33); + evas_object_move(delbtn, 55, 38); + evas_object_show(delbtn); + } +*/ + + icon = evas_object_image_add(evas_object_evas_get(obj)); + + evas_object_image_data_set(icon, NULL); + evas_object_image_size_set(icon, GRID_ITEM_SIZE, GRID_ITEM_SIZE); + evas_object_image_fill_set(icon, 0, 0, GRID_ITEM_SIZE, GRID_ITEM_SIZE); + evas_object_image_filled_set(icon, EINA_TRUE); + evas_object_image_data_copy_set(icon, (int *)ecore_evas_buffer_pixels_get(my_ee)); + evas_object_image_data_update_add(icon, 0, 0, GRID_ITEM_SIZE, GRID_ITEM_SIZE); + + evas_object_del(bgrect); + evas_object_del(fgimg); + if (delete_mode) + evas_object_del(delbtn); + ecore_evas_free(my_ee); + return icon; } else if (!strcmp(part, "elm.swallow.end") && delete_mode) @@ -377,6 +433,21 @@ int clipdrawer_add_image_item(char *imagepath) igl = elm_gengrid_items_get(ad->imggrid); igl_counter = eina_list_count(igl); + + Eina_List *l; + Elm_Gengrid_Item *item; + gridimgitem_t *ti = NULL; + + EINA_LIST_FOREACH(igl, l, item) + { + ti = elm_gengrid_item_data_get(item); + if (!strcmp(ti->path, imagepath)) + { + DTRACE("Error : duplicated file path = %s\n", imagepath); + return -1; + } + } + if (igl_counter >= HISTORY_QUEUE_MAX_IMG_ITEMS) { elm_gengrid_item_del(eina_list_data_get(eina_list_last(igl))); @@ -484,7 +555,7 @@ int clipdrawer_create_view(void *data) // for debug // at starting, showing app view - //clipdrawer_activate_view(ad); + // clipdrawer_activate_view(ad); return 0; } diff --git a/src/scrcapture.c b/src/scrcapture.c index 7f65dc4..0cc68d3 100644 --- a/src/scrcapture.c +++ b/src/scrcapture.c @@ -66,7 +66,7 @@ static Eina_Bool _scrcapture_capture_postprocess(void* data) return EINA_FALSE; } -static Eina_Bool capture_current_screen(void *data) +Eina_Bool capture_current_screen(void *data) { struct appdata *ad = data; diff --git a/src/scrcapture.h b/src/scrcapture.h index 4ec527d..e271654 100644 --- a/src/scrcapture.h +++ b/src/scrcapture.h @@ -12,6 +12,7 @@ const char* createScreenShot(int width, int height); void releaseScreenShot(const char *ss); // XV extension API - end +Eina_Bool capture_current_screen(void *data); char *scrcapture_capture_screen_by_x11(Window xid, int *size); char *scrcapture_capture_screen_by_xv_ext(int width, int height); void scrcapture_release_screen_by_xv_ext(const char *s); diff --git a/src/xcnphandler.c b/src/xcnphandler.c index 7ab5a82..34ffca7 100755 --- a/src/xcnphandler.c +++ b/src/xcnphandler.c @@ -211,6 +211,7 @@ int get_selection_content(void *data) AnyPropertyType, &cbtype, &cbformat, &cbitems, &cbsize, &cbbuf); XDeleteProperty(g_disp, g_evtwin, atomCBOut); +/* unesc = clipdrawer_get_plain_string_from_escaped(cbbuf); if (unesc != NULL) { @@ -232,13 +233,48 @@ int get_selection_content(void *data) } else unesc_len = 0; +*/ // add_to_storage_buffer(ad, cbbuf, cbitems); // DTRACE("len = %ld, data = %s\n", cbitems, cbbuf); + if (cbbuf != NULL) + { + unesc_len = strlen(cbbuf); + // FIXME: invent more clever way to right trim the string + for (i = unesc_len-1; i > 0; i--) + { + // avoid control characters + if (cbbuf[i] >= 0x01 && cbbuf[i] <= 0x1F) + continue; + else + { + DTRACE("before right trim len = %d\n", unesc_len); + unesc_len = i+1; + DTRACE("after right trim len = %d\n", unesc_len); + break; + } + } + } + else + unesc_len = 0; + + if (!strncmp(cbbuf, "file://", 7) && + (strcasestr(cbbuf,".png") || strcasestr(cbbuf,".jpg") || strcasestr(cbbuf,".bmp")) && + check_regular_file(cbbuf+7)) + { + DTRACE("clipdrawer add path = %s\n", cbbuf+7); + clipdrawer_add_image_item(cbbuf+7); + } + else + add_to_storage_buffer(ad, cbbuf, unesc_len); + DTRACE("len = %ld, data = %s\n", unesc_len, cbbuf); + + /* FIXME : it needs two verification. 1. does the file exist? 2. dose the file wanted type? */ +/* if (!strncmp(unesc, "file://", 7) && (strcasestr(unesc,".png") || strcasestr(unesc,".jpg") || strcasestr(unesc,".bmp")) && check_regular_file(unesc+7)) @@ -250,6 +286,7 @@ int get_selection_content(void *data) add_to_storage_buffer(ad, unesc, unesc_len); DTRACE("len = %ld, data = %s\n", unesc_len, unesc); free(unesc); +*/ DTRACE("\n"); print_storage_buffer(); @@ -365,6 +402,7 @@ static int _cbhm_init(void *data) ecore_x_netwm_name_set(g_evtwin, CLIPBOARD_MANAGER_WINDOW_TITLE_STRING); XSelectInput(g_disp, g_evtwin, PropertyChangeMask); + XSelectInput(g_disp, g_rootwin, StructureNotifyMask); // ecore_x_window_show(g_evtwin); ecore_x_flush(); @@ -454,11 +492,21 @@ static int _xclient_msg_cb(void *data, int ev_type, void *event) Atom atomCBHM_MSG = XInternAtom(g_disp, "CBHM_MSG", False); Atom atomCBHM_cRAW = XInternAtom(g_disp, "CBHM_cRAW", False); + Atom atomXKey_MSG = XInternAtom(g_disp, "_XKEY_COMPOSITION", False); char atomname[10]; Atom cbhm_atoms[HISTORY_QUEUE_MAX_TXT_ITEMS]; Ecore_X_Window reqwin = ev->win; int i, pos; + if (ev->message_type == atomXKey_MSG) + { + DTRACE("XE:ClientMessage for Screen capture\n"); + + capture_current_screen(ad); + + return TRUE; + } + if (ev->message_type != atomCBHM_MSG) return -1; -- 2.7.4