4 # define E_LOG_LEVEL EINA_LOG_LEVEL_INFO
7 EINTERN int e_log_dom = -1;
9 static const char *_names[] = {
18 _e_log_cb(const Eina_Log_Domain *d, Eina_Log_Level level, const char *file, const char *fnc __UNUSED__, int line, const char *fmt, void *data __UNUSED__, va_list args)
22 color = eina_log_level_color_get(level);
24 "%s%s<" EINA_COLOR_RESET "%s%s>" EINA_COLOR_RESET "%s:%d" EINA_COLOR_RESET " ",
25 color, _names[level > EINA_LOG_LEVEL_DBG ? EINA_LOG_LEVEL_DBG : level],
26 d->domain_str, color, file, line);
27 vfprintf(stdout, fmt, args);
34 e_log_dom = eina_log_domain_register("e", EINA_COLOR_WHITE);
35 eina_log_domain_level_set("e", E_LOG_LEVEL);
36 eina_log_print_cb_set(_e_log_cb, NULL);
37 return (e_log_dom != -1);
43 eina_log_domain_unregister(e_log_dom);
49 EAPI unsigned int e_logbuf_type = ELBT_NONE;
52 #define MAX_LOG_FUNC_STR_SIZE 50
53 #define MAX_LOG_STR_SIZE 256
60 char func[MAX_LOG_FUNC_STR_SIZE];
62 unsigned int id; // Ecore_X_Window or Zone ID
63 char str[MAX_LOG_STR_SIZE];
66 typedef struct _E_Logbuf
68 E_DBus_Interface *iface;
73 Eina_List *list; // list of E_Log
74 Ecore_Event_Handler *h;
78 static E_Logbuf *buf = NULL;
80 static void _log_disp(FILE *fp, E_Log *m);
83 e_logbuf_add(unsigned int type,
92 if (eina_list_count(buf->list) < MAX_LOGS)
94 msg = E_NEW(E_Log, 1);
96 buf->list = eina_list_append(buf->list, msg);
100 buf->cur = (buf->cur) % MAX_LOGS;
101 msg = eina_list_nth(buf->list, buf->cur);
107 msg->num = buf->num++;
111 n = sizeof(msg->func);
112 if (n >= MAX_LOG_FUNC_STR_SIZE)
114 strncpy(msg->func, func, MAX_LOG_FUNC_STR_SIZE-1);
115 msg->func[MAX_LOG_FUNC_STR_SIZE-1] = '\0';
119 strncpy(msg->func, func, n);
125 n = sizeof(msg->str);
126 if (n >= MAX_LOG_STR_SIZE)
128 strncpy(msg->str, str, MAX_LOG_STR_SIZE-1);
129 msg->str[MAX_LOG_STR_SIZE-1] = '\0';
133 strncpy(msg->str, str, n);
136 buf->cur = (buf->num) % MAX_LOGS;
138 if ((buf->pts) && (buf->fp))
139 _log_disp(buf->fp, msg);
144 e_logbuf_fmt_add(unsigned int type,
156 if (eina_list_count(buf->list) < MAX_LOGS)
158 msg = E_NEW(E_Log, 1);
160 buf->list = eina_list_append(buf->list, msg);
164 buf->cur = (buf->cur) % MAX_LOGS;
165 msg = eina_list_nth(buf->list, buf->cur);
171 msg->num = buf->num++;
175 n = sizeof(msg->func);
176 if (n >= MAX_LOG_FUNC_STR_SIZE)
178 strncpy(msg->func, func, MAX_LOG_FUNC_STR_SIZE-1);
179 msg->func[MAX_LOG_FUNC_STR_SIZE-1] = '\0';
183 strncpy(msg->func, func, n);
190 vsnprintf(msg->str, sizeof(msg->str), fmt, args);
193 buf->cur = (buf->num) % MAX_LOGS;
195 if ((buf->pts) && (buf->fp))
196 _log_disp(buf->fp, msg);
201 _e_logbuf_shutdown(void)
203 e_logbuf_type = ELBT_NONE;
208 EINA_LIST_FREE(buf->list, msg) E_FREE(msg);
212 e_msgbus_interface_detach(buf->iface);
213 e_dbus_interface_unref(buf->iface);
217 ecore_event_handler_del(buf->h);
218 memset(buf, 0, sizeof(E_Logbuf));
225 _type_name_get(unsigned int t)
229 case ELBT_NONE: return "NONE"; break;
230 case ELBT_DFT: return "DFT"; break;
231 case ELBT_MNG: return "MNG"; break;
232 case ELBT_BD: return "BD"; break;
233 case ELBT_ROT: return "ROT"; break;
234 case ELBT_ILLUME: return "ILLUME"; break;
235 case ELBT_COMP: return "COMP"; break;
236 case ELBT_MOVE: return "MOVE"; break;
237 case ELBT_ALL: return "ALL"; break;
250 fprintf(fp, "%38.38s|0x%08x|%s\n",
253 fprintf(fp, "%49.49s|%s\n",
259 fprintf(fp, "%5d|%20.20s|%5d|%5.5s|0x%08x|%s\n",
260 m->num, m->func, m->line,
261 _type_name_get(m->type), m->id, m->str);
263 fprintf(fp, "%5d|%20.20s|%5d|%5.5s|%10.10s|%s\n",
264 m->num, m->func, m->line,
265 _type_name_get(m->type), "", m->str);
270 _e_log_dump(FILE *fp)
272 Eina_List *l = NULL, *ll = NULL;
274 unsigned int idx = 0;
275 if ((!buf) || (!fp)) return;
277 ll = eina_list_nth_list(buf->list, buf->cur);
278 EINA_LIST_FOREACH(ll, l, msg)
283 EINA_LIST_FOREACH(buf->list, l, msg)
285 if (msg->num < idx) break;
289 fprintf(fp, "Total:%d Num:%d\n", eina_list_count(buf->list), buf->num);
294 _e_log_cb_enable(E_DBus_Object *obj __UNUSED__,
297 e_logbuf_type = ELBT_ALL;
298 return dbus_message_new_method_return(msg);
302 _e_log_cb_disable(E_DBus_Object *obj __UNUSED__,
305 e_logbuf_type = ELBT_NONE;
306 return dbus_message_new_method_return(msg);
310 _e_log_cb_dump(E_DBus_Object *obj __UNUSED__,
314 const char *path = NULL;
317 dbus_error_init(&err);
318 if (!dbus_message_get_args(msg, &err,
319 DBUS_TYPE_STRING, &path,
323 "could not get Log.Dump arguments: %s: %s",
324 err.name, err.message);
325 dbus_error_free(&err);
331 Eina_Bool pts = EINA_FALSE;
332 if (strstr(path, "/dev/pts/"))
335 fp = fopen(path, "w");
348 buf->pts = EINA_TRUE;
355 "dump log messages to file:%s\n",
361 return dbus_message_new_method_return(msg);
365 _e_log_cb_prop(void *data __UNUSED__,
369 Ecore_X_Event_Window_Property *ev = event;
373 if (!ev) return ECORE_CALLBACK_PASS_ON;
374 if (!ev->atom) return ECORE_CALLBACK_PASS_ON;
375 if (!buf) return ECORE_CALLBACK_PASS_ON;
376 if (ev->atom != buf->a) return ECORE_CALLBACK_PASS_ON;
378 path = ecore_x_window_prop_string_get(ev->win, ev->atom);
379 if (!path) return ECORE_CALLBACK_PASS_ON;
381 fp = fopen(path, "w");
382 if (!fp) return ECORE_CALLBACK_PASS_ON;
388 buf->pts = EINA_FALSE;
392 "dump log messages to file:%s\n",
396 return ECORE_CALLBACK_PASS_ON;
402 _e_logbuf_shutdown();
404 buf = E_NEW(E_Logbuf, 1);
407 buf->iface = e_dbus_interface_new("org.enlightenment.wm.Log");
410 fprintf(stderr, "Cannot add org.enlightenment.wm.Log interface\n");
411 memset(buf, 0, sizeof(E_Logbuf));
416 e_dbus_interface_method_add(buf->iface, "Enable", "", "", _e_log_cb_enable);
417 e_dbus_interface_method_add(buf->iface, "Disable", "", "", _e_log_cb_disable);
418 e_dbus_interface_method_add(buf->iface, "Dump", "s", "", _e_log_cb_dump);
420 e_msgbus_interface_attach(buf->iface);
422 buf->h = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY, _e_log_cb_prop, NULL);
423 buf->a = ecore_x_atom_get("_E_LOG");
425 e_logbuf_type = ELBT_ALL;
431 e_logbuf_shutdown(void)
433 _e_logbuf_shutdown();