Reenable resource view
[lttv.git] / lttv / modules / gui / resourceview / drawing.c
CommitLineData
9e01e6d4 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>
9e01e6d4 30#include <lttvwindow/lttvwindow.h>
31#include <lttv/state.h>
32#include <lttv/hook.h>
33
34#include "drawing.h"
35#include "eventhooks.h"
36#include "cfv.h"
37
58a9b31b 38//#define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format)
9e01e6d4 39
40//FIXME
41// fixed #define TRACE_NUMBER 0
42#define EXTRA_ALLOC 1024 // pixels
43
44
45#if 0 /* colors for two lines representation */
46GdkColor drawing_colors[NUM_COLORS] =
47{ /* Pixel, R, G, B */
48 { 0, 0, 0, 0 }, /* COL_BLACK */
49 { 0, 0xFFFF, 0xFFFF, 0xFFFF }, /* COL_WHITE */
50 { 0, 0x0FFF, 0xFFFF, 0xFFFF }, /* COL_WAIT_FORK : pale blue */
51 { 0, 0xFFFF, 0xFFFF, 0x0000 }, /* COL_WAIT_CPU : yellow */
52 { 0, 0xFFFF, 0xA000, 0xFCFF }, /* COL_EXIT : pale magenta */
53 { 0, 0xFFFF, 0x0000, 0xFFFF }, /* COL_ZOMBIE : purple */
54 { 0, 0xFFFF, 0x0000, 0x0000 }, /* COL_WAIT : red */
55 { 0, 0x0000, 0xFFFF, 0x0000 }, /* COL_RUN : green */
56 { 0, 0x8800, 0xFFFF, 0x8A00 }, /* COL_USER_MODE : pale green */
57 { 0, 0x09FF, 0x01FF, 0xFFFF }, /* COL_SYSCALL : blue */
58 { 0, 0xF900, 0x4200, 0xFF00 }, /* COL_TRAP : pale purple */
59 { 0, 0xFFFF, 0x5AFF, 0x01FF }, /* COL_IRQ : orange */
60 { 0, 0xFFFF, 0xFFFF, 0xFFFF } /* COL_MODE_UNKNOWN : white */
61
62};
63#endif //0
64
65
66GdkColor drawing_colors[NUM_COLORS] =
67{ /* Pixel, R, G, B */
68 { 0, 0, 0, 0 }, /* COL_BLACK */
69 { 0, 0xFFFF, 0xFFFF, 0xFFFF }, /* COL_WHITE */
70 { 0, 0x0000, 0xFF00, 0x0000 }, /* COL_RUN_USER_MODE : green */
71 { 0, 0x0100, 0x9E00, 0xFFFF }, /* COL_RUN_SYSCALL : pale blue */
72 { 0, 0xFF00, 0xFF00, 0x0100 }, /* COL_RUN_TRAP : yellow */
73 { 0, 0xFFFF, 0x5E00, 0x0000 }, /* COL_RUN_IRQ : orange */
74 { 0, 0xFFFF, 0x9400, 0x9600 }, /* COL_RUN_SOFT_IRQ : pink */
75 { 0, 0x6600, 0x0000, 0x0000 }, /* COL_WAIT : dark red */
76 { 0, 0x7700, 0x7700, 0x0000 }, /* COL_WAIT_CPU : dark yellow */
77 { 0, 0x6400, 0x0000, 0x5D00 }, /* COL_ZOMBIE : dark purple */
78 { 0, 0x0700, 0x6400, 0x0000 }, /* COL_WAIT_FORK : dark green */
79 { 0, 0x8900, 0x0000, 0x8400 }, /* COL_EXIT : "less dark" magenta */
80 { 0, 0xFFFF, 0xFFFF, 0xFFFF }, /* COL_MODE_UNKNOWN : white */
81 { 0, 0xFFFF, 0xFFFF, 0xFFFF } /* COL_UNNAMED : white */
82
83};
84
44ffb95f 85GdkColor drawing_colors_cpu[NUM_COLORS_CPU] =
86{ /* Pixel, R, G, B */
d3d99fde 87 { 0, 0x0000, 0x0000, 0x0000 }, /* COL_CPU_UNKNOWN */
598026ba 88 { 0, 0xBBBB, 0xBBBB, 0xBBBB }, /* COL_CPU_IDLE */
89 { 0, 0xFFFF, 0xFFFF, 0xFFFF }, /* COL_CPU_BUSY */
d3d99fde 90 { 0, 0xFFFF, 0x5E00, 0x0000 }, /* COL_CPU_IRQ */
d34141ca 91 { 0, 0xFFFF, 0x9400, 0x9600 }, /* COL_CPU_SOFT_IRQ */
d3d99fde 92 { 0, 0xFF00, 0xFF00, 0x0100 }, /* COL_CPU_TRAP */
44ffb95f 93};
9e01e6d4 94
8743690d 95GdkColor drawing_colors_irq[NUM_COLORS_IRQ] =
96{ /* Pixel, R, G, B */
97 { 0, 0x0000, 0x0000, 0x0000 }, /* COL_IRQ_UNKNOWN */
98 { 0, 0xBBBB, 0xBBBB, 0xBBBB }, /* COL_IRQ_IDLE */
885dc404 99 { 0, 0xFFFF, 0x5E00, 0x0000 }, /* COL_IRQ_BUSY */
8743690d 100};
9e01e6d4 101
0305fe77 102GdkColor drawing_colors_soft_irq[NUM_COLORS_SOFT_IRQ] =
103{ /* Pixel, R, G, B */
104 { 0, 0x0000, 0x0000, 0x0000 }, /* COL_SOFT_IRQ_UNKNOWN */
105 { 0, 0x0000, 0x0000, 0x0000 }, /* COL_SOFT_IRQ_IDLE */
67c73bb3 106 { 0, 0xFFFF, 0xD400, 0xD400 }, /* COL_SOFT_IRQ_PENDING */
0305fe77 107 { 0, 0xFFFF, 0x9400, 0x9600 }, /* COL_SOFT_IRQ_BUSY */
108};
109
38726a78 110GdkColor drawing_colors_trap[NUM_COLORS_TRAP] =
111{ /* Pixel, R, G, B */
112 { 0, 0x0000, 0x0000, 0x0000 }, /* COL_TRAP_UNKNOWN */
a81d2a59 113 { 0, 0x0000, 0x0000, 0x0000 }, /* COL_TRAP_IDLE */
38726a78 114 { 0, 0xFF00, 0xFF00, 0x0100 }, /* COL_TRAP_BUSY */
115};
116
20d16f82 117GdkColor drawing_colors_bdev[NUM_COLORS_BDEV] =
118{ /* Pixel, R, G, B */
119 { 0, 0x0000, 0x0000, 0x0000 }, /* COL_BDEV_UNKNOWN */
120 { 0, 0xBBBB, 0xBBBB, 0xBBBB }, /* COL_BDEV_IDLE */
121 { 0, 0x0000, 0x0000, 0xFFFF }, /* COL_BDEV_BUSY_READING */
122 { 0, 0xFFFF, 0x0000, 0x0000 }, /* COL_BDEV_BUSY_WRITING */
123};
124
9e01e6d4 125/*****************************************************************************
126 * drawing functions *
127 *****************************************************************************/
128
129static gboolean
130expose_ruler( GtkWidget *widget, GdkEventExpose *event, gpointer user_data );
131
132static gboolean
133motion_notify_ruler(GtkWidget *widget, GdkEventMotion *event, gpointer user_data);
134
135
136/* Function responsible for updating the exposed area.
137 * It must do an events request to the lttvwindow API to ask for this update.
138 * Note : this function cannot clear the background, because it may
139 * erase drawing already present (SAFETY).
140 */
141void drawing_data_request(Drawing_t *drawing,
142 gint x, gint y,
143 gint width,
144 gint height)
145{
146 if(width < 0) return ;
147 if(height < 0) return ;
148
149
150 Tab *tab = drawing->control_flow_data->tab;
151 TimeWindow time_window =
152 lttvwindow_get_time_window(tab);
dd47d0d8 153 LttvTraceset *traceset = lttvwindow_get_traceset(tab);
9e01e6d4 154
155 ControlFlowData *control_flow_data = drawing->control_flow_data;
156 // (ControlFlowData*)g_object_get_data(
67f72973 157 // G_OBJECT(drawing->drawing_area), "resourceview_data");
9e01e6d4 158
159 LttTime start, time_end;
160 LttTime window_end = time_window.end_time;
161
162 g_debug("req : window start_time : %lu, %lu", time_window.start_time.tv_sec,
163 time_window.start_time.tv_nsec);
164
165 g_debug("req : window time width : %lu, %lu", time_window.time_width.tv_sec,
166 time_window.time_width.tv_nsec);
167
168 g_debug("req : window_end : %lu, %lu", window_end.tv_sec,
169 window_end.tv_nsec);
170
171 g_debug("x is : %i, x+width is : %i", x, x+width);
172
173 convert_pixels_to_time(drawing->width, x,
174 time_window,
175 &start);
176
177 convert_pixels_to_time(drawing->width, x+width,
178 time_window,
179 &time_end);
180 time_end = ltt_time_add(time_end, ltt_time_one); // because main window
181 // doesn't deliver end time.
182
183 lttvwindow_events_request_remove_all(tab,
184 control_flow_data);
185
186 {
dd47d0d8
YB
187 LttvHooks *event_hook = lttv_hooks_new();
188
189 lttv_hooks_add(event_hook,before_schedchange_hook , control_flow_data, LTTV_PRIO_STATE-5);
190 lttv_hooks_add(event_hook,before_execmode_hook , control_flow_data, LTTV_PRIO_STATE-5);
191 lttv_hooks_add(event_hook, after_schedchange_hook, control_flow_data, LTTV_PRIO_STATE+5);
192
9e01e6d4 193 /* find the tracehooks */
dd47d0d8 194
9e01e6d4 195 LttvTraceState *ts;
9e01e6d4 196 GArray *hooks;
9e01e6d4 197
8d8c5ea7 198 guint i, k;
ca5c76ed 199 guint first_after;
9e01e6d4 200
8d8c5ea7 201 guint nb_trace = lttv_traceset_number(traceset);
9e01e6d4 202 // FIXME (fixed) : eventually request for more traces
203 for(i = 0 ; i < nb_trace ; i++) {
9e01e6d4 204 EventsRequest *events_request = g_new(EventsRequest, 1);
205 // Create the hooks
206 //LttvHooks *event = lttv_hooks_new();
dd47d0d8 207
9e01e6d4 208 LttvHooks *before_chunk_traceset = lttv_hooks_new();
209 LttvHooks *after_chunk_traceset = lttv_hooks_new();
210 LttvHooks *before_request_hook = lttv_hooks_new();
211 LttvHooks *after_request_hook = lttv_hooks_new();
212
213 lttv_hooks_add(before_chunk_traceset,
214 before_chunk,
215 events_request,
216 LTTV_PRIO_DEFAULT);
217
218 lttv_hooks_add(after_chunk_traceset,
219 after_chunk,
220 events_request,
221 LTTV_PRIO_DEFAULT);
222
223 lttv_hooks_add(before_request_hook,
224 before_request,
225 events_request,
226 LTTV_PRIO_DEFAULT);
227
228 lttv_hooks_add(after_request_hook,
229 after_request,
230 events_request,
231 LTTV_PRIO_DEFAULT);
232
dd47d0d8 233#ifdef BABEL_CLEANUP
9e01e6d4 234 ts = (LttvTraceState *)tsc->traces[i];
235
236 /* Find the eventtype id for the following events and register the
237 associated by id hooks. */
238
ca5c76ed 239 hooks = g_array_sized_new(FALSE, FALSE, sizeof(LttvTraceHook), 18);
9e01e6d4 240
241 /* before hooks */
242
ca5c76ed 243// lttv_trace_find_hook(ts->parent.t,
cc731880 244// LTT_FACILITY_ARCH,
dd455fb8 245// LTT_EVENT_SYSCALL_ENTRY,
ca5c76ed 246// FIELD_ARRAY(LTT_FIELD_SYSCALL_ID),
58a9b31b 247// before_execmode_hook,
248// events_request,
ca5c76ed 249// &hooks);
58a9b31b 250//
ca5c76ed 251// lttv_trace_find_hook(ts->parent.t,
cc731880 252// LTT_FACILITY_ARCH,
dd455fb8 253// LTT_EVENT_SYSCALL_EXIT,
ca5c76ed 254// NULL,
58a9b31b 255// before_execmode_hook,
256// events_request,
ca5c76ed 257// &hooks);
58a9b31b 258//
ca5c76ed 259 lttv_trace_find_hook(ts->parent.t,
750eb11a 260 LTT_CHANNEL_KERNEL,
dd455fb8 261 LTT_EVENT_TRAP_ENTRY,
ca5c76ed 262 FIELD_ARRAY(LTT_FIELD_TRAP_ID),
d3d99fde 263 before_execmode_hook,
264 events_request,
ca5c76ed 265 &hooks);
d3d99fde 266
ca5c76ed 267 lttv_trace_find_hook(ts->parent.t,
750eb11a 268 LTT_CHANNEL_KERNEL,
dd455fb8 269 LTT_EVENT_TRAP_EXIT,
ca5c76ed 270 NULL,
d3d99fde 271 before_execmode_hook,
272 events_request,
ca5c76ed 273 &hooks);
d3d99fde 274
4e9bbbd3 275 lttv_trace_find_hook(ts->parent.t,
276 LTT_CHANNEL_KERNEL,
277 LTT_EVENT_PAGE_FAULT_ENTRY,
278 FIELD_ARRAY(LTT_FIELD_TRAP_ID),
279 before_execmode_hook,
280 events_request,
281 &hooks);
282
283 lttv_trace_find_hook(ts->parent.t,
284 LTT_CHANNEL_KERNEL,
285 LTT_EVENT_PAGE_FAULT_EXIT,
286 NULL,
287 before_execmode_hook,
288 events_request,
289 &hooks);
290
291 lttv_trace_find_hook(ts->parent.t,
292 LTT_CHANNEL_KERNEL,
293 LTT_EVENT_PAGE_FAULT_NOSEM_ENTRY,
294 FIELD_ARRAY(LTT_FIELD_TRAP_ID),
295 before_execmode_hook,
296 events_request,
297 &hooks);
298
299 lttv_trace_find_hook(ts->parent.t,
300 LTT_CHANNEL_KERNEL,
301 LTT_EVENT_PAGE_FAULT_NOSEM_EXIT,
302 NULL,
303 before_execmode_hook,
304 events_request,
305 &hooks);
306
ca5c76ed 307 lttv_trace_find_hook(ts->parent.t,
750eb11a 308 LTT_CHANNEL_KERNEL,
dd455fb8 309 LTT_EVENT_IRQ_ENTRY,
ca5c76ed 310 FIELD_ARRAY(LTT_FIELD_IRQ_ID),
598026ba 311 before_execmode_hook,
312 events_request,
ca5c76ed 313 &hooks);
598026ba 314
ca5c76ed 315 lttv_trace_find_hook(ts->parent.t,
750eb11a 316 LTT_CHANNEL_KERNEL,
dd455fb8 317 LTT_EVENT_IRQ_EXIT,
ca5c76ed 318 NULL,
598026ba 319 before_execmode_hook,
320 events_request,
ca5c76ed 321 &hooks);
0305fe77 322
67c73bb3 323 lttv_trace_find_hook(ts->parent.t,
750eb11a 324 LTT_CHANNEL_KERNEL,
67c73bb3 325 LTT_EVENT_SOFT_IRQ_RAISE,
326 FIELD_ARRAY(LTT_FIELD_SOFT_IRQ_ID),
327 before_execmode_hook,
328 events_request,
329 &hooks);
330
0305fe77 331 lttv_trace_find_hook(ts->parent.t,
750eb11a 332 LTT_CHANNEL_KERNEL,
0305fe77 333 LTT_EVENT_SOFT_IRQ_ENTRY,
334 FIELD_ARRAY(LTT_FIELD_SOFT_IRQ_ID),
335 before_execmode_hook,
336 events_request,
337 &hooks);
338
339 lttv_trace_find_hook(ts->parent.t,
750eb11a 340 LTT_CHANNEL_KERNEL,
0305fe77 341 LTT_EVENT_SOFT_IRQ_EXIT,
342 NULL,
343 before_execmode_hook,
344 events_request,
345 &hooks);
9e01e6d4 346
347
ca5c76ed 348 lttv_trace_find_hook(ts->parent.t,
750eb11a 349 LTT_CHANNEL_KERNEL,
dd455fb8 350 LTT_EVENT_SCHED_SCHEDULE,
ca5c76ed 351 FIELD_ARRAY(LTT_FIELD_PREV_PID, LTT_FIELD_NEXT_PID, LTT_FIELD_PREV_STATE),
9e01e6d4 352 before_schedchange_hook,
353 events_request,
ca5c76ed 354 &hooks);
9e01e6d4 355
ca5c76ed 356// lttv_trace_find_hook(ts->parent.t,
750eb11a 357// LTT_CHANNEL_KERNEL,
dd455fb8 358// LTT_EVENT_PROCESS_EXIT,
ca5c76ed 359// FIELD_ARRAY(LTT_FIELD_PID),
58a9b31b 360// before_process_exit_hook,
361// events_request,
ca5c76ed 362// &hooks);
58a9b31b 363//
ca5c76ed 364// lttv_trace_find_hook(ts->parent.t,
750eb11a 365// LTT_CHANNEL_KERNEL,
dd455fb8 366// LTT_EVENT_PROCESS_FREE,
ca5c76ed 367// FIELD_ARRAY(LTT_FIELD_PID),
58a9b31b 368// before_process_release_hook,
369// events_request,
ca5c76ed 370// &hooks);
58a9b31b 371//
ca5c76ed 372// lttv_trace_find_hook(ts->parent.t,
373// LTT_FACILITY_LIST,
dd455fb8 374// LTT_EVENT_STATEDUMP_END,
ca5c76ed 375// NULL,
58a9b31b 376// before_statedump_end,
377// events_request,
ca5c76ed 378// &hooks);
9e01e6d4 379
ca5c76ed 380 lttv_trace_find_hook(ts->parent.t,
750eb11a 381 LTT_CHANNEL_BLOCK,
dd455fb8 382 LTT_EVENT_REQUEST_ISSUE,
ca5c76ed 383 FIELD_ARRAY(LTT_FIELD_MAJOR, LTT_FIELD_MINOR, LTT_FIELD_OPERATION),
fbe038b6 384 before_bdev_event_hook,
385 events_request,
ca5c76ed 386 &hooks);
fbe038b6 387
ca5c76ed 388 lttv_trace_find_hook(ts->parent.t,
750eb11a 389 LTT_CHANNEL_BLOCK,
dd455fb8 390 LTT_EVENT_REQUEST_COMPLETE,
ca5c76ed 391 FIELD_ARRAY(LTT_FIELD_MAJOR, LTT_FIELD_MINOR, LTT_FIELD_OPERATION),
fbe038b6 392 before_bdev_event_hook,
393 events_request,
ca5c76ed 394 &hooks);
fbe038b6 395
ca5c76ed 396 /* After hooks */
397 first_after = hooks->len;
9e01e6d4 398
ca5c76ed 399 lttv_trace_find_hook(ts->parent.t,
750eb11a 400 LTT_CHANNEL_KERNEL,
dd455fb8 401 LTT_EVENT_SCHED_SCHEDULE,
ca5c76ed 402 FIELD_ARRAY(LTT_FIELD_PREV_PID, LTT_FIELD_NEXT_PID, LTT_FIELD_PREV_STATE),
9e01e6d4 403 after_schedchange_hook,
404 events_request,
ca5c76ed 405 &hooks);
9e01e6d4 406
ca5c76ed 407// lttv_trace_find_hook(ts->parent.t,
750eb11a 408// LTT_CHANNEL_KERNEL,
dd455fb8 409// LTT_EVENT_PROCESS_FORK,
ca5c76ed 410// FIELD_ARRAY(LTT_FIELD_PARENT_PID, LTT_FIELD_CHILD_PID),
58a9b31b 411// after_process_fork_hook,
412// events_request,
ca5c76ed 413// &hooks);
58a9b31b 414//
ca5c76ed 415// lttv_trace_find_hook(ts->parent.t,
750eb11a 416// LTT_CHANNEL_KERNEL,
dd455fb8 417// LTT_EVENT_PROCESS_EXIT,
ca5c76ed 418// FIELD_ARRAY(LTT_FIELD_PID),
58a9b31b 419// after_process_exit_hook,
420// events_request,
ca5c76ed 421// &hooks);
58a9b31b 422//
ca5c76ed 423// lttv_trace_find_hook(ts->parent.t,
750eb11a 424// LTT_CHANNEL_KERNEL,
dd455fb8 425// LTT_EVENT_EXEC,
ca5c76ed 426// NULL,
58a9b31b 427// after_fs_exec_hook,
428// events_request,
ca5c76ed 429// &hooks);
58a9b31b 430//
ca5c76ed 431// lttv_trace_find_hook(ts->parent.t,
432// LTT_FACILITY_USER_GENERIC,
dd455fb8 433// LTT_EVENT_THREAD_BRAND,
ca5c76ed 434// FIELD_ARRAY(LTT_FIELD_NAME),
58a9b31b 435// after_user_generic_thread_brand_hook,
436// events_request,
ca5c76ed 437// &hooks);
58a9b31b 438//
ca5c76ed 439// lttv_trace_find_hook(ts->parent.t,
440// LTT_FACILITY_LIST,
dd455fb8 441// LTT_EVENT_PROCESS_STATE,
ca5c76ed 442// FIELD_ARRAY(LTT_FIELD_PID, LTT_FIELD_PARENT_PID, LTT_FIELD_NAME),
58a9b31b 443// after_event_enum_process_hook,
444// events_request,
ca5c76ed 445// &hooks);
9e01e6d4 446
447
448 /* Add these hooks to each event_by_id hooks list */
449 /* add before */
ca5c76ed 450 for(k = 0 ; k < first_after ; k++) {
451 th = &g_array_index(hooks, LttvTraceHook, k);
750eb11a 452 lttv_hooks_add(lttv_hooks_by_id_channel_find(event_by_id_channel,
453 th->channel, th->id),
454 th->h,
455 th,
456 LTTV_PRIO_STATE-5);
9e01e6d4 457 }
458
459 /* add after */
ca5c76ed 460 for(k = first_after ; k < hooks->len ; k++) {
461 th = &g_array_index(hooks, LttvTraceHook, k);
750eb11a 462 lttv_hooks_add(lttv_hooks_by_id_channel_find(event_by_id_channel,
463 th->channel, th->id),
464 th->h,
465 th,
466 LTTV_PRIO_STATE+5);
9e01e6d4 467 }
468
469 events_request->hooks = hooks;
dd47d0d8 470#endif
9e01e6d4 471 // Fill the events request
472 events_request->owner = control_flow_data;
473 events_request->viewer_data = control_flow_data;
474 events_request->servicing = FALSE;
475 events_request->start_time = start;
476 events_request->start_position = NULL;
477 events_request->stop_flag = FALSE;
478 events_request->end_time = time_end;
479 events_request->num_events = G_MAXUINT;
480 events_request->end_position = NULL;
481 events_request->trace = i; //fixed /* FIXME */
482 events_request->before_chunk_traceset = before_chunk_traceset;
483 events_request->before_chunk_trace = NULL;
484 events_request->before_chunk_tracefile = NULL;
dd47d0d8 485 events_request->event = event_hook;
9e01e6d4 486 events_request->after_chunk_tracefile = NULL;
487 events_request->after_chunk_trace = NULL;
488 events_request->after_chunk_traceset = after_chunk_traceset;
489 events_request->before_request = before_request_hook;
490 events_request->after_request = after_request_hook;
491
492 g_debug("req : start : %lu, %lu", start.tv_sec,
493 start.tv_nsec);
494
495 g_debug("req : end : %lu, %lu", time_end.tv_sec,
496 time_end.tv_nsec);
497
498 lttvwindow_events_request(tab, events_request);
499
500 }
9e01e6d4 501 }
9e01e6d4 502}
503
504
505static void set_last_start(gpointer key, gpointer value, gpointer user_data)
506{
67f72973 507 //ResourceInfo *process_info = (ResourceInfo*)key;
58a9b31b 508 HashedResourceData *hashed_process_data = (HashedResourceData*)value;
43ed82b5 509 guint x = GPOINTER_TO_UINT(user_data);
9e01e6d4 510
511 hashed_process_data->x.over = x;
512 hashed_process_data->x.over_used = FALSE;
513 hashed_process_data->x.over_marked = FALSE;
514 hashed_process_data->x.middle = x;
515 hashed_process_data->x.middle_used = FALSE;
516 hashed_process_data->x.middle_marked = FALSE;
517 hashed_process_data->x.under = x;
518 hashed_process_data->x.under_used = FALSE;
519 hashed_process_data->x.under_marked = FALSE;
520 hashed_process_data->next_good_time = ltt_time_zero;
521
522 return;
523}
524
dd47d0d8 525void drawing_data_request_begin(EventsRequest *events_request)
9e01e6d4 526{
67f72973 527 int i;
528
9e01e6d4 529 g_debug("Begin of data request");
530 ControlFlowData *cfd = events_request->viewer_data;
9e01e6d4 531 TimeWindow time_window =
532 lttvwindow_get_time_window(cfd->tab);
533
534 guint width = cfd->drawing->width;
535 guint x=0;
536
537 cfd->drawing->last_start = events_request->start_time;
538
539 convert_time_to_pixels(
540 time_window,
541 events_request->start_time,
542 width,
543 &x);
544
67f72973 545 for(i=0; i<RV_RESOURCE_COUNT; i++) {
546 g_hash_table_foreach(cfd->process_list->restypes[i].hash_table, set_last_start,
43ed82b5 547 GUINT_TO_POINTER(x));
67f72973 548 }
9e01e6d4 549
550}
551
dd47d0d8 552void drawing_chunk_begin(EventsRequest *events_request, LttvTraceset *ts)
9e01e6d4 553{
554 g_debug("Begin of chunk");
555 ControlFlowData *cfd = events_request->viewer_data;
9e01e6d4 556 guint i;
dd47d0d8 557 guint nb_trace = lttv_traceset_number(ts);
9e01e6d4 558
559 if(!cfd->process_list->current_hash_data) {
58a9b31b 560 cfd->process_list->current_hash_data = g_new(HashedResourceData**,nb_trace);
9e01e6d4 561 for(i = 0 ; i < nb_trace ; i++) {
dd47d0d8 562 guint num_cpu = lttv_trace_get_num_cpu(lttv_traceset_get(ts, i));
58a9b31b 563 cfd->process_list->current_hash_data[i] = g_new(HashedResourceData*,num_cpu);
9e01e6d4 564 memset(cfd->process_list->current_hash_data[i], 0,
58a9b31b 565 sizeof(HashedResourceData*)*num_cpu);
9e01e6d4 566 }
567 }
568 //cfd->drawing->last_start = LTT_TIME_MIN(current_time,
569 // events_request->end_time);
570}
571
572
573void drawing_request_expose(EventsRequest *events_request,
9e01e6d4 574 LttTime end_time)
575{
576 gint x, width;
577 guint x_end;
578
579 ControlFlowData *cfd = events_request->viewer_data;
9e01e6d4 580 Drawing_t *drawing = cfd->drawing;
581
582 TimeWindow time_window =
583 lttvwindow_get_time_window(cfd->tab);
584
585 g_debug("request expose");
586
587 convert_time_to_pixels(
588 time_window,
589 end_time,
590 drawing->width,
591 &x_end);
592 x = drawing->damage_begin;
593
594 width = x_end - x;
595
596 drawing->damage_begin = x+width;
597
598 // FIXME ?
599 gtk_widget_queue_draw_area ( drawing->drawing_area,
600 x, 0,
601 width, drawing->drawing_area->allocation.height);
602
603 /* Update directly when scrolling */
604 gdk_window_process_updates(drawing->drawing_area->window,
605 TRUE);
606}
607
608
609/* Callbacks */
610
611
612/* Create a new backing pixmap of the appropriate size */
613/* As the scaling will always change, it's of no use to copy old
614 * pixmap.
615 *
616 * Only change the size if width changes. The height is specified and changed
617 * when process ID are added or removed from the process list.
618 */
619static gboolean
620configure_event( GtkWidget *widget, GdkEventConfigure *event,
621 gpointer user_data)
622{
623 Drawing_t *drawing = (Drawing_t*)user_data;
624
625
626 /* First, get the new time interval of the main window */
627 /* we assume (see documentation) that the main window
628 * has updated the time interval before this configure gets
629 * executed.
630 */
631 //lttvwindow_get_time_window(drawing->control_flow_data->mw,
632 // &drawing->control_flow_data->time_window);
633
634 /* New pixmap, size of the configure event */
635 //GdkPixmap *pixmap = gdk_pixmap_new(widget->window,
636 // widget->allocation.width + SAFETY,
637 // widget->allocation.height + SAFETY,
638 // -1);
639
640 if(widget->allocation.width != drawing->width) {
641 g_debug("drawing configure event");
642 g_debug("New alloc draw size : %i by %i",widget->allocation.width,
643 widget->allocation.height);
644
645 drawing->width = widget->allocation.width;
646
647 if(drawing->alloc_width < widget->allocation.width) {
648 //if(drawing->pixmap)
649 // gdk_pixmap_unref(drawing->pixmap);
650
651 //drawing->pixmap = gdk_pixmap_new(widget->window,
652 // drawing->width + SAFETY + EXTRA_ALLOC,
653 // drawing->height + EXTRA_ALLOC,
654 // -1);
655 drawing->alloc_width = drawing->width + SAFETY + EXTRA_ALLOC;
656 drawing->alloc_height = drawing->height + EXTRA_ALLOC;
657 update_pixmap_size(drawing->control_flow_data->process_list,
658 drawing->alloc_width);
659 update_index_to_pixmap(drawing->control_flow_data->process_list);
660 }
661 //drawing->height = widget->allocation.height;
662
663 //ProcessList_get_height
664 // (GuiControlFlow_get_process_list(drawing->control_flow_data)),
665
666
667 // Clear the image
668 //gdk_draw_rectangle (drawing->pixmap,
669 // widget->style->black_gc,
670 // TRUE,
671 // 0, 0,
672 // drawing->width+SAFETY,
673 // drawing->height);
674
675 //g_info("init data request");
676
677
678 /* Initial data request */
679 /* no, do initial data request in the expose event */
680 // Do not need to ask for data of 1 pixel : not synchronized with
681 // main window time at this moment.
682 //drawing_data_request(drawing, &drawing->pixmap, 0, 0,
683 // widget->allocation.width,
684 // widget->allocation.height);
685
686 //drawing->width = widget->allocation.width;
687 //drawing->height = widget->allocation.height;
688
689 drawing->damage_begin = 0;
690 drawing->damage_end = widget->allocation.width;
691
692 if((widget->allocation.width != 1 &&
693 widget->allocation.height != 1)
694 && drawing->damage_begin < drawing->damage_end)
695 {
696
697 rectangle_pixmap (drawing->control_flow_data->process_list,
698 drawing->drawing_area->style->black_gc,
699 TRUE,
700 0, 0,
701 drawing->alloc_width, // do not overlap
702 -1);
703
704
705 drawing_data_request(drawing,
706 drawing->damage_begin,
707 0,
708 drawing->damage_end - drawing->damage_begin,
709 drawing->height);
710 }
711 }
712 return TRUE;
713}
714
715
716/* Redraw the screen from the backing pixmap */
717static gboolean
718expose_event( GtkWidget *widget, GdkEventExpose *event, gpointer user_data )
719{
720 Drawing_t *drawing = (Drawing_t*)user_data;
721
722 ControlFlowData *control_flow_data =
723 (ControlFlowData*)g_object_get_data(
724 G_OBJECT(widget),
67f72973 725 "resourceview_data");
9e01e6d4 726#if 0
727 if(unlikely(drawing->gc == NULL)) {
728 drawing->gc = gdk_gc_new(drawing->drawing_area->window);
729 gdk_gc_copy(drawing->gc, drawing->drawing_area->style->black_gc);
730 }
731#endif //0
732 TimeWindow time_window =
733 lttvwindow_get_time_window(control_flow_data->tab);
734 LttTime current_time =
735 lttvwindow_get_current_time(control_flow_data->tab);
736
737 guint cursor_x=0;
738
739 LttTime window_end = time_window.end_time;
740
741 /* update the screen from the pixmap buffer */
742#if 0
743 gdk_draw_pixmap(widget->window,
744 widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
745 drawing->pixmap,
746 event->area.x, event->area.y,
747 event->area.x, event->area.y,
748 event->area.width, event->area.height);
749#endif //0
750 drawing->height = processlist_get_height(control_flow_data->process_list);
751#if 0
752 copy_pixmap_to_screen(control_flow_data->process_list,
753 widget->window,
754 widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
755 event->area.x, event->area.y,
756 event->area.width, event->area.height);
757#endif //0
758 copy_pixmap_to_screen(control_flow_data->process_list,
759 widget->window,
760 drawing->gc,
761 event->area.x, event->area.y,
762 event->area.width, event->area.height);
763
764
765 /* Erase the dotted lines left.. */
766 if(widget->allocation.height > drawing->height)
767 {
768 gdk_draw_rectangle (widget->window,
769 drawing->drawing_area->style->black_gc,
770 TRUE,
771 event->area.x, drawing->height,
772 event->area.width, // do not overlap
773 widget->allocation.height - drawing->height);
774 }
775 if(ltt_time_compare(time_window.start_time, current_time) <= 0 &&
776 ltt_time_compare(window_end, current_time) >= 0)
777 {
778 /* Draw the dotted lines */
779 convert_time_to_pixels(
780 time_window,
781 current_time,
782 drawing->width,
783 &cursor_x);
784
785#if 0
786 if(drawing->dotted_gc == NULL) {
787
788 drawing->dotted_gc = gdk_gc_new(drawing->drawing_area->window);
789 gdk_gc_copy(drawing->dotted_gc, widget->style->white_gc);
790
791 gint8 dash_list[] = { 1, 2 };
792 gdk_gc_set_line_attributes(drawing->dotted_gc,
793 1,
794 GDK_LINE_ON_OFF_DASH,
795 GDK_CAP_BUTT,
796 GDK_JOIN_MITER);
797 gdk_gc_set_dashes(drawing->dotted_gc,
798 0,
799 dash_list,
800 2);
801 }
802#endif //0
803 gint height_tot = MAX(widget->allocation.height, drawing->height);
804 gdk_draw_line(widget->window,
805 drawing->dotted_gc,
806 cursor_x, 0,
807 cursor_x, height_tot);
808 }
809 return FALSE;
810}
811
812static gboolean
813after_expose_event( GtkWidget *widget, GdkEventExpose *event, gpointer user_data )
814{
815 //g_assert(0);
816 g_debug("AFTER EXPOSE");
817
818 return FALSE;
819
820
821}
822
823#if 0
824void
825tree_row_activated(GtkTreeModel *treemodel,
826 GtkTreePath *arg1,
827 GtkTreeViewColumn *arg2,
828 gpointer user_data)
829{
830 ControlFlowData *cfd = (ControlFlowData*)user_data;
831 Drawing_t *drawing = cfd->drawing;
832 GtkTreeView *treeview = cfd->process_list->process_list_widget;
833 gint *path_indices;
834 gint height;
835
836 path_indices = gtk_tree_path_get_indices (arg1);
837
838 height = get_cell_height(cfd->process_list,
839 GTK_TREE_VIEW(treeview));
840 drawing->horizontal_sel = height * path_indices[0];
841 g_critical("new hor sel : %i", drawing->horizontal_sel);
842}
843#endif //0
844
845/* mouse click */
846static gboolean
847button_press_event( GtkWidget *widget, GdkEventButton *event, gpointer user_data )
848{
849 ControlFlowData *control_flow_data =
850 (ControlFlowData*)g_object_get_data(
851 G_OBJECT(widget),
67f72973 852 "resourceview_data");
9e01e6d4 853 Drawing_t *drawing = control_flow_data->drawing;
854 TimeWindow time_window =
855 lttvwindow_get_time_window(control_flow_data->tab);
856
857 g_debug("click");
858 if(event->button == 1)
859 {
860 LttTime time;
861
862 /* left mouse button click */
863 g_debug("x click is : %f", event->x);
864
865 convert_pixels_to_time(drawing->width, (guint)event->x,
866 time_window,
867 &time);
868
869 lttvwindow_report_current_time(control_flow_data->tab, time);
870
871 }
872
873 return FALSE;
874}
875
876static gboolean
877scrollbar_size_allocate(GtkWidget *widget,
878 GtkAllocation *allocation,
879 gpointer user_data)
880{
881 Drawing_t *drawing = (Drawing_t*)user_data;
882
883 gtk_widget_set_size_request(drawing->padding, allocation->width, -1);
884 //gtk_widget_queue_resize(drawing->padding);
885 //gtk_widget_queue_resize(drawing->ruler);
886 gtk_container_check_resize(GTK_CONTAINER(drawing->ruler_hbox));
887 return 0;
888}
889
890
891
892Drawing_t *drawing_construct(ControlFlowData *control_flow_data)
893{
894 Drawing_t *drawing = g_new(Drawing_t, 1);
895
896 drawing->control_flow_data = control_flow_data;
897
898 drawing->vbox = gtk_vbox_new(FALSE, 1);
899
900
901 drawing->ruler_hbox = gtk_hbox_new(FALSE, 1);
902 drawing->ruler = gtk_drawing_area_new ();
903 //gtk_widget_set_size_request(drawing->ruler, -1, 27);
904
905 drawing->padding = gtk_drawing_area_new ();
906 //gtk_widget_set_size_request(drawing->padding, -1, 27);
907 gtk_box_pack_start(GTK_BOX(drawing->ruler_hbox), drawing->ruler,
908 TRUE, TRUE, 0);
909 gtk_box_pack_end(GTK_BOX(drawing->ruler_hbox), drawing->padding,
910 FALSE, FALSE, 0);
911
912
913
914 drawing->drawing_area = gtk_drawing_area_new ();
915
916 drawing->gc = NULL;
917
918 drawing->hbox = gtk_hbox_new(FALSE, 1);
919 drawing->viewport = gtk_viewport_new(NULL, control_flow_data->v_adjust);
920 drawing->scrollbar = gtk_vscrollbar_new(control_flow_data->v_adjust);
921 gtk_box_pack_start(GTK_BOX(drawing->hbox), drawing->viewport,
922 TRUE, TRUE, 0);
923 gtk_box_pack_end(GTK_BOX(drawing->hbox), drawing->scrollbar,
924 FALSE, FALSE, 0);
925
926 //drawing->scrolled_window =
927 // gtk_scrolled_window_new (NULL,
928 // control_flow_data->v_adjust);
929
930 //gtk_scrolled_window_set_policy(
931 // GTK_SCROLLED_WINDOW(drawing->scrolled_window),
932 // GTK_POLICY_NEVER,
933 // GTK_POLICY_AUTOMATIC);
934
935 gtk_container_add(GTK_CONTAINER(drawing->viewport),
936 drawing->drawing_area);
937 //gtk_scrolled_window_add_with_viewport(
938 // GTK_SCROLLED_WINDOW(drawing->scrolled_window),
939 // drawing->drawing_area);
940
941 gtk_box_pack_start(GTK_BOX(drawing->vbox), drawing->ruler_hbox,
942 FALSE, FALSE, 0);
943 gtk_box_pack_end(GTK_BOX(drawing->vbox), drawing->hbox,
944 TRUE, TRUE, 0);
945
946 drawing->pango_layout =
947 gtk_widget_create_pango_layout(drawing->drawing_area, NULL);
948
949 drawing->height = 1;
950 drawing->width = 1;
951 drawing->depth = 0;
952 drawing->alloc_height = 1;
953 drawing->alloc_width = 1;
954
955 drawing->damage_begin = 0;
956 drawing->damage_end = 0;
957 drawing->horizontal_sel = -1;
958
959 //gtk_widget_set_size_request(drawing->drawing_area->window, 50, 50);
960 g_object_set_data_full(
961 G_OBJECT(drawing->drawing_area),
962 "Link_drawing_Data",
963 drawing,
964 (GDestroyNotify)drawing_destroy);
965
966 g_object_set_data(
967 G_OBJECT(drawing->ruler),
968 "drawing",
969 drawing);
970
971
972 //gtk_widget_modify_bg( drawing->drawing_area,
973 // GTK_STATE_NORMAL,
974 // &CF_Colors[BLACK]);
975
976 //gdk_window_get_geometry(drawing->drawing_area->window,
977 // NULL, NULL,
978 // &(drawing->width),
979 // &(drawing->height),
980 // -1);
981
982 //drawing->pixmap = gdk_pixmap_new(
983 // drawing->drawing_area->window,
984 // drawing->width,
985 // drawing->height,
986 // drawing->depth);
987
988 //drawing->pixmap = NULL;
989
990// drawing->pixmap = gdk_pixmap_new(drawing->drawing_area->window,
991// drawing->drawing_area->allocation.width,
992// drawing->drawing_area->allocation.height,
993// -1);
994
995 g_signal_connect (G_OBJECT(drawing->drawing_area),
996 "configure_event",
997 G_CALLBACK (configure_event),
998 (gpointer)drawing);
999
1000 g_signal_connect (G_OBJECT(drawing->ruler),
1001 "expose_event",
1002 G_CALLBACK(expose_ruler),
1003 (gpointer)drawing);
1004
1005 gtk_widget_add_events(drawing->ruler, GDK_POINTER_MOTION_MASK);
1006
1007 g_signal_connect (G_OBJECT(drawing->ruler),
1008 "motion-notify-event",
1009 G_CALLBACK(motion_notify_ruler),
1010 (gpointer)drawing);
1011
1012
1013 g_signal_connect (G_OBJECT(drawing->scrollbar),
1014 "size-allocate",
1015 G_CALLBACK(scrollbar_size_allocate),
1016 (gpointer)drawing);
1017
1018
1019
1020 g_signal_connect (G_OBJECT(drawing->drawing_area),
1021 "expose_event",
1022 G_CALLBACK (expose_event),
1023 (gpointer)drawing);
1024
1025 g_signal_connect_after (G_OBJECT(drawing->drawing_area),
1026 "expose_event",
1027 G_CALLBACK (after_expose_event),
1028 (gpointer)drawing);
1029
1030 g_signal_connect (G_OBJECT(drawing->drawing_area),
1031 "button-press-event",
1032 G_CALLBACK (button_press_event),
1033 (gpointer)drawing);
1034
1035
1036 gtk_widget_show(drawing->ruler);
1037 gtk_widget_show(drawing->padding);
1038 gtk_widget_show(drawing->ruler_hbox);
1039
1040 gtk_widget_show(drawing->drawing_area);
1041 //gtk_widget_show(drawing->scrolled_window);
1042 gtk_widget_show(drawing->viewport);
1043 gtk_widget_show(drawing->scrollbar);
1044 gtk_widget_show(drawing->hbox);
1045
1046 /* Allocate the colors */
1047 GdkColormap* colormap = gdk_colormap_get_system();
1048 gboolean success[NUM_COLORS];
d3d99fde 1049 gdk_colormap_alloc_colors(colormap, drawing_colors, NUM_COLORS, FALSE,
1050 TRUE, success);
44ffb95f 1051 gdk_colormap_alloc_colors(colormap, drawing_colors_cpu, NUM_COLORS_CPU, FALSE,
9e01e6d4 1052 TRUE, success);
885dc404 1053 gdk_colormap_alloc_colors(colormap, drawing_colors_irq, NUM_COLORS_IRQ, FALSE,
1054 TRUE, success);
2410d45e 1055 gdk_colormap_alloc_colors(colormap, drawing_colors_soft_irq, NUM_COLORS_SOFT_IRQ, FALSE,
0305fe77 1056 TRUE, success);
38726a78 1057 gdk_colormap_alloc_colors(colormap, drawing_colors_trap, NUM_COLORS_TRAP, FALSE,
1058 TRUE, success);
20d16f82 1059 gdk_colormap_alloc_colors(colormap, drawing_colors_bdev, NUM_COLORS_BDEV, FALSE,
1060 TRUE, success);
9e01e6d4 1061
1062 drawing->gc =
1063 gdk_gc_new(GDK_DRAWABLE(main_window_get_widget(control_flow_data->tab)->window));
1064 drawing->dotted_gc =
1065 gdk_gc_new(GDK_DRAWABLE(main_window_get_widget(control_flow_data->tab)->window));
1066
1067 gdk_gc_copy(drawing->gc,
1068 main_window_get_widget(control_flow_data->tab)->style->black_gc);
1069 gdk_gc_copy(drawing->dotted_gc,
1070 main_window_get_widget(control_flow_data->tab)->style->white_gc);
1071
1072 gint8 dash_list[] = { 1, 2 };
1073 gdk_gc_set_line_attributes(drawing->dotted_gc,
1074 1,
1075 GDK_LINE_ON_OFF_DASH,
1076 GDK_CAP_BUTT,
1077 GDK_JOIN_MITER);
1078 gdk_gc_set_dashes(drawing->dotted_gc,
1079 0,
1080 dash_list,
1081 2);
1082
1083 drawing->ruler_gc_butt =
1084 gdk_gc_new(GDK_DRAWABLE(main_window_get_widget(control_flow_data->tab)->window));
1085 gdk_gc_copy(drawing->ruler_gc_butt,
1086 main_window_get_widget(control_flow_data->tab)->style->black_gc);
1087 drawing->ruler_gc_round =
1088 gdk_gc_new(GDK_DRAWABLE(main_window_get_widget(control_flow_data->tab)->window));
1089 gdk_gc_copy(drawing->ruler_gc_round,
1090 main_window_get_widget(control_flow_data->tab)->style->black_gc);
1091
1092
1093 gdk_gc_set_line_attributes(drawing->ruler_gc_butt,
1094 2,
1095 GDK_LINE_SOLID,
1096 GDK_CAP_BUTT,
1097 GDK_JOIN_MITER);
1098
1099 gdk_gc_set_line_attributes(drawing->ruler_gc_round,
1100 2,
1101 GDK_LINE_SOLID,
1102 GDK_CAP_ROUND,
1103 GDK_JOIN_ROUND);
1104
1105
1106 return drawing;
1107}
1108
1109void drawing_destroy(Drawing_t *drawing)
1110{
1111 g_info("drawing_destroy %p", drawing);
1112
1113 /* Free the colors */
1114 GdkColormap* colormap = gdk_colormap_get_system();
1115
d3d99fde 1116 gdk_colormap_free_colors(colormap, drawing_colors, NUM_COLORS);
44ffb95f 1117 gdk_colormap_free_colors(colormap, drawing_colors_cpu, NUM_COLORS_CPU);
8743690d 1118 gdk_colormap_free_colors(colormap, drawing_colors_irq, NUM_COLORS_IRQ);
0305fe77 1119 gdk_colormap_free_colors(colormap, drawing_colors_soft_irq, NUM_COLORS_IRQ);
38726a78 1120 gdk_colormap_free_colors(colormap, drawing_colors_trap, NUM_COLORS_TRAP);
20d16f82 1121 gdk_colormap_free_colors(colormap, drawing_colors_bdev, NUM_COLORS_BDEV);
9e01e6d4 1122
1123 // Do not unref here, Drawing_t destroyed by it's widget.
1124 //g_object_unref( G_OBJECT(drawing->drawing_area));
1125 if(drawing->gc != NULL)
1126 gdk_gc_unref(drawing->gc);
1127
1128 g_object_unref(drawing->pango_layout);
1129 if(drawing->dotted_gc != NULL) gdk_gc_unref(drawing->dotted_gc);
1130 if(drawing->ruler_gc_butt != NULL) gdk_gc_unref(drawing->ruler_gc_butt);
1131 if(drawing->ruler_gc_round != NULL) gdk_gc_unref(drawing->ruler_gc_round);
1132
1133 g_free(drawing);
1134 g_info("drawing_destroy end");
1135}
1136
1137GtkWidget *drawing_get_drawing_area(Drawing_t *drawing)
1138{
1139 return drawing->drawing_area;
1140}
1141
1142GtkWidget *drawing_get_widget(Drawing_t *drawing)
1143{
1144 return drawing->vbox;
1145}
1146
1147void drawing_draw_line( Drawing_t *drawing,
1148 GdkPixmap *pixmap,
1149 guint x1, guint y1,
1150 guint x2, guint y2,
1151 GdkGC *GC)
1152{
1153 gdk_draw_line (pixmap,
1154 GC,
1155 x1, y1, x2, y2);
1156}
1157
1158void drawing_clear(Drawing_t *drawing)
1159{
1160 //if (drawing->pixmap)
1161 // gdk_pixmap_unref(drawing->pixmap);
1162 ControlFlowData *cfd = drawing->control_flow_data;
1163
1164
1165 rectangle_pixmap(cfd->process_list,
1166 drawing->drawing_area->style->black_gc,
1167 TRUE,
1168 0, 0,
1169 drawing->alloc_width, // do not overlap
1170 -1);
1171
1172 //drawing->height = 1;
1173 /* Allocate a new pixmap with new height */
1174 //drawing->pixmap = gdk_pixmap_new(drawing->drawing_area->window,
1175 // drawing->width + SAFETY + EXTRA_ALLOC,
1176 // drawing->height + EXTRA_ALLOC,
1177 // -1);
1178 //drawing->alloc_width = drawing->width + SAFETY + EXTRA_ALLOC;
1179 //drawing->alloc_height = drawing->height + EXTRA_ALLOC;
1180
1181 //gtk_widget_set_size_request(drawing->drawing_area,
1182 // -1,
1183 // drawing->height);
1184 //gtk_widget_queue_resize_no_redraw(drawing->drawing_area);
1185
1186 /* ask for the buffer to be redrawn */
1187 gtk_widget_queue_draw ( drawing->drawing_area);
1188}
1189
1190#if 0
1191/* Insert a square corresponding to a new process in the list */
1192/* Applies to whole drawing->width */
1193void drawing_insert_square(Drawing_t *drawing,
1194 guint y,
1195 guint height)
1196{
1197 //GdkRectangle update_rect;
1198 gboolean reallocate = FALSE;
1199 GdkPixmap *new_pixmap;
1200
1201 /* Allocate a new pixmap with new height */
1202 if(drawing->alloc_height < drawing->height + height) {
1203
1204 new_pixmap = gdk_pixmap_new(drawing->drawing_area->window,
1205 drawing->width + SAFETY + EXTRA_ALLOC,
1206 drawing->height + height + EXTRA_ALLOC,
1207 -1);
1208 drawing->alloc_width = drawing->width + SAFETY + EXTRA_ALLOC;
1209 drawing->alloc_height = drawing->height + height + EXTRA_ALLOC;
1210 reallocate = TRUE;
1211
1212 /* Copy the high region */
1213 gdk_draw_pixmap (new_pixmap,
1214 drawing->drawing_area->style->black_gc,
1215 drawing->pixmap,
1216 0, 0,
1217 0, 0,
1218 drawing->width + SAFETY, y);
1219
1220 } else {
1221 new_pixmap = drawing->pixmap;
1222 }
1223
1224 //GdkPixmap *pixmap = gdk_pixmap_new(drawing->drawing_area->window,
1225 // drawing->width + SAFETY,
1226 // drawing->height + height,
1227 // -1);
1228
1229 /* add an empty square */
1230 gdk_draw_rectangle (new_pixmap,
1231 drawing->drawing_area->style->black_gc,
1232 TRUE,
1233 0, y,
1234 drawing->width + SAFETY, // do not overlap
1235 height);
1236
1237 /* copy the bottom of the region */
1238 gdk_draw_pixmap (new_pixmap,
1239 drawing->drawing_area->style->black_gc,
1240 drawing->pixmap,
1241 0, y,
1242 0, y + height,
1243 drawing->width+SAFETY, drawing->height - y);
1244
1245
1246 if(reallocate && likely(drawing->pixmap)) {
1247 gdk_pixmap_unref(drawing->pixmap);
1248 drawing->pixmap = new_pixmap;
1249 }
1250
1251 if(unlikely(drawing->height==1)) drawing->height = height;
1252 else drawing->height += height;
1253
1254 gtk_widget_set_size_request(drawing->drawing_area,
1255 -1,
1256 drawing->height);
1257 gtk_widget_queue_resize_no_redraw(drawing->drawing_area);
1258
1259 /* ask for the buffer to be redrawn */
1260 gtk_widget_queue_draw_area ( drawing->drawing_area,
1261 0, y,
1262 drawing->width, drawing->height-y);
1263}
1264
1265
1266/* Remove a square corresponding to a removed process in the list */
1267void drawing_remove_square(Drawing_t *drawing,
1268 guint y,
1269 guint height)
1270{
1271 GdkPixmap *pixmap;
1272
1273 if(unlikely((guint)drawing->height == height)) {
1274 //pixmap = gdk_pixmap_new(
1275 // drawing->drawing_area->window,
1276 // drawing->width + SAFETY,
1277 // 1,
1278 // -1);
1279 pixmap = drawing->pixmap;
1280 drawing->height=1;
1281 } else {
1282 /* Allocate a new pixmap with new height */
1283 //pixmap = gdk_pixmap_new(
1284 // drawing->drawing_area->window,
1285 // drawing->width + SAFETY,
1286 // drawing->height - height,
1287 // -1);
1288 /* Keep the same preallocated pixmap */
1289 pixmap = drawing->pixmap;
1290
1291 /* Copy the high region */
1292 gdk_draw_pixmap (pixmap,
1293 drawing->drawing_area->style->black_gc,
1294 drawing->pixmap,
1295 0, 0,
1296 0, 0,
1297 drawing->width + SAFETY, y);
1298
1299 /* Copy up the bottom of the region */
1300 gdk_draw_pixmap (pixmap,
1301 drawing->drawing_area->style->black_gc,
1302 drawing->pixmap,
1303 0, y + height,
1304 0, y,
1305 drawing->width, drawing->height - y - height);
1306
1307 drawing->height-=height;
1308 }
1309
1310 //if(likely(drawing->pixmap))
1311 // gdk_pixmap_unref(drawing->pixmap);
1312
1313 //drawing->pixmap = pixmap;
1314
1315 gtk_widget_set_size_request(drawing->drawing_area,
1316 -1,
1317 drawing->height);
1318 gtk_widget_queue_resize_no_redraw(drawing->drawing_area);
1319 /* ask for the buffer to be redrawn */
1320 gtk_widget_queue_draw_area ( drawing->drawing_area,
1321 0, y,
1322 drawing->width, MAX(drawing->height-y, 1));
1323}
1324#endif //0
1325
1326void drawing_update_ruler(Drawing_t *drawing, TimeWindow *time_window)
1327{
9e01e6d4 1328 gtk_widget_queue_draw(drawing->ruler);
9e01e6d4 1329}
1330
1331/* Redraw the ruler */
1332static gboolean
1333expose_ruler( GtkWidget *widget, GdkEventExpose *event, gpointer user_data )
1334{
1335 Drawing_t *drawing = (Drawing_t*)user_data;
1336 TimeWindow time_window = lttvwindow_get_time_window(drawing->control_flow_data->tab);
1337 gchar text[255];
1338
1339 PangoContext *context;
1340 PangoLayout *layout;
1341 PangoFontDescription *FontDesc;
1342 PangoRectangle ink_rect;
1343 gint global_width=0;
1344 GdkColor foreground = { 0, 0, 0, 0 };
1345 GdkColor background = { 0, 0xffff, 0xffff, 0xffff };
1346
1347 LttTime window_end = time_window.end_time;
1348 LttTime half_width =
1349 ltt_time_div(time_window.time_width,2.0);
1350 LttTime window_middle =
1351 ltt_time_add(half_width,
1352 time_window.start_time);
1353 g_debug("ruler expose event");
1354
1355 gdk_draw_rectangle (drawing->ruler->window,
1356 drawing->ruler->style->white_gc,
1357 TRUE,
1358 event->area.x, event->area.y,
1359 event->area.width,
1360 event->area.height);
1361
1362 gdk_draw_line (drawing->ruler->window,
1363 drawing->ruler_gc_butt,
1364 event->area.x, 1,
1365 event->area.x + event->area.width, 1);
1366
1367
1368 snprintf(text, 255, "%lus\n%luns",
1369 time_window.start_time.tv_sec,
1370 time_window.start_time.tv_nsec);
1371
1372 layout = gtk_widget_create_pango_layout(drawing->drawing_area, NULL);
1373
1374 context = pango_layout_get_context(layout);
1375 FontDesc = pango_context_get_font_description(context);
1376
1377 pango_font_description_set_size(FontDesc, 6*PANGO_SCALE);
1378 pango_layout_context_changed(layout);
1379
1380 pango_layout_set_text(layout, text, -1);
1381 pango_layout_get_pixel_extents(layout, &ink_rect, NULL);
1382 global_width += ink_rect.width;
1383
1384 gdk_draw_layout_with_colors(drawing->ruler->window,
1385 drawing->ruler_gc_butt,
1386 0,
1387 6,
1388 layout, &foreground, &background);
1389
1390 gdk_draw_line (drawing->ruler->window,
1391 drawing->ruler_gc_round,
1392 1, 1,
1393 1, 7);
1394
1395
1396 snprintf(text, 255, "%lus\n%luns", window_end.tv_sec,
1397 window_end.tv_nsec);
1398
1399 pango_layout_set_text(layout, text, -1);
1400 pango_layout_get_pixel_extents(layout, &ink_rect, NULL);
1401 global_width += ink_rect.width;
1402
1403 if(global_width <= drawing->ruler->allocation.width)
1404 {
1405 gdk_draw_layout_with_colors(drawing->ruler->window,
1406 drawing->ruler_gc_butt,
1407 drawing->ruler->allocation.width - ink_rect.width,
1408 6,
1409 layout, &foreground, &background);
1410
1411 gdk_draw_line (drawing->ruler->window,
1412 drawing->ruler_gc_butt,
1413 drawing->ruler->allocation.width-1, 1,
1414 drawing->ruler->allocation.width-1, 7);
1415 }
1416
1417
1418 snprintf(text, 255, "%lus\n%luns", window_middle.tv_sec,
1419 window_middle.tv_nsec);
1420
1421 pango_layout_set_text(layout, text, -1);
1422 pango_layout_get_pixel_extents(layout, &ink_rect, NULL);
1423 global_width += ink_rect.width;
1424
1425 if(global_width <= drawing->ruler->allocation.width)
1426 {
1427 gdk_draw_layout_with_colors(drawing->ruler->window,
1428 drawing->ruler_gc_butt,
1429 (drawing->ruler->allocation.width - ink_rect.width)/2,
1430 6,
1431 layout, &foreground, &background);
1432
1433 gdk_draw_line (drawing->ruler->window,
1434 drawing->ruler_gc_butt,
1435 drawing->ruler->allocation.width/2, 1,
1436 drawing->ruler->allocation.width/2, 7);
1437
1438
1439
1440
1441 }
1442
1443 g_object_unref(layout);
1444
1445 return FALSE;
1446}
1447
1448
1449/* notify mouse on ruler */
1450static gboolean
1451motion_notify_ruler(GtkWidget *widget, GdkEventMotion *event, gpointer user_data)
1452{
1453 //g_debug("motion");
1454 //eventually follow mouse and show time here
1455 return 0;
1456}
This page took 0.110721 seconds and 4 git commands to generate.