efl

Форк
0
/
edje_watch.c 
149 строк · 3.2 Кб
1
#ifdef HAVE_CONFIG_H
2
# include "config.h"
3
#endif
4

5
#ifdef HAVE_SYS_WAIT_H
6
# include <sys/wait.h>
7
#endif
8

9
#include <Eina.h>
10
#include <Ecore.h>
11
#include <Eio.h>
12

13
#ifdef _WIN32
14
# define WEXITSTATUS(r) r
15
#endif
16

17
static Eina_Tmpstr *watchfile;
18
static char *edje_cc_command = NULL;
19
static Eina_List *watching = NULL;
20
static Ecore_Timer *timeout = NULL;
21
static Eina_Bool anotate = EINA_FALSE;
22

23
static void
24
read_watch_file(const char *file)
25
{
26
   Eina_File *f;
27
   Eina_Iterator *it;
28
   Eina_File_Line *ln;
29
   Eio_Monitor *mon;
30
   Eina_List *r = NULL;
31

32
   f = eina_file_open(file, EINA_FALSE);
33
   if (!f) return;
34

35
   it = eina_file_map_lines(f);
36
   if (!it) goto err;
37

38
   EINA_ITERATOR_FOREACH(it, ln)
39
     {
40
        const char *path;
41
        Eina_Bool do_append = EINA_TRUE;
42

43
        if (ln->length < 4) continue;
44
        if (anotate)
45
          {
46
             path = eina_stringshare_add_length(ln->start + 3, ln->length - 3);
47
             fprintf(stdout, "%c: %s\n", *ln->start, path);
48
             if (*ln->start == 'O')
49
               do_append = EINA_FALSE;
50
          }
51
        else
52
          {
53
             path = eina_stringshare_add_length(ln->start, ln->length);
54
          }
55
        if (do_append)
56
          r = eina_list_append(r, eio_monitor_add(path));
57
        eina_stringshare_del(path);
58
     }
59
   eina_iterator_free(it);
60

61
   EINA_LIST_FREE(watching, mon)
62
     eio_monitor_del(mon);
63
   watching = r;
64

65
err:
66
   eina_file_close(f);
67
}
68

69
Eina_Bool
70
rebuild(void *data EINA_UNUSED)
71
{
72
   double start, end;
73
   int ret;
74

75
   start = ecore_time_get();
76
   fprintf(stdout, "* SYSTEM('%s')\n", edje_cc_command);
77
   fflush(stdout);
78

79
   ret = system(edje_cc_command);
80
   if (WEXITSTATUS(ret) == 0)
81
     read_watch_file(watchfile);
82
   end = ecore_time_get();
83
   fprintf(stdout, "* DONE IN %f\n", end - start);
84
   fflush(stdout);
85

86
   timeout = NULL;
87
   return EINA_FALSE;
88
}
89

90
Eina_Bool
91
some_change(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED)
92
{
93
   if (timeout) ecore_timer_del(timeout);
94
   timeout = ecore_timer_add(0.5, rebuild, NULL);
95

96
   return ECORE_CALLBACK_PASS_ON;
97
}
98

99
int
100
main(int argc, char **argv)
101
{
102
   Eina_Strbuf *buf;
103
   int tfd;
104
   int i;
105

106
   eina_init();
107
   ecore_init();
108
   eio_init();
109

110
   if (argc < 2) return -1;
111

112
   ecore_event_handler_add(EIO_MONITOR_FILE_MODIFIED, some_change, NULL);
113
   ecore_event_handler_add(EIO_MONITOR_FILE_CREATED, some_change, NULL);
114
   ecore_event_handler_add(EIO_MONITOR_FILE_DELETED, some_change, NULL);
115
   ecore_event_handler_add(EIO_MONITOR_FILE_CLOSED, some_change, NULL);
116

117
   tfd = eina_file_mkstemp("edje_watch-tmp-XXXXXX", &watchfile);
118
   if (tfd < 0) return -1;
119
   close(tfd);
120

121
   buf = eina_strbuf_new();
122
   if (!buf) return -1;
123

124
   eina_strbuf_append_printf(buf, "%s/edje_cc -fastcomp -w %s ", PACKAGE_BIN_DIR, watchfile);
125
   for (i = 1; i < argc; ++i)
126
     {
127
        if (!strcmp(argv[i], "-anotate"))
128
          anotate = EINA_TRUE;
129
        eina_strbuf_append_printf(buf, "%s ", argv[i]);
130
     }
131
   eina_strbuf_append(buf, "> /dev/null");
132

133
   edje_cc_command = eina_strbuf_string_steal(buf);
134

135
   eina_strbuf_free(buf);
136

137
   rebuild(NULL);
138

139
   ecore_main_loop_begin();
140

141
   unlink(watchfile);
142
   eina_tmpstr_del(watchfile);
143

144
   eio_shutdown();
145
   ecore_shutdown();
146
   eina_shutdown();
147

148
   return 1;
149
}
150

151

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.