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 20
53 #define MAX_LOG_STR_SIZE 80
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_TRACE: return "TRACE"; break;
238 case ELBT_ALL: return "ALL"; break;
251 fprintf(fp, "%38.38s|0x%08x|%s\n",
254 fprintf(fp, "%49.49s|%s\n",
260 fprintf(fp, "%5d|%20.20s|%5d|%5.5s|0x%08x|%s\n",
261 m->num, m->func, m->line,
262 _type_name_get(m->type), m->id, m->str);
264 fprintf(fp, "%5d|%20.20s|%5d|%5.5s|%10.10s|%s\n",
265 m->num, m->func, m->line,
266 _type_name_get(m->type), "", m->str);
271 _e_log_dump(FILE *fp)
273 Eina_List *l = NULL, *ll = NULL;
275 unsigned int idx = 0;
276 if ((!buf) || (!fp)) return;
278 ll = eina_list_nth_list(buf->list, buf->cur);
279 EINA_LIST_FOREACH(ll, l, msg)
284 EINA_LIST_FOREACH(buf->list, l, msg)
286 if (msg->num < idx) break;
290 fprintf(fp, "Total:%d Num:%d\n", eina_list_count(buf->list), buf->num);
295 _e_log_cb_enable(E_DBus_Object *obj __UNUSED__,
298 e_logbuf_type = ELBT_ALL;
299 return dbus_message_new_method_return(msg);
303 _e_log_cb_disable(E_DBus_Object *obj __UNUSED__,
306 e_logbuf_type = ELBT_NONE;
307 return dbus_message_new_method_return(msg);
311 _e_log_cb_dump(E_DBus_Object *obj __UNUSED__,
315 const char *path = NULL;
318 dbus_error_init(&err);
319 if (!dbus_message_get_args(msg, &err,
320 DBUS_TYPE_STRING, &path,
324 "could not get Log.Dump arguments: %s: %s",
325 err.name, err.message);
326 dbus_error_free(&err);
332 Eina_Bool pts = EINA_FALSE;
333 if (strstr(path, "/dev/pts/"))
336 fp = fopen(path, "w");
349 buf->pts = EINA_TRUE;
356 "dump log messages to file:%s\n",
362 return dbus_message_new_method_return(msg);
366 _e_log_cb_prop(void *data __UNUSED__,
370 Ecore_X_Event_Window_Property *ev = event;
374 if (!ev) return ECORE_CALLBACK_PASS_ON;
375 if (!ev->atom) return ECORE_CALLBACK_PASS_ON;
376 if (!buf) return ECORE_CALLBACK_PASS_ON;
377 if (ev->atom != buf->a) return ECORE_CALLBACK_PASS_ON;
379 path = ecore_x_window_prop_string_get(ev->win, ev->atom);
380 if (!path) return ECORE_CALLBACK_PASS_ON;
382 fp = fopen(path, "w");
383 if (!fp) return ECORE_CALLBACK_PASS_ON;
389 buf->pts = EINA_FALSE;
393 "dump log messages to file:%s\n",
397 return ECORE_CALLBACK_PASS_ON;
403 _e_logbuf_shutdown();
405 buf = E_NEW(E_Logbuf, 1);
408 buf->iface = e_dbus_interface_new("org.enlightenment.wm.Log");
411 fprintf(stderr, "Cannot add org.enlightenment.wm.Log interface\n");
412 memset(buf, 0, sizeof(E_Logbuf));
417 e_dbus_interface_method_add(buf->iface, "Enable", "", "", _e_log_cb_enable);
418 e_dbus_interface_method_add(buf->iface, "Disable", "", "", _e_log_cb_disable);
419 e_dbus_interface_method_add(buf->iface, "Dump", "s", "", _e_log_cb_dump);
421 e_msgbus_interface_attach(buf->iface);
423 buf->h = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY, _e_log_cb_prop, NULL);
424 buf->a = ecore_x_atom_get("_E_LOG");
426 e_logbuf_type = ELBT_ALL;
432 e_logbuf_shutdown(void)
434 _e_logbuf_shutdown();