summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Blumenkrantz <zmike@osg.samsung.com>2016-02-08 11:52:46 -0500
committerMike Blumenkrantz <zmike@osg.samsung.com>2016-02-06 21:09:57 -0500
commit39bc858b20ca0a0ba2c1427ce64d57163b819dd2 (patch)
treec1ff8ccd7830b28103d53fdc62d3adf30c01620f /src
parent86f5a0324e3f25522eb0fa435a5011f03db1592b (diff)
handle incremental queue version updating in the ui
this removes a number of workarounds related to deleting items from the queue and significantly improves ui responsiveness when editing the queue ref T3147
Diffstat (limited to 'src')
-rw-r--r--src/bin/empc.c203
1 files changed, 119 insertions, 84 deletions
diff --git a/src/bin/empc.c b/src/bin/empc.c
index 8a7ffeb..dc8585c 100644
--- a/src/bin/empc.c
+++ b/src/bin/empc.c
@@ -32,7 +32,6 @@ static unsigned int empd_port;
32static Eldbus_Pending *config_call; 32static Eldbus_Pending *config_call;
33 33
34static int empd_state = 0; 34static int empd_state = 0;
35static int noclear = 0;
36 35
37static Evas_Object *win = NULL; 36static Evas_Object *win = NULL;
38static Evas_Object *bg[2] = {NULL}; 37static Evas_Object *bg[2] = {NULL};
@@ -113,7 +112,7 @@ static size_t empc_module_size[EMPC_MODULE_TYPE_LAST] =
113static void queue_list_header_image(void *data, Empc_Fetch_Request *req, Evas_Object *obj); 112static void queue_list_header_image(void *data, Empc_Fetch_Request *req, Evas_Object *obj);
114static void filesystem_base(Eldbus_Proxy *proxy, void *data, Eldbus_Pending *pending, Eldbus_Error_Info *error, Eina_Value *args); 113static void filesystem_base(Eldbus_Proxy *proxy, void *data, Eldbus_Pending *pending, Eldbus_Error_Info *error, Eina_Value *args);
115static void filesystem_item_image(void *data, Empc_Fetch_Request *req, Evas_Object *obj); 114static void filesystem_item_image(void *data, Empc_Fetch_Request *req, Evas_Object *obj);
116static void queue_list_handler(Eina_Value *value, Eina_Bool cached); 115static void queue_list_handler(Eina_Value *value, Eina_Bool update);
117static void filesystem_next(void *data, Evas_Object *obj, void *event_info); 116static void filesystem_next(void *data, Evas_Object *obj, void *event_info);
118static void filesystem_prev(void); 117static void filesystem_prev(void);
119static Evas_Object *filesystem_new(const char *uri); 118static Evas_Object *filesystem_new(const char *uri);
@@ -1864,7 +1863,7 @@ static void
1864queue_list_cached(Eldbus_Proxy *proxy EINA_UNUSED, void *data, Eldbus_Pending *pending EINA_UNUSED, Eldbus_Error_Info *error EINA_UNUSED, Eina_Value *value) 1863queue_list_cached(Eldbus_Proxy *proxy EINA_UNUSED, void *data, Eldbus_Pending *pending EINA_UNUSED, Eldbus_Error_Info *error EINA_UNUSED, Eina_Value *value)
1865{ 1864{
1866 if (value) 1865 if (value)
1867 queue_list_handler(value, EINA_TRUE); 1866 queue_list_handler(value, EINA_FALSE);
1868 if ((empd_songid == -1) && ((long)data == -1)) 1867 if ((empd_songid == -1) && ((long)data == -1))
1869 empd_empdd_status_call(empd_proxy); 1868 empd_empdd_status_call(empd_proxy);
1870} 1869}
@@ -2170,23 +2169,16 @@ queue_list_item_realize(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, vo
2170static void 2169static void
2171queue_list_delete_list(const Eina_List *items) 2170queue_list_delete_list(const Eina_List *items)
2172{ 2171{
2173 Eina_List *l, *headers = NULL; 2172 Eina_List *l;
2174 int start = -1, num = 0, total = 0; 2173 int start = -1, num = 0, total = 0;
2175 Elm_Object_Item *it, *next, *hdr = NULL; 2174 Elm_Object_Item *it, *next;
2176 Eina_Bool del_playing = EINA_FALSE; 2175 Eina_Bool del_playing = EINA_FALSE;
2177 Empd_Empdd_Song *so; 2176 Empd_Empdd_Song *so;
2178 unsigned int sub = 0;
2179 2177
2180 if (!items) return; 2178 if (!items) return;
2181 l = eina_list_sort(eina_list_clone(items), 0, (Eina_Compare_Cb)queue_list_sort); 2179 l = eina_list_sort(eina_list_clone(items), 0, (Eina_Compare_Cb)queue_list_sort);
2182 EINA_LIST_FREE(l, it) 2180 EINA_LIST_FREE(l, it)
2183 { 2181 {
2184 if (hdr != elm_genlist_item_parent_get(it))
2185 {
2186 hdr = elm_genlist_item_parent_get(it);
2187 headers = eina_list_append(headers, hdr);
2188 sub = elm_genlist_item_subitems_count(hdr);
2189 }
2190 /* check for contiguous selection */ 2182 /* check for contiguous selection */
2191 so = elm_object_item_data_get(it); 2183 so = elm_object_item_data_get(it);
2192 if (start == -1) 2184 if (start == -1)
@@ -2205,18 +2197,10 @@ queue_list_delete_list(const Eina_List *items)
2205 start = -1, num = 0; 2197 start = -1, num = 0;
2206 if (!del_playing) 2198 if (!del_playing)
2207 total += num; 2199 total += num;
2208 if (!sub)
2209 headers = eina_list_remove(headers, hdr);
2210 } 2200 }
2211 else 2201 else
2212 num++, sub--; 2202 num++;
2213 elm_object_item_del(it);
2214 } 2203 }
2215 noclear++;
2216 if (!sub)
2217 headers = eina_list_remove(headers, hdr);
2218 EINA_LIST_FREE(headers, hdr)
2219 elm_genlist_item_fields_update(hdr, EMPC_TEXT_TIME, ELM_GENLIST_ITEM_FIELD_TEXT);
2220 if (!num) return; 2204 if (!num) return;
2221 empd_empdd_delete_list_range_call(empd_proxy, start, num - 1); 2205 empd_empdd_delete_list_range_call(empd_proxy, start, num - 1);
2222 if ((!del_playing) || (empd_state != MPD_STATE_PLAY)) return; 2206 if ((!del_playing) || (empd_state != MPD_STATE_PLAY)) return;
@@ -2236,7 +2220,7 @@ static void
2236queue_list_delete_inverted(void) 2220queue_list_delete_inverted(void)
2237{ 2221{
2238 const Eina_List *items; 2222 const Eina_List *items;
2239 Eina_List *l, *headers = NULL; 2223 Eina_List *l;
2240 int start = -1; 2224 int start = -1;
2241 Elm_Object_Item *it, *prev, *next, *hdr = NULL; 2225 Elm_Object_Item *it, *prev, *next, *hdr = NULL;
2242 int del_playing = -1; 2226 int del_playing = -1;
@@ -2265,10 +2249,7 @@ queue_list_delete_inverted(void)
2265 EINA_LIST_FREE(l, it) 2249 EINA_LIST_FREE(l, it)
2266 { 2250 {
2267 if (hdr != elm_genlist_item_parent_get(it)) 2251 if (hdr != elm_genlist_item_parent_get(it))
2268 { 2252 hdr = elm_genlist_item_parent_get(it);
2269 hdr = elm_genlist_item_parent_get(it);
2270 headers = eina_list_append(headers, hdr);
2271 }
2272 next = elm_genlist_item_next_get(it); 2253 next = elm_genlist_item_next_get(it);
2273 prev = elm_genlist_item_prev_get(it); 2254 prev = elm_genlist_item_prev_get(it);
2274 so = elm_object_item_data_get(next); 2255 so = elm_object_item_data_get(next);
@@ -2299,8 +2280,6 @@ queue_list_delete_inverted(void)
2299 start = -1; 2280 start = -1;
2300 } 2281 }
2301 } 2282 }
2302 EINA_LIST_FREE(headers, hdr)
2303 elm_genlist_item_fields_update(hdr, EMPC_TEXT_TIME, ELM_GENLIST_ITEM_FIELD_TEXT);
2304 if (start == -1) return; 2283 if (start == -1) return;
2305 empd_empdd_delete_list_range_call(empd_proxy, start, -1); 2284 empd_empdd_delete_list_range_call(empd_proxy, start, -1);
2306 if ((!del_playing) || (empd_state != MPD_STATE_PLAY)) return; 2285 if ((!del_playing) || (empd_state != MPD_STATE_PLAY)) return;
@@ -2692,25 +2671,24 @@ queue_list_find_insert_point(Empd_Empdd_Song *so)
2692 Elm_Object_Item *it, *itp; 2671 Elm_Object_Item *it, *itp;
2693 Empd_Empdd_Song *soi; 2672 Empd_Empdd_Song *soi;
2694 2673
2674 if (!elm_genlist_items_count(queue_list)) return NULL;
2695 if ((unsigned int)so->song_pos > (elm_genlist_items_count(queue_list) / 2)) 2675 if ((unsigned int)so->song_pos > (elm_genlist_items_count(queue_list) / 2))
2696 { 2676 {
2697 it = elm_genlist_last_item_get(queue_list); 2677 it = elm_genlist_last_item_get(queue_list);
2698 if (!it) return NULL;
2699 do 2678 do
2700 { 2679 {
2701 soi = elm_object_item_data_get(it); 2680 soi = elm_object_item_data_get(it);
2702 if (so->song_pos > soi->song_pos) return it; 2681 if (so->song_pos >= soi->song_pos) return it;
2703 it = elm_genlist_item_prev_get(it); 2682 it = elm_genlist_item_prev_get(it);
2704 } while (it); 2683 } while (it);
2705 return NULL; 2684 return NULL;
2706 } 2685 }
2707 2686
2708 itp = it = elm_genlist_first_item_get(queue_list); 2687 itp = it = elm_genlist_first_item_get(queue_list);
2709 if (!it) return NULL;
2710 do 2688 do
2711 { 2689 {
2712 soi = elm_object_item_data_get(it); 2690 soi = elm_object_item_data_get(it);
2713 if (so->song_pos < soi->song_pos) return itp; 2691 if (so->song_pos <= soi->song_pos) return itp;
2714 itp = it; 2692 itp = it;
2715 it = elm_genlist_item_next_get(it); 2693 it = elm_genlist_item_next_get(it);
2716 } while (it); 2694 } while (it);
@@ -2785,15 +2763,12 @@ queue_list_item_unselect(void *data EINA_UNUSED, Evas_Object *obj, void *event_i
2785} 2763}
2786 2764
2787static void 2765static void
2788queue_list_handler(Eina_Value *value, Eina_Bool cached) 2766queue_list_handler(Eina_Value *value, Eina_Bool update)
2789{ 2767{
2790 Empd_Array_Songs *songs = NULL; 2768 Empd_Array_Songs *songs = NULL;
2791 Empd_Empdd_Song *so; 2769 Empd_Empdd_Song *so;
2792 const char *album = NULL, *artist = NULL; 2770 const char *album = NULL, *artist = NULL;
2793 Elm_Object_Item *itl = NULL, *ith = NULL; 2771 Elm_Object_Item *itl = NULL, *ith = NULL;
2794 int x, y, w, h;
2795 Eina_Bool reset = EINA_FALSE;
2796 Eina_List *sel = NULL;
2797 static Elm_Genlist_Item_Class queue_itc = { 2772 static Elm_Genlist_Item_Class queue_itc = {
2798 .item_style = "default", 2773 .item_style = "default",
2799 .func = { 2774 .func = {
@@ -2817,57 +2792,110 @@ queue_list_handler(Eina_Value *value, Eina_Bool cached)
2817 EINA_LOG_ERR("conversion failure"); 2792 EINA_LOG_ERR("conversion failure");
2818 return; 2793 return;
2819 } 2794 }
2820 if ((!cached) && (!noclear)) 2795 if (update && songs->songs)
2821 { 2796 {
2822 Elm_Object_Item *it; 2797 Elm_Object_Item *insert;
2823 const Eina_List *l, *its = elm_genlist_selected_items_get(queue_list); 2798 Empd_Empdd_Song *exist;
2824 elm_scroller_region_get(queue_list, &x, &y, &w, &h); 2799
2825 if (its) 2800 so = eina_list_data_get(songs->songs);
2801 /* find existing song with first updated song's id */
2802 insert = eina_hash_find(empd_current_queue, &so->songid);
2803 if (insert)
2826 { 2804 {
2827 EINA_LIST_FOREACH(its, l, it) 2805 exist = elm_object_item_data_get(insert);
2828 sel = eina_list_append(sel, Empd_Empdd_Song_copy(elm_object_item_data_get(it))); 2806 if (exist->song_pos > so->song_pos)
2807 {
2808 /* songs removed before existing item:
2809 * - remove items until exist has target position
2810 */
2811 int target = so->song_pos;
2812 Elm_Object_Item *prev, *next = insert;
2813
2814 do
2815 {
2816 insert = elm_genlist_item_prev_get(next);
2817 if (elm_genlist_item_subitems_count(insert))
2818 insert = elm_genlist_item_prev_get(insert);
2819 if (!insert) break;
2820 exist = elm_object_item_data_get(insert);
2821 if (exist->song_pos < target) break;
2822 elm_object_item_del(insert);
2823 } while (insert);
2824 prev = elm_genlist_item_prev_get(next);
2825 if (prev)
2826 {
2827 Elm_Object_Item *parent;
2828 Empd_Empdd_Song *a, *b;
2829
2830 parent = elm_genlist_item_parent_get(next);
2831 a = elm_object_item_data_get(prev);
2832 b = elm_object_item_data_get(parent);
2833 /* check whether the previous album can be merged with the next one */
2834 if ((a->artist == b->artist) && (a->album == b->album) &&
2835 (parent != elm_genlist_item_parent_get(prev)))
2836 elm_object_item_del(parent);
2837 }
2838 }
2839 }
2840 }
2841 else if (update)
2842 {
2843 while ((unsigned int)eina_hash_population(empd_current_queue) > empd_queue_length)
2844 {
2845 Elm_Object_Item *it;
2846
2847 /* skip header item... */
2848 it = elm_genlist_item_prev_get(elm_genlist_last_item_get(queue_list));
2849 elm_object_item_del(it);
2829 } 2850 }
2830 queue_list_clear();
2831 reset = EINA_TRUE;
2832 } 2851 }
2833 EINA_LIST_FREE(songs->songs, so) 2852 EINA_LIST_FREE(songs->songs, so)
2834 { 2853 {
2835 Elm_Object_Item *it = NULL; 2854 Elm_Object_Item *it = NULL;
2836 Empd_Empdd_Song *sop; 2855 Empd_Empdd_Song *sop;
2837 2856
2838 if (cached || noclear) 2857 it = eina_hash_find(empd_current_queue, &so->songid);
2858 if (it)
2839 { 2859 {
2840 it = eina_hash_find(empd_current_queue, &so->songid); 2860 Empd_Empdd_Song *ss = elm_object_item_data_get(it);
2841 if (it) 2861 if (Empd_Empdd_Song_eq(so, ss))
2862 {
2863 Empd_Empdd_Song_free(so);
2864 so = ss;
2865 }
2866 else
2842 { 2867 {
2843 Empd_Empdd_Song *ss = elm_object_item_data_get(it); 2868 Elm_Object_Item *parent;
2844 if (Empd_Empdd_Song_eq(so, ss)) 2869
2870 parent = elm_genlist_item_parent_get(it);
2871 sop = elm_object_item_data_get(parent);
2872 if (Empd_Empdd_Song_eq(sop, ss))
2845 { 2873 {
2846 Empd_Empdd_Song_free(so); 2874 Empd_Empdd_Song_free(sop);
2847 so = ss; 2875 elm_object_item_data_set(parent, Empd_Empdd_Song_copy(so));
2876 elm_genlist_item_update(parent);
2848 } 2877 }
2849 else 2878 Empd_Empdd_Song_free(ss);
2879 elm_object_item_data_set(it, so);
2880 elm_genlist_item_update(it);
2881 if (so->songid == empd_songid)
2850 { 2882 {
2851 Empd_Empdd_Song_free(ss); 2883 if ((so->track != empd_song_track) || (empd_song_title != so->title))
2852 elm_object_item_data_set(it, so);
2853 elm_genlist_item_update(it);
2854 if (so->songid == empd_songid)
2855 { 2884 {
2856 if ((so->track != empd_song_track) || (empd_song_title != so->title)) 2885 empd_song_track = so->track;
2857 { 2886 eina_stringshare_refplace(&empd_song_title, so->title);
2858 empd_song_track = so->track; 2887 title_text_set();
2859 eina_stringshare_refplace(&empd_song_title, so->title); 2888 elm_object_tooltip_hide(bg[background_num]);
2860 title_text_set();
2861 elm_object_tooltip_hide(bg[background_num]);
2862 }
2863 } 2889 }
2864 } 2890 }
2865 ith = elm_genlist_item_parent_get(it);
2866 } 2891 }
2892 ith = elm_genlist_item_parent_get(it);
2867 } 2893 }
2894
2868 if (!it) 2895 if (!it)
2869 { 2896 {
2870 Elm_Object_Item *itp = NULL; 2897 Elm_Object_Item *itp = NULL;
2898 Eina_Bool end = EINA_FALSE;
2871 2899
2872 if (((!album) && (!artist)) || (album != so->album) || (artist != so->artist) || (!ith)) 2900 if (((!album) && (!artist)) || (album != so->album) || (artist != so->artist) || (!ith))
2873 { 2901 {
@@ -2882,25 +2910,29 @@ queue_list_handler(Eina_Value *value, Eina_Bool cached)
2882 { 2910 {
2883 use = EINA_TRUE; 2911 use = EINA_TRUE;
2884 ith = elm_genlist_item_parent_get(itp); 2912 ith = elm_genlist_item_parent_get(itp);
2885 if (!ith) ith = itp, itp = NULL;
2886 } 2913 }
2914 if (itp && (itp == elm_genlist_last_item_get(queue_list)))
2915 end = EINA_TRUE;
2887 } 2916 }
2888 } 2917 }
2889 if (!use) 2918 if (!use)
2890 { 2919 {
2891 char buf[1024]; 2920 char buf[1024];
2892 2921
2893 if (itp) 2922 if (end || (!itp))
2894 ith = elm_genlist_item_insert_after(queue_list, &header_itc, Empd_Empdd_Song_copy(so), NULL, itp, ELM_GENLIST_ITEM_GROUP, NULL, NULL);
2895 else
2896 ith = elm_genlist_item_append(queue_list, &header_itc, Empd_Empdd_Song_copy(so), NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL); 2923 ith = elm_genlist_item_append(queue_list, &header_itc, Empd_Empdd_Song_copy(so), NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL);
2924 else
2925 ith = elm_genlist_item_insert_after(queue_list, &header_itc, Empd_Empdd_Song_copy(so), NULL, itp, ELM_GENLIST_ITEM_GROUP, NULL, NULL);
2897 snprintf(buf, sizeof(buf), "%s:::%s", so->artist, so->album); 2926 snprintf(buf, sizeof(buf), "%s:::%s", so->artist, so->album);
2898 //INF("NEW HEADER(%p): %s", ith, buf); 2927 //INF("NEW HEADER(%p): %s", ith, buf);
2899 eina_hash_list_append(empd_current_queue_headers, buf, ith); 2928 eina_hash_list_append(empd_current_queue_headers, buf, ith);
2900 elm_genlist_item_select_mode_set(ith, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); 2929 elm_genlist_item_select_mode_set(ith, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
2930 itp = NULL;
2901 } 2931 }
2902 } 2932 }
2903 if (itp) 2933 if (end || (!itp))
2934 it = elm_genlist_item_append(queue_list, &queue_itc, so, ith, ELM_GENLIST_ITEM_NONE, queue_list_item_select, NULL);
2935 else if (itp)
2904 it = elm_genlist_item_insert_after(queue_list, &queue_itc, so, ith, itp, ELM_GENLIST_ITEM_NONE, queue_list_item_select, NULL); 2936 it = elm_genlist_item_insert_after(queue_list, &queue_itc, so, ith, itp, ELM_GENLIST_ITEM_NONE, queue_list_item_select, NULL);
2905 else 2937 else
2906 it = elm_genlist_item_sorted_insert(queue_list, &queue_itc, so, ith, ELM_GENLIST_ITEM_NONE, (Eina_Compare_Cb)queue_list_sort, queue_list_item_select, NULL); 2938 it = elm_genlist_item_sorted_insert(queue_list, &queue_itc, so, ith, ELM_GENLIST_ITEM_NONE, (Eina_Compare_Cb)queue_list_sort, queue_list_item_select, NULL);
@@ -2931,27 +2963,29 @@ queue_list_handler(Eina_Value *value, Eina_Bool cached)
2931 artist = so->artist; 2963 artist = so->artist;
2932 itl = it; 2964 itl = it;
2933 } 2965 }
2934 selecting = EINA_TRUE;
2935 EINA_LIST_FREE(sel, so)
2936 {
2937 itl = eina_hash_find(empd_current_queue, &so->songid);
2938 if (itl)
2939 elm_genlist_item_selected_set(itl, EINA_TRUE);
2940 Empd_Empdd_Song_free(so);
2941 }
2942 selecting = EINA_FALSE;
2943 free(songs); 2966 free(songs);
2944 if (noclear)
2945 noclear--;
2946 if (reset)
2947 elm_scroller_region_show(queue_list, x, y, w, h);
2948} 2967}
2949 2968
2950static Eina_Bool 2969static Eina_Bool
2951empc_queue_list(void *d EINA_UNUSED, int t EINA_UNUSED, Empd_Empdd_QueueList_Data *ev) 2970empc_queue_list(void *d EINA_UNUSED, int t EINA_UNUSED, Empd_Empdd_QueueList_Data *ev)
2952{ 2971{
2972 Elm_Object_Item *it;
2973
2974 it = empd_song_item;
2953 queue_list_handler(ev->value, EINA_FALSE); 2975 queue_list_handler(ev->value, EINA_FALSE);
2954 if (empd_song_item) 2976 if ((!it) || (it != empd_song_item))
2977 elm_genlist_item_show(empd_song_item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
2978 return ECORE_CALLBACK_RENEW;
2979}
2980
2981static Eina_Bool
2982empc_queue_list_changes(void *d EINA_UNUSED, int t EINA_UNUSED, Empd_Empdd_QueueList_Data *ev)
2983{
2984 Elm_Object_Item *it;
2985
2986 it = empd_song_item;
2987 queue_list_handler(ev->value, EINA_TRUE);
2988 if ((!it) || (it != empd_song_item))
2955 elm_genlist_item_show(empd_song_item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE); 2989 elm_genlist_item_show(empd_song_item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
2956 return ECORE_CALLBACK_RENEW; 2990 return ECORE_CALLBACK_RENEW;
2957} 2991}
@@ -3851,6 +3885,7 @@ main(int argc, char *argv[])
3851 E_LIST_HANDLER_APPEND(handlers, EMPD_EMPDD_PERMISSION_FAILED_EVENT, empc_permission_fail, NULL); 3885 E_LIST_HANDLER_APPEND(handlers, EMPD_EMPDD_PERMISSION_FAILED_EVENT, empc_permission_fail, NULL);
3852 E_LIST_HANDLER_APPEND(handlers, EMPD_EMPDD_STATUS_EVENT, empc_status, NULL); 3886 E_LIST_HANDLER_APPEND(handlers, EMPD_EMPDD_STATUS_EVENT, empc_status, NULL);
3853 E_LIST_HANDLER_APPEND(handlers, EMPD_EMPDD_QUEUE_LIST_EVENT, empc_queue_list, NULL); 3887 E_LIST_HANDLER_APPEND(handlers, EMPD_EMPDD_QUEUE_LIST_EVENT, empc_queue_list, NULL);
3888 E_LIST_HANDLER_APPEND(handlers, EMPD_EMPDD_QUEUE_CHANGES_META_EVENT, empc_queue_list_changes, NULL);
3854 E_LIST_HANDLER_APPEND(handlers, EMPD_EMPDD_DATABASE_UPDATE_END_EVENT, empc_database_end, NULL); 3889 E_LIST_HANDLER_APPEND(handlers, EMPD_EMPDD_DATABASE_UPDATE_END_EVENT, empc_database_end, NULL);
3855 E_LIST_HANDLER_APPEND(handlers, EMPD_EMPC_BACKGROUND_CHANGED_EVENT, empc_bg_changed, NULL); 3890 E_LIST_HANDLER_APPEND(handlers, EMPD_EMPC_BACKGROUND_CHANGED_EVENT, empc_bg_changed, NULL);
3856 3891