From: Enlightenment S. <no-...@en...> - 2009-11-28 23:58:08
|
Log: elm_list: Delete the timer when deleting an item. Author: nash Date: 2009-11-28 15:57:54 -0800 (Sat, 28 Nov 2009) New Revision: 44036 Modified: trunk/TMP/st/elementary/src/lib/elm_list.c Modified: trunk/TMP/st/elementary/src/lib/elm_list.c =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_list.c 2009-11-28 12:15:48 UTC (rev 44035) +++ trunk/TMP/st/elementary/src/lib/elm_list.c 2009-11-28 23:57:54 UTC (rev 44036) @@ -695,6 +695,7 @@ if (it->selected) _item_unselect(it); wd->items = eina_list_remove_list(wd->items, it->node); eina_stringshare_del(it->label); + if (it->long_timer) ecore_timer_del(it->long_timer); if (it->icon) evas_object_del(it->icon); if (it->end) evas_object_del(it->end); if (it->base) evas_object_del(it->base); |
From: Enlightenment S. <no-...@en...> - 2009-11-29 00:01:26
|
Log: elm_list: Call the callbacks _last_. Saves segv when the user deletes stuff. Author: nash Date: 2009-11-28 16:01:13 -0800 (Sat, 28 Nov 2009) New Revision: 44037 Modified: trunk/TMP/st/elementary/src/lib/elm_list.c Modified: trunk/TMP/st/elementary/src/lib/elm_list.c =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_list.c 2009-11-28 23:57:54 UTC (rev 44036) +++ trunk/TMP/st/elementary/src/lib/elm_list.c 2009-11-29 00:01:13 UTC (rev 44037) @@ -219,11 +219,12 @@ else wd->on_hold = EINA_FALSE; wd->wasselected = it->selected; _item_hilight(it); - if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK) - evas_object_smart_callback_call(it->obj, "clicked", it); wd->longpressed = EINA_FALSE; if (it->long_timer) ecore_timer_del(it->long_timer); it->long_timer = ecore_timer_add(1.0, _long_press, it); + /* Always call the callbacks last - the user may delete our context! */ + if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK) + evas_object_smart_callback_call(it->obj, "clicked", it); } static void |
From: Enlightenment S. <no-...@en...> - 2010-06-06 04:10:03
|
Log: Don't deref a pointer before we check it. Author: nash Date: 2010-06-05 21:09:56 -0700 (Sat, 05 Jun 2010) New Revision: 49473 Modified: trunk/TMP/st/elementary/src/lib/elm_entry.c Modified: trunk/TMP/st/elementary/src/lib/elm_entry.c =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_entry.c 2010-06-05 14:15:18 UTC (rev 49472) +++ trunk/TMP/st/elementary/src/lib/elm_entry.c 2010-06-06 04:09:56 UTC (rev 49473) @@ -455,8 +455,10 @@ _store_selection(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); - const char *sel = edje_object_part_text_selection_get(wd->ent, "elm.text"); + const char *sel; + if (!wd) return; + sel = edje_object_part_text_selection_get(wd->ent, "elm.text"); eina_stringshare_replace(&wd->cut_sel, sel); } |
From: Enlightenment S. <no-...@en...> - 2010-06-06 04:32:48
|
Log: Minor fix to documentation formatting Author: nash Date: 2010-06-05 21:32:41 -0700 (Sat, 05 Jun 2010) New Revision: 49474 Modified: trunk/TMP/st/elementary/src/lib/elm_entry.c Modified: trunk/TMP/st/elementary/src/lib/elm_entry.c =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_entry.c 2010-06-06 04:09:56 UTC (rev 49473) +++ trunk/TMP/st/elementary/src/lib/elm_entry.c 2010-06-06 04:32:41 UTC (rev 49474) @@ -19,46 +19,46 @@ * vsize=ascent or vsize=full. the href=NAME sets the item name. Entry * supports a list of emoticon names by default. These are: * - * emoticon/angry - * emoticon/angry-shout - * emoticon/crazy-laugh - * emoticon/evil-laugh - * emoticon/evil - * emoticon/goggle-smile - * emoticon/grumpy - * emoticon/grumpy-smile - * emoticon/guilty - * emoticon/guilty-smile - * emoticon/haha - * emoticon/half-smile - * emoticon/happy-panting - * emoticon/happy - * emoticon/indifferent - * emoticon/kiss - * emoticon/knowing-grin - * emoticon/laugh - * emoticon/little-bit-sorry - * emoticon/love-lots - * emoticon/love - * emoticon/minimal-smile - * emoticon/not-happy - * emoticon/not-impressed - * emoticon/omg - * emoticon/opensmile - * emoticon/smile - * emoticon/sorry - * emoticon/squint-laugh - * emoticon/surprised - * emoticon/suspicious - * emoticon/tongue-dangling - * emoticon/tongue-poke - * emoticon/uh - * emoticon/unhappy - * emoticon/very-sorry - * emoticon/what - * emoticon/wink - * emoticon/worried - * emoticon/wtf + * - emoticon/angry + * - emoticon/angry-shout + * - emoticon/crazy-laugh + * - emoticon/evil-laugh + * - emoticon/evil + * - emoticon/goggle-smile + * - emoticon/grumpy + * - emoticon/grumpy-smile + * - emoticon/guilty + * - emoticon/guilty-smile + * - emoticon/haha + * - emoticon/half-smile + * - emoticon/happy-panting + * - emoticon/happy + * - emoticon/indifferent + * - emoticon/kiss + * - emoticon/knowing-grin + * - emoticon/laugh + * - emoticon/little-bit-sorry + * - emoticon/love-lots + * - emoticon/love + * - emoticon/minimal-smile + * - emoticon/not-happy + * - emoticon/not-impressed + * - emoticon/omg + * - emoticon/opensmile + * - emoticon/smile + * - emoticon/sorry + * - emoticon/squint-laugh + * - emoticon/surprised + * - emoticon/suspicious + * - emoticon/tongue-dangling + * - emoticon/tongue-poke + * - emoticon/uh + * - emoticon/unhappy + * - emoticon/very-sorry + * - emoticon/what + * - emoticon/wink + * - emoticon/worried + * - emoticon/wtf * * These are built-in currently, but you can add your own item provieer that * can create inlined objects in the text and fill the space allocated to the @@ -67,22 +67,22 @@ * See the entry test for some more examples of use of this. * * Signals that you can add callbacks for are: - * "changed" - The text within the entry was changed - * "activated" - The entry has received focus and the cursor - * "press" - The entry has been clicked - * "longpressed" - The entry has been clicked for a couple seconds - * "clicked" - The entry has been clicked - * "clicked,double" - The entry has been double clicked - * "focused" - The entry has received focus - * "unfocused" - The entry has lost focus - * "selection,paste" - A paste action has occurred - * "selection,copy" - A copy action has occurred - * "selection,cut" - A cut action has occurred - * "selection,start" - A selection has begun - * "selection,changed" - The selection has changed - * "selection,cleared" - The selection has been cleared - * "cursor,changed" - The cursor has changed - * "anchor,clicked" - The anchor has been clicked + * - "changed" - The text within the entry was changed + * - "activated" - The entry has received focus and the cursor + * - "press" - The entry has been clicked + * - "longpressed" - The entry has been clicked for a couple seconds + * - "clicked" - The entry has been clicked + * - "clicked,double" - The entry has been double clicked + * - "focused" - The entry has received focus + * - "unfocused" - The entry has lost focus + * - "selection,paste" - A paste action has occurred + * - "selection,copy" - A copy action has occurred + * - "selection,cut" - A cut action has occurred + * - "selection,start" - A selection has begun + * - "selection,changed" - The selection has changed + * - "selection,cleared" - The selection has been cleared + * - "cursor,changed" - The cursor has changed + * - "anchor,clicked" - The anchor has been clicked */ typedef struct _Mod_Api Mod_Api; |
From: Enlightenment S. <no-...@en...> - 2010-06-06 04:45:00
|
Log: Scrolled entry doc format update Author: nash Date: 2010-06-05 21:44:54 -0700 (Sat, 05 Jun 2010) New Revision: 49475 Modified: trunk/TMP/st/elementary/src/lib/elc_scrolled_entry.c Modified: trunk/TMP/st/elementary/src/lib/elc_scrolled_entry.c =================================================================== --- trunk/TMP/st/elementary/src/lib/elc_scrolled_entry.c 2010-06-06 04:32:41 UTC (rev 49474) +++ trunk/TMP/st/elementary/src/lib/elc_scrolled_entry.c 2010-06-06 04:44:54 UTC (rev 49475) @@ -12,22 +12,22 @@ * widget. * * Signals that you can add callbacks for are: - * "changed" - The text within the entry was changed - * "activated" - The entry has received focus and the cursor - * "press" - The entry has been clicked - * "longpressed" - The entry has been clicked for a couple seconds - * "clicked" - The entry has been clicked - * "clicked,double" - The entry has been double clicked - * "focused" - The entry has received focus - * "unfocused" - The entry has lost focus - * "selection,paste" - A paste action has occurred - * "selection,copy" - A copy action has occurred - * "selection,cut" - A cut action has occurred - * "selection,start" - A selection has begun - * "selection,changed" - The selection has changed - * "selection,cleared" - The selection has been cleared - * "cursor,changed" - The cursor has changed - * "anchor,clicked" - The anchor has been clicked + * - "changed" - The text within the entry was changed + * - "activated" - The entry has received focus and the cursor + * - "press" - The entry has been clicked + * - "longpressed" - The entry has been clicked for a couple seconds + * - "clicked" - The entry has been clicked + * - "clicked,double" - The entry has been double clicked + * - "focused" - The entry has received focus + * - "unfocused" - The entry has lost focus + * - "selection,paste" - A paste action has occurred + * - "selection,copy" - A copy action has occurred + * - "selection,cut" - A cut action has occurred + * - "selection,start" - A selection has begun + * - "selection,changed" - The selection has changed + * - "selection,cleared" - The selection has been cleared + * - "cursor,changed" - The cursor has changed + * - "anchor,clicked" - The anchor has been clicked */ typedef struct _Widget_Data Widget_Data; |
From: Enlightenment S. <no-...@en...> - 2010-06-10 06:41:57
|
Log: /me shuts up GCC for not understanding this new fangled C code. Author: nash Date: 2010-06-09 23:41:50 -0700 (Wed, 09 Jun 2010) New Revision: 49608 Modified: trunk/TMP/st/elementary/src/lib/elc_fileselector_button.c Modified: trunk/TMP/st/elementary/src/lib/elc_fileselector_button.c =================================================================== --- trunk/TMP/st/elementary/src/lib/elc_fileselector_button.c 2010-06-10 05:53:42 UTC (rev 49607) +++ trunk/TMP/st/elementary/src/lib/elc_fileselector_button.c 2010-06-10 06:41:50 UTC (rev 49608) @@ -216,7 +216,7 @@ static void _fs_launch(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__) { - Evas_Object *fs_btn, *win, *iw; + Evas_Object *fs_btn, *win = NULL, *iw = NULL; Eina_Bool win_fallback; Widget_Data *wd; |
From: Enlightenment S. <no-...@en...> - 2010-06-17 08:06:16
|
Log: Add the Cut and Paste helper code. Author: nash Date: 2010-06-17 01:06:07 -0700 (Thu, 17 Jun 2010) New Revision: 49725 Added: trunk/TMP/st/elementary/src/lib/elm_cnp_helper.c |
From: Enlightenment S. <no-...@en...> - 2010-06-17 08:07:33
|
Log: Add to Makefile. Author: nash Date: 2010-06-17 01:07:27 -0700 (Thu, 17 Jun 2010) New Revision: 49726 Modified: trunk/TMP/st/elementary/src/lib/Makefile.am Modified: trunk/TMP/st/elementary/src/lib/Makefile.am =================================================================== --- trunk/TMP/st/elementary/src/lib/Makefile.am 2010-06-17 08:06:07 UTC (rev 49725) +++ trunk/TMP/st/elementary/src/lib/Makefile.am 2010-06-17 08:07:27 UTC (rev 49726) @@ -91,7 +91,9 @@ els_box.c \ els_box.h \ els_icon.c \ -els_icon.h +els_icon.h \ +\ +elm_cnp_helper.c libelementary_la_CFLAGS = |
From: Enlightenment S. <no-...@en...> - 2010-06-17 08:14:38
|
Log: Fix == and =. Author: nash Date: 2010-06-17 01:14:32 -0700 (Thu, 17 Jun 2010) New Revision: 49727 Modified: trunk/TMP/st/elementary/src/lib/elm_layout.c Modified: trunk/TMP/st/elementary/src/lib/elm_layout.c =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_layout.c 2010-06-17 08:07:27 UTC (rev 49726) +++ trunk/TMP/st/elementary/src/lib/elm_layout.c 2010-06-17 08:14:32 UTC (rev 49727) @@ -279,7 +279,7 @@ if (!strcmp(swallow, si->swallow)) { if (!si->obj) return NULL; - content == si->obj; + content = si->obj; elm_widget_sub_object_del(obj, si->obj); edje_object_part_unswallow(wd->lay, si->obj); si->obj = NULL; |
From: Enlightenment S. <no-...@en...> - 2010-06-17 08:50:51
|
Log: Updates to entry to use selection code. Author: nash Date: 2010-06-17 01:50:43 -0700 (Thu, 17 Jun 2010) New Revision: 49728 Modified: trunk/TMP/st/elementary/src/lib/elm_entry.c trunk/TMP/st/elementary/src/lib/elm_priv.h Modified: trunk/TMP/st/elementary/src/lib/elm_entry.c =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_entry.c 2010-06-17 08:14:32 UTC (rev 49727) +++ trunk/TMP/st/elementary/src/lib/elm_entry.c 2010-06-17 08:50:43 UTC (rev 49728) @@ -460,13 +460,15 @@ } static void -_store_selection(Evas_Object *obj) +_store_selection(enum _elm_sel_type seltype, Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); const char *sel; + if (!wd) return; sel = edje_object_part_text_selection_get(wd->ent, "elm.text"); + elm_selection_set(seltype, obj, ELM_SEL_MARKUP, sel); eina_stringshare_replace(&wd->cut_sel, sel); } @@ -475,11 +477,12 @@ { Widget_Data *wd = elm_widget_data_get(data); + /* Store it */ wd->selmode = EINA_FALSE; edje_object_part_text_select_allow_set(wd->ent, "elm.text", 0); edje_object_signal_emit(wd->ent, "elm,state,select,off", "elm"); elm_widget_scroll_hold_pop(data); - _store_selection(data); + _store_selection(ELM_SEL_CLIPBOARD, data); edje_object_part_text_insert(wd->ent, "elm.text", ""); edje_object_part_text_select_none(wd->ent, "elm.text"); } @@ -493,8 +496,8 @@ edje_object_part_text_select_allow_set(wd->ent, "elm.text", 0); edje_object_signal_emit(wd->ent, "elm,state,select,off", "elm"); elm_widget_scroll_hold_pop(data); - _store_selection(data); - edje_object_part_text_select_none(wd->ent, "elm.text"); + _store_selection(ELM_SEL_CLIPBOARD, data); +// edje_object_part_text_select_none(wd->ent, "elm.text"); } static void @@ -856,6 +859,7 @@ return str; } + static char * _text_to_mkup(const char *text) { @@ -942,23 +946,8 @@ if (!wd) return; wd->have_selection = EINA_TRUE; evas_object_smart_callback_call(data, SIG_SELECTION_CHANGED, NULL); - if (wd->sel_notify_handler) - { - char *txt = _mkup_to_text(elm_entry_selection_get(data)); - - if (txt) - { -#ifdef HAVE_ELEMENTARY_X - Evas_Object *top; - - top = elm_widget_top_get(data); - if ((top) && (elm_win_xwindow_get(top))) - ecore_x_selection_primary_set(elm_win_xwindow_get(top), txt, - strlen(txt)); -#endif - free(txt); - } - } + elm_selection_set(ELM_SEL_PRIMARY, obj, ELM_SEL_MARKUP, + elm_entry_selection_get(data)); } static void @@ -1034,6 +1023,8 @@ Widget_Data *wd = elm_widget_data_get(data); if (!wd) return; evas_object_smart_callback_call(data, SIG_SELECTION_COPY, NULL); + elm_selection_set(ELM_SEL_CLIPBOARD, obj, ELM_SEL_MARKUP, + elm_entry_selection_get(data)); } static void @@ -1043,9 +1034,8 @@ char *txt; if (!wd) return; evas_object_smart_callback_call(data, SIG_SELECTION_CUT, NULL); - txt = _mkup_to_text(elm_entry_selection_get(data)); - eina_stringshare_replace(&wd->cut_sel, txt); - if (txt) free(txt); + elm_selection_set(ELM_SEL_CLIPBOARD, obj, ELM_SEL_MARKUP, + elm_entry_selection_get(data)); edje_object_part_text_insert(wd->ent, "elm.text", ""); wd->changed = EINA_TRUE; _sizing_eval(data); @@ -1194,6 +1184,7 @@ Ecore_X_Event_Selection_Notify *ev = event; if (!wd) return 1; if (!wd->selection_asked) return 1; + if ((ev->selection == ECORE_X_SELECTION_CLIPBOARD) || (ev->selection == ECORE_X_SELECTION_PRIMARY)) { @@ -1223,6 +1214,7 @@ { Widget_Data *wd = elm_widget_data_get(data); Ecore_X_Event_Selection_Clear *ev = event; +/* if (!wd) return 1; if (!wd->have_selection) return 1; if ((ev->selection == ECORE_X_SELECTION_CLIPBOARD) || @@ -1230,7 +1222,7 @@ { elm_entry_select_none(data); } - return 1; + return 1;*/ } #endif Modified: trunk/TMP/st/elementary/src/lib/elm_priv.h =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_priv.h 2010-06-17 08:14:32 UTC (rev 49727) +++ trunk/TMP/st/elementary/src/lib/elm_priv.h 2010-06-17 08:50:43 UTC (rev 49728) @@ -93,6 +93,21 @@ int references; }; + +enum _elm_sel_type { + ELM_SEL_PRIMARY, + ELM_SEL_SECONDARY, + ELM_SEL_CLIPBOARD, + + ELM_SEL_MAX, +}; + +enum _elm_sel_format { + ELM_SEL_MARKUP = 0x01, +}; + + + #define ELM_NEW(t) calloc(1, sizeof(t)) void _elm_win_shutdown(void); @@ -187,6 +202,12 @@ void _elm_config_sub_init(void); void _elm_config_shutdown(void); +Eina_Bool elm_selection_set(enum _elm_sel_type selection, Evas_Object *widget, enum _elm_sel_format format, const char *buf); +Eina_Bool elm_selection_clear(enum _elm_sel_type selection, Evas_Object *widget); + + + + #define ELM_SET_WIDTYPE(widtype, type) if (!widtype) widtype = eina_stringshare_add(type) //#define ELM_CHECK_WIDTYPE(obj, widtype) if (elm_widget_type_get(obj) != widtype) return #define ELM_CHECK_WIDTYPE(obj, widtype) if (!_elm_widget_type_check((obj), (widtype))) return |
From: Enlightenment S. <no-...@en...> - 2010-06-22 01:25:27
|
Log: Clarify 'secondary' string. Author: nash Date: 2010-06-21 18:25:20 -0700 (Mon, 21 Jun 2010) New Revision: 49791 Modified: trunk/TMP/st/elementary/src/lib/elm_cnp_helper.c Modified: trunk/TMP/st/elementary/src/lib/elm_cnp_helper.c =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_cnp_helper.c 2010-06-22 00:06:40 UTC (rev 49790) +++ trunk/TMP/st/elementary/src/lib/elm_cnp_helper.c 2010-06-22 01:25:20 UTC (rev 49791) @@ -108,7 +108,7 @@ .clear = ecore_x_selection_primary_clear }, ARRAYINIT(ELM_SEL_SECONDARY) { - .debug = "Secondary: AKA WTF", + .debug = "Secondary", .ecore_sel = ECORE_X_SELECTION_SECONDARY, .set = ecore_x_selection_secondary_set, .clear = ecore_x_selection_secondary_clear |
From: Enlightenment S. <no-...@en...> - 2010-06-23 01:29:05
|
Log: Fix elm->elm copy Author: nash Date: 2010-06-22 18:28:57 -0700 (Tue, 22 Jun 2010) New Revision: 49810 Modified: trunk/TMP/st/elementary/src/lib/elm_entry.c trunk/TMP/st/elementary/src/lib/elm_priv.h Modified: trunk/TMP/st/elementary/src/lib/elm_entry.c =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_entry.c 2010-06-22 22:47:41 UTC (rev 49809) +++ trunk/TMP/st/elementary/src/lib/elm_entry.c 2010-06-23 01:28:57 UTC (rev 49810) @@ -99,6 +99,7 @@ Ecore_Event_Handler *sel_notify_handler; Ecore_Event_Handler *sel_clear_handler; Ecore_Timer *longpress_timer; + /* Only for clipboard */ const char *cut_sel; const char *text; Evas_Coord lastw; @@ -455,7 +456,7 @@ top = elm_widget_top_get(data); if ((top) && (elm_win_xwindow_get(top))) { - ecore_x_selection_primary_request + ecore_x_selection_clipboard_request (elm_win_xwindow_get(top), ECORE_X_SELECTION_TARGET_UTF8_STRING); wd->selection_asked = EINA_TRUE; @@ -474,7 +475,8 @@ if (!wd) return; sel = edje_object_part_text_selection_get(wd->ent, "elm.text"); elm_selection_set(seltype, obj, ELM_SEL_MARKUP, sel); - eina_stringshare_replace(&wd->cut_sel, sel); + if (seltype == ELM_SEL_CLIPBOARD) + eina_stringshare_replace(&wd->cut_sel, sel); } static void @@ -928,7 +930,7 @@ #ifdef HAVE_ELEMENTARY_X if (wd->sel_notify_handler) { - char *txt = elm_entry_selection_get(data); + const char *txt = elm_entry_selection_get(data); Evas_Object *top; top = elm_widget_top_get(data); @@ -979,7 +981,7 @@ top = elm_widget_top_get(data); if ((top) && (elm_win_xwindow_get(top))) - ecore_x_selection_primary_clear(); + elm_selection_clear(ELM_SEL_PRIMARY, data); #endif } } @@ -1021,7 +1023,6 @@ _signal_entry_cut_notify(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__) { Widget_Data *wd = elm_widget_data_get(data); - char *txt; if (!wd) return; evas_object_smart_callback_call(data, SIG_SELECTION_CUT, NULL); elm_selection_set(ELM_SEL_CLIPBOARD, obj, ELM_SEL_MARKUP, @@ -1174,7 +1175,7 @@ Ecore_X_Event_Selection_Notify *ev = event; if (!wd) return 1; if (!wd->selection_asked) return 1; - + if ((ev->selection == ECORE_X_SELECTION_CLIPBOARD) || (ev->selection == ECORE_X_SELECTION_PRIMARY)) { @@ -1213,6 +1214,7 @@ elm_entry_select_none(data); } return 1;*/ + return 1; } #endif Modified: trunk/TMP/st/elementary/src/lib/elm_priv.h =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_priv.h 2010-06-22 22:47:41 UTC (rev 49809) +++ trunk/TMP/st/elementary/src/lib/elm_priv.h 2010-06-23 01:28:57 UTC (rev 49810) @@ -104,6 +104,7 @@ enum _elm_sel_format { ELM_SEL_MARKUP = 0x01, + ELM_SEL_IMAGE = 0x02, }; |
From: Enlightenment S. <no-...@en...> - 2010-06-23 08:02:41
|
Log: Improve content negotiation on paste Author: nash Date: 2010-06-23 01:02:35 -0700 (Wed, 23 Jun 2010) New Revision: 49812 Modified: trunk/TMP/st/elementary/src/lib/elm_cnp_helper.c Modified: trunk/TMP/st/elementary/src/lib/elm_cnp_helper.c =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_cnp_helper.c 2010-06-23 08:01:43 UTC (rev 49811) +++ trunk/TMP/st/elementary/src/lib/elm_cnp_helper.c 2010-06-23 08:02:35 UTC (rev 49812) @@ -46,15 +46,22 @@ Ecore_X_Selection ecore_sel; + Evas_Object *requestwidget; + enum _elm_sel_format requestformat; + int (*set)(Ecore_X_Window, const void *data, int size); int (*clear)(void); + void (*request)(Ecore_X_Window, const char *target); }; - +/* Optimisation: Turn this into a 256 byte table: + * then can lookup in one index, not N checks */ static const struct escapes { const char *escape; const char value; } escapes[] = { + { "<br>", '\n' }, + { "<\t>", '\t' }, { "gt;", '>' }, { "lt;", '<' }, { "amp;",'&' }, @@ -63,41 +70,55 @@ }; #define N_ESCAPES ((int)(sizeof(escapes)/sizeof(escapes[0]))) -typedef int (*converter_fn)(char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *typesize); static Eina_Bool _elm_cnp_init(void); static int selection_clear(void *udata __UNUSED__, int type, void *event); +static int selection_notify(void *udata __UNUSED__, int type, void *event); static char *remove_tags(const char *p, int *len); +static char *mark_up(const char *start, int *lenp); + +typedef int (*converter_fn)(char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *typesize); + static int targets_converter(char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *typesize); static int text_converter(char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *typesize); static int html_converter(char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *typesize); static int edje_converter(char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *typesize); +typedef int (*response_handler)(struct _elm_cnp_selection *sel, + Ecore_X_Event_Selection_Notify *); +static int response_handler_targets(struct _elm_cnp_selection *sel, + Ecore_X_Event_Selection_Notify *); +static int response_handler_text(struct _elm_cnp_selection *sel, + Ecore_X_Event_Selection_Notify *); + static struct { const char *name; enum _elm_sel_format formats; converter_fn converter; + response_handler response; Ecore_X_Atom atom; } atoms[CNP_N_ATOMS] = { ARRAYINIT(CNP_ATOM_TARGETS) { "TARGETS", - (enum _elm_sel_format)-1, targets_converter, 0 }, + (enum _elm_sel_format)-1, targets_converter, + response_handler_targets, 0 }, ARRAYINIT(CNP_ATOM_XEDJE) { "application/x-edje-string", - ELM_SEL_MARKUP, edje_converter, 0}, + ELM_SEL_MARKUP, edje_converter, NULL, 0}, ARRAYINIT(CNP_ATOM_text_html_utf8) { "text/html;charset=utf-8", - ELM_SEL_MARKUP, html_converter, 0 }, - ARRAYINIT(CNP_ATOM_text_html) { "text/html", - ELM_SEL_MARKUP, html_converter, 0 }, - ARRAYINIT(CNP_ATOM_UTF8STRING) { "UTF8_STRING", - ELM_SEL_MARKUP, text_converter, 0 }, - ARRAYINIT(CNP_ATOM_STRING) { "STRING", - ELM_SEL_MARKUP, text_converter, 0 }, - ARRAYINIT(CNP_ATOM_TEXT) { "TEXT", - ELM_SEL_MARKUP, text_converter, 0 }, + ELM_SEL_MARKUP, html_converter, NULL, 0 }, + ARRAYINIT(CNP_ATOM_text_html) { "text/html", ELM_SEL_MARKUP, + html_converter, NULL, 0 }, + ARRAYINIT(CNP_ATOM_UTF8STRING) { "UTF8_STRING", ELM_SEL_MARKUP, + text_converter, response_handler_text, 0 }, + ARRAYINIT(CNP_ATOM_STRING) { "STRING", ELM_SEL_MARKUP, + text_converter, response_handler_text, 0 }, + ARRAYINIT(CNP_ATOM_TEXT) { "TEXT", ELM_SEL_MARKUP, + text_converter, response_handler_text, 0 }, ARRAYINIT(CNP_ATOM_text_plain_utf8) { "text/plain;charset=ut-8", - ELM_SEL_MARKUP, text_converter, 0 }, - ARRAYINIT(CNP_ATOM_text_plain) { "text/plain", - ELM_SEL_MARKUP, text_converter, 0 }, + ELM_SEL_MARKUP, text_converter, + response_handler_text, 0 }, + ARRAYINIT(CNP_ATOM_text_plain) { "text/plain", ELM_SEL_MARKUP, + text_converter, response_handler_text, 0 }, }; static struct _elm_cnp_selection selections[ELM_SEL_MAX] = { @@ -105,19 +126,22 @@ .debug = "Primary", .ecore_sel = ECORE_X_SELECTION_PRIMARY, .set = ecore_x_selection_primary_set, - .clear = ecore_x_selection_primary_clear + .clear = ecore_x_selection_primary_clear, + .request = ecore_x_selection_primary_request, }, ARRAYINIT(ELM_SEL_SECONDARY) { .debug = "Secondary", .ecore_sel = ECORE_X_SELECTION_SECONDARY, .set = ecore_x_selection_secondary_set, - .clear = ecore_x_selection_secondary_clear + .clear = ecore_x_selection_secondary_clear, + .request = ecore_x_selection_secondary_request, }, ARRAYINIT(ELM_SEL_CLIPBOARD) { .debug = "Clipboard", .ecore_sel = ECORE_X_SELECTION_CLIPBOARD, .set = ecore_x_selection_clipboard_set, - .clear = ecore_x_selection_clipboard_clear + .clear = ecore_x_selection_clipboard_clear, + .request = ecore_x_selection_clipboard_request, } }; @@ -163,6 +187,26 @@ return true; } +Eina_Bool +elm_selection_get(enum _elm_sel_type selection, enum _elm_sel_format format, + Evas_Object *widget){ + Evas_Object *top; + struct _elm_cnp_selection *sel; + + if ((unsigned int)selection >= (unsigned int)ELM_SEL_MAX) return false; + if (!_elm_cnp_init_count) _elm_cnp_init(); + + sel = selections + selection; + top = elm_widget_top_get(widget); + if (!top) return false; + + sel->request(elm_win_xwindow_get(top), "TARGETS"); + sel->requestformat = format; + sel->requestwidget = widget; + + return EINA_TRUE; +} + static Eina_Bool _elm_cnp_init(void){ int i; @@ -176,7 +220,8 @@ atoms[i].converter); } - ecore_event_handler_add(ECORE_X_EVENT_SELECTION_CLEAR, selection_clear, NULL); + ecore_event_handler_add(ECORE_X_EVENT_SELECTION_CLEAR, selection_clear,NULL); + ecore_event_handler_add(ECORE_X_EVENT_SELECTION_NOTIFY,selection_notify,NULL); return true; } @@ -202,7 +247,47 @@ return true; } +/** + * Response to a selection notify + */ static int +selection_notify(void *udata __UNUSED__, int type, void *event){ + Ecore_X_Event_Selection_Notify *ev = event; + struct _elm_cnp_selection *sel; + int i; + + switch (ev->selection){ + case ECORE_X_SELECTION_CLIPBOARD: + sel = selections + ELM_SEL_CLIPBOARD; + break; + + case ECORE_X_SELECTION_PRIMARY: + sel = selections + ELM_SEL_PRIMARY; + break; + case ECORE_X_SELECTION_SECONDARY: + sel = selections + ELM_SEL_SECONDARY; + break; + default: + return 1; + } + + for (i = 0 ; i < CNP_N_ATOMS ; i ++) + { + if (strcmp(ev->target, atoms[i].name) == 0) + { + if (atoms[i].response){ + atoms[i].response(sel, ev); + } else { + printf("Ignored: No handler!\n"); + } + } + } + + return 1; +} + + +static int targets_converter(char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *typesize){ @@ -233,6 +318,61 @@ static int +response_handler_targets(struct _elm_cnp_selection *sel, + Ecore_X_Event_Selection_Notify *notify){ + Ecore_X_Selection_Data_Targets *targets; + Ecore_X_Atom *atomlist; + Evas_Object *top; + int i,j; + int prio, selected; + + targets = notify->data; + atomlist = (Ecore_X_Atom *)(targets->data.data); + + prio = -1; + selected = -1; + /* Start from 1: Skip targets */ + for (j = 1 ; j < CNP_N_ATOMS ; j ++) + { + if (!(atoms[j].formats & sel->requestformat)) continue; + for (i = 0 ; i < targets->data.length ; i ++) + { + if (atoms[j].atom == atomlist[i] && atoms[j].response){ + /* Found a match: Use it */ + goto found; + } + } + } + found: + if (j == CNP_N_ATOMS) + { + printf("No matching type found\n"); + return 0; + } + + top = elm_widget_top_get(sel->requestwidget); + if (!top) return 0; + + sel->request(elm_win_xwindow_get(top), atoms[j].name); + return 0; +} + +static int +response_handler_text(struct _elm_cnp_selection *sel, + Ecore_X_Event_Selection_Notify *notify){ + Ecore_X_Selection_Data_Text *text; + char *str; + + text = notify->data; + str = mark_up(text->text, NULL); + elm_entry_entry_insert(sel->requestwidget, str); + free(str); + + return 0; +} + + +static int text_converter(char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *typesize){ @@ -273,7 +413,6 @@ -/* FIXME: Doesn't handle '<foo str='>'>' */ static char * remove_tags(const char *p, int *len){ char *q,*ret; @@ -312,4 +451,50 @@ return ret; } +/* Mark up */ +static char * +mark_up(const char *start, int *lenp){ + int l,i; + const char *p; + char *q,*ret; + + /* First pass: Count characters */ + for (l = 0, p = start ; *p ; p ++) + { + for (i = 0 ; i < N_ESCAPES ; i ++) + { + if (*p == escapes[i].value) + { + l += strlen(escapes[i].escape); + break; + } + } + if (i == N_ESCAPES) + l ++; + } + + q = ret = malloc(l + 1); + + /* Second pass: Count characters */ + for (p = start ; *p ; ) + { + for (i = 0 ; i < N_ESCAPES ; i ++) + { + if (*p == escapes[i].value) + { + strcpy(q, escapes[i].escape); + q += strlen(escapes[i].escape); + p ++; + break; + } + } + if (i == N_ESCAPES) + *q ++ = *p ++; + } + *q = 0; + + if (lenp) *lenp = l; + return ret; +} + /* vim: set ts=8 sw=3 sts=8 noexpandtab cino=>5n-3f0^-2{2 : */ |
From: Enlightenment S. <no-...@en...> - 2010-06-23 08:08:24
|
Log: Elm entry now uses new & improved cut and paste. Author: nash Date: 2010-06-23 01:08:17 -0700 (Wed, 23 Jun 2010) New Revision: 49813 Modified: trunk/TMP/st/elementary/src/lib/elm_entry.c trunk/TMP/st/elementary/src/lib/elm_priv.h Modified: trunk/TMP/st/elementary/src/lib/elm_entry.c =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_entry.c 2010-06-23 08:02:35 UTC (rev 49812) +++ trunk/TMP/st/elementary/src/lib/elm_entry.c 2010-06-23 08:08:17 UTC (rev 49813) @@ -451,16 +451,7 @@ if (wd->sel_notify_handler) { #ifdef HAVE_ELEMENTARY_X - Evas_Object *top; - - top = elm_widget_top_get(data); - if ((top) && (elm_win_xwindow_get(top))) - { - ecore_x_selection_clipboard_request - (elm_win_xwindow_get(top), - ECORE_X_SELECTION_TARGET_UTF8_STRING); - wd->selection_asked = EINA_TRUE; - } + elm_selection_get(ELM_SEL_CLIPBOARD, ELM_SEL_MARKUP, data); #endif } } @@ -471,7 +462,6 @@ Widget_Data *wd = elm_widget_data_get(obj); const char *sel; - if (!wd) return; sel = edje_object_part_text_selection_get(wd->ent, "elm.text"); elm_selection_set(seltype, obj, ELM_SEL_MARKUP, sel); Modified: trunk/TMP/st/elementary/src/lib/elm_priv.h =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_priv.h 2010-06-23 08:02:35 UTC (rev 49812) +++ trunk/TMP/st/elementary/src/lib/elm_priv.h 2010-06-23 08:08:17 UTC (rev 49813) @@ -205,6 +205,7 @@ Eina_Bool elm_selection_set(enum _elm_sel_type selection, Evas_Object *widget, enum _elm_sel_format format, const char *buf); Eina_Bool elm_selection_clear(enum _elm_sel_type selection, Evas_Object *widget); +Eina_Bool elm_selection_get(enum _elm_sel_type selection, enum _elm_sel_format format, Evas_Object *widget); |
From: Enlightenment S. <no-...@en...> - 2010-06-23 08:52:06
|
Log: Add elm_object_top_widget_get(): Useful for hoversels. Also useful for arguments about widget_top or top_widget. After all it's not a widget of type top, but rather the widget at the top. Your views? Opinions on a postcard plase. Author: nash Date: 2010-06-23 01:51:58 -0700 (Wed, 23 Jun 2010) New Revision: 49814 Modified: trunk/TMP/st/elementary/src/lib/Elementary.h.in trunk/TMP/st/elementary/src/lib/elm_main.c Modified: trunk/TMP/st/elementary/src/lib/Elementary.h.in =================================================================== --- trunk/TMP/st/elementary/src/lib/Elementary.h.in 2010-06-23 08:08:17 UTC (rev 49813) +++ trunk/TMP/st/elementary/src/lib/Elementary.h.in 2010-06-23 08:51:58 UTC (rev 49814) @@ -265,6 +265,7 @@ EAPI Eina_Bool elm_object_widget_check(const Evas_Object *obj); EAPI Evas_Object *elm_object_parent_widget_get(const Evas_Object *obj); + EAPI Evas_Object *elm_object_top_widget_get(const Evas_Object *obj); EAPI const char *elm_object_widget_type_get(const Evas_Object *obj); EAPI double elm_scale_get(void); Modified: trunk/TMP/st/elementary/src/lib/elm_main.c =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_main.c 2010-06-23 08:08:17 UTC (rev 49813) +++ trunk/TMP/st/elementary/src/lib/elm_main.c 2010-06-23 08:51:58 UTC (rev 49814) @@ -1362,6 +1362,19 @@ } /** + * Get the top level parent of an Elementary widget. + * + * @param obj The object to query. + * @return The top level Elementary widget, or @c NULL if parent cannot be + * found. + */ +EAPI Evas_Object * +elm_object_top_widget_get(const Evas_Object *obj) +{ + return elm_widget_top_get(obj); +} + +/** * Get the string that represents this Elementary widget. * * @note Elementary is weird and exposes itself as a single |
From: Enlightenment S. <no-...@en...> - 2010-06-24 03:01:54
|
Log: return NULL, not NULL. Author: nash Date: 2010-06-23 20:01:47 -0700 (Wed, 23 Jun 2010) New Revision: 49826 Modified: trunk/TMP/st/elementary/src/lib/elm_frame.c Modified: trunk/TMP/st/elementary/src/lib/elm_frame.c =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_frame.c 2010-06-24 02:54:03 UTC (rev 49825) +++ trunk/TMP/st/elementary/src/lib/elm_frame.c 2010-06-24 03:01:47 UTC (rev 49826) @@ -199,7 +199,7 @@ Widget_Data *wd = elm_widget_data_get(obj); Evas_Object *content; if (!wd) return NULL; - if (!wd->content) NULL; + if (!wd->content) return NULL; content = wd->content; elm_widget_sub_object_del(obj, wd->content); edje_object_part_unswallow(wd->frm, wd->content); |
From: Enlightenment S. <no-...@en...> - 2010-06-24 03:02:25
|
Log: Fix return of hover check. Author: nash Date: 2010-06-23 20:02:18 -0700 (Wed, 23 Jun 2010) New Revision: 49827 Modified: trunk/TMP/st/elementary/src/lib/elm_hover.c Modified: trunk/TMP/st/elementary/src/lib/elm_hover.c =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_hover.c 2010-06-24 03:01:47 UTC (rev 49826) +++ trunk/TMP/st/elementary/src/lib/elm_hover.c 2010-06-24 03:02:18 UTC (rev 49827) @@ -490,7 +490,7 @@ EAPI Evas_Object * elm_hover_content_unset(Evas_Object *obj, const char *swallow) { - ELM_CHECK_WIDTYPE(obj, widtype); + ELM_CHECK_WIDTYPE(obj, widtype) NULL; Widget_Data *wd = elm_widget_data_get(obj); Subinfo *si; const Eina_List *l; |
From: Enlightenment S. <no-...@en...> - 2010-06-30 13:21:06
|
Log: Improvements to cut and paste. Author: nash Date: 2010-06-30 06:20:58 -0700 (Wed, 30 Jun 2010) New Revision: 49947 Modified: trunk/TMP/st/elementary/src/lib/elm_cnp_helper.c trunk/TMP/st/elementary/src/lib/elm_icon.c Modified: trunk/TMP/st/elementary/src/lib/elm_cnp_helper.c =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_cnp_helper.c 2010-06-30 09:49:15 UTC (rev 49946) +++ trunk/TMP/st/elementary/src/lib/elm_cnp_helper.c 2010-06-30 13:20:58 UTC (rev 49947) @@ -14,20 +14,36 @@ # define ARRAYINIT(foo) [foo]= +#define DEBUGON 1 +#if DEBUGON +#define cnp_debug(x...) printf(__FILE__": " x) +#else +#define cnp_debug(x...) +#endif + + enum { - CNP_ATOM_TARGETS = 0, - CNP_ATOM_XEDJE, - CNP_ATOM_text_html_utf8, - CNP_ATOM_text_html, - CNP_ATOM_UTF8STRING, - CNP_ATOM_STRING, - CNP_ATOM_TEXT, - CNP_ATOM_text_plain_utf8, - CNP_ATOM_text_plain, + CNP_ATOM_TARGETS = 0, + CNP_ATOM_text_uri, + CNP_ATOM_image_png, + CNP_ATOM_XELM, + CNP_ATOM_text_html_utf8, + CNP_ATOM_text_html, + CNP_ATOM_UTF8STRING, + CNP_ATOM_STRING, + CNP_ATOM_TEXT, + CNP_ATOM_text_plain_utf8, + CNP_ATOM_text_plain, - CNP_N_ATOMS, + CNP_N_ATOMS, }; +struct pasteimage { + Evas_Object *entry; + const char *tag; + const char *file; + Evas_Object *img; +}; struct _elm_cnp_selection { @@ -68,52 +84,139 @@ static Eina_Bool _elm_cnp_init(void); static Eina_Bool selection_clear(void *udata __UNUSED__, int type, void *event); +//static Eina_Bool selection_request(void *udata __UNUSED__, int type, void *event); static Eina_Bool selection_notify(void *udata __UNUSED__, int type, void *event); static char *remove_tags(const char *p, int *len); static char *mark_up(const char *start, int *lenp); +static Evas_Object *image_provider(void *images, Evas_Object *entry, const char *item); + typedef int (*converter_fn)(char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *typesize); static int targets_converter(char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *typesize); static int text_converter(char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *typesize); static int html_converter(char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *typesize); static int edje_converter(char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *typesize); +static int uri_converter(char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *typesize); +static int png_converter(char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *typesize); +/* FIXME: Which way should this be: Notify or response */ typedef int (*response_handler)(struct _elm_cnp_selection *sel, Ecore_X_Event_Selection_Notify *); static int response_handler_targets(struct _elm_cnp_selection *sel, Ecore_X_Event_Selection_Notify *); -static int response_handler_text(struct _elm_cnp_selection *sel, + +typedef int (*notify_handler)(struct _elm_cnp_selection *sel, Ecore_X_Event_Selection_Notify *); +static int notify_handler_targets(struct _elm_cnp_selection *sel, + Ecore_X_Event_Selection_Notify *notify); +static int notify_handler_text(struct _elm_cnp_selection *sel, + Ecore_X_Event_Selection_Notify *notify); +static int notify_handler_png(struct _elm_cnp_selection *sel, + Ecore_X_Event_Selection_Notify *notify); +static int notify_handler_uri(struct _elm_cnp_selection *sel, + Ecore_X_Event_Selection_Notify *notify); + static struct { const char *name; enum _elm_sel_format formats; + /* Called by ecore to do conversion */ converter_fn converter; response_handler response; + notify_handler notify; + /* Atom */ Ecore_X_Atom atom; } atoms[CNP_N_ATOMS] = { - ARRAYINIT(CNP_ATOM_TARGETS) { "TARGETS", - (enum _elm_sel_format)-1, targets_converter, - response_handler_targets, 0 }, - ARRAYINIT(CNP_ATOM_XEDJE) { "application/x-edje-string", - ELM_SEL_MARKUP, edje_converter, NULL, 0}, - ARRAYINIT(CNP_ATOM_text_html_utf8) { "text/html;charset=utf-8", - ELM_SEL_MARKUP, html_converter, NULL, 0 }, - ARRAYINIT(CNP_ATOM_text_html) { "text/html", ELM_SEL_MARKUP, - html_converter, NULL, 0 }, - ARRAYINIT(CNP_ATOM_UTF8STRING) { "UTF8_STRING", ELM_SEL_MARKUP, - text_converter, response_handler_text, 0 }, - ARRAYINIT(CNP_ATOM_STRING) { "STRING", ELM_SEL_MARKUP, - text_converter, response_handler_text, 0 }, - ARRAYINIT(CNP_ATOM_TEXT) { "TEXT", ELM_SEL_MARKUP, - text_converter, response_handler_text, 0 }, - ARRAYINIT(CNP_ATOM_text_plain_utf8) { "text/plain;charset=ut-8", - ELM_SEL_MARKUP, text_converter, - response_handler_text, 0 }, - ARRAYINIT(CNP_ATOM_text_plain) { "text/plain", ELM_SEL_MARKUP, - text_converter, response_handler_text, 0 }, + [CNP_ATOM_TARGETS] = { + "TARGETS", + (enum _elm_sel_format)-1, + targets_converter, + response_handler_targets, + notify_handler_targets, + 0 + }, + [CNP_ATOM_XELM] = { + "application/x-elementary-markup", + ELM_SEL_MARKUP, + edje_converter, + NULL, + NULL, + 0 + }, + [CNP_ATOM_text_uri] = { + "text/uri", + ELM_SEL_MARKUP | ELM_SEL_IMAGE, /* Either images or entries */ + uri_converter, + NULL, + notify_handler_uri, + 0 + }, + [CNP_ATOM_image_png] = { + "image/png", + ELM_SEL_IMAGE | ELM_SEL_IMAGE, + png_converter, + NULL, + notify_handler_png, + 0 + }, + [CNP_ATOM_text_html_utf8] = { + "text/html;charset=utf-8", + ELM_SEL_MARKUP, + html_converter, + NULL, + NULL, + 0 + }, + [CNP_ATOM_text_html] = { + "text/html", + ELM_SEL_MARKUP, + html_converter, + NULL, + NULL, + 0 + }, + [CNP_ATOM_UTF8STRING] = { + "UTF8_STRING", + ELM_SEL_MARKUP, + text_converter, + NULL, + notify_handler_text, + 0 + }, + [CNP_ATOM_STRING] = { + "STRING", + ELM_SEL_MARKUP | ELM_SEL_IMAGE, + text_converter, + NULL, + notify_handler_text, + 0 + }, + [CNP_ATOM_TEXT] = { + "TEXT", + ELM_SEL_MARKUP | ELM_SEL_IMAGE, + text_converter, + NULL, + NULL, + 0 + }, + [CNP_ATOM_text_plain_utf8] = { + "text/plain;charset=ut-8", + ELM_SEL_MARKUP, + text_converter, + NULL, + NULL, + 0 + }, + [CNP_ATOM_text_plain] = { + "text/plain", + ELM_SEL_MARKUP, + text_converter, + NULL, + NULL, + 0 + }, }; static struct _elm_cnp_selection selections[ELM_SEL_MAX] = { @@ -141,7 +244,10 @@ }; static int _elm_cnp_init_count = 0; + /* Gah... who left this out of XAtoms.h */ +static Ecore_X_Atom clipboard_atom; +Eina_List *pastedimages; #endif @@ -154,16 +260,18 @@ if ((unsigned int)selection >= (unsigned int)ELM_SEL_MAX) return EINA_FALSE; if (!_elm_cnp_init_count) _elm_cnp_init(); - if (!selbuf) return elm_selection_clear(selection, widget); + if (!selbuf && format != ELM_SEL_IMAGE) + return elm_selection_clear(selection, widget); sel = selections + selection; sel->active = 1; sel->widget = widget; - sel->set(elm_win_xwindow_get(elm_widget_top_get(widget)), - &selection, sizeof(int)); + + sel->set(elm_win_xwindow_get(widget),&selection,sizeof(enum _elm_sel_type)); sel->format = format; - sel->selbuf = strdup(selbuf); + sel->selbuf = selbuf ? strdup(selbuf) : NULL; + return EINA_TRUE; #else return EINA_FALSE; @@ -233,10 +341,10 @@ ecore_x_selection_converter_atom_add(atoms[i].atom, atoms[i].converter); } + clipboard_atom = ecore_x_atom_get("CLIPBOARD"); ecore_event_handler_add(ECORE_X_EVENT_SELECTION_CLEAR, selection_clear,NULL); ecore_event_handler_add(ECORE_X_EVENT_SELECTION_NOTIFY,selection_notify,NULL); - return EINA_TRUE; } @@ -261,15 +369,59 @@ return ECORE_CALLBACK_PASS_ON; } +#if 0 /** - * Response to a selection notify + * Response to a selection request */ static Eina_Bool +selection_request(void *udata __UNUSED__, int type, void *event){ + Ecore_X_Event_Selection_Request *ev = event; + struct _elm_cnp_selection *sel; + int i; +printf("selection request callback: %d\n",ev->selection); +printf("selection request callback: %d\n",ev->target); + + if (ev->selection == clipboard_atom){ + sel = selections + ELM_SEL_CLIPBOARD; + } else if (ev->selection == XA_PRIMARY){ + sel = selections + ELM_SEL_PRIMARY; + } else if (ev->selection == XA_SECONDARY){ + sel = selections + ELM_SEL_SECONDARY; + } else { + return ECORE_CALLBACK_PASS_ON; + } + return ECORE_CALLBACK_PASS_ON; + + for (i = 0 ; i < CNP_N_ATOMS ; i ++) + { + if (ev->target == atoms[i].atom) + { + if (atoms[i].response){ + atoms[i].response(sel, ev); + } else { + printf("Ignored: No handler!\n"); + } + } + } + + return ECORE_CALLBACK_PASS_ON; +} +#endif + + +/* + * Response to a selection notify: + * - So we have asked for the selection list. + * - If it's the targets list, parse it, and fire of what we want, + * else it's the data we want. + */ +static Eina_Bool selection_notify(void *udata __UNUSED__, int type, void *event){ Ecore_X_Event_Selection_Notify *ev = event; struct _elm_cnp_selection *sel; int i; + cnp_debug("selection notify callback: %d\n",ev->selection); switch (ev->selection){ case ECORE_X_SELECTION_CLIPBOARD: sel = selections + ELM_SEL_CLIPBOARD; @@ -284,13 +436,15 @@ default: return ECORE_CALLBACK_PASS_ON; } + cnp_debug("Target is %s\n",ev->target); for (i = 0 ; i < CNP_N_ATOMS ; i ++) { if (strcmp(ev->target, atoms[i].name) == 0) { - if (atoms[i].response){ - atoms[i].response(sel, ev); + if (atoms[i].notify){ + cnp_debug("Found something: %s\n", atoms[i].name); + atoms[i].notify(sel, ev); } else { printf("Ignored: No handler!\n"); } @@ -301,6 +455,7 @@ } + static int targets_converter(char *target, void *data, int size, void **data_ret, int *size_ret, @@ -319,7 +474,7 @@ aret = malloc(sizeof(Ecore_X_Atom) * count); for (i = 0, count = 0 ; i < CNP_N_ATOMS ; i ++) - if (sel->format && atoms[i].formats) + if (sel->format & atoms[i].formats) aret[count ++] = atoms[i].atom; if (data_ret) *data_ret = aret; @@ -330,8 +485,53 @@ return 1; } +static int +png_converter(char *target, void *data, int size, + void **data_ret, int *size_ret, + Ecore_X_Atom *ttype, int *typesize){ + return 1; +} + +/* + * Callback to handle a targets response on a selection request: + * So pick the format we'd like; and then request it. + */ static int +notify_handler_targets(struct _elm_cnp_selection *sel, + Ecore_X_Event_Selection_Notify *notify){ + Ecore_X_Selection_Data_Targets *targets; + Ecore_X_Atom *atomlist; + int i,j; + + targets = notify->data; + atomlist = (Ecore_X_Atom *)(targets->data.data); + + for (j = 1; j < CNP_N_ATOMS ; j ++) + { + cnp_debug("\t%s %d\n",atoms[j].name, atoms[j].atom); + if (!(atoms[j].formats & sel->requestformat)) continue; + for (i = 0 ; i < targets->data.length ; i ++) + { + if (atoms[j].atom == atomlist[i]) + { + cnp_debug("Atom %s matches\n",atoms[j].name); + goto done; + } + } + } + + cnp_debug("Couldn't find anything that matches\n"); + return ECORE_CALLBACK_PASS_ON; + + done: + cnp_debug("Sending request for %s\n",atoms[j].name); + sel->request(elm_win_xwindow_get(sel->requestwidget), atoms[j].name); + + return ECORE_CALLBACK_PASS_ON; +} + +static int response_handler_targets(struct _elm_cnp_selection *sel, Ecore_X_Event_Selection_Notify *notify){ Ecore_X_Selection_Data_Targets *targets; @@ -360,7 +560,7 @@ found: if (j == CNP_N_ATOMS) { - printf("No matching type found\n"); + cnp_debug("No matching type found\n"); return 0; } @@ -371,14 +571,15 @@ return 0; } + static int -response_handler_text(struct _elm_cnp_selection *sel, +notify_handler_text(struct _elm_cnp_selection *sel, Ecore_X_Event_Selection_Notify *notify){ - Ecore_X_Selection_Data_Text *text; + Ecore_X_Selection_Data *data; char *str; - text = notify->data; - str = mark_up(text->text, NULL); + data = notify->data; + str = mark_up((char*)data->data, NULL); elm_entry_entry_insert(sel->requestwidget, str); free(str); @@ -386,7 +587,52 @@ } +/** + * So someone is pasting an image into my entry or widget... + */ static int +notify_handler_uri(struct _elm_cnp_selection *sel, + Ecore_X_Event_Selection_Notify *notify) +{ + Ecore_X_Selection_Data *data; + struct pasteimage *pi; + char entrytag[100]; + char *p; + + data = notify->data; + p = (char *)data->data; + cnp_debug("Got %s\n",p); + if (strncmp(p,"file://",7) != 0){ + cnp_debug("Doesn't start with ;file; %s\n",p); + return 0; + } + + p += strlen("file://"); + + pi = calloc(1,sizeof(struct pasteimage)); + snprintf(entrytag, sizeof(entrytag), "pasteimage-%p",pi); + pi->tag = strdup(entrytag); + pi->file = strndup(p,data->length - strlen("file://")); + + elm_entry_item_provider_append(sel->requestwidget, image_provider, pi); + pastedimages = eina_list_append(pastedimages, pi); + + snprintf(entrytag, sizeof(entrytag), "<item absize=240x180 href=%s>",pi->tag); + elm_entry_entry_insert(sel->requestwidget, entrytag); + + return 0; +} + +static int +notify_handler_png(struct _elm_cnp_selection *sel, + Ecore_X_Event_Selection_Notify *notify) +{ + cnp_debug("got a png!\n"); + return 0; +} + + +static int text_converter(char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *typesize){ @@ -397,7 +643,17 @@ { return 1; } - *data_ret = remove_tags(sel->selbuf, size_ret); + + if (sel->format == ELM_SEL_MARKUP){ + *data_ret = remove_tags(sel->selbuf, size_ret); + } else if (sel->format == ELM_SEL_IMAGE){ + cnp_debug("Image %s\n",evas_object_type_get(sel->widget)); + cnp_debug("Elm type: %s\n",elm_object_widget_type_get(sel->widget)); + evas_object_image_file_get(elm_photocam_internal_image_get(sel->widget), (const char **)data_ret, NULL); + if (!*data_ret) *data_ret = strdup("No file"); + else *data_ret = strdup(*data_ret); + *size_ret = strlen(*data_ret); + } return 1; } @@ -425,15 +681,70 @@ return 1; } +static int +uri_converter(char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *typesize){ + struct _elm_cnp_selection *sel; + sel = selections + *(int *)data; + cnp_debug("Uri converter\n"); + if (data_ret) *data_ret = strdup(sel->selbuf); + if (size_ret) *size_ret = strlen(sel->selbuf); + return 1; +} + +/* + * Image paste provide + */ + +/* FIXME: Should add provider for each pated item: Use data to store it + * much easier */ +static Evas_Object * +image_provider(void *images, Evas_Object *entry, const char *item) +{ + struct pasteimage *pi; + Eina_List *l; + + cnp_debug("image provider for %s called\n",item); + EINA_LIST_FOREACH(pastedimages, l, pi) + { + cnp_debug("is it %s?\n",pi->tag); + if (strcmp(pi->tag,item) == 0){ + /* Found it */ + Evas_Object *o; + o = evas_object_image_filled_add(evas_object_evas_get(entry)); + /* FIXME: Handle eets */ + cnp_debug("file is %s (object is %p)\n",pi->file,o); + evas_object_image_file_set(o, pi->file, NULL); + evas_object_show(o); + return o; + } + } + return NULL; +} + +static void +entry_deleted(void *images, Evas *e, Evas_Object *entry, void *unused) +{ + struct pasteimage *pi; + Eina_List *l,*next; + + EINA_LIST_FOREACH_SAFE(pastedimages, l, next, pi) + { + if (pi->entry == entry){ + pastedimages = eina_list_remove_list(pastedimages, l); + } + } +} + + static char * remove_tags(const char *p, int *len){ char *q,*ret; int i; if (!p) return NULL; - q = malloc(strlen(p)); + q = malloc(strlen(p) + 1); if (!q) return NULL; ret = q; @@ -450,10 +761,11 @@ } else if (*p == '&') { p ++; for (i = 0 ; i < N_ESCAPES ; i ++){ - if (strncmp(p,escapes[i].escape, strlen(escapes[i].escape))){ + if (!strncmp(p,escapes[i].escape, strlen(escapes[i].escape))){ p += strlen(escapes[i].escape); *q = escapes[i].value; q ++; + break; } } if (i == N_ESCAPES) @@ -489,7 +801,7 @@ q = ret = malloc(l + 1); - /* Second pass: Count characters */ + /* Second pass: Change characters */ for (p = start ; *p ; ) { for (i = 0 ; i < N_ESCAPES ; i ++) Modified: trunk/TMP/st/elementary/src/lib/elm_icon.c =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_icon.c 2010-06-30 09:49:15 UTC (rev 49946) +++ trunk/TMP/st/elementary/src/lib/elm_icon.c 2010-06-30 13:20:58 UTC (rev 49947) @@ -288,3 +288,5 @@ if (!wd) return; _els_smart_icon_scale_size_set(wd->img, size); } + + |
From: Enlightenment S. <no-...@en...> - 2010-07-01 01:18:39
|
Log: TUrn off debug. Author: nash Date: 2010-06-30 18:18:32 -0700 (Wed, 30 Jun 2010) New Revision: 49956 Modified: trunk/TMP/st/elementary/src/lib/elm_cnp_helper.c Modified: trunk/TMP/st/elementary/src/lib/elm_cnp_helper.c =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_cnp_helper.c 2010-06-30 23:03:30 UTC (rev 49955) +++ trunk/TMP/st/elementary/src/lib/elm_cnp_helper.c 2010-07-01 01:18:32 UTC (rev 49956) @@ -14,7 +14,7 @@ # define ARRAYINIT(foo) [foo]= -#define DEBUGON 1 +#define DEBUGON 0 #if DEBUGON #define cnp_debug(x...) printf(__FILE__": " x) |
From: Enlightenment S. <no-...@en...> - 2010-08-04 01:46:49
|
Log: Doesn't anyone check their compiler output? Don't return random stack cruft on NULL pointer. Author: nash Date: 2010-08-03 18:46:41 -0700 (Tue, 03 Aug 2010) New Revision: 50796 Modified: trunk/TMP/st/elementary/src/lib/els_icon.c Modified: trunk/TMP/st/elementary/src/lib/els_icon.c =================================================================== --- trunk/TMP/st/elementary/src/lib/els_icon.c 2010-08-04 01:25:57 UTC (rev 50795) +++ trunk/TMP/st/elementary/src/lib/els_icon.c 2010-08-04 01:46:41 UTC (rev 50796) @@ -98,7 +98,7 @@ { Smart_Data *sd; sd = evas_object_smart_data_get(obj); - if (!sd) return; + if (!sd) return NULL; return sd->obj; } |
From: Enlightenment S. <no-...@en...> - 2010-08-04 02:03:51
|
Log: eina_list: Return false on error. Maybe Eina_Bool needs a 'file not found' error or something. Author: nash Date: 2010-08-03 19:03:45 -0700 (Tue, 03 Aug 2010) New Revision: 50799 Modified: trunk/TMP/st/elementary/src/lib/elm_list.c Modified: trunk/TMP/st/elementary/src/lib/elm_list.c =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_list.c 2010-08-04 02:01:38 UTC (rev 50798) +++ trunk/TMP/st/elementary/src/lib/elm_list.c 2010-08-04 02:03:45 UTC (rev 50799) @@ -1164,7 +1164,7 @@ EAPI Eina_Bool elm_list_item_separator_get(const Elm_List_Item *it) { - ELM_LIST_ITEM_CHECK_DELETED_RETURN(it); + ELM_LIST_ITEM_CHECK_DELETED_RETURN(it, EINA_FALSE); return it->is_separator; } |
From: Enlightenment S. <no-...@en...> - 2010-08-04 02:03:59
|
Log: elm_notify: Return an invalid enumeration on error. Author: nash Date: 2010-08-03 19:03:53 -0700 (Tue, 03 Aug 2010) New Revision: 50800 Modified: trunk/TMP/st/elementary/src/lib/elm_notify.c Modified: trunk/TMP/st/elementary/src/lib/elm_notify.c =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_notify.c 2010-08-04 02:03:45 UTC (rev 50799) +++ trunk/TMP/st/elementary/src/lib/elm_notify.c 2010-08-04 02:03:53 UTC (rev 50800) @@ -488,7 +488,7 @@ { ELM_CHECK_WIDTYPE(obj, widtype); Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; + if (!wd) return (Elm_Notify_Orient)-1; return wd->orient; } |
From: Enlightenment S. <no-...@en...> - 2010-08-04 02:04:03
|
Log: More error returns. Please people, when you add a function look at what it compiles too. Author: nash Date: 2010-08-03 19:03:57 -0700 (Tue, 03 Aug 2010) New Revision: 50801 Modified: trunk/TMP/st/elementary/src/lib/elm_notify.c Modified: trunk/TMP/st/elementary/src/lib/elm_notify.c =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_notify.c 2010-08-04 02:03:53 UTC (rev 50800) +++ trunk/TMP/st/elementary/src/lib/elm_notify.c 2010-08-04 02:03:57 UTC (rev 50801) @@ -518,7 +518,7 @@ { ELM_CHECK_WIDTYPE(obj, widtype); Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; + if (!wd) return -1; return wd->timeout; } @@ -576,7 +576,7 @@ { ELM_CHECK_WIDTYPE(obj, widtype); Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; + if (!wd) return EINA_FALSE; return wd->repeat_events; } |
From: Enlightenment S. <no-...@en...> - 2010-09-07 09:36:58
|
Log: Handle providers a little better. Author: nash Date: 2010-09-07 02:36:51 -0700 (Tue, 07 Sep 2010) New Revision: 51938 Modified: trunk/TMP/st/elementary/src/lib/elm_cnp_helper.c Modified: trunk/TMP/st/elementary/src/lib/elm_cnp_helper.c =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_cnp_helper.c 2010-09-07 09:08:34 UTC (rev 51937) +++ trunk/TMP/st/elementary/src/lib/elm_cnp_helper.c 2010-09-07 09:36:51 UTC (rev 51938) @@ -24,6 +24,8 @@ #endif +#define PROVIDER_SET "__elm_cnp_provider_set" + enum { CNP_ATOM_TARGETS = 0, CNP_ATOM_text_uri, @@ -275,6 +277,7 @@ static Ecore_X_Atom clipboard_atom; Eina_List *pastedimages; +Eina_List *providedobjs; #endif /* Stringshared, so I can just compare pointers later */ @@ -888,16 +891,29 @@ } static bool +pasteimage_provider_set(Evas_Object *entry) +{ + void *v; + v = evas_object_data_get(entry, PROVIDER_SET); + if (!v) + { + evas_object_data_set(entry, PROVIDER_SET, pasteimage_provider_set); + elm_entry_item_provider_append(entry, image_provider, NULL); + } + return true; +} + + +static bool pasteimage_append(struct pasteimage *pi, Evas_Object *entry) { char entrytag[100]; + char *v; if (!pi) return false; if (!entry) return false; - /* FIXME: Need to do this per widget */ - if (!pastedimages) - elm_entry_item_provider_append(entry, image_provider, NULL); + pasteimage_provider_set(entry); pastedimages = eina_list_append(pastedimages, pi); snprintf(entrytag, sizeof(entrytag),"<item absize=240x180 href=%s>",pi->tag); @@ -1152,8 +1168,8 @@ ddata.y = savedtypes.y; ddata.format = ELM_SEL_IMAGE; /* FIXME: Need to do this per widget */ - if (!pastedimages) - elm_entry_item_provider_append(dropable->obj, image_provider, NULL); + pasteimage_provider_set(dropable->obj); + pastedimages = eina_list_append(pastedimages, savedtypes.pi); snprintf(entrytag, sizeof(entrytag),"<item absize=240x180 href=%s>",savedtypes.pi->tag); ddata.data = entrytag; |
From: Enlightenment S. <no-...@en...> - 2010-09-08 04:54:53
|
Log: Elm: Simplify elm photo size handling. Also don't carry around a negative size when it's not used. Author: nash Date: 2010-09-07 21:54:46 -0700 (Tue, 07 Sep 2010) New Revision: 51967 Modified: trunk/TMP/st/elementary/src/lib/elm_photo.c Modified: trunk/TMP/st/elementary/src/lib/elm_photo.c =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_photo.c 2010-09-08 03:54:42 UTC (rev 51966) +++ trunk/TMP/st/elementary/src/lib/elm_photo.c 2010-09-08 04:54:46 UTC (rev 51967) @@ -190,13 +190,11 @@ ELM_CHECK_WIDTYPE(obj, widtype); Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; - wd->size = size; - if(size >= 0) - _els_smart_icon_scale_size_set(wd->img, size); - else - _els_smart_icon_scale_size_set(wd->img, 0); + wd->size = (size > 0) ? size : 0; + _els_smart_icon_scale_size_set(wd->img, wd->size); + _sizing_eval(obj); } |