discomfitor pushed a commit to branch master.

commit fbd09e2562e60186c8327717c04b0a191e6906ab
Author: Mike Blumenkrantz <[email protected]>
Date:   Wed May 29 12:46:51 2013 +0100

    add support for text/x-moz-url DND operations
---
 ChangeLog                                 |  1 +
 NEWS                                      |  1 +
 src/lib/ecore_x/Ecore_X.h                 | 10 +++++
 src/lib/ecore_x/Ecore_X_Atoms.h           |  1 +
 src/lib/ecore_x/ecore_x_atoms_decl.h      |  2 +
 src/lib/ecore_x/xcb/ecore_xcb_selection.c | 70 +++++++++++++++++++++++++++++++
 src/lib/ecore_x/xlib/ecore_x_selection.c  | 69 ++++++++++++++++++++++++++++++
 7 files changed, 154 insertions(+)

diff --git a/ChangeLog b/ChangeLog
index 43896da..ff35f3f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,7 @@
 2013-05-29  Mike Blumenkrantz
 
         * Added eina_str_convert_len() to work around broken eina_str_convert()
+        * Add ecore-x(cb) support for text/x-moz-url DND operations
 
 2013-05-28  ChunEon Park (Hermet)
 
diff --git a/NEWS b/NEWS
index 1e75370..3fcda0b 100644
--- a/NEWS
+++ b/NEWS
@@ -46,6 +46,7 @@ Additions:
        ecore_x_randr_crtc_info_free()
        ecore_x_dnd_self_begin()
        ecore_x_dnd_self_drop()
+       support for text/x-moz-url DND operations
     * ecore_wayland:
      - Store global wayland interfaces in a globals list so wayland programs
        can bind to other non-standard wayland protocol extensions.
diff --git a/src/lib/ecore_x/Ecore_X.h b/src/lib/ecore_x/Ecore_X.h
index 8767704..fa10024 100644
--- a/src/lib/ecore_x/Ecore_X.h
+++ b/src/lib/ecore_x/Ecore_X.h
@@ -259,6 +259,7 @@ typedef enum _Ecore_X_Randr_Edid_Aspect_Ratio
 #define ECORE_X_SELECTION_TARGET_STRING        "STRING"
 #define ECORE_X_SELECTION_TARGET_UTF8_STRING   "UTF8_STRING"
 #define ECORE_X_SELECTION_TARGET_FILENAME      "FILENAME"
+#define ECORE_X_SELECTION_TARGET_X_MOZ_URL     "X_MOZ_URL"
 
 #define ECORE_X_DND_VERSION                    5
 
@@ -427,6 +428,7 @@ typedef struct _Ecore_X_Event_Fixes_Selection_Notify       
Ecore_X_Event_Fixes_S
 typedef struct _Ecore_X_Selection_Data                     
Ecore_X_Selection_Data;
 typedef struct _Ecore_X_Selection_Data_Files               
Ecore_X_Selection_Data_Files;
 typedef struct _Ecore_X_Selection_Data_Text                
Ecore_X_Selection_Data_Text;
+typedef struct _Ecore_X_Selection_Data_X_Moz_Url           
Ecore_X_Selection_Data_X_Moz_Url;
 typedef struct _Ecore_X_Selection_Data_Targets             
Ecore_X_Selection_Data_Targets;
 typedef struct _Ecore_X_Event_Xdnd_Enter                   
Ecore_X_Event_Xdnd_Enter;
 typedef struct _Ecore_X_Event_Xdnd_Position                
Ecore_X_Event_Xdnd_Position;
@@ -714,6 +716,7 @@ struct _Ecore_X_Selection_Data
       ECORE_X_SELECTION_CONTENT_NONE,
       ECORE_X_SELECTION_CONTENT_TEXT,
       ECORE_X_SELECTION_CONTENT_FILES,
+      ECORE_X_SELECTION_CONTENT_X_MOZ_URL,
       ECORE_X_SELECTION_CONTENT_TARGETS,
       ECORE_X_SELECTION_CONTENT_CUSTOM
    } content;
@@ -736,6 +739,13 @@ struct _Ecore_X_Selection_Data_Text
    char                  *text;
 };
 
+struct _Ecore_X_Selection_Data_X_Moz_Url
+{
+   Ecore_X_Selection_Data data;
+   Eina_Inarray         *links;
+   Eina_Inarray         *link_names;
+};
+
 struct _Ecore_X_Selection_Data_Targets
 {
    Ecore_X_Selection_Data data;
diff --git a/src/lib/ecore_x/Ecore_X_Atoms.h b/src/lib/ecore_x/Ecore_X_Atoms.h
index 2048c74..48e01b6 100644
--- a/src/lib/ecore_x/Ecore_X_Atoms.h
+++ b/src/lib/ecore_x/Ecore_X_Atoms.h
@@ -14,6 +14,7 @@ EAPI extern Ecore_X_Atom ECORE_X_ATOM_FILE_NAME;
 EAPI extern Ecore_X_Atom ECORE_X_ATOM_STRING;
 EAPI extern Ecore_X_Atom ECORE_X_ATOM_TEXT;
 EAPI extern Ecore_X_Atom ECORE_X_ATOM_UTF8_STRING;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_X_MOZ_URL;
 EAPI extern Ecore_X_Atom ECORE_X_ATOM_WINDOW;
 EAPI extern Ecore_X_Atom ECORE_X_ATOM_PIXMAP;
 EAPI extern Ecore_X_Atom ECORE_X_ATOM_VISUALID;
diff --git a/src/lib/ecore_x/ecore_x_atoms_decl.h 
b/src/lib/ecore_x/ecore_x_atoms_decl.h
index e30bc35..dc40510 100644
--- a/src/lib/ecore_x/ecore_x_atoms_decl.h
+++ b/src/lib/ecore_x/ecore_x_atoms_decl.h
@@ -5,6 +5,7 @@ EAPI Ecore_X_Atom ECORE_X_ATOM_COMPOUND_TEXT = 0;
 EAPI Ecore_X_Atom ECORE_X_ATOM_FILE_NAME = 0;
 EAPI Ecore_X_Atom ECORE_X_ATOM_STRING = 0;
 EAPI Ecore_X_Atom ECORE_X_ATOM_TEXT = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_X_MOZ_URL = 0;
 EAPI Ecore_X_Atom ECORE_X_ATOM_UTF8_STRING = 0;
 EAPI Ecore_X_Atom ECORE_X_ATOM_WINDOW = 0;
 EAPI Ecore_X_Atom ECORE_X_ATOM_PIXMAP = 0;
@@ -353,6 +354,7 @@ const Atom_Item atom_items[] =
    { "FILE_NAME", &ECORE_X_ATOM_FILE_NAME },
    { "STRING", &ECORE_X_ATOM_STRING },
    { "TEXT", &ECORE_X_ATOM_TEXT },
+   { "X_MOZ_URL", &ECORE_X_ATOM_X_MOZ_URL },
    { "UTF8_STRING", &ECORE_X_ATOM_UTF8_STRING },
    { "WINDOW", &ECORE_X_ATOM_WINDOW },
    { "PIXMAP", &ECORE_X_ATOM_PIXMAP },
diff --git a/src/lib/ecore_x/xcb/ecore_xcb_selection.c 
b/src/lib/ecore_x/xcb/ecore_xcb_selection.c
index c758783..338e845 100644
--- a/src/lib/ecore_x/xcb/ecore_xcb_selection.c
+++ b/src/lib/ecore_x/xcb/ecore_xcb_selection.c
@@ -8,6 +8,10 @@ static void *_ecore_xcb_selection_parser_text(const char 
*target EINA_UNUSED,
                                               void       *data,
                                               int         size,
                                               int         format EINA_UNUSED);
+static void *_ecore_xcb_selection_parser_xmozurl(const char *target 
EINA_UNUSED,
+                                              void       *data,
+                                              int         size,
+                                              int         format EINA_UNUSED);
 static void *_ecore_xcb_selection_parser_files(const char *target,
                                                void       *data,
                                                int         size,
@@ -61,6 +65,8 @@ _ecore_xcb_selection_init(void)
                                 _ecore_xcb_selection_parser_text);
    ecore_x_selection_parser_add("text/uri-list",
                                 _ecore_xcb_selection_parser_files);
+   ecore_x_selection_parser_add("text/x-moz-url",
+                                _ecore_x_selection_parser_xmozurl);
    ecore_x_selection_parser_add("_NETSCAPE_URL",
                                 _ecore_xcb_selection_parser_files);
    ecore_x_selection_parser_add(ECORE_X_SELECTION_TARGET_TARGETS,
@@ -769,6 +775,66 @@ _ecore_xcb_selection_parser_text(const char *target 
EINA_UNUSED,
    return sel;
 }
 
+static int
+_ecore_xcb_selection_data_xmozurl_free(void *data)
+{
+   Ecore_X_Selection_Data_X_Moz_Url *sel = data;
+   char **buf;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!sel) return 0;
+
+   buf = eina_inarray_nth(sel->links, 0);
+   free(*buf);
+   eina_inarray_free(sel->links);
+   eina_inarray_free(sel->link_names);
+   free(sel);
+   return 1;
+}
+
+static void *
+_ecore_xcb_selection_parser_xmozurl(const char *target EINA_UNUSED,
+                               void *_data,
+                               int size,
+                               int format EINA_UNUSED)
+{
+   Ecore_X_Selection_Data_X_Moz_Url *sel;
+   char *prev, *n, *buf, *data = _data;
+   size_t sz;
+   int num = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   buf = eina_str_convert_len("UTF-16LE", "UTF-8", data, size, &sz);
+   if (!buf) return NULL;
+   sel = calloc(1, sizeof(Ecore_X_Selection_Data_X_Moz_Url));
+   if (!sel)
+     {
+        free(buf);
+        return NULL;
+     }
+   sel->links = eina_inarray_new(sizeof(char*), 0);
+   sel->link_names = eina_inarray_new(sizeof(char*), 0);
+   prev = buf;
+   for (n = memchr(buf, '\n', sz); n; n = memchr(prev, '\n', sz - (prev - 
buf)))
+     {
+        n[0] = 0;
+        if (num % 2 == 0)
+          eina_inarray_push(sel->links, &prev);
+        else
+          eina_inarray_push(sel->link_names, &prev);
+        num++;
+        prev = n + 1;
+     }
+   eina_inarray_push(sel->link_names, &prev[0]);
+
+   ECORE_XCB_SELECTION_DATA(sel)->length = size;
+   ECORE_XCB_SELECTION_DATA(sel)->content = 
ECORE_X_SELECTION_CONTENT_X_MOZ_URL;
+   ECORE_XCB_SELECTION_DATA(sel)->data = (void*)data;
+   ECORE_XCB_SELECTION_DATA(sel)->free = 
_ecore_xcb_selection_data_xmozurl_free;
+   return sel;
+}
+
 static void *
 _ecore_xcb_selection_parser_files(const char *target,
                                   void       *data,
@@ -1004,6 +1070,8 @@ _ecore_xcb_selection_target_atom_get(const char *target)
      x_target = ECORE_X_ATOM_UTF8_STRING;
    else if (!strcmp(target, ECORE_X_SELECTION_TARGET_FILENAME))
      x_target = ECORE_X_ATOM_FILE_NAME;
+   else if (!strcmp(target, ECORE_X_SELECTION_TARGET_X_MOZ_URL))
+     x_target = ECORE_X_ATOM_X_MOZ_URL;
    else
      x_target = ecore_x_atom_get(target);
 
@@ -1021,6 +1089,8 @@ _ecore_xcb_selection_target_get(Ecore_X_Atom target)
      return strdup(ECORE_X_SELECTION_TARGET_UTF8_STRING);
    else if (target == ECORE_X_ATOM_TEXT)
      return strdup(ECORE_X_SELECTION_TARGET_TEXT);
+   else if (target == ECORE_X_ATOM_X_MOZ_URL)
+     return strdup(ECORE_X_SELECTION_TARGET_X_MOZ_URL);
    else
      return ecore_x_atom_name_get(target);
 }
diff --git a/src/lib/ecore_x/xlib/ecore_x_selection.c 
b/src/lib/ecore_x/xlib/ecore_x_selection.c
index ae2d41c..8e2efa4 100644
--- a/src/lib/ecore_x/xlib/ecore_x_selection.c
+++ b/src/lib/ecore_x/xlib/ecore_x_selection.c
@@ -34,6 +34,10 @@ static void *_ecore_x_selection_parser_text(const char 
*target,
                                             void *data,
                                             int size,
                                             int format);
+static void *_ecore_x_selection_parser_xmozurl(const char *target,
+                                            void *data,
+                                            int size,
+                                            int format);
 static int   _ecore_x_selection_data_text_free(void *data);
 static void *_ecore_x_selection_parser_targets(const char *target,
                                                void *data,
@@ -68,6 +72,8 @@ _ecore_x_selection_data_init(void)
                                 _ecore_x_selection_parser_text);
    ecore_x_selection_parser_add("text/uri-list",
                                 _ecore_x_selection_parser_files);
+   ecore_x_selection_parser_add("text/x-moz-url",
+                                _ecore_x_selection_parser_xmozurl);
    ecore_x_selection_parser_add("_NETSCAPE_URL",
                                 _ecore_x_selection_parser_files);
    ecore_x_selection_parser_add(ECORE_X_SELECTION_TARGET_TARGETS,
@@ -316,6 +322,8 @@ _ecore_x_selection_target_atom_get(const char *target)
      x_target = ECORE_X_ATOM_UTF8_STRING;
    else if (!strcmp(target, ECORE_X_SELECTION_TARGET_FILENAME))
      x_target = ECORE_X_ATOM_FILE_NAME;
+   else if (!strcmp(target, ECORE_X_SELECTION_TARGET_X_MOZ_URL))
+     x_target = ECORE_X_ATOM_X_MOZ_URL;
    else
      x_target = ecore_x_atom_get(target);
 
@@ -335,6 +343,8 @@ _ecore_x_selection_target_get(Ecore_X_Atom target)
      return strdup(ECORE_X_SELECTION_TARGET_UTF8_STRING);
    else if (target == ECORE_X_ATOM_TEXT)
      return strdup(ECORE_X_SELECTION_TARGET_TEXT);
+   else if (target == ECORE_X_ATOM_X_MOZ_URL)
+     return strdup(ECORE_X_SELECTION_TARGET_X_MOZ_URL);
    else
      return XGetAtomName(_ecore_x_disp, target);
 }
@@ -942,6 +952,65 @@ _ecore_x_selection_parser_text(const char *target 
EINA_UNUSED,
 }
 
 static int
+_ecore_x_selection_data_xmozurl_free(void *data)
+{
+   Ecore_X_Selection_Data_X_Moz_Url *sel = data;
+   char **buf;
+
+   buf = eina_inarray_nth(sel->links, 0);
+   free(*buf);
+   eina_inarray_free(sel->links);
+   eina_inarray_free(sel->link_names);
+   free(sel);
+   return 1;
+}
+#ifdef HAVE_ICONV
+# include <errno.h>
+# include <iconv.h>
+#endif
+static void *
+_ecore_x_selection_parser_xmozurl(const char *target EINA_UNUSED,
+                               void *_data,
+                               int size,
+                               int format EINA_UNUSED)
+{
+   Ecore_X_Selection_Data_X_Moz_Url *sel;
+   char *prev, *n, *buf, *data = _data;
+   size_t sz;
+   int num = 0;
+
+   buf = eina_str_convert_len("UTF-16LE", "UTF-8", data, size, &sz);
+   if (!buf) return NULL;
+   sel = calloc(1, sizeof(Ecore_X_Selection_Data_X_Moz_Url));
+   if (!sel)
+     {
+        free(buf);
+        return NULL;
+     }
+   sz = strlen(buf);
+   sel->links = eina_inarray_new(sizeof(char*), 0);
+   sel->link_names = eina_inarray_new(sizeof(char*), 0);
+   prev = buf;
+   for (n = memchr(buf, '\n', sz); n; n = memchr(prev, '\n', sz - (prev - 
buf)))
+     {
+        n[0] = 0;
+        if (num % 2 == 0)
+          eina_inarray_push(sel->links, &prev);
+        else
+          eina_inarray_push(sel->link_names, &prev);
+        num++;
+        prev = n + 1;
+     }
+   eina_inarray_push(sel->link_names, &prev);
+
+   ECORE_X_SELECTION_DATA(sel)->length = size;
+   ECORE_X_SELECTION_DATA(sel)->content = ECORE_X_SELECTION_CONTENT_X_MOZ_URL;
+   ECORE_X_SELECTION_DATA(sel)->data = (void*)data;
+   ECORE_X_SELECTION_DATA(sel)->free = _ecore_x_selection_data_xmozurl_free;
+   return sel;
+}
+
+static int
 _ecore_x_selection_data_text_free(void *data)
 {
    Ecore_X_Selection_Data_Text *sel;

-- 

------------------------------------------------------------------------------
Introducing AppDynamics Lite, a free troubleshooting tool for Java/.NET
Get 100% visibility into your production application - at no cost.
Code-level diagnostics for performance bottlenecks with <2% overhead
Download for free and get started troubleshooting in minutes.
http://p.sf.net/sfu/appdyn_d2d_ap1

Reply via email to