1 #include "cbhm_helper.h"
3 #ifdef HAVE_ELEMENTARY_X
6 #define ATOM_CBHM_WINDOW_NAME "CBHM_XWIN"
7 #define ATOM_CBHM_MSG "CBHM_MSG"
8 #define ATOM_CBHM_COUNT_GET "CBHM_cCOUNT"
9 #define ATOM_CBHM_SERIAL_NUMBER "CBHM_SERIAL_NUMBER"
10 #define MSG_CBHM_COUNT_GET "get count"
11 #define ATOM_CBHM_ERROR "CBHM_ERROR"
12 #define ATOM_CBHM_ITEM "CBHM_ITEM"
15 #ifdef HAVE_ELEMENTARY_X
19 Ecore_X_Atom x_atom_cbhm = ecore_x_atom_get(ATOM_CBHM_WINDOW_NAME);
20 Ecore_X_Window x_cbhm_win = 0;
21 unsigned char *buf = NULL;
23 int ret = ecore_x_window_prop_property_get(0, x_atom_cbhm, XA_WINDOW, 0, &buf, &num);
24 DMSG("ret: %d, num: %d\n", ret, num);
26 memcpy(&x_cbhm_win, buf, sizeof(Ecore_X_Window));
34 _cbhm_msg_send(Evas_Object *obj, char *msg)
36 #ifdef HAVE_ELEMENTARY_X
37 Ecore_X_Window x_cbhm_win = _cbhm_window_get();
38 Ecore_X_Atom x_atom_cbhm_msg = ecore_x_atom_get(ATOM_CBHM_MSG);
39 Ecore_X_Window xwin = ecore_evas_software_x11_window_get(
40 ecore_evas_ecore_evas_get(evas_object_evas_get(obj)));
42 DMSG("x_cbhm: 0x%x\n", x_cbhm_win);
43 if (!x_cbhm_win || !x_atom_cbhm_msg)
46 XClientMessageEvent m;
47 memset(&m, 0, sizeof(m));
48 m.type = ClientMessage;
49 m.display = ecore_x_display_get();
51 m.message_type = x_atom_cbhm_msg;
53 snprintf(m.data.b, 20, "%s", msg);
55 XSendEvent(ecore_x_display_get(), x_cbhm_win, False, NoEventMask, (XEvent*)&m);
64 #ifdef HAVE_ELEMENTARY_X
66 _cbhm_reply_get(Ecore_X_Window xwin, Ecore_X_Atom property, Ecore_X_Atom *x_data_type, int *num)
68 unsigned char *data = NULL;
77 long unsigned int num_ret = 0, bytes = 0;
78 int ret = 0, size_ret;
80 unsigned char *prop_ret;
81 Ecore_X_Atom type_ret;
82 ret = XGetWindowProperty(ecore_x_display_get(), xwin, property, 0, LONG_MAX,
83 False, ecore_x_window_prop_any_type(), (Atom *)&type_ret, &size_ret,
84 &num_ret, &bytes, &prop_ret);
93 if (!(data = malloc(num_ret * size_ret / 8)))
101 for (i = 0; i < num_ret; i++)
102 (data)[i] = prop_ret[i];
106 for (i = 0; i < num_ret; i++)
107 ((unsigned short *)data)[i] = ((unsigned short *)prop_ret)[i];
111 for (i = 0; i < num_ret; i++)
112 ((unsigned int *)data)[i] = ((unsigned long *)prop_ret)[i];
121 *x_data_type = type_ret;
128 _cbhm_item_count_get(Evas_Object *obj)
130 #ifdef HAVE_ELEMENTARY_X
132 if(_cbhm_msg_send(obj, MSG_CBHM_COUNT_GET))
134 DMSG("message send success\n");
135 Ecore_X_Atom x_atom_cbhm_count_get = ecore_x_atom_get(ATOM_CBHM_COUNT_GET);
136 Ecore_X_Window xwin = ecore_evas_software_x11_window_get(
137 ecore_evas_ecore_evas_get(evas_object_evas_get(obj)));
138 DMSG("x_win: 0x%x, x_atom: %d\n", xwin, x_atom_cbhm_count_get);
139 ret = _cbhm_reply_get(xwin, x_atom_cbhm_count_get, NULL, NULL);
143 DMSG("count: %d\n", count);
147 DMSG("ret: 0x%x\n", ret);
153 #ifdef HAVE_ELEMENTARY_X
155 _cbhm_item_get(Evas_Object *obj, int index, Ecore_X_Atom *data_type, char **buf)
158 _cbhm_item_get(Evas_Object *obj, int index, void *data_type, char **buf)
165 *(int *)data_type = 0;
167 #ifdef HAVE_ELEMENTARY_X
168 Ecore_X_Window xwin = ecore_evas_software_x11_window_get(
169 ecore_evas_ecore_evas_get(evas_object_evas_get(obj)));
173 snprintf(send_buf, 20, "GET_ITEM%d", index);
174 if (_cbhm_msg_send(obj, send_buf))
176 DMSG("message send success\n");
177 Ecore_X_Atom x_atom_cbhm_item = ecore_x_atom_get(ATOM_CBHM_ITEM);
178 Ecore_X_Atom x_atom_item_type = 0;
180 DMSG("x_win: 0x%x, x_atom: %d\n", xwin, x_atom_cbhm_item);
181 ret = _cbhm_reply_get(xwin, x_atom_cbhm_item, &x_atom_item_type, NULL);
184 DMSG("data_type: %d, buf: %s\n", x_atom_item_type, ret);
190 *data_type = x_atom_item_type;
192 Ecore_X_Atom x_atom_cbhm_error = ecore_x_atom_get(ATOM_CBHM_ERROR);
193 if (x_atom_item_type == x_atom_cbhm_error)
196 DMSG("ret: 0x%x\n", ret);
203 _cbhm_serial_number_get()
205 unsigned int senum = 0;
206 #ifdef HAVE_ELEMENTARY_X
207 unsigned char *buf = NULL;
208 Ecore_X_Atom x_atom_cbhm_SN = ecore_x_atom_get(ATOM_CBHM_SERIAL_NUMBER);
209 Ecore_X_Window x_cbhm_win = _cbhm_window_get();
210 buf = _cbhm_reply_get(x_cbhm_win, x_atom_cbhm_SN, NULL, NULL);
213 memcpy(&senum, buf, sizeof(senum));
220 //////////////////////////////////////////////////////////////////////////////
221 // old elm_cbmh_helper //
222 //////////////////////////////////////////////////////////////////////////////
223 //#include <Elementary.h>
224 //#include "elm_priv.h"
226 //#ifdef HAVE_ELEMENTARY_X
227 //#include <X11/Xlib.h>
228 //#include <X11/Xatom.h>
232 // * @defgroup CBHM_helper CBHM_helper
233 // * @ingroup Elementary
235 // * retrieving date from Clipboard History Manager
236 // * CBHM_helper supports to get CBHM's contents
240 //#define ATOM_CLIPBOARD_NAME "CLIPBOARD"
241 //#define ATOM_CLIPBOARD_MANGER_NAME "CLIPBOARD_MANAGER"
242 //#define CLIPBOARD_MANAGER_WINDOW_TITLE_STRING "X11_CLIPBOARD_HISTORY_MANAGER"
243 //#define ATOM_CBHM_WINDOW_NAME "CBHM_XWIN"
245 //#ifdef HAVE_ELEMENTARY_X
246 //static Ecore_X_Display *cbhm_disp = NULL;
247 //static Ecore_X_Window cbhm_win = None;
248 //static Ecore_X_Window self_win = None;
250 //static Eina_Bool init_flag = EINA_FALSE;
252 //void _get_clipboard_window();
253 //unsigned int _get_cbhm_serial_number();
254 //void _search_clipboard_window(Ecore_X_Window w);
255 //int _send_clipboard_events(char *cmd);
256 //#ifdef HAVE_ELEMENTARY_X
257 //int _get_clipboard_data(Atom datom, char **datomptr);
260 //void _get_clipboard_window()
262 //#ifdef HAVE_ELEMENTARY_X
264 // int actual_format;
265 // unsigned long nitems, bytes_after;
266 // unsigned char *prop_return = NULL;
267 // Atom atomCbhmWin = XInternAtom(cbhm_disp, ATOM_CBHM_WINDOW_NAME, False);
269 // XGetWindowProperty(cbhm_disp, DefaultRootWindow(cbhm_disp), atomCbhmWin,
270 // 0, sizeof(Ecore_X_Window), False, XA_WINDOW,
271 // &actual_type, &actual_format, &nitems, &bytes_after, &prop_return) &&
274 // cbhm_win = *(Ecore_X_Window*)prop_return;
275 // XFree(prop_return);
276 // fprintf(stderr, "## find clipboard history manager at root\n");
281 //unsigned int _get_cbhm_serial_number()
283 // unsigned int senum = 0;
284 //#ifdef HAVE_ELEMENTARY_X
286 // int actual_format;
287 // unsigned long nitems, bytes_after;
288 // unsigned char *prop_return = NULL;
289 // Atom atomCbhmSN = XInternAtom(cbhm_disp, "CBHM_SERIAL_NUMBER", False);
291 // // FIXME : is it really needed?
292 // XSync(cbhm_disp, EINA_FALSE);
295 // XGetWindowProperty(cbhm_disp, cbhm_win, atomCbhmSN,
296 // 0, sizeof(Ecore_X_Window), False, XA_INTEGER,
297 // &actual_type, &actual_format, &nitems, &bytes_after, &prop_return) &&
300 // senum = *(unsigned int*)prop_return;
301 // XFree(prop_return);
303 // fprintf(stderr, "## chbm_serial = %d\n", senum);
308 //void _search_clipboard_window(Ecore_X_Window w)
310 //#ifdef HAVE_ELEMENTARY_X
311 // // Get the PID for the current Window.
312 // Atom atomWMName = XInternAtom(cbhm_disp, "_NET_WM_NAME", False);
313 // Atom atomUTF8String = XInternAtom(cbhm_disp, "UTF8_STRING", False);
316 // unsigned long nitems;
317 // unsigned long bytes_after;
318 // unsigned long nsize = 0;
319 // unsigned char *propName = 0;
321 // XGetWindowProperty(cbhm_disp, w, atomWMName, 0, (long)nsize, False,
322 // atomUTF8String, &type, &format, &nitems, &bytes_after, &propName))
327 // if (strcmp((const char *)CLIPBOARD_MANAGER_WINDOW_TITLE_STRING,(const char *)propName) == 0)
333 // // Recurse into child windows.
337 // unsigned nchildren;
339 // if(0 != XQueryTree(cbhm_disp, w, &wroot, &wparent, &wchild, &nchildren))
341 // for(i = 0; i < nchildren; i++)
342 // _search_clipboard_window(wchild[i]);
348 //int _send_clipboard_events(char *cmd)
353 //#ifdef HAVE_ELEMENTARY_X
354 // Atom atomCBHM_MSG = XInternAtom(cbhm_disp, "CBHM_MSG", False);
356 // XClientMessageEvent m;
357 // memset(&m, 0, sizeof(m));
358 // m.type = ClientMessage;
359 // m.display = cbhm_disp;
360 // m.window = self_win;
361 // m.message_type = atomCBHM_MSG;
363 // sprintf(m.data.b, "%s", cmd);
365 // XSendEvent(cbhm_disp, cbhm_win, False, NoEventMask, (XEvent*)&m);
370 //#ifdef HAVE_ELEMENTARY_X
371 //int _get_clipboard_data(Atom datom, char **datomptr)
373 // // Atom atomUTF8String = XInternAtom(cbhm_disp, "UTF8_STRING", False);
376 // unsigned long nitems;
377 // unsigned long nsize;
378 // unsigned char *propname = NULL;
380 // // FIXME : is it really needed?
381 // XSync(cbhm_disp, EINA_FALSE);
384 // XGetWindowProperty(cbhm_disp, self_win, datom, 0, 0, False,
385 // AnyPropertyType, &type, &format, &nitems, &nsize, &propname))
393 // fprintf(stderr, "## format = %d\n", format);
394 // fprintf(stderr, "## nsize = %d\n", nsize);
401 // XGetWindowProperty(cbhm_disp, self_win, datom, 0, (long)nsize, False,
402 // AnyPropertyType, &type, &format, &nitems, &nsize, &propname))
406 // XGetWindowProperty(cbhm_disp, self_win, datom, 0, (long)nsize, False,
407 // AnyPropertyType, &type, &format, &nitems, &nsize, &propname);
410 // if(propname != NULL)
412 // // fprintf(stderr, "## get data(0x%x) : %s\n", propname, propname);
413 // // fprintf(stderr, "## after nsize = %d\n", nsize);
414 // *datomptr = (char*)propname;
415 // // XFree(propName);
418 // XDeleteProperty(cbhm_disp, self_win, datom);
419 // XFlush(cbhm_disp);
422 // if (propname != NULL)
430 //void free_clipboard_data(char *dptr)
432 //#ifdef HAVE_ELEMENTARY_X
440 // * initalizing CBHM_helper
442 // * @param self The self window object which receive events
443 // * @return return TRUE or FALSE if it cannot be created
445 // * @ingroup CBHM_helper
448 //elm_cbhm_helper_init(Evas_Object *self)
450 // init_flag = EINA_FALSE;
452 //#ifdef HAVE_ELEMENTARY_X
453 // cbhm_disp = ecore_x_display_get();
454 // if (cbhm_disp == NULL)
456 // if (cbhm_win == None)
457 // _get_clipboard_window();
458 // if (cbhm_win == None)
459 // _search_clipboard_window(DefaultRootWindow(cbhm_disp));
460 // if (self_win == None)
461 // self_win = ecore_evas_software_x11_window_get(ecore_evas_ecore_evas_get(evas_object_evas_get(self)));
463 // if (cbhm_disp && cbhm_win && self_win)
464 // init_flag = EINA_TRUE;
470 // * getting serial number of CBHM
472 // * @return return serial number of clipboard history manager
474 // * @ingroup CBHM_helper
477 //elm_cbhm_get_serial_number()
479 // if (init_flag == EINA_FALSE)
482 // unsigned int num = 0;
483 // num = _get_cbhm_serial_number();
488 // * getting count of CBHM's contents
490 // * @return return count of history contents
492 // * @ingroup CBHM_helper
495 //elm_cbhm_get_count()
497 // if (init_flag == EINA_FALSE)
500 // char *retptr = NULL;
503 // _send_clipboard_events("get count");
505 //#ifdef HAVE_ELEMENTARY_X
506 // Atom atomCBHM_cCOUNT = XInternAtom(cbhm_disp, "CBHM_cCOUNT", False);
508 // _get_clipboard_data(atomCBHM_cCOUNT, &retptr);
511 // if (retptr != NULL)
513 // fprintf(stderr, "## c get retptr : %s\n", retptr);
514 // count = atoi(retptr);
516 // free_clipboard_data(retptr);
524 // * getting raw data of CBHM's contents
526 // * @return return raw data of history contents
528 // * @ingroup CBHM_helper
531 //elm_cbhm_get_raw_data()
533 // if (init_flag == EINA_FALSE)
536 // char *retptr = NULL;
538 // _send_clipboard_events("get raw");
540 //#ifdef HAVE_ELEMENTARY_X
541 // Atom atomCBHM_cRAW = XInternAtom(cbhm_disp, "CBHM_cRAW", False);
543 // _get_clipboard_data(atomCBHM_cRAW, &retptr);
546 // if (retptr != NULL)
548 // free_clipboard_data(retptr);
556 // * sending raw command to CBHM
560 // * @ingroup CBHM_helper
563 //elm_cbhm_send_raw_data(char *cmd)
565 // if (init_flag == EINA_FALSE)
571 // _send_clipboard_events(cmd);
572 // fprintf(stderr, "## cbhm - send raw cmd = %s\n", cmd);
578 // * getting data by history position of CBHM's contents
579 // * 0 is current content.
581 // * @return return data pointer of position of history contents
583 // * @ingroup CBHM_helper
586 //elm_cbhm_get_data_by_position(int pos, char **dataptr)
588 // if (init_flag == EINA_FALSE)
593 // sprintf(reqbuf, "get #%d", pos);
595 // _send_clipboard_events(reqbuf);
597 // sprintf(reqbuf, "CBHM_c%d", pos);
599 //#ifdef HAVE_ELEMENTARY_X
600 // Atom atomCBHM_cPOS = XInternAtom(cbhm_disp, reqbuf, False);
602 // ret = _get_clipboard_data(atomCBHM_cPOS, dataptr);
605 // if (ret >= 0 && *dataptr != NULL)
607 // // fprintf(stderr, "## d get retptr : %s\n", *dataptr);
608 // // fprintf(stderr, "## dptr = 0x%x\n", *dataptr);
617 // * free data by history position of CBHM's contents
621 // * @ingroup CBHM_helper
624 //elm_cbhm_free_data(char *dptr)
627 // free_clipboard_data(dptr);