f0d936c0 |
1 | |
fa2c4dbe |
2 | #include <gtk/gtk.h> |
3 | #include <glib.h> |
f0d936c0 |
4 | #include "Process_List.h" |
5 | |
fa2c4dbe |
6 | |
f0d936c0 |
7 | /***************************************************************************** |
8 | * Methods to synchronize process list * |
9 | *****************************************************************************/ |
10 | |
f0d936c0 |
11 | /* Enumeration of the columns */ |
12 | enum |
13 | { |
14 | PROCESS_COLUMN, |
fa2c4dbe |
15 | PID_COLUMN, |
16 | BIRTH_S_COLUMN, |
17 | BIRTH_NS_COLUMN, |
f0d936c0 |
18 | N_COLUMNS |
19 | }; |
20 | |
21 | |
fa2c4dbe |
22 | gint process_sort_func ( GtkTreeModel *model, |
23 | GtkTreeIter *it_a, |
24 | GtkTreeIter *it_b, |
25 | gpointer user_data) |
26 | { |
27 | GValue a, b; |
28 | |
29 | memset(&a, 0, sizeof(GValue)); |
30 | memset(&b, 0, sizeof(GValue)); |
31 | |
32 | /* Order by PID */ |
33 | gtk_tree_model_get_value( model, |
34 | it_a, |
35 | PID_COLUMN, |
36 | &a); |
37 | |
38 | gtk_tree_model_get_value( model, |
39 | it_b, |
40 | PID_COLUMN, |
41 | &b); |
42 | |
43 | if(G_VALUE_TYPE(&a) == G_TYPE_UINT |
44 | && G_VALUE_TYPE(&b) == G_TYPE_UINT ) |
45 | { |
46 | if(g_value_get_uint(&a) > g_value_get_uint(&b)) |
47 | { |
48 | g_value_unset(&a); |
49 | g_value_unset(&b); |
50 | return 1; |
51 | } |
52 | if(g_value_get_uint(&a) < g_value_get_uint(&b)) |
53 | { |
54 | g_value_unset(&a); |
55 | g_value_unset(&b); |
56 | return 0; |
57 | } |
58 | } |
59 | |
60 | g_value_unset(&a); |
61 | g_value_unset(&b); |
62 | |
63 | |
64 | /* Order by birth second */ |
65 | gtk_tree_model_get_value( model, |
66 | it_a, |
67 | BIRTH_S_COLUMN, |
68 | &a); |
69 | |
70 | gtk_tree_model_get_value( model, |
71 | it_b, |
72 | BIRTH_S_COLUMN, |
73 | &b); |
74 | |
75 | |
76 | if(G_VALUE_TYPE(&a) == G_TYPE_ULONG |
77 | && G_VALUE_TYPE(&b) == G_TYPE_ULONG ) |
78 | { |
79 | if(g_value_get_ulong(&a) > g_value_get_ulong(&b)) |
80 | { |
81 | g_value_unset(&a); |
82 | g_value_unset(&b); |
83 | return 1; |
84 | } |
85 | if(g_value_get_ulong(&a) < g_value_get_ulong(&b)) |
86 | { |
87 | g_value_unset(&a); |
88 | g_value_unset(&b); |
89 | return 0; |
90 | } |
91 | |
92 | } |
93 | |
94 | g_value_unset(&a); |
95 | g_value_unset(&b); |
96 | |
97 | /* Order by birth nanosecond */ |
98 | gtk_tree_model_get_value( model, |
99 | it_a, |
100 | BIRTH_NS_COLUMN, |
101 | &a); |
102 | |
103 | gtk_tree_model_get_value( model, |
104 | it_b, |
105 | BIRTH_NS_COLUMN, |
106 | &b); |
107 | |
108 | |
109 | if(G_VALUE_TYPE(&a) == G_TYPE_ULONG |
110 | && G_VALUE_TYPE(&b) == G_TYPE_ULONG ) |
111 | { |
112 | if(g_value_get_ulong(&a) > g_value_get_ulong(&b)) |
113 | { |
114 | g_value_unset(&a); |
115 | g_value_unset(&b); |
116 | return 1; |
117 | } |
118 | // Final condition |
119 | //if(g_value_get_ulong(&a) < g_value_get_ulong(&b)) |
120 | //{ |
121 | // g_value_unset(&a); |
122 | // g_value_unset(&b); |
123 | // return 0; |
124 | //} |
125 | |
126 | } |
127 | |
128 | g_value_unset(&a); |
129 | g_value_unset(&b); |
130 | |
131 | return 0; |
132 | |
133 | } |
134 | |
fa2c4dbe |
135 | guint hash_fct(gconstpointer key) |
136 | { |
137 | return ((ProcessInfo*)key)->pid; |
138 | } |
139 | |
140 | gboolean equ_fct(gconstpointer a, gconstpointer b) |
141 | { |
142 | if(((ProcessInfo*)a)->pid != ((ProcessInfo*)b)->pid) |
143 | return 0; |
f7afe191 |
144 | // g_critical("compare %u and %u",((ProcessInfo*)a)->pid,((ProcessInfo*)b)->pid); |
fa2c4dbe |
145 | if(((ProcessInfo*)a)->birth.tv_sec != ((ProcessInfo*)b)->birth.tv_sec) |
146 | return 0; |
f7afe191 |
147 | // g_critical("compare %u and %u",((ProcessInfo*)a)->birth.tv_sec,((ProcessInfo*)b)->birth.tv_sec); |
fa2c4dbe |
148 | |
149 | if(((ProcessInfo*)a)->birth.tv_nsec != ((ProcessInfo*)b)->birth.tv_nsec) |
150 | return 0; |
f7afe191 |
151 | // g_critical("compare %u and %u",((ProcessInfo*)a)->birth.tv_nsec,((ProcessInfo*)b)->birth.tv_nsec); |
fa2c4dbe |
152 | |
153 | return 1; |
154 | } |
155 | |
4c69e0cc |
156 | void destroy_hash_key(gpointer key); |
fa2c4dbe |
157 | |
4c69e0cc |
158 | void destroy_hash_data(gpointer data); |
fa2c4dbe |
159 | |
160 | |
161 | |
162 | |
4c69e0cc |
163 | ProcessList *processlist_construct(void) |
f0d936c0 |
164 | { |
165 | GtkTreeViewColumn *column; |
166 | GtkCellRenderer *renderer; |
167 | |
168 | ProcessList* Process_List = g_new(ProcessList,1); |
169 | |
fa2c4dbe |
170 | Process_List->Number_Of_Process = 0; |
171 | |
f0d936c0 |
172 | /* Create the Process list */ |
173 | Process_List->Store_M = gtk_list_store_new ( N_COLUMNS, |
fa2c4dbe |
174 | G_TYPE_STRING, |
175 | G_TYPE_UINT, |
176 | G_TYPE_ULONG, |
177 | G_TYPE_ULONG); |
f0d936c0 |
178 | |
179 | |
180 | Process_List->Process_List_VC = |
181 | gtk_tree_view_new_with_model |
182 | (GTK_TREE_MODEL (Process_List->Store_M)); |
183 | |
184 | g_object_unref (G_OBJECT (Process_List->Store_M)); |
185 | |
fa2c4dbe |
186 | gtk_tree_sortable_set_sort_func( |
187 | GTK_TREE_SORTABLE(Process_List->Store_M), |
188 | PID_COLUMN, |
189 | process_sort_func, |
190 | NULL, |
191 | NULL); |
192 | |
193 | gtk_tree_sortable_set_sort_column_id( |
194 | GTK_TREE_SORTABLE(Process_List->Store_M), |
195 | PID_COLUMN, |
196 | GTK_SORT_ASCENDING); |
197 | |
198 | Process_List->Process_Hash = g_hash_table_new_full( |
199 | hash_fct, equ_fct, |
4c69e0cc |
200 | destroy_hash_key, destroy_hash_data |
fa2c4dbe |
201 | ); |
202 | |
203 | |
f0d936c0 |
204 | gtk_tree_view_set_headers_visible( |
205 | GTK_TREE_VIEW(Process_List->Process_List_VC), FALSE); |
206 | |
207 | /* Create a column, associating the "text" attribute of the |
208 | * cell_renderer to the first column of the model */ |
209 | /* Columns alignment : 0.0 : Left 0.5 : Center 1.0 : Right */ |
210 | renderer = gtk_cell_renderer_text_new (); |
211 | column = gtk_tree_view_column_new_with_attributes ( "Process", |
212 | renderer, |
213 | "text", |
214 | PROCESS_COLUMN, |
215 | NULL); |
216 | gtk_tree_view_column_set_alignment (column, 0.0); |
217 | gtk_tree_view_column_set_fixed_width (column, 45); |
218 | gtk_tree_view_append_column ( |
219 | GTK_TREE_VIEW (Process_List->Process_List_VC), column); |
fa2c4dbe |
220 | |
221 | column = gtk_tree_view_column_new_with_attributes ( "PID", |
222 | renderer, |
223 | "text", |
224 | PID_COLUMN, |
225 | NULL); |
226 | gtk_tree_view_append_column ( |
227 | GTK_TREE_VIEW (Process_List->Process_List_VC), column); |
228 | |
229 | |
230 | column = gtk_tree_view_column_new_with_attributes ( "Birth sec", |
231 | renderer, |
232 | "text", |
233 | BIRTH_S_COLUMN, |
234 | NULL); |
235 | gtk_tree_view_append_column ( |
236 | GTK_TREE_VIEW (Process_List->Process_List_VC), column); |
237 | |
238 | //gtk_tree_view_column_set_visible(column, 0); |
239 | // |
240 | column = gtk_tree_view_column_new_with_attributes ( "Birth nsec", |
241 | renderer, |
242 | "text", |
243 | BIRTH_NS_COLUMN, |
244 | NULL); |
245 | gtk_tree_view_append_column ( |
246 | GTK_TREE_VIEW (Process_List->Process_List_VC), column); |
247 | |
248 | //gtk_tree_view_column_set_visible(column, 0); |
f0d936c0 |
249 | |
250 | g_object_set_data_full( |
251 | G_OBJECT(Process_List->Process_List_VC), |
252 | "Process_List_Data", |
253 | Process_List, |
4c69e0cc |
254 | (GDestroyNotify)processlist_destroy); |
f7afe191 |
255 | |
256 | Process_List->Test_Process_Sent = 0; |
257 | |
f0d936c0 |
258 | return Process_List; |
259 | } |
4c69e0cc |
260 | void processlist_destroy(ProcessList *Process_List) |
f0d936c0 |
261 | { |
fa2c4dbe |
262 | g_hash_table_destroy(Process_List->Process_Hash); |
263 | Process_List->Process_Hash = NULL; |
f0d936c0 |
264 | |
265 | g_free(Process_List); |
266 | } |
267 | |
4c69e0cc |
268 | GtkWidget *processlist_get_widget(ProcessList *Process_List) |
f0d936c0 |
269 | { |
270 | return Process_List->Process_List_VC; |
271 | } |
272 | |
273 | |
274 | |
275 | gint get_cell_height(GtkTreeView *TreeView) |
276 | { |
fa2c4dbe |
277 | gint height; |
f0d936c0 |
278 | GtkTreeViewColumn *Column = gtk_tree_view_get_column(TreeView, 0); |
8d088fb2 |
279 | //GList *Render_List = gtk_tree_view_column_get_cell_renderers(Column); |
280 | //GtkCellRenderer *Renderer = g_list_first(Render_List)->data; |
f0d936c0 |
281 | |
8d088fb2 |
282 | //g_list_free(Render_List); |
f0d936c0 |
283 | gtk_tree_view_column_cell_get_size(Column, NULL, NULL, NULL, NULL, &height); |
f7afe191 |
284 | //g_critical("cell 0 height : %u",height); |
f0d936c0 |
285 | |
286 | return height; |
287 | } |
288 | |
4c69e0cc |
289 | void destroy_hash_key(gpointer key) |
f0d936c0 |
290 | { |
fa2c4dbe |
291 | g_free(key); |
292 | } |
293 | |
4c69e0cc |
294 | void destroy_hash_data(gpointer data) |
fa2c4dbe |
295 | { |
296 | g_free(data); |
297 | } |
298 | |
4c69e0cc |
299 | int processlist_add( ProcessList *Process_List, |
fa2c4dbe |
300 | guint pid, |
301 | LttTime *birth, |
302 | guint *height) |
303 | { |
304 | GtkTreeIter iter ; |
305 | ProcessInfo *Process_Info = g_new(ProcessInfo, 1); |
306 | GtkTreeRowReference *RowRef; |
307 | |
308 | Process_Info->pid = pid; |
309 | Process_Info->birth = *birth; |
310 | |
311 | /* Add a new row to the model */ |
312 | gtk_list_store_append ( Process_List->Store_M, &iter); |
f7afe191 |
313 | //g_critical ( "iter before : %s", gtk_tree_path_to_string ( |
314 | // gtk_tree_model_get_path ( |
315 | // GTK_TREE_MODEL(Process_List->Store_M), |
316 | // &iter))); |
fa2c4dbe |
317 | gtk_list_store_set ( Process_List->Store_M, &iter, |
318 | PROCESS_COLUMN, "name", |
319 | PID_COLUMN, pid, |
320 | BIRTH_S_COLUMN, birth->tv_sec, |
321 | BIRTH_NS_COLUMN, birth->tv_nsec, |
322 | -1); |
323 | RowRef = gtk_tree_row_reference_new ( |
324 | GTK_TREE_MODEL(Process_List->Store_M), |
325 | gtk_tree_model_get_path( |
326 | GTK_TREE_MODEL(Process_List->Store_M), |
327 | &iter)); |
328 | |
329 | g_hash_table_insert( Process_List->Process_Hash, |
330 | (gpointer)Process_Info, |
331 | (gpointer)RowRef); |
332 | |
f7afe191 |
333 | //g_critical ( "iter after : %s", gtk_tree_path_to_string ( |
334 | // gtk_tree_model_get_path ( |
335 | // GTK_TREE_MODEL(Process_List->Store_M), |
336 | // &iter))); |
fa2c4dbe |
337 | Process_List->Number_Of_Process++; |
f0d936c0 |
338 | |
fa2c4dbe |
339 | *height = get_cell_height(GTK_TREE_VIEW(Process_List->Process_List_VC)) |
f0d936c0 |
340 | * Process_List->Number_Of_Process ; |
341 | |
fa2c4dbe |
342 | |
f0d936c0 |
343 | return 0; |
344 | |
345 | } |
346 | |
4c69e0cc |
347 | int processlist_remove( ProcessList *Process_List, |
fa2c4dbe |
348 | guint pid, |
349 | LttTime *birth) |
f0d936c0 |
350 | { |
fa2c4dbe |
351 | ProcessInfo Process_Info; |
352 | gint *path_indices; |
353 | GtkTreeRowReference *got_RowRef; |
354 | GtkTreeIter iter; |
f0d936c0 |
355 | |
fa2c4dbe |
356 | Process_Info.pid = pid; |
357 | Process_Info.birth = *birth; |
358 | |
359 | if(got_RowRef = |
360 | (GtkTreeRowReference*)g_hash_table_lookup( |
361 | Process_List->Process_Hash, |
362 | &Process_Info)) |
363 | { |
364 | gtk_tree_model_get_iter ( |
365 | GTK_TREE_MODEL(Process_List->Store_M), |
366 | &iter, |
367 | gtk_tree_row_reference_get_path( |
368 | (GtkTreeRowReference*)got_RowRef) |
369 | ); |
370 | |
371 | gtk_list_store_remove (Process_List->Store_M, &iter); |
372 | |
373 | g_hash_table_remove(Process_List->Process_Hash, |
374 | &Process_Info); |
375 | |
376 | Process_List->Number_Of_Process--; |
377 | |
378 | return 0; |
379 | } else { |
380 | return 1; |
381 | } |
382 | } |
383 | |
384 | |
4c69e0cc |
385 | guint processlist_get_height(ProcessList *Process_List) |
fa2c4dbe |
386 | { |
387 | return get_cell_height(GTK_TREE_VIEW(Process_List->Process_List_VC)) |
f0d936c0 |
388 | * Process_List->Number_Of_Process ; |
f0d936c0 |
389 | } |
fa2c4dbe |
390 | |
391 | |
4c69e0cc |
392 | gint processlist_get_process_pixels( ProcessList *Process_List, |
fa2c4dbe |
393 | guint pid, LttTime *birth, |
f7afe191 |
394 | guint *y, |
fa2c4dbe |
395 | guint *height) |
396 | { |
397 | ProcessInfo Process_Info; |
398 | gint *path_indices; |
399 | GtkTreeRowReference *got_RowRef; |
8d088fb2 |
400 | GtkTreePath *tree_path; |
fa2c4dbe |
401 | |
402 | Process_Info.pid = pid; |
403 | Process_Info.birth = *birth; |
404 | |
405 | if(got_RowRef = |
406 | (GtkTreeRowReference*)g_hash_table_lookup( |
407 | Process_List->Process_Hash, |
408 | &Process_Info)) |
409 | { |
8d088fb2 |
410 | tree_path = gtk_tree_row_reference_get_path( |
411 | (GtkTreeRowReference*)got_RowRef); |
412 | path_indices = gtk_tree_path_get_indices (tree_path); |
413 | gtk_tree_path_free(tree_path); |
fa2c4dbe |
414 | |
415 | *height = get_cell_height( |
416 | GTK_TREE_VIEW(Process_List->Process_List_VC)); |
f7afe191 |
417 | *y = *height * path_indices[0]; |
fa2c4dbe |
418 | |
419 | return 0; |
420 | } else { |
421 | return 1; |
422 | } |
423 | |
424 | |
425 | |
426 | } |