convert from svn repository: remove tags directory
[lttv.git] / trunk / lttng-xenomai / LinuxTraceToolkitViewer-0.8.61-xenoltt / lttv / modules / gui / xenoltt / xenoltt_drawing.c
CommitLineData
03d7fdf3 1/* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2003-2004 Mathieu Desnoyers
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License Version 2 as
6 * published by the Free Software Foundation;
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
16 * MA 02111-1307, USA.
17 */
18
19#ifdef HAVE_CONFIG_H
20#include <config.h>
21#endif
22
23#include <gtk/gtk.h>
24#include <gdk/gdk.h>
25#include <string.h>
26
27#include <ltt/trace.h>
28
29#include <lttv/lttv.h>
30#include <lttv/tracecontext.h>
31#include <lttvwindow/lttvwindow.h>
32#include <lttv/state.h>
33#include <lttv/hook.h>
34
35#include "xenoltt_drawing.h"
36#include "xenoltt_eventhooks.h"
37#include "xfv.h"
38
39#define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format)
40#define g_debug(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format)
41
42//FIXME
43// fixed #define TRACE_NUMBER 0
44#define EXTRA_ALLOC 1024 // pixels
45
46
47// { 0, 0xFFFF, 0xFFFF, 0x0000 }, /* COL_WAIT_CPU : yellow */
48// { 0, 0xFFFF, 0xA000, 0xFCFF }, /* COL_EXIT : pale magenta */
49// { 0, 0xFFFF, 0x0000, 0xFFFF }, /* COL_ZOMBIE : purple */
50// { 0, 0xFFFF, 0x0000, 0x0000 }, /* COL_WAIT : red */
51// { 0, 0x8800, 0xFFFF, 0x8A00 }, /* COL_USER_MODE : pale green */
52// { 0, 0x09FF, 0x01FF, 0xFFFF }, /* COL_SYSCALL : blue */
53// { 0, 0xF900, 0x4200, 0xFF00 }, /* COL_TRAP : pale purple */
54
55
56GdkColor drawing_colors[NUM_COLORS] =
57{ /* Pixel, R, G, B */
58 { 0, 0, 0, 0 }, /* COL_BLACK */
59 { 0, 0xFFFF, 0xFFFF, 0xFFFF }, /* COL_WHITE */
60 { 0, 0x0000, 0xFF00, 0x0000 }, /* COL_RUN_USER_MODE : green */
61 { 0, 0x0100, 0x9E00, 0xFFFF }, /* COL_RUN_SYSCALL : pale blue */
62 { 0, 0xFF00, 0xFF00, 0x0100 }, /* COL_RUN_TRAP : yellow */
63 { 0, 0xFFFF, 0x5E00, 0x0000 }, /* COL_RUN_IRQ : orange */
64 { 0, 0xFFFF, 0x9400, 0x9600 }, /* COL_RUN_SOFT_IRQ : pink */
65 { 0, 0xFFFF, 0x0000, 0x0000 }, /* COL_WAIT : red */
66// { 0, 0x6600, 0x0000, 0x0000 }, /* COL_WAIT : dark red */
67 { 0, 0x7700, 0x7700, 0x0000 }, /* COL_WAIT_CPU : dark yellow */
68 { 0, 0x6400, 0x0000, 0x5D00 }, /* COL_ZOMBIE : dark purple */
69 { 0, 0x0700, 0x6400, 0x0000 }, /* COL_WAIT_FORK : dark green */
70 { 0, 0x8900, 0x0000, 0x8400 }, /* COL_EXIT : "less dark" magenta */
71 { 0, 0xFFFF, 0xFFFF, 0xFFFF }, /* COL_MODE_UNKNOWN : white */
72 { 0, 0xFFFF, 0xFFFF, 0xFFFF } /* COL_UNNAMED : white */
73
74};
75
76/*
77RUN+USER MODE green
78RUN+SYSCALL
79RUN+TRAP
80RUN+IRQ
81WAIT+fonc�
82WAIT CPU + WAIT FORK vert fonc� ou jaune
83IRQ rouge
84TRAP: orange
85SYSCALL: bleu p�le
86
87ZOMBIE + WAIT EXIT
88*/
89
90
91/*****************************************************************************
92 * drawing functions *
93 *****************************************************************************/
94
95static gboolean
96expose_ruler( GtkWidget *widget, GdkEventExpose *event, gpointer user_data );
97
98static gboolean
99motion_notify_ruler(GtkWidget *widget, GdkEventMotion *event, gpointer user_data);
100
101
102/* Function responsible for updating the exposed area.
103 * It must do an events request to the lttvwindow API to ask for this update.
104 * Note : this function cannot clear the background, because it may
105 * erase drawing already present (SAFETY).
106 */
107void drawing_data_request(XenoLtt_Drawing_t *drawing,
108 gint x, gint y,
109 gint width,
110 gint height)
111{
112 if(width < 0) return ;
113 if(height < 0) return ;
114
115 Tab *tab = drawing->xenoltt_data->tab;
116 TimeWindow time_window = lttvwindow_get_time_window(tab);
117
118
119 XenoLTTData *xenoltt_data = drawing->xenoltt_data;
120
121 LttTime start, time_end;
122 LttTime window_end = time_window.end_time;
123
124 g_debug("req : window start_time : %lu, %lu", time_window.start_time.tv_sec,
125 time_window.start_time.tv_nsec);
126
127 g_debug("req : window time width : %lu, %lu", time_window.time_width.tv_sec,
128 time_window.time_width.tv_nsec);
129
130 g_debug("req : window_end : %lu, %lu", window_end.tv_sec,
131 window_end.tv_nsec);
132
133 g_debug("xenoltt: x is : %i, x+width is : %i", x, x+width);
134
135 convert_pixels_to_time(drawing->width, x,time_window,&start);
136
137 convert_pixels_to_time(drawing->width, x+width,time_window,&time_end);
138
139 time_end = ltt_time_add(time_end, ltt_time_one); // because main window
140 // doesn't deliver end time.
141
142 lttvwindow_events_request_remove_all(tab,xenoltt_data);
143
144 {
145 /* find the tracehooks */
146 LttvTracesetContext *tsc = lttvwindow_get_traceset_context(tab);
147
148 LttvTraceset *traceset = tsc->ts;
149
150 guint i, k, l, nb_trace;
151
152 LttvTraceState *ts;
153
154 LttvTracefileState *tfs;
155
156 GArray *hooks;
157
158 LttvTraceHook *hook;
159
160 LttvTraceHookByFacility *thf;
161
162 guint ret;
163 gint before_hn, after_hn, icons_hn;
164
165 nb_trace = lttv_traceset_number(traceset);
166 // FIXME (fixed) : eventually request for more traces
167 for(i = 0 ; i < nb_trace ; i++) {
168 //for(i = 0; i<MIN(TRACE_NUMBER+1, nb_trace);i++) {
169 EventsRequest *events_request = g_new(EventsRequest, 1);
170 // Create the hooks
171 //LttvHooks *event = lttv_hooks_new();
172 LttvHooksById *event_by_id = lttv_hooks_by_id_new();
173 LttvHooks *before_chunk_traceset = lttv_hooks_new();
174 LttvHooks *after_chunk_traceset = lttv_hooks_new();
175 LttvHooks *before_request_hook = lttv_hooks_new();
176 LttvHooks *after_request_hook = lttv_hooks_new();
177
178 lttv_hooks_add(before_chunk_traceset,
179 xenoltt_before_chunk,
180 events_request,
181 LTTV_PRIO_DEFAULT);
182
183 lttv_hooks_add(after_chunk_traceset,
184 xenoltt_after_chunk,
185 events_request,
186 LTTV_PRIO_DEFAULT);
187
188 lttv_hooks_add(before_request_hook,
189 xenoltt_before_request,
190 events_request,
191 LTTV_PRIO_DEFAULT);
192
193 lttv_hooks_add(after_request_hook,
194 xenoltt_after_request,
195 events_request,
196 LTTV_PRIO_DEFAULT);
197
198 ts = (LttvTraceState *)tsc->traces[i];
199
200 /* Find the eventtype id for the following events and register the
201 associated by id hooks. */
202
203 hooks = g_array_new(FALSE, FALSE, sizeof(LttvTraceHook));
204 hooks = g_array_set_size(hooks, 36);
205 before_hn = after_hn = icons_hn = 0;
206
207 /* before hooks */
208
209 /* Xenomai Thread Period Setting */
210/* ret = lttv_trace_find_hook(ts->parent.t,
211 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_THREAD_SET_PERIOD,
212 LTT_FIELD_XENOLTT_NAME, LTT_FIELD_XENOLTT_ADDRESS, LTT_FIELD_XENOLTT_PERIOD,
213 xenoltt_thread_set_period,
214 events_request,
215 &g_array_index(hooks, LttvTraceHook, before_hn++));
216 if(ret) before_hn--;
217*/
218 /* Xenomai Thread Start Statement */
219 ret = lttv_trace_find_hook(ts->parent.t,
220 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_THREAD_START,
221 LTT_FIELD_XENOLTT_ADDRESS, 0, 0,
222 xenoltt_before_thread_hook,
223 events_request,
224 &g_array_index(hooks, LttvTraceHook, before_hn++));
225 if(ret) before_hn--;
226
227 /* Xenomai Thread Switch Statement */
228 ret = lttv_trace_find_hook(ts->parent.t,
229 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_THREAD_SWITCH,
230 LTT_FIELD_XENOLTT_ADDRESS, LTT_FIELD_XENOLTT_ADDRESS_OUT, 0,
231 xenoltt_before_thread_hook,
232 events_request,
233 &g_array_index(hooks, LttvTraceHook, before_hn++));
234 if(ret) before_hn--;
235
236 /* Xenomai Thread Switch Statement */
237 ret = lttv_trace_find_hook(ts->parent.t,
238 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_THREAD_SWITCH,
239 LTT_FIELD_XENOLTT_ADDRESS, LTT_FIELD_XENOLTT_ADDRESS_OUT, 0,
240 xenoltt_before_thread_switch_hook,
241 events_request,
242 &g_array_index(hooks, LttvTraceHook, before_hn++));
243 if(ret) before_hn--;
244
245 /* Xenomai Thread Resume Statement */
246 ret = lttv_trace_find_hook(ts->parent.t,
247 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_THREAD_RESUME,
248 LTT_FIELD_XENOLTT_ADDRESS, 0, 0,
249 xenoltt_before_thread_hook,
250 events_request,
251 &g_array_index(hooks, LttvTraceHook, before_hn++));
252 if(ret) before_hn--;
253
254 /* Xenomai Thread Suspend Statement */
255 ret = lttv_trace_find_hook(ts->parent.t,
256 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_THREAD_SUSPEND,
257 LTT_FIELD_XENOLTT_ADDRESS, 0, 0,
258 xenoltt_before_thread_hook,
259 events_request,
260 &g_array_index(hooks, LttvTraceHook, before_hn++));
261 if(ret) before_hn--;
262
263 /* Xenomai Thread Wait Period Statement */
264 ret = lttv_trace_find_hook(ts->parent.t,
265 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_THREAD_WAIT_PERIOD,
266 LTT_FIELD_XENOLTT_ADDRESS, 0, 0,
267 xenoltt_before_thread_hook,
268 events_request,
269 &g_array_index(hooks, LttvTraceHook, before_hn++));
270 if(ret) before_hn--;
271
272 /* Xenomai Thread Unblock Statement */
273 ret = lttv_trace_find_hook(ts->parent.t,
274 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_THREAD_UNBLOCK,
275 LTT_FIELD_XENOLTT_ADDRESS, 0, 0,
276 xenoltt_before_thread_hook,
277 events_request,
278 &g_array_index(hooks, LttvTraceHook, before_hn++));
279 if(ret) before_hn--;
280
281 /* Xenomai Thread Delete Statement */
282 ret = lttv_trace_find_hook(ts->parent.t,
283 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_THREAD_DELETE,
284 LTT_FIELD_XENOLTT_ADDRESS, 0, 0,
285 xenoltt_before_thread_hook,
286 events_request,
287 &g_array_index(hooks, LttvTraceHook, before_hn++));
288 if(ret) before_hn--;
289
290 /* Xenomai Timer Tick */
291 ret = lttv_trace_find_hook(ts->parent.t,
292 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_TIMER_TICK,
293 LTT_FIELD_XENOLTT_ADDRESS, 0, 0,
294 xenoltt_before_thread_hook,
295 events_request,
296 &g_array_index(hooks, LttvTraceHook, before_hn++));
297 if(ret) before_hn--;
298
299 /* Xenomai Mutex/Semaphore owner setting */
300 ret = lttv_trace_find_hook(ts->parent.t,
301 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_SYNCH_SET_OWNER,
302 LTT_FIELD_XENOLTT_ADDRESS, 0, 0,
303 xenoltt_before_thread_hook,
304 events_request,
305 &g_array_index(hooks, LttvTraceHook, before_hn++));
306 if(ret) before_hn--;
307
308 /* Xenomai Mutex/Semaphore owner setting */
309 ret = lttv_trace_find_hook(ts->parent.t,
310 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_SYNCH_WAKEUP1,
311 LTT_FIELD_XENOLTT_ADDRESS, 0, 0,
312 xenoltt_before_thread_hook,
313 events_request,
314 &g_array_index(hooks, LttvTraceHook, before_hn++));
315 if(ret) before_hn--;
316
317 /* Xenomai Mutex/Semaphore owner setting */
318 ret = lttv_trace_find_hook(ts->parent.t,
319 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_SYNCH_WAKEUPX,
320 LTT_FIELD_XENOLTT_ADDRESS, 0, 0,
321 xenoltt_before_thread_hook,
322 events_request,
323 &g_array_index(hooks, LttvTraceHook, before_hn++));
324 if(ret) before_hn--;
325
326 /* Xenomai Mutex/Semaphore owner setting */
327 ret = lttv_trace_find_hook(ts->parent.t,
328 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_SYNCH_UNLOCK,
329 LTT_FIELD_XENOLTT_ADDRESS, 0, 0,
330 xenoltt_before_thread_hook,
331 events_request,
332 &g_array_index(hooks, LttvTraceHook, before_hn++));
333 if(ret) before_hn--;
334
335 /* Xenomai sleeping on a mutex */
336 ret = lttv_trace_find_hook(ts->parent.t,
337 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_SYNCH_SLEEP_ON,
338 LTT_FIELD_XENOLTT_ADDRESS, 0, 0,
339 xenoltt_before_thread_hook,
340 events_request,
341 &g_array_index(hooks, LttvTraceHook, before_hn++));
342 if(ret) before_hn--;
343
344 /******************** after hooks **********************************/
345
346 after_hn = before_hn;
347
348 /* Xenomai Thread Initialization */
349 ret = lttv_trace_find_hook(ts->parent.t,
350 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_THREAD_INIT,
351 LTT_FIELD_XENOLTT_NAME, LTT_FIELD_XENOLTT_ADDRESS, LTT_FIELD_XENOLTT_PRIO,
352 xenoltt_thread_init,
353 events_request,
354 &g_array_index(hooks, LttvTraceHook, after_hn++));
355 if(ret) after_hn--;
356
357 /* Xenomai Thread Initialization , first event of each thread */
358 ret = lttv_trace_find_hook(ts->parent.t,
359 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_THREAD_INIT,
360 LTT_FIELD_XENOLTT_ADDRESS, 0, 0,
361 xenoltt_after_thread_hook,
362 events_request,
363 &g_array_index(hooks, LttvTraceHook, after_hn++));
364 if(ret) after_hn--;
365
366 /******************** icons hooks **********************************/
367
368 icons_hn = after_hn;
369
370 /* Xenomai Thread Initialization */
371 ret = lttv_trace_find_hook(ts->parent.t,
372 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_THREAD_INIT,
373 LTT_FIELD_XENOLTT_NAME, LTT_FIELD_XENOLTT_ADDRESS, 0,
374 xenoltt_draw_icons,
375 events_request,
376 &g_array_index(hooks, LttvTraceHook, icons_hn++));
377 if(ret) icons_hn--;
378
379 /* Xenomai Thread Delete */
380 ret = lttv_trace_find_hook(ts->parent.t,
381 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_THREAD_DELETE,
382 LTT_FIELD_XENOLTT_NAME, LTT_FIELD_XENOLTT_ADDRESS, 0,
383 xenoltt_draw_icons,
384 events_request,
385 &g_array_index(hooks, LttvTraceHook, icons_hn++));
386 if(ret) icons_hn--;
387
388 /* Xenomai Thread Set Period */
389 ret = lttv_trace_find_hook(ts->parent.t,
390 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_THREAD_SET_PERIOD,
391 LTT_FIELD_XENOLTT_NAME, LTT_FIELD_XENOLTT_ADDRESS, LTT_FIELD_XENOLTT_PERIOD,
392 xenoltt_draw_icons,
393 events_request,
394 &g_array_index(hooks, LttvTraceHook, icons_hn++));
395 if(ret) icons_hn--;
396
397 /* Xenomai TIMER TICK */
398 ret = lttv_trace_find_hook(ts->parent.t,
399 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_TIMER_TICK,
400 LTT_FIELD_XENOLTT_NAME, LTT_FIELD_XENOLTT_ADDRESS, 0,
401 xenoltt_draw_icons,
402 events_request,
403 &g_array_index(hooks, LttvTraceHook, icons_hn++));
404 if(ret) icons_hn--;
405
406 /* Xenomai Thread Renice */
407 ret = lttv_trace_find_hook(ts->parent.t,
408 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_THREAD_RENICE,
409 LTT_FIELD_XENOLTT_NAME, LTT_FIELD_XENOLTT_ADDRESS, LTT_FIELD_XENOLTT_PRIO,
410 xenoltt_draw_icons,
411 events_request,
412 &g_array_index(hooks, LttvTraceHook, icons_hn++));
413 if(ret) icons_hn--;
414
415 /* Xenomai Thread Missed period */
416 ret = lttv_trace_find_hook(ts->parent.t,
417 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_THREAD_MISSED_PERIOD,
418 LTT_FIELD_XENOLTT_NAME, LTT_FIELD_XENOLTT_ADDRESS, LTT_FIELD_XENOLTT_OVERRUNS,
419 xenoltt_draw_icons,
420 events_request,
421 &g_array_index(hooks, LttvTraceHook, icons_hn++));
422 if(ret) icons_hn--;
423
424 /* Xenomai Mutex/Semaphore owner setting */
425 ret = lttv_trace_find_hook(ts->parent.t,
426 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_SYNCH_SET_OWNER,
427 LTT_FIELD_XENOLTT_NAME, LTT_FIELD_XENOLTT_ADDRESS, LTT_FIELD_XENOLTT_SYNCH,
428 xenoltt_draw_icons,
429 events_request,
430 &g_array_index(hooks, LttvTraceHook, icons_hn++));
431 if(ret) icons_hn--;
432
433 /* Xenomai Mutex/Semaphore owner setting */
434 ret = lttv_trace_find_hook(ts->parent.t,
435 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_SYNCH_WAKEUP1,
436 LTT_FIELD_XENOLTT_NAME, LTT_FIELD_XENOLTT_ADDRESS, LTT_FIELD_XENOLTT_SYNCH,
437 xenoltt_draw_icons,
438 events_request,
439 &g_array_index(hooks, LttvTraceHook, icons_hn++));
440 if(ret) icons_hn--;
441
442 /* Xenomai Mutex/Semaphore owner setting */
443 ret = lttv_trace_find_hook(ts->parent.t,
444 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_SYNCH_WAKEUPX,
445 LTT_FIELD_XENOLTT_NAME, LTT_FIELD_XENOLTT_ADDRESS, LTT_FIELD_XENOLTT_SYNCH,
446 xenoltt_draw_icons,
447 events_request,
448 &g_array_index(hooks, LttvTraceHook, icons_hn++));
449 if(ret) icons_hn--;
450
451 /* Xenomai Mutex/Semaphore owner setting */
452 ret = lttv_trace_find_hook(ts->parent.t,
453 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_SYNCH_SLEEP_ON,
454 LTT_FIELD_XENOLTT_NAME, LTT_FIELD_XENOLTT_ADDRESS, LTT_FIELD_XENOLTT_SYNCH,
455 xenoltt_draw_icons,
456 events_request,
457 &g_array_index(hooks, LttvTraceHook, icons_hn++));
458 if(ret) icons_hn--;
459
460 /* Xenomai Mutex/Semaphore owner setting */
461 ret = lttv_trace_find_hook(ts->parent.t,
462 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_SYNCH_UNLOCK,
463 LTT_FIELD_XENOLTT_NAME, LTT_FIELD_XENOLTT_ADDRESS, LTT_FIELD_XENOLTT_SYNCH,
464 xenoltt_draw_icons,
465 events_request,
466 &g_array_index(hooks, LttvTraceHook, icons_hn++));
467 if(ret) icons_hn--;
468
469 hooks = g_array_set_size(hooks, icons_hn);
470
471 /* Add these hooks to each event_by_id hooks list */
472 /* add before */
473 for(k = 0 ; k < before_hn ; k++) {
474 hook = &g_array_index(hooks, LttvTraceHook, k);
475 for(l=0;l<hook->fac_list->len;l++) {
476 thf = g_array_index(hook->fac_list, LttvTraceHookByFacility*, l);
477 lttv_hooks_add(lttv_hooks_by_id_find(event_by_id, thf->id),
478 thf->h,
479 thf,
480 LTTV_PRIO_STATE-5);
481 }
482 }
483
484 /* add after */
485 for(k = before_hn ; k < after_hn ; k++) {
486 hook = &g_array_index(hooks, LttvTraceHook, k);
487 for(l=0;l<hook->fac_list->len;l++) {
488 thf = g_array_index(hook->fac_list, LttvTraceHookByFacility*, l);
489 lttv_hooks_add(lttv_hooks_by_id_find(event_by_id, thf->id),
490 thf->h,
491 thf,
492 LTTV_PRIO_STATE+5);
493 }
494 }
495
496 /* add icons/text */
497 for(k = after_hn ; k < icons_hn ; k++) {
498 hook = &g_array_index(hooks, LttvTraceHook, k);
499 for(l=0;l<hook->fac_list->len;l++) {
500 thf = g_array_index(hook->fac_list, LttvTraceHookByFacility*, l);
501 lttv_hooks_add(lttv_hooks_by_id_find(event_by_id, thf->id),
502 thf->h,
503 thf,
504 LTTV_PRIO_STATE+4);
505 }
506 }
507
508 events_request->hooks = hooks;
509
510 // Fill the events request
511 events_request->owner = xenoltt_data;
512 events_request->viewer_data = xenoltt_data;
513 events_request->servicing = FALSE;
514 events_request->start_time = start;
515 events_request->start_position = NULL;
516 events_request->stop_flag = FALSE;
517 events_request->end_time = time_end;
518 events_request->num_events = G_MAXUINT;
519 events_request->end_position = NULL;
520 events_request->trace = i; //fixed /* FIXME */
521 events_request->before_chunk_traceset = before_chunk_traceset;
522 events_request->before_chunk_trace = NULL;
523 events_request->before_chunk_tracefile = NULL;
524 events_request->event = NULL;
525 events_request->event_by_id = event_by_id;
526 events_request->after_chunk_tracefile = NULL;
527 events_request->after_chunk_trace = NULL;
528 events_request->after_chunk_traceset = after_chunk_traceset;
529 events_request->before_request = before_request_hook;
530 events_request->after_request = after_request_hook;
531
532 g_debug("req : start : %lu, %lu", start.tv_sec,
533 start.tv_nsec);
534
535 g_debug("req : end : %lu, %lu", time_end.tv_sec,
536 time_end.tv_nsec);
537
538 lttvwindow_events_request(tab, events_request);
539
540 }
541 }
542}
543
544
545static void set_last_start(gpointer key, gpointer value, gpointer user_data)
546{
547 XenoThreadInfo *thread_info = (XenoThreadInfo*)key;
548 HashedThreadData *hashed_thread_data = (HashedThreadData*)value;
549 guint x = (guint)user_data;
550
551 hashed_thread_data->x.over = x;
552 hashed_thread_data->x.over_used = FALSE;
553 hashed_thread_data->x.over_marked = FALSE;
554 hashed_thread_data->x.middle = x;
555 hashed_thread_data->x.middle_used = FALSE;
556 hashed_thread_data->x.middle_marked = FALSE;
557 hashed_thread_data->x.under = x;
558 hashed_thread_data->x.under_used = FALSE;
559 hashed_thread_data->x.under_marked = FALSE;
560 hashed_thread_data->next_good_time = ltt_time_zero;
561
562 return;
563}
564
565void drawing_data_request_begin(EventsRequest *events_request, LttvTracesetState *tss)
566{
567 g_debug("XENOLTT - Begin of data request");
568 XenoLTTData *cfd = events_request->viewer_data;
569 LttvTracesetContext *tsc = LTTV_TRACESET_CONTEXT(tss);
570 TimeWindow time_window =
571 lttvwindow_get_time_window(cfd->tab);
572
573 guint width = cfd->drawing->width;
574 guint x=0;
575
576 cfd->drawing->last_start = events_request->start_time;
577
578 convert_time_to_pixels(
579 time_window,
580 events_request->start_time,
581 width,
582 &x);
583
584 g_hash_table_foreach(cfd->thread_list->thread_hash, set_last_start,
585 (gpointer)x);
586
587}
588
589void drawing_chunk_begin(EventsRequest *events_request, LttvTracesetState *tss)
590{
591 g_debug("Begin of chunk");
592 XenoLTTData *cfd = events_request->viewer_data;
593 LttvTracesetContext *tsc = &tss->parent.parent;
594 //LttTime current_time = lttv_traceset_context_get_current_tfc(tsc)->timestamp;
595 guint i;
596 LttvTraceset *traceset = tsc->ts;
597 guint nb_trace = lttv_traceset_number(traceset);
598
599 if(!cfd->thread_list->current_hash_data) {
600 cfd->thread_list->current_hash_data = g_new(HashedThreadData**,nb_trace);
601 for(i = 0 ; i < nb_trace ; i++) {
602 guint num_cpu = ltt_trace_get_num_cpu(tss->parent.traces[i]->t);
603 cfd->thread_list->current_hash_data[i] = g_new(HashedThreadData*,num_cpu);
604 memset(cfd->thread_list->current_hash_data[i], 0,
605 sizeof(HashedThreadData*)*num_cpu);
606 }
607 }
608}
609
610
611void drawing_request_expose(EventsRequest *events_request,
612 LttvTracesetState *tss,
613 LttTime end_time)
614{
615 gint x, width;
616 guint x_end;
617
618 XenoLTTData *cfd = events_request->viewer_data;
619 LttvTracesetContext *tsc = (LttvTracesetContext*)tss;
620 XenoLtt_Drawing_t *drawing = cfd->drawing;
621
622 TimeWindow time_window =
623 lttvwindow_get_time_window(cfd->tab);
624
625 g_debug("request expose");
626
627 convert_time_to_pixels(
628 time_window,
629 end_time,
630 drawing->width,
631 &x_end);
632 x = drawing->damage_begin;
633
634 width = x_end - x;
635
636 drawing->damage_begin = x+width;
637
638 // FIXME ?
639 gtk_widget_queue_draw_area ( drawing->drawing_area,
640 x, 0,
641 width, drawing->drawing_area->allocation.height);
642
643 /* Update directly when scrolling */
644 gdk_window_process_updates(drawing->drawing_area->window,
645 TRUE);
646}
647
648
649/* Callbacks */
650
651
652/* Create a new backing pixmap of the appropriate size */
653/* As the scaling will always change, it's of no use to copy old
654 * pixmap.
655 *
656 * Only change the size if width changes. The height is specified and changed
657 * when process ID are added or removed from the process list.
658 */
659static gboolean
660configure_event( GtkWidget *widget, GdkEventConfigure *event,
661 gpointer user_data)
662{
663 XenoLtt_Drawing_t *drawing = (XenoLtt_Drawing_t *)user_data;
664
665
666 /* First, get the new time interval of the main window */
667 /* we assume (see documentation) that the main window
668 * has updated the time interval before this configure gets
669 * executed.
670 */
671 //lttvwindow_get_time_window(drawing->xenoltt_data->mw,
672 // &drawing->xenoltt_data->time_window);
673
674 /* New pixmap, size of the configure event */
675 //GdkPixmap *pixmap = gdk_pixmap_new(widget->window,
676 // widget->allocation.width + SAFETY,
677 // widget->allocation.height + SAFETY,
678 // -1);
679
680 if(widget->allocation.width != drawing->width) {
681 g_debug("drawing configure event");
682 g_debug("New alloc draw size : %i by %i",widget->allocation.width,
683 widget->allocation.height);
684
685 drawing->width = widget->allocation.width;
686
687 if(drawing->alloc_width < widget->allocation.width) {
688 //if(drawing->pixmap)
689 // gdk_pixmap_unref(drawing->pixmap);
690
691 //drawing->pixmap = gdk_pixmap_new(widget->window,
692 // drawing->width + SAFETY + EXTRA_ALLOC,
693 // drawing->height + EXTRA_ALLOC,
694 // -1);
695 drawing->alloc_width = drawing->width + SAFETY + EXTRA_ALLOC;
696 drawing->alloc_height = drawing->height + EXTRA_ALLOC;
697 update_pixmap_size(drawing->xenoltt_data->thread_list,
698 drawing->alloc_width);
699 update_index_to_pixmap(drawing->xenoltt_data->thread_list);
700 }
701 //drawing->height = widget->allocation.height;
702
703 //ProcessList_get_height
704 // (GuiControlFlow_get_thread_list(drawing->xenoltt_data)),
705
706
707 // Clear the image
708 //gdk_draw_rectangle (drawing->pixmap,
709 // widget->style->black_gc,
710 // TRUE,
711 // 0, 0,
712 // drawing->width+SAFETY,
713 // drawing->height);
714
715 //g_info("init data request");
716
717
718 /* Initial data request */
719 /* no, do initial data request in the expose event */
720 // Do not need to ask for data of 1 pixel : not synchronized with
721 // main window time at this moment.
722 //drawing_data_request(drawing, &drawing->pixmap, 0, 0,
723 // widget->allocation.width,
724 // widget->allocation.height);
725
726 //drawing->width = widget->allocation.width;
727 //drawing->height = widget->allocation.height;
728
729 drawing->damage_begin = 0;
730 drawing->damage_end = widget->allocation.width;
731
732 if((widget->allocation.width != 1 &&
733 widget->allocation.height != 1)
734 && drawing->damage_begin < drawing->damage_end)
735 {
736
737 rectangle_pixmap (drawing->xenoltt_data->thread_list,
738 drawing->drawing_area->style->black_gc,
739 TRUE,
740 0, 0,
741 drawing->alloc_width, // do not overlap
742 -1);
743
744
745 drawing_data_request(drawing,
746 drawing->damage_begin,
747 0,
748 drawing->damage_end - drawing->damage_begin,
749 drawing->height);
750 }
751 }
752 return TRUE;
753}
754
755
756/* Redraw the screen from the backing pixmap */
757static gboolean
758expose_event( GtkWidget *widget, GdkEventExpose *event, gpointer user_data )
759{
760 XenoLtt_Drawing_t *drawing = (XenoLtt_Drawing_t *)user_data;
761
762 XenoLTTData *xenoltt_data =
763 (XenoLTTData*)g_object_get_data(
764 G_OBJECT(widget),
765 "xenoltt_data");
766#if 0
767 if(unlikely(drawing->gc == NULL)) {
768 drawing->gc = gdk_gc_new(drawing->drawing_area->window);
769 gdk_gc_copy(drawing->gc, drawing->drawing_area->style->black_gc);
770 }
771#endif //0
772 TimeWindow time_window =
773 lttvwindow_get_time_window(xenoltt_data->tab);
774 LttTime current_time =
775 lttvwindow_get_current_time(xenoltt_data->tab);
776
777 guint cursor_x=0;
778
779 LttTime window_end = time_window.end_time;
780
781 /* update the screen from the pixmap buffer */
782#if 0
783 gdk_draw_pixmap(widget->window,
784 widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
785 drawing->pixmap,
786 event->area.x, event->area.y,
787 event->area.x, event->area.y,
788 event->area.width, event->area.height);
789#endif //0
790 drawing->height = threadlist_get_height(xenoltt_data->thread_list);
791#if 0
792 copy_pixmap_to_screen(xenoltt_data->thread_list,
793 widget->window,
794 widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
795 event->area.x, event->area.y,
796 event->area.width, event->area.height);
797#endif //0
798 copy_pixmap_to_screen(xenoltt_data->thread_list,
799 widget->window,
800 drawing->gc,
801 event->area.x, event->area.y,
802 event->area.width, event->area.height);
803
804
805 /* Erase the dotted lines left.. */
806 if(widget->allocation.height > drawing->height)
807 {
808 gdk_draw_rectangle (widget->window,
809 drawing->drawing_area->style->black_gc,
810 TRUE,
811 event->area.x, drawing->height,
812 event->area.width, // do not overlap
813 widget->allocation.height - drawing->height);
814 }
815 if(ltt_time_compare(time_window.start_time, current_time) <= 0 &&
816 ltt_time_compare(window_end, current_time) >= 0)
817 {
818 /* Draw the dotted lines */
819 convert_time_to_pixels(
820 time_window,
821 current_time,
822 drawing->width,
823 &cursor_x);
824
825#if 0
826 if(drawing->dotted_gc == NULL) {
827
828 drawing->dotted_gc = gdk_gc_new(drawing->drawing_area->window);
829 gdk_gc_copy(drawing->dotted_gc, widget->style->white_gc);
830
831 gint8 dash_list[] = { 1, 2 };
832 gdk_gc_set_line_attributes(drawing->dotted_gc,
833 1,
834 GDK_LINE_ON_OFF_DASH,
835 GDK_CAP_BUTT,
836 GDK_JOIN_MITER);
837 gdk_gc_set_dashes(drawing->dotted_gc,
838 0,
839 dash_list,
840 2);
841 }
842#endif //0
843 gint height_tot = MAX(widget->allocation.height, drawing->height);
844 gdk_draw_line(widget->window,
845 drawing->dotted_gc,
846 cursor_x, 0,
847 cursor_x, height_tot);
848 }
849 return FALSE;
850}
851
852static gboolean
853after_expose_event( GtkWidget *widget, GdkEventExpose *event, gpointer user_data )
854{
855 //g_assert(0);
856 g_debug("AFTER EXPOSE");
857
858 return FALSE;
859
860
861}
862
863#if 0
864void
865tree_row_activated(GtkTreeModel *treemodel,
866 GtkTreePath *arg1,
867 GtkTreeViewColumn *arg2,
868 gpointer user_data)
869{
870 XenoLTTData *cfd = (XenoLTTData*)user_data;
871 XenoLtt_Drawing_t *drawing = cfd->drawing;
872 GtkTreeView *treeview = cfd->thread_list->thread_list_widget;
873 gint *path_indices;
874 gint height;
875
876 path_indices = gtk_tree_path_get_indices (arg1);
877
878 height = get_cell_height(cfd->thread_list,
879 GTK_TREE_VIEW(treeview));
880 drawing->horizontal_sel = height * path_indices[0];
881 g_critical("new hor sel : %i", drawing->horizontal_sel);
882}
883#endif //0
884
885/* mouse click */
886static gboolean
887button_press_event( GtkWidget *widget, GdkEventButton *event, gpointer user_data )
888{
889 XenoLTTData *xenoltt_data =
890 (XenoLTTData*)g_object_get_data(
891 G_OBJECT(widget),
892 "xenoltt_data");
893 XenoLtt_Drawing_t *drawing = xenoltt_data->drawing;
894 TimeWindow time_window =
895 lttvwindow_get_time_window(xenoltt_data->tab);
896
897 g_debug("click");
898 if(event->button == 1)
899 {
900 LttTime time;
901
902 /* left mouse button click */
903 g_debug("x click is : %f", event->x);
904
905 convert_pixels_to_time(drawing->width, (guint)event->x,
906 time_window,
907 &time);
908
909 lttvwindow_report_current_time(xenoltt_data->tab, time);
910
911 }
912
913 return FALSE;
914}
915
916static gboolean
917scrollbar_size_allocate(GtkWidget *widget,
918 GtkAllocation *allocation,
919 gpointer user_data)
920{
921 XenoLtt_Drawing_t *drawing = (XenoLtt_Drawing_t *)user_data;
922
923 gtk_widget_set_size_request(drawing->padding, allocation->width, -1);
924 //gtk_widget_queue_resize(drawing->padding);
925 //gtk_widget_queue_resize(drawing->ruler);
926 gtk_container_check_resize(GTK_CONTAINER(drawing->ruler_hbox));
927 return 0;
928}
929
930
931
932XenoLtt_Drawing_t *xenoltt_drawing_construct(XenoLTTData *xenoltt_data)
933{
934 XenoLtt_Drawing_t *drawing = g_new(XenoLtt_Drawing_t , 1);
935
936 drawing->xenoltt_data = xenoltt_data;
937
938 drawing->vbox = gtk_vbox_new(FALSE, 1);
939
940
941 drawing->ruler_hbox = gtk_hbox_new(FALSE, 1);
942 drawing->ruler = gtk_drawing_area_new ();
943 //gtk_widget_set_size_request(drawing->ruler, -1, 27);
944
945 drawing->padding = gtk_drawing_area_new ();
946 //gtk_widget_set_size_request(drawing->padding, -1, 27);
947 gtk_box_pack_start(GTK_BOX(drawing->ruler_hbox), drawing->ruler,
948 TRUE, TRUE, 0);
949 gtk_box_pack_end(GTK_BOX(drawing->ruler_hbox), drawing->padding,
950 FALSE, FALSE, 0);
951
952
953
954 drawing->drawing_area = gtk_drawing_area_new ();
955
956 drawing->gc = NULL;
957
958 drawing->hbox = gtk_hbox_new(FALSE, 1);
959 drawing->viewport = gtk_viewport_new(NULL, xenoltt_data->v_adjust);
960 drawing->scrollbar = gtk_vscrollbar_new(xenoltt_data->v_adjust);
961 gtk_box_pack_start(GTK_BOX(drawing->hbox), drawing->viewport,
962 TRUE, TRUE, 0);
963 gtk_box_pack_end(GTK_BOX(drawing->hbox), drawing->scrollbar,
964 FALSE, FALSE, 0);
965
966 //drawing->scrolled_window =
967 // gtk_scrolled_window_new (NULL,
968 // xenoltt_data->v_adjust);
969
970 //gtk_scrolled_window_set_policy(
971 // GTK_SCROLLED_WINDOW(drawing->scrolled_window),
972 // GTK_POLICY_NEVER,
973 // GTK_POLICY_AUTOMATIC);
974
975 gtk_container_add(GTK_CONTAINER(drawing->viewport),
976 drawing->drawing_area);
977 //gtk_scrolled_window_add_with_viewport(
978 // GTK_SCROLLED_WINDOW(drawing->scrolled_window),
979 // drawing->drawing_area);
980
981 gtk_box_pack_start(GTK_BOX(drawing->vbox), drawing->ruler_hbox,
982 FALSE, FALSE, 0);
983 gtk_box_pack_end(GTK_BOX(drawing->vbox), drawing->hbox,
984 TRUE, TRUE, 0);
985
986 drawing->pango_layout =
987 gtk_widget_create_pango_layout(drawing->drawing_area, NULL);
988
989 drawing->height = 1;
990 drawing->width = 1;
991 drawing->depth = 0;
992 drawing->alloc_height = 1;
993 drawing->alloc_width = 1;
994
995 drawing->damage_begin = 0;
996 drawing->damage_end = 0;
997 drawing->horizontal_sel = -1;
998
999 //gtk_widget_set_size_request(drawing->drawing_area->window, 50, 50);
1000 g_object_set_data_full(
1001 G_OBJECT(drawing->drawing_area),
1002 "Link_drawing_Data",
1003 drawing,
1004 (GDestroyNotify)drawing_destroy);
1005
1006 g_object_set_data(
1007 G_OBJECT(drawing->ruler),
1008 "drawing",
1009 drawing);
1010
1011
1012 //gtk_widget_modify_bg( drawing->drawing_area,
1013 // GTK_STATE_NORMAL,
1014 // &CF_Colors[BLACK]);
1015
1016 //gdk_window_get_geometry(drawing->drawing_area->window,
1017 // NULL, NULL,
1018 // &(drawing->width),
1019 // &(drawing->height),
1020 // -1);
1021
1022 //drawing->pixmap = gdk_pixmap_new(
1023 // drawing->drawing_area->window,
1024 // drawing->width,
1025 // drawing->height,
1026 // drawing->depth);
1027
1028 //drawing->pixmap = NULL;
1029
1030// drawing->pixmap = gdk_pixmap_new(drawing->drawing_area->window,
1031// drawing->drawing_area->allocation.width,
1032// drawing->drawing_area->allocation.height,
1033// -1);
1034
1035 g_signal_connect (G_OBJECT(drawing->drawing_area),
1036 "configure_event",
1037 G_CALLBACK (configure_event),
1038 (gpointer)drawing);
1039
1040 g_signal_connect (G_OBJECT(drawing->ruler),
1041 "expose_event",
1042 G_CALLBACK(expose_ruler),
1043 (gpointer)drawing);
1044
1045 gtk_widget_add_events(drawing->ruler, GDK_POINTER_MOTION_MASK);
1046
1047 g_signal_connect (G_OBJECT(drawing->ruler),
1048 "motion-notify-event",
1049 G_CALLBACK(motion_notify_ruler),
1050 (gpointer)drawing);
1051
1052
1053 g_signal_connect (G_OBJECT(drawing->scrollbar),
1054 "size-allocate",
1055 G_CALLBACK(scrollbar_size_allocate),
1056 (gpointer)drawing);
1057
1058
1059
1060 g_signal_connect (G_OBJECT(drawing->drawing_area),
1061 "expose_event",
1062 G_CALLBACK (expose_event),
1063 (gpointer)drawing);
1064
1065 g_signal_connect_after (G_OBJECT(drawing->drawing_area),
1066 "expose_event",
1067 G_CALLBACK (after_expose_event),
1068 (gpointer)drawing);
1069
1070 g_signal_connect (G_OBJECT(drawing->drawing_area),
1071 "button-press-event",
1072 G_CALLBACK (button_press_event),
1073 (gpointer)drawing);
1074
1075
1076 gtk_widget_show(drawing->ruler);
1077 gtk_widget_show(drawing->padding);
1078 gtk_widget_show(drawing->ruler_hbox);
1079
1080 gtk_widget_show(drawing->drawing_area);
1081 //gtk_widget_show(drawing->scrolled_window);
1082 gtk_widget_show(drawing->viewport);
1083 gtk_widget_show(drawing->scrollbar);
1084 gtk_widget_show(drawing->hbox);
1085
1086 /* Allocate the colors */
1087 GdkColormap* colormap = gdk_colormap_get_system();
1088 gboolean success[NUM_COLORS];
1089 gdk_colormap_alloc_colors(colormap, drawing_colors, NUM_COLORS, FALSE,
1090 TRUE, success);
1091
1092 drawing->gc =
1093 gdk_gc_new(GDK_DRAWABLE(main_window_get_widget(xenoltt_data->tab)->window));
1094 drawing->dotted_gc =
1095 gdk_gc_new(GDK_DRAWABLE(main_window_get_widget(xenoltt_data->tab)->window));
1096
1097 gdk_gc_copy(drawing->gc,
1098 main_window_get_widget(xenoltt_data->tab)->style->black_gc);
1099 gdk_gc_copy(drawing->dotted_gc,
1100 main_window_get_widget(xenoltt_data->tab)->style->white_gc);
1101
1102 gint8 dash_list[] = { 1, 2 };
1103 gdk_gc_set_line_attributes(drawing->dotted_gc,
1104 1,
1105 GDK_LINE_ON_OFF_DASH,
1106 GDK_CAP_BUTT,
1107 GDK_JOIN_MITER);
1108 gdk_gc_set_dashes(drawing->dotted_gc,
1109 0,
1110 dash_list,
1111 2);
1112
1113 drawing->ruler_gc_butt =
1114 gdk_gc_new(GDK_DRAWABLE(main_window_get_widget(xenoltt_data->tab)->window));
1115 gdk_gc_copy(drawing->ruler_gc_butt,
1116 main_window_get_widget(xenoltt_data->tab)->style->black_gc);
1117 drawing->ruler_gc_round =
1118 gdk_gc_new(GDK_DRAWABLE(main_window_get_widget(xenoltt_data->tab)->window));
1119 gdk_gc_copy(drawing->ruler_gc_round,
1120 main_window_get_widget(xenoltt_data->tab)->style->black_gc);
1121
1122
1123 gdk_gc_set_line_attributes(drawing->ruler_gc_butt,
1124 2,
1125 GDK_LINE_SOLID,
1126 GDK_CAP_BUTT,
1127 GDK_JOIN_MITER);
1128
1129 gdk_gc_set_line_attributes(drawing->ruler_gc_round,
1130 2,
1131 GDK_LINE_SOLID,
1132 GDK_CAP_ROUND,
1133 GDK_JOIN_ROUND);
1134
1135
1136 return drawing;
1137}
1138
1139void drawing_destroy(XenoLtt_Drawing_t *drawing)
1140{
1141 g_info("drawing_destroy %p", drawing);
1142
1143 /* Free the colors */
1144 GdkColormap* colormap = gdk_colormap_get_system();
1145
1146 gdk_colormap_free_colors(colormap, drawing_colors, NUM_COLORS);
1147
1148
1149
1150 // Do not unref here, XenoLtt_Drawing_t destroyed by it's widget.
1151 //g_object_unref( G_OBJECT(drawing->drawing_area));
1152 if(drawing->gc != NULL)
1153 gdk_gc_unref(drawing->gc);
1154
1155 g_object_unref(drawing->pango_layout);
1156 if(drawing->dotted_gc != NULL) gdk_gc_unref(drawing->dotted_gc);
1157 if(drawing->ruler_gc_butt != NULL) gdk_gc_unref(drawing->ruler_gc_butt);
1158 if(drawing->ruler_gc_round != NULL) gdk_gc_unref(drawing->ruler_gc_round);
1159
1160 g_free(drawing);
1161 g_info("drawing_destroy end");
1162}
1163
1164GtkWidget *drawing_get_drawing_area(XenoLtt_Drawing_t *drawing)
1165{
1166 return drawing->drawing_area;
1167}
1168
1169GtkWidget *drawing_get_widget(XenoLtt_Drawing_t *drawing)
1170{
1171 return drawing->vbox;
1172}
1173
1174void drawing_draw_line( XenoLtt_Drawing_t *drawing,
1175 GdkPixmap *pixmap,
1176 guint x1, guint y1,
1177 guint x2, guint y2,
1178 GdkGC *GC)
1179{
1180 gdk_draw_line (pixmap,
1181 GC,
1182 x1, y1, x2, y2);
1183}
1184
1185void drawing_clear(XenoLtt_Drawing_t *drawing)
1186{
1187 //if (drawing->pixmap)
1188 // gdk_pixmap_unref(drawing->pixmap);
1189 XenoLTTData *cfd = drawing->xenoltt_data;
1190
1191
1192 rectangle_pixmap(cfd->thread_list,
1193 drawing->drawing_area->style->black_gc,
1194 TRUE,
1195 0, 0,
1196 drawing->alloc_width, // do not overlap
1197 -1);
1198
1199 //drawing->height = 1;
1200 /* Allocate a new pixmap with new height */
1201 //drawing->pixmap = gdk_pixmap_new(drawing->drawing_area->window,
1202 // drawing->width + SAFETY + EXTRA_ALLOC,
1203 // drawing->height + EXTRA_ALLOC,
1204 // -1);
1205 //drawing->alloc_width = drawing->width + SAFETY + EXTRA_ALLOC;
1206 //drawing->alloc_height = drawing->height + EXTRA_ALLOC;
1207
1208 //gtk_widget_set_size_request(drawing->drawing_area,
1209 // -1,
1210 // drawing->height);
1211 //gtk_widget_queue_resize_no_redraw(drawing->drawing_area);
1212
1213 /* ask for the buffer to be redrawn */
1214 gtk_widget_queue_draw ( drawing->drawing_area);
1215}
1216
1217#if 0
1218/* Insert a square corresponding to a new process in the list */
1219/* Applies to whole drawing->width */
1220void drawing_insert_square(XenoLtt_Drawing_t *drawing,
1221 guint y,
1222 guint height)
1223{
1224 //GdkRectangle update_rect;
1225 gboolean reallocate = FALSE;
1226 GdkPixmap *new_pixmap;
1227
1228 /* Allocate a new pixmap with new height */
1229 if(drawing->alloc_height < drawing->height + height) {
1230
1231 new_pixmap = gdk_pixmap_new(drawing->drawing_area->window,
1232 drawing->width + SAFETY + EXTRA_ALLOC,
1233 drawing->height + height + EXTRA_ALLOC,
1234 -1);
1235 drawing->alloc_width = drawing->width + SAFETY + EXTRA_ALLOC;
1236 drawing->alloc_height = drawing->height + height + EXTRA_ALLOC;
1237 reallocate = TRUE;
1238
1239 /* Copy the high region */
1240 gdk_draw_pixmap (new_pixmap,
1241 drawing->drawing_area->style->black_gc,
1242 drawing->pixmap,
1243 0, 0,
1244 0, 0,
1245 drawing->width + SAFETY, y);
1246
1247 } else {
1248 new_pixmap = drawing->pixmap;
1249 }
1250
1251 //GdkPixmap *pixmap = gdk_pixmap_new(drawing->drawing_area->window,
1252 // drawing->width + SAFETY,
1253 // drawing->height + height,
1254 // -1);
1255
1256 /* add an empty square */
1257 gdk_draw_rectangle (new_pixmap,
1258 drawing->drawing_area->style->black_gc,
1259 TRUE,
1260 0, y,
1261 drawing->width + SAFETY, // do not overlap
1262 height);
1263
1264 /* copy the bottom of the region */
1265 gdk_draw_pixmap (new_pixmap,
1266 drawing->drawing_area->style->black_gc,
1267 drawing->pixmap,
1268 0, y,
1269 0, y + height,
1270 drawing->width+SAFETY, drawing->height - y);
1271
1272
1273 if(reallocate && likely(drawing->pixmap)) {
1274 gdk_pixmap_unref(drawing->pixmap);
1275 drawing->pixmap = new_pixmap;
1276 }
1277
1278 if(unlikely(drawing->height==1)) drawing->height = height;
1279 else drawing->height += height;
1280
1281 gtk_widget_set_size_request(drawing->drawing_area,
1282 -1,
1283 drawing->height);
1284 gtk_widget_queue_resize_no_redraw(drawing->drawing_area);
1285
1286 /* ask for the buffer to be redrawn */
1287 gtk_widget_queue_draw_area ( drawing->drawing_area,
1288 0, y,
1289 drawing->width, drawing->height-y);
1290}
1291
1292
1293/* Remove a square corresponding to a removed process in the list */
1294void drawing_remove_square(XenoLtt_Drawing_t *drawing,
1295 guint y,
1296 guint height)
1297{
1298 GdkPixmap *pixmap;
1299
1300 if(unlikely((guint)drawing->height == height)) {
1301 //pixmap = gdk_pixmap_new(
1302 // drawing->drawing_area->window,
1303 // drawing->width + SAFETY,
1304 // 1,
1305 // -1);
1306 pixmap = drawing->pixmap;
1307 drawing->height=1;
1308 } else {
1309 /* Allocate a new pixmap with new height */
1310 //pixmap = gdk_pixmap_new(
1311 // drawing->drawing_area->window,
1312 // drawing->width + SAFETY,
1313 // drawing->height - height,
1314 // -1);
1315 /* Keep the same preallocated pixmap */
1316 pixmap = drawing->pixmap;
1317
1318 /* Copy the high region */
1319 gdk_draw_pixmap (pixmap,
1320 drawing->drawing_area->style->black_gc,
1321 drawing->pixmap,
1322 0, 0,
1323 0, 0,
1324 drawing->width + SAFETY, y);
1325
1326 /* Copy up the bottom of the region */
1327 gdk_draw_pixmap (pixmap,
1328 drawing->drawing_area->style->black_gc,
1329 drawing->pixmap,
1330 0, y + height,
1331 0, y,
1332 drawing->width, drawing->height - y - height);
1333
1334 drawing->height-=height;
1335 }
1336
1337 //if(likely(drawing->pixmap))
1338 // gdk_pixmap_unref(drawing->pixmap);
1339
1340 //drawing->pixmap = pixmap;
1341
1342 gtk_widget_set_size_request(drawing->drawing_area,
1343 -1,
1344 drawing->height);
1345 gtk_widget_queue_resize_no_redraw(drawing->drawing_area);
1346 /* ask for the buffer to be redrawn */
1347 gtk_widget_queue_draw_area ( drawing->drawing_area,
1348 0, y,
1349 drawing->width, MAX(drawing->height-y, 1));
1350}
1351#endif //0
1352
1353void drawing_update_ruler(XenoLtt_Drawing_t *drawing, TimeWindow *time_window)
1354{
1355 GtkRequisition req;
1356 GdkRectangle rect;
1357
1358 req.width = drawing->ruler->allocation.width;
1359 req.height = drawing->ruler->allocation.height;
1360
1361
1362 rect.x = 0;
1363 rect.y = 0;
1364 rect.width = req.width;
1365 rect.height = req.height;
1366
1367 gtk_widget_queue_draw(drawing->ruler);
1368 //gtk_widget_draw( drawing->ruler, &rect);
1369}
1370
1371/* Redraw the ruler */
1372static gboolean
1373expose_ruler( GtkWidget *widget, GdkEventExpose *event, gpointer user_data )
1374{
1375 XenoLtt_Drawing_t *drawing = (XenoLtt_Drawing_t *)user_data;
1376 TimeWindow time_window = lttvwindow_get_time_window(drawing->xenoltt_data->tab);
1377 gchar text[255];
1378
1379 PangoContext *context;
1380 PangoLayout *layout;
1381 PangoFontDescription *FontDesc;
1382 PangoRectangle ink_rect;
1383 gint global_width=0;
1384 GdkColor foreground = { 0, 0, 0, 0 };
1385 GdkColor background = { 0, 0xffff, 0xffff, 0xffff };
1386
1387 LttTime window_end = time_window.end_time;
1388 LttTime half_width =
1389 ltt_time_div(time_window.time_width,2.0);
1390 LttTime window_middle =
1391 ltt_time_add(half_width,
1392 time_window.start_time);
1393 g_debug("ruler expose event");
1394
1395 gdk_draw_rectangle (drawing->ruler->window,
1396 drawing->ruler->style->white_gc,
1397 TRUE,
1398 event->area.x, event->area.y,
1399 event->area.width,
1400 event->area.height);
1401
1402 gdk_draw_line (drawing->ruler->window,
1403 drawing->ruler_gc_butt,
1404 event->area.x, 1,
1405 event->area.x + event->area.width, 1);
1406
1407
1408 snprintf(text, 255, "%lus\n%luns",
1409 time_window.start_time.tv_sec,
1410 time_window.start_time.tv_nsec);
1411
1412 layout = gtk_widget_create_pango_layout(drawing->drawing_area, NULL);
1413
1414 context = pango_layout_get_context(layout);
1415 FontDesc = pango_context_get_font_description(context);
1416
1417 pango_font_description_set_size(FontDesc, 6*PANGO_SCALE);
1418 pango_layout_context_changed(layout);
1419
1420 pango_layout_set_text(layout, text, -1);
1421 pango_layout_get_pixel_extents(layout, &ink_rect, NULL);
1422 global_width += ink_rect.width;
1423
1424 gdk_draw_layout_with_colors(drawing->ruler->window,
1425 drawing->ruler_gc_butt,
1426 0,
1427 6,
1428 layout, &foreground, &background);
1429
1430 gdk_draw_line (drawing->ruler->window,
1431 drawing->ruler_gc_round,
1432 1, 1,
1433 1, 7);
1434
1435
1436 snprintf(text, 255, "%lus\n%luns", window_end.tv_sec,
1437 window_end.tv_nsec);
1438
1439 pango_layout_set_text(layout, text, -1);
1440 pango_layout_get_pixel_extents(layout, &ink_rect, NULL);
1441 global_width += ink_rect.width;
1442
1443 if(global_width <= drawing->ruler->allocation.width)
1444 {
1445 gdk_draw_layout_with_colors(drawing->ruler->window,
1446 drawing->ruler_gc_butt,
1447 drawing->ruler->allocation.width - ink_rect.width,
1448 6,
1449 layout, &foreground, &background);
1450
1451 gdk_draw_line (drawing->ruler->window,
1452 drawing->ruler_gc_butt,
1453 drawing->ruler->allocation.width-1, 1,
1454 drawing->ruler->allocation.width-1, 7);
1455 }
1456
1457
1458 snprintf(text, 255, "%lus\n%luns", window_middle.tv_sec,
1459 window_middle.tv_nsec);
1460
1461 pango_layout_set_text(layout, text, -1);
1462 pango_layout_get_pixel_extents(layout, &ink_rect, NULL);
1463 global_width += ink_rect.width;
1464
1465 if(global_width <= drawing->ruler->allocation.width)
1466 {
1467 gdk_draw_layout_with_colors(drawing->ruler->window,
1468 drawing->ruler_gc_butt,
1469 (drawing->ruler->allocation.width - ink_rect.width)/2,
1470 6,
1471 layout, &foreground, &background);
1472
1473 gdk_draw_line (drawing->ruler->window,
1474 drawing->ruler_gc_butt,
1475 drawing->ruler->allocation.width/2, 1,
1476 drawing->ruler->allocation.width/2, 7);
1477
1478
1479
1480
1481 }
1482
1483 g_object_unref(layout);
1484
1485 return FALSE;
1486}
1487
1488
1489/* notify mouse on ruler */
1490static gboolean
1491motion_notify_ruler(GtkWidget *widget, GdkEventMotion *event, gpointer user_data)
1492{
1493 //g_debug("motion");
1494 //eventually follow mouse and show time here
1495 return 0;
1496}
1497
1498
1499
1500
1501
1502
1503 /* Xenomai Thread Start Statement
1504 ret = lttv_trace_find_hook(ts->parent.t,
1505 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_THREAD_START,
1506 LTT_FIELD_XENOLTT_ADDRESS, 0, 0,
1507 xenoltt_after_thread_hook,
1508 events_request,
1509 &g_array_index(hooks, LttvTraceHook, after_hn++));
1510 if(ret) after_hn--;
1511
1512 /* Xenomai Thread Resume Statement
1513 ret = lttv_trace_find_hook(ts->parent.t,
1514 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_THREAD_RESUME,
1515 LTT_FIELD_XENOLTT_ADDRESS, 0, 0,
1516 xenoltt_after_thread_hook,
1517 events_request,
1518 &g_array_index(hooks, LttvTraceHook, after_hn++));
1519 if(ret) after_hn--;
1520
1521 /* Xenomai Thread Suspend Statement
1522 ret = lttv_trace_find_hook(ts->parent.t,
1523 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_THREAD_SUSPEND,
1524 LTT_FIELD_XENOLTT_ADDRESS, 0, 0,
1525 xenoltt_after_thread_hook,
1526 events_request,
1527 &g_array_index(hooks, LttvTraceHook, after_hn++));
1528 if(ret) after_hn--;
1529
1530 /* Xenomai Thread Wait Period Statement
1531 ret = lttv_trace_find_hook(ts->parent.t,
1532 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_THREAD_WAIT_PERIOD,
1533 LTT_FIELD_XENOLTT_ADDRESS, 0, 0,
1534 xenoltt_after_thread_hook,
1535 events_request,
1536 &g_array_index(hooks, LttvTraceHook, after_hn++));
1537 if(ret) after_hn--;
1538
1539 /* Xenomai Thread Unblock Statement
1540 ret = lttv_trace_find_hook(ts->parent.t,
1541 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_THREAD_UNBLOCK,
1542 LTT_FIELD_XENOLTT_ADDRESS, 0, 0,
1543 xenoltt_after_thread_hook,
1544 events_request,
1545 &g_array_index(hooks, LttvTraceHook, after_hn++));
1546 if(ret) after_hn--;
1547
1548 /* Xenomai Thread Delete Statement
1549 ret = lttv_trace_find_hook(ts->parent.t,
1550 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_THREAD_DELETE,
1551 LTT_FIELD_XENOLTT_ADDRESS, 0, 0,
1552 xenoltt_after_thread_hook,
1553 events_request,
1554 &g_array_index(hooks, LttvTraceHook, after_hn++));
1555 if(ret) after_hn--;
1556
1557 /* Xenomai Timer Tick
1558 ret = lttv_trace_find_hook(ts->parent.t,
1559 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_TIMER_TICK,
1560 LTT_FIELD_XENOLTT_ADDRESS, 0, 0,
1561 xenoltt_after_thread_hook,
1562 events_request,
1563 &g_array_index(hooks, LttvTraceHook, after_hn++));
1564 if(ret) after_hn--;
1565
1566 /* Xenomai Mutex/Semaphore owner setting
1567 ret = lttv_trace_find_hook(ts->parent.t,
1568 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_SYNCH_SET_OWNER,
1569 LTT_FIELD_XENOLTT_ADDRESS, 0, 0,
1570 xenoltt_after_thread_hook,
1571 events_request,
1572 &g_array_index(hooks, LttvTraceHook, after_hn++));
1573 if(ret) after_hn--;
1574
1575 /* Xenomai Mutex/Semaphore owner setting
1576 ret = lttv_trace_find_hook(ts->parent.t,
1577 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_SYNCH_UNLOCK,
1578 LTT_FIELD_XENOLTT_ADDRESS, 0, 0,
1579 xenoltt_after_thread_hook,
1580 events_request,
1581 &g_array_index(hooks, LttvTraceHook, after_hn++));
1582 if(ret) after_hn--;
1583
1584 /* Xenomai Mutex/Semaphore owner setting
1585 ret = lttv_trace_find_hook(ts->parent.t,
1586 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_SYNCH_WAKEUP1,
1587 LTT_FIELD_XENOLTT_ADDRESS, 0, 0,
1588 xenoltt_after_thread_hook,
1589 events_request,
1590 &g_array_index(hooks, LttvTraceHook, after_hn++));
1591 if(ret) after_hn--;
1592
1593 /* Xenomai Mutex/Semaphore owner setting
1594 ret = lttv_trace_find_hook(ts->parent.t,
1595 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_SYNCH_WAKEUPX,
1596 LTT_FIELD_XENOLTT_ADDRESS, 0, 0,
1597 xenoltt_after_thread_hook,
1598 events_request,
1599 &g_array_index(hooks, LttvTraceHook, after_hn++));
1600 if(ret) after_hn--;
1601
1602 /* Xenomai Mutex/Semaphore sleeping call
1603 ret = lttv_trace_find_hook(ts->parent.t,
1604 LTT_FACILITY_XENOLTT, LTT_EVENT_XENOLTT_SYNCH_SLEEP_ON,
1605 LTT_FIELD_XENOLTT_ADDRESS, 0, 0,
1606 xenoltt_after_thread_hook,
1607 events_request,
1608 &g_array_index(hooks, LttvTraceHook, after_hn++));
1609 if(ret) after_hn--;
1610 */
This page took 0.116007 seconds and 4 git commands to generate.