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