diff options
author | Sebastian Dransfeld <sebastian.dransfeld@sintef.no> | 2013-06-20 11:56:15 +0200 |
---|---|---|
committer | Sebastian Dransfeld <sebastian.dransfeld@sintef.no> | 2013-06-20 11:56:46 +0200 |
commit | 5b3cd4cde17731a71020f48b13e2e9dab511e294 (patch) | |
tree | d0184ce8548446dd3a93eed37e010443d5c2996b /src/lib/efreet | |
parent | 0c317eaca288a546124677247952f3962a7117fb (diff) |
efreet: Add async menu parsing
Diffstat (limited to 'src/lib/efreet')
-rw-r--r-- | src/lib/efreet/efreet_menu.c | 129 | ||||
-rw-r--r-- | src/lib/efreet/efreet_menu.h | 21 |
2 files changed, 122 insertions, 28 deletions
diff --git a/src/lib/efreet/efreet_menu.c b/src/lib/efreet/efreet_menu.c index dc0389985b..d4bbeb6a4d 100644 --- a/src/lib/efreet/efreet_menu.c +++ b/src/lib/efreet/efreet_menu.c | |||
@@ -2,6 +2,7 @@ | |||
2 | # include <config.h> | 2 | # include <config.h> |
3 | #endif | 3 | #endif |
4 | 4 | ||
5 | #include <Ecore.h> | ||
5 | #include <Ecore_File.h> | 6 | #include <Ecore_File.h> |
6 | 7 | ||
7 | /* define macros and variable for using the eina logging system */ | 8 | /* define macros and variable for using the eina logging system */ |
@@ -154,6 +155,14 @@ struct Efreet_Menu_Desktop | |||
154 | unsigned char allocated:1; /**< If this desktop has been allocated */ | 155 | unsigned char allocated:1; /**< If this desktop has been allocated */ |
155 | }; | 156 | }; |
156 | 157 | ||
158 | typedef struct Efreet_Menu_Async Efreet_Menu_Async; | ||
159 | |||
160 | struct Efreet_Menu_Async | ||
161 | { | ||
162 | Efreet_Menu_Cb func; | ||
163 | Eina_Stringshare *path; | ||
164 | }; | ||
165 | |||
157 | static const char *efreet_menu_prefix = NULL; /**< The $XDG_MENU_PREFIX env var */ | 166 | static const char *efreet_menu_prefix = NULL; /**< The $XDG_MENU_PREFIX env var */ |
158 | Eina_List *efreet_menu_kde_legacy_dirs = NULL; /**< The directories to use for KDELegacy entries */ | 167 | Eina_List *efreet_menu_kde_legacy_dirs = NULL; /**< The directories to use for KDELegacy entries */ |
159 | static const char *efreet_tag_menu = NULL; | 168 | static const char *efreet_tag_menu = NULL; |
@@ -164,6 +173,8 @@ static Eina_Hash *efreet_menu_filter_cbs = NULL; | |||
164 | static Eina_Hash *efreet_menu_move_cbs = NULL; | 173 | static Eina_Hash *efreet_menu_move_cbs = NULL; |
165 | static Eina_Hash *efreet_menu_layout_cbs = NULL; | 174 | static Eina_Hash *efreet_menu_layout_cbs = NULL; |
166 | 175 | ||
176 | static Efreet_Menu *efreet_menu_internal_get(Efreet_Menu_Cb func); | ||
177 | |||
167 | static Efreet_Menu_Internal *efreet_menu_by_name_find(Efreet_Menu_Internal *internal, | 178 | static Efreet_Menu_Internal *efreet_menu_by_name_find(Efreet_Menu_Internal *internal, |
168 | const char *name, | 179 | const char *name, |
169 | Efreet_Menu_Internal **parent); | 180 | Efreet_Menu_Internal **parent); |
@@ -305,6 +316,8 @@ static void efreet_menu_path_set(Efreet_Menu_Internal *internal, const char *pat | |||
305 | static int efreet_menu_save_menu(Efreet_Menu *menu, FILE *f, int indent); | 316 | static int efreet_menu_save_menu(Efreet_Menu *menu, FILE *f, int indent); |
306 | static int efreet_menu_save_indent(FILE *f, int indent); | 317 | static int efreet_menu_save_indent(FILE *f, int indent); |
307 | 318 | ||
319 | static void _efreet_menu_async_parse_cb(void *data, Ecore_Thread *thread); | ||
320 | |||
308 | int | 321 | int |
309 | efreet_menu_init(void) | 322 | efreet_menu_init(void) |
310 | { | 323 | { |
@@ -507,39 +520,27 @@ efreet_menu_file_set(const char *file) | |||
507 | if (file) efreet_menu_file = eina_stringshare_add(file); | 520 | if (file) efreet_menu_file = eina_stringshare_add(file); |
508 | } | 521 | } |
509 | 522 | ||
523 | EAPI void | ||
524 | efreet_menu_async_get(Efreet_Menu_Cb func) | ||
525 | { | ||
526 | efreet_menu_internal_get(func); | ||
527 | } | ||
528 | |||
510 | EAPI Efreet_Menu * | 529 | EAPI Efreet_Menu * |
511 | efreet_menu_get(void) | 530 | efreet_menu_get(void) |
512 | { | 531 | { |
513 | char menu[PATH_MAX]; | 532 | return efreet_menu_internal_get(NULL); |
514 | const char *dir; | 533 | } |
515 | Eina_List *config_dirs, *l; | ||
516 | |||
517 | #ifndef STRICT_SPEC | ||
518 | /* prefer user set menu */ | ||
519 | if (efreet_menu_file) | ||
520 | { | ||
521 | if (ecore_file_exists(efreet_menu_file)) | ||
522 | return efreet_menu_parse(efreet_menu_file); | ||
523 | } | ||
524 | #endif | ||
525 | |||
526 | /* check the users config directory first */ | ||
527 | snprintf(menu, sizeof(menu), "%s/menus/%sapplications.menu", | ||
528 | efreet_config_home_get(), efreet_menu_prefix); | ||
529 | if (ecore_file_exists(menu)) | ||
530 | return efreet_menu_parse(menu); | ||
531 | 534 | ||
532 | /* fallback to the XDG_CONFIG_DIRS */ | 535 | EAPI void |
533 | config_dirs = efreet_config_dirs_get(); | 536 | efreet_menu_async_parse(const char *path, Efreet_Menu_Cb func) |
534 | EINA_LIST_FOREACH(config_dirs, l, dir) | 537 | { |
535 | { | 538 | Efreet_Menu_Async *async; |
536 | snprintf(menu, sizeof(menu), "%s/menus/%sapplications.menu", | ||
537 | dir, efreet_menu_prefix); | ||
538 | if (ecore_file_exists(menu)) | ||
539 | return efreet_menu_parse(menu); | ||
540 | } | ||
541 | 539 | ||
542 | return NULL; | 540 | async = NEW(Efreet_Menu_Async, 1); |
541 | async->func = func; | ||
542 | async->path = eina_stringshare_add(path); | ||
543 | ecore_thread_run(_efreet_menu_async_parse_cb, NULL, NULL, async); | ||
543 | } | 544 | } |
544 | 545 | ||
545 | EAPI Efreet_Menu * | 546 | EAPI Efreet_Menu * |
@@ -720,6 +721,65 @@ efreet_menu_dump(Efreet_Menu *menu, const char *indent) | |||
720 | } | 721 | } |
721 | } | 722 | } |
722 | 723 | ||
724 | static Efreet_Menu * | ||
725 | efreet_menu_internal_get(Efreet_Menu_Cb func) | ||
726 | { | ||
727 | char menu[PATH_MAX]; | ||
728 | const char *dir; | ||
729 | Eina_List *config_dirs, *l; | ||
730 | |||
731 | #ifndef STRICT_SPEC | ||
732 | /* prefer user set menu */ | ||
733 | if (efreet_menu_file) | ||
734 | { | ||
735 | if (ecore_file_exists(efreet_menu_file)) | ||
736 | { | ||
737 | if (func) | ||
738 | { | ||
739 | efreet_menu_async_parse(efreet_menu_file, func); | ||
740 | return NULL; | ||
741 | } | ||
742 | else | ||
743 | return efreet_menu_parse(efreet_menu_file); | ||
744 | } | ||
745 | } | ||
746 | #endif | ||
747 | |||
748 | /* check the users config directory first */ | ||
749 | snprintf(menu, sizeof(menu), "%s/menus/%sapplications.menu", | ||
750 | efreet_config_home_get(), efreet_menu_prefix); | ||
751 | if (ecore_file_exists(menu)) | ||
752 | { | ||
753 | if (func) | ||
754 | { | ||
755 | efreet_menu_async_parse(menu, func); | ||
756 | return NULL; | ||
757 | } | ||
758 | else | ||
759 | return efreet_menu_parse(menu); | ||
760 | } | ||
761 | |||
762 | /* fallback to the XDG_CONFIG_DIRS */ | ||
763 | config_dirs = efreet_config_dirs_get(); | ||
764 | EINA_LIST_FOREACH(config_dirs, l, dir) | ||
765 | { | ||
766 | snprintf(menu, sizeof(menu), "%s/menus/%sapplications.menu", | ||
767 | dir, efreet_menu_prefix); | ||
768 | if (ecore_file_exists(menu)) | ||
769 | { | ||
770 | if (func) | ||
771 | { | ||
772 | efreet_menu_async_parse(menu, func); | ||
773 | return NULL; | ||
774 | } | ||
775 | else | ||
776 | return efreet_menu_parse(menu); | ||
777 | } | ||
778 | } | ||
779 | |||
780 | return NULL; | ||
781 | } | ||
782 | |||
723 | /** | 783 | /** |
724 | * @internal | 784 | * @internal |
725 | * @return Returns a new Efreet_Menu_Internal struct | 785 | * @return Returns a new Efreet_Menu_Internal struct |
@@ -3798,3 +3858,16 @@ efreet_menu_save_indent(FILE *f, int indent) | |||
3798 | return 1; | 3858 | return 1; |
3799 | } | 3859 | } |
3800 | 3860 | ||
3861 | static void | ||
3862 | _efreet_menu_async_parse_cb(void *data, Ecore_Thread *thread EINA_UNUSED) | ||
3863 | { | ||
3864 | Efreet_Menu_Async *async = data; | ||
3865 | Efreet_Menu *menu; | ||
3866 | |||
3867 | menu = efreet_menu_parse(async->path); | ||
3868 | ecore_thread_main_loop_begin(); | ||
3869 | async->func(menu); | ||
3870 | ecore_thread_main_loop_end(); | ||
3871 | eina_stringshare_del(async->path); | ||
3872 | free(async); | ||
3873 | } | ||
diff --git a/src/lib/efreet/efreet_menu.h b/src/lib/efreet/efreet_menu.h index 19c3e10211..a9f6b301fa 100644 --- a/src/lib/efreet/efreet_menu.h +++ b/src/lib/efreet/efreet_menu.h | |||
@@ -44,6 +44,12 @@ struct Efreet_Menu | |||
44 | Eina_List *entries; /**< The menu items */ | 44 | Eina_List *entries; /**< The menu items */ |
45 | }; | 45 | }; |
46 | 46 | ||
47 | /** | ||
48 | * A callback used with efreet_menu_async_get() and efreet_menu_async_parse() | ||
49 | * | ||
50 | * @since 1.8 | ||
51 | */ | ||
52 | typedef void *(*Efreet_Menu_Cb) (Efreet_Menu *menu); | ||
47 | 53 | ||
48 | /** | 54 | /** |
49 | * @return Returns no value | 55 | * @return Returns no value |
@@ -70,6 +76,13 @@ EAPI Efreet_Menu *efreet_menu_new(const char *name); | |||
70 | EAPI void efreet_menu_file_set(const char *file); | 76 | EAPI void efreet_menu_file_set(const char *file); |
71 | 77 | ||
72 | /** | 78 | /** |
79 | * Creates the Efreet_Menu representation of the default menu or | ||
80 | * NULL if none found and returns it in the callback. | ||
81 | * @param func function to call when menu is created | ||
82 | */ | ||
83 | EAPI void efreet_menu_async_get(Efreet_Menu_Cb func); | ||
84 | |||
85 | /** | ||
73 | * @return Returns the Efreet_Menu representation of the default menu or | 86 | * @return Returns the Efreet_Menu representation of the default menu or |
74 | * NULL if none found | 87 | * NULL if none found |
75 | * @brief Creates the default menu representation | 88 | * @brief Creates the default menu representation |
@@ -77,6 +90,14 @@ EAPI void efreet_menu_file_set(const char *file); | |||
77 | EAPI Efreet_Menu *efreet_menu_get(void); | 90 | EAPI Efreet_Menu *efreet_menu_get(void); |
78 | 91 | ||
79 | /** | 92 | /** |
93 | * Parses the given .menu file and creates the menu representation, and | ||
94 | * returns it in the callback | ||
95 | * @param path The path of the menu to load | ||
96 | * @param func function to call when menu is created | ||
97 | */ | ||
98 | EAPI void efreet_menu_async_parse(const char *path, Efreet_Menu_Cb func); | ||
99 | |||
100 | /** | ||
80 | * @param path The path of the menu to load | 101 | * @param path The path of the menu to load |
81 | * @return Returns the Efreet_Menu representation on success or NULL on | 102 | * @return Returns the Efreet_Menu representation on success or NULL on |
82 | * failure | 103 | * failure |