29#include <json-glib/json-glib.h>
33#define TIMELINE_MAX_ROWS 4000
34#define POLL_INTERVAL_MS 300
35#define MEMORY_MAX_ROWS 500
36#define MEMORY_REFRESH_TICKS 4
80 return g_strdup_printf(
"0x%016" G_GINT64_MODIFIER
"x", h);
85 if(!g_strcmp0(
d,
"history"))
return "#7fbfff";
86 if(!g_strcmp0(
d,
"node"))
return "#9fe0a0";
87 if(!g_strcmp0(
d,
"cacheline"))
return "#ffd080";
88 if(!g_strcmp0(
d,
"backbuf"))
return "#ff9a9a";
89 if(!g_strcmp0(
d,
"widget"))
return "#d0a8ff";
90 if(!g_strcmp0(
d,
"thumbnail"))
return "#bcbcbc";
91 if(!g_strcmp0(
d,
"mipmap"))
return "#b0c4de";
92 if(!g_strcmp0(
d,
"image"))
return "#e8c8a0";
93 if(!g_strcmp0(
d,
"form"))
return "#f0a0c0";
99 JsonParser *
p = json_parser_new();
101 if(json_parser_load_from_data(
p, compact, -1, NULL))
103 JsonGenerator *
g = json_generator_new();
104 json_generator_set_root(
g, json_parser_get_root(
p));
105 json_generator_set_pretty(
g,
TRUE);
106 out = json_generator_to_data(
g, NULL);
110 return out ?
out : g_strdup(compact);
118 if(!
row || !
_g.timeline_scroll)
return;
119 GtkAdjustment *vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(
_g.timeline_scroll));
122 if(!gtk_widget_translate_coordinates(
row,
_g.timeline_list, 0, 0, NULL, &y))
return;
124 gtk_widget_get_allocation(
row, &alloc);
125 const double page = gtk_adjustment_get_page_size(vadj);
126 const double upper = gtk_adjustment_get_upper(vadj);
127 double target = (
double)y + alloc.height / 2.0 - page / 2.0;
128 target = CLAMP(target, 0.0,
MAX(0.0, upper - page));
129 gtk_adjustment_set_value(vadj, target);
135 if(
_g.window &&
_g.scroll_target)
140 g_clear_pointer(&
_g.scroll_target, g_free);
141 return G_SOURCE_REMOVE;
145static gboolean
_on_link(GtkLabel *label, gchar *uri, gpointer user_data)
147 if(!
_g.decl_map)
return TRUE;
151 gtk_notebook_set_current_page(GTK_NOTEBOOK(
_g.notebook),
_g.page_timeline);
153 if(toggle) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle),
TRUE);
154 gtk_list_box_select_row(GTK_LIST_BOX(
_g.timeline_list), GTK_LIST_BOX_ROW(
row));
155 gtk_widget_grab_focus(
row);
158 g_free(
_g.scroll_target);
159 _g.scroll_target = g_strdup(uri);
167 const char *uri = (
const char *)g_object_get_data(G_OBJECT(item),
"uri");
168 if(uri &&
_g.search_entry)
170 gtk_entry_set_text(GTK_ENTRY(
_g.search_entry), uri);
171 gtk_notebook_set_current_page(GTK_NOTEBOOK(
_g.notebook),
_g.page_search);
178 if(e->type != GDK_BUTTON_PRESS || e->button != GDK_BUTTON_SECONDARY)
return FALSE;
179 const char *uri = gtk_label_get_current_uri(GTK_LABEL(label));
182 if(!uri || !*uri) uri = (
const char *)g_object_get_data(G_OBJECT(label),
"own-hash");
183 if(!uri || !*uri)
return FALSE;
186 GtkWidget *mi = gtk_menu_item_new_with_label(_(
"Search for this hash"));
187 g_object_set_data_full(G_OBJECT(mi),
"uri", g_strdup(uri), g_free);
189 gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
190 gtk_widget_show_all(menu);
191 gtk_menu_popup_at_pointer(GTK_MENU(menu), (GdkEvent *)e);
198 gtk_label_set_track_visited_links(GTK_LABEL(label),
FALSE);
199 g_signal_connect(label,
"activate-link", G_CALLBACK(
_on_link), NULL);
200 gtk_widget_add_events(label, GDK_BUTTON_PRESS_MASK);
201 g_signal_connect(label,
"button-press-event", G_CALLBACK(
_on_label_button), NULL);
208 const gboolean a = gtk_toggle_button_get_active(
t);
214 if(a && rev && !gtk_bin_get_child(GTK_BIN(rev)))
216 const char *json = (
const char *)g_object_get_data(G_OBJECT(
t),
"lazy_json");
220 gtk_container_add(GTK_CONTAINER(rev), body);
221 gtk_widget_show_all(body);
224 if(rev) gtk_revealer_set_reveal_child(GTK_REVEALER(rev), a);
226 gtk_image_set_from_icon_name(GTK_IMAGE(arrow), a ?
"pan-down-symbolic" :
"pan-end-symbolic",
227 GTK_ICON_SIZE_BUTTON);
235 GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
236 GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
238 GtkWidget *toggle = gtk_toggle_button_new();
239 gtk_button_set_relief(GTK_BUTTON(toggle), GTK_RELIEF_NONE);
240 gtk_widget_set_focus_on_click(toggle,
FALSE);
241 GtkWidget *arrow = gtk_image_new_from_icon_name(expanded ?
"pan-down-symbolic" :
"pan-end-symbolic",
242 GTK_ICON_SIZE_BUTTON);
243 gtk_container_add(GTK_CONTAINER(toggle), arrow);
246 gtk_label_set_markup(GTK_LABEL(header), header_markup);
247 gtk_label_set_xalign(GTK_LABEL(header), 0.0);
250 GtkWidget *revealer = gtk_revealer_new();
251 gtk_revealer_set_reveal_child(GTK_REVEALER(revealer), expanded);
252 if(body) gtk_container_add(GTK_CONTAINER(revealer), body);
254 g_object_set_data(G_OBJECT(toggle),
"revealer", revealer);
255 g_object_set_data(G_OBJECT(toggle),
"arrow", arrow);
256 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), expanded);
257 g_signal_connect(toggle,
"toggled", G_CALLBACK(
_on_toggle), NULL);
259 gtk_box_pack_start(GTK_BOX(hbox), toggle,
FALSE,
FALSE, 0);
260 gtk_box_pack_start(GTK_BOX(hbox), header,
TRUE,
TRUE, 0);
261 gtk_box_pack_start(GTK_BOX(vbox), hbox,
FALSE,
FALSE, 0);
262 gtk_box_pack_start(GTK_BOX(vbox), revealer,
FALSE,
FALSE, 0);
264 g_object_set_data(G_OBJECT(vbox),
"toggle", toggle);
265 g_object_set_data(G_OBJECT(vbox),
"header", header);
272 gchar *e_op = g_markup_escape_text(ev->
op, -1);
273 gchar *e_dom = g_markup_escape_text(ev->
domain, -1);
274 gchar *e_thr = g_markup_escape_text(ev->
thread, -1);
275 gchar *e_mn_raw = g_markup_escape_text(ev->
mnemonic[0] ? ev->
mnemonic :
"-", -1);
279 const gboolean is_raster_mask
280 = !g_strcmp0(ev->
domain,
"cacheline") && !g_strcmp0(ev->
cache_name,
"raster mask");
281 gchar *e_mn = is_raster_mask ? g_strdup_printf(
"%s - raster mask", e_mn_raw) : g_strdup(e_mn_raw);
283 gchar *
out = g_strdup_printf(
284 "<tt>%9.3f</tt> <b>%-7s</b> <span foreground=\"%s\">%-10s</span> <b>%-16s</b> "
285 "<a href=\"%s\"><tt>%s</tt></a> <span size=\"small\"><i>%s</i></span>",
298 GtkWidget *detail = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
299 gtk_widget_set_margin_start(detail, 28);
300 gtk_widget_set_margin_bottom(detail, 6);
302 if(links && links->len)
304 GString *ls = g_string_new(NULL);
305 for(guint
i = 0;
i < links->len;
i++)
309 g_string_append_printf(ls,
"%s%s → <a href=\"%s\"><tt>%s</tt></a>",
i ?
" " :
"", lk->
label,
314 gtk_label_set_markup(GTK_LABEL(
lw), ls->str);
315 gtk_label_set_xalign(GTK_LABEL(
lw), 0.0);
317 gtk_box_pack_start(GTK_BOX(detail),
lw,
FALSE,
FALSE, 0);
318 g_string_free(ls,
TRUE);
322 gchar *escaped = g_markup_escape_text(pretty, -1);
323 gchar *mono = g_strdup_printf(
"<tt>%s</tt>", escaped);
325 gtk_label_set_markup(GTK_LABEL(body), mono);
326 gtk_label_set_xalign(GTK_LABEL(body), 0.0);
327 gtk_label_set_selectable(GTK_LABEL(body),
TRUE);
328 gtk_box_pack_start(GTK_BOX(detail), body,
FALSE,
FALSE, 0);
337 if(
p) g_array_free((GArray *)
p,
TRUE);
348 g_object_set_data_full(G_OBJECT(toggle),
"lazy_json", g_strdup(ev->
json), g_free);
353 g_object_set_data_full(G_OBJECT(toggle),
"lazy_links",
copy,
_links_free);
359 if(header) g_object_set_data_full(G_OBJECT(header),
"own-hash",
_hashhex(ev->
hash), g_free);
368 gtk_widget_show_all(w);
369 gtk_container_add(GTK_CONTAINER(
_g.timeline_list), w);
371 g_object_set_data(G_OBJECT(
row),
"toggle", g_object_get_data(G_OBJECT(w),
"toggle"));
372 if(!g_strcmp0(ev->
op,
"create"))
375 g_object_set_data_full(G_OBJECT(
row),
"svhash", g_strdup(hx), g_free);
376 g_hash_table_replace(
_g.decl_map, hx,
row);
382 GList *children = gtk_container_get_children(GTK_CONTAINER(
_g.timeline_list));
384 for(GList *l = children; l && excess > 0; l = l->next, excess--)
387 const char *hx = (
const char *)g_object_get_data(G_OBJECT(
row),
"svhash");
388 if(hx && g_hash_table_lookup(
_g.decl_map, hx) ==
row) g_hash_table_remove(
_g.decl_map, hx);
389 gtk_widget_destroy(
row);
391 g_list_free(children);
396 GList *children = gtk_container_get_children(GTK_CONTAINER(list));
397 for(GList *l = children; l; l = l->next) gtk_widget_destroy(GTK_WIDGET(l->data));
398 g_list_free(children);
404 gtk_label_set_text(GTK_LABEL(
_g.count_label), s);
410 if(!g_strcmp0(by,
"thread"))
return ev->
thread;
411 if(!g_strcmp0(by,
"op"))
return ev->
op;
417 gchar *e = g_markup_escape_text(
g->key && *
g->key ?
g->key :
"(none)", -1);
418 gchar *hm = g_strdup_printf(
"<b>%s</b> <span size=\"small\">(%d)</span>", e,
g->count);
419 gtk_label_set_markup(GTK_LABEL(
g->header), hm);
433 g->key = g_strdup(
k);
434 g->body = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
435 gtk_widget_set_margin_start(
g->body, 12);
437 g->header = (
GtkWidget *)g_object_get_data(G_OBJECT(coll),
"header");
438 gtk_container_add(GTK_CONTAINER(
_g.grouped_list), coll);
439 gtk_widget_show_all(coll);
440 g_hash_table_insert(
_g.group_map, g_strdup(
k),
g);
444 gtk_widget_show_all(
row);
456 gchar *by = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(
_g.groupby));
457 for(guint
i = 0;
i < evs->len;
i++)
_grouped_append(g_ptr_array_index(evs,
i), by ? by :
"domain");
459 _g.grouped_last_seq = newlast;
468 g_hash_table_remove_all(
_g.group_map);
469 _g.grouped_last_seq = 0;
478 gchar *
t = g_markup_printf_escaped(
"<b>%s</b>", title);
479 gtk_label_set_markup(GTK_LABEL(hdr),
t);
480 gtk_label_set_xalign(GTK_LABEL(hdr), 0.0);
481 gtk_widget_set_margin_top(hdr, 8);
483 gtk_box_pack_start(GTK_BOX(box), hdr,
FALSE,
FALSE, 0);
485 const double frac =
max ? CLAMP((
double)cur / (
double)
max, 0.0, 1.0) : 0.0;
487 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(bar), frac);
488 gtk_progress_bar_set_show_text(GTK_PROGRESS_BAR(bar),
TRUE);
489 gchar *txt = g_strdup_printf(
"%.1f / %.1f MiB (%.0f%%)", cur / 1048576.0,
max / 1048576.0, frac * 100.0);
490 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(bar), txt);
492 gtk_box_pack_start(GTK_BOX(box), bar,
FALSE,
FALSE, 0);
501 gtk_label_set_markup(GTK_LABEL(lbl), markup);
502 gtk_label_set_xalign(GTK_LABEL(lbl), 0.0);
505 if(trailing && *trailing)
507 GtkWidget *
row = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
508 gtk_widget_set_margin_start(
row, 12);
509 gtk_box_pack_start(GTK_BOX(
row), lbl,
TRUE,
TRUE, 0);
511 gtk_label_set_markup(GTK_LABEL(tl), trailing);
512 gtk_label_set_xalign(GTK_LABEL(tl), 1.0);
518 gtk_widget_set_margin_start(lbl, 12);
519 gtk_box_pack_start(GTK_BOX(box), lbl,
FALSE,
FALSE, 0);
526 return (y->size >
x->size) - (y->size <
x->size);
532 return (y->size >
x->size) - (y->size <
x->size);
538 return x->imgid - y->imgid;
543 if(!
_g.mem_box)
return;
547 size_t cur = 0,
max = 0;
552 size_t vram_used = 0;
555 gchar *ptitle = g_strdup_printf(gpu ? _(
"Pipeline cache (RAM) — %u items") : _(
"Pipeline cache — %u items"),
568 gchar *
name = g_markup_escape_text(e->
name[0] ? e->
name :
"-", -1);
570 gchar *vram = (gpu && e->
cl_count > 0)
571 ? g_strdup_printf(
"<tt>+%8.2f MiB vRAM (%2d buf)</tt>", e->
cl_bytes / 1048576.0,
574 gchar *
m = g_strdup_printf(
"<a href=\"%s\"><tt>%s</tt></a> %.2f MiB refs=%d hits=%d <i>%s</i>", hx, hx,
582 g_array_free(pe,
TRUE);
587 gchar *mtitle = g_strdup_printf(_(
"Mipmap cache — %u items"), me->len);
595 gchar *
m = g_strdup_printf(
"<a href=\"%s\">image #%d · mip %d</a> %.2f MiB", hx, e->
imgid, e->
mip,
596 e->
size / 1048576.0);
601 g_array_free(me,
TRUE);
606 gchar *ititle = g_strdup_printf(_(
"Image cache — %u items"), ie->len);
615 gchar *
m = g_strdup_printf(
"<a href=\"%s\">image #%d</a> <i>%s</i>", hx, e->
imgid, fn);
621 g_array_free(ie,
TRUE);
623 gtk_widget_show_all(
_g.mem_box);
632 gchar *lh = g_ascii_strdown(hx, -1);
633 const gboolean
m = strstr(lh, needle) != NULL;
644 const char *text_needle)
650 for(guint
i = 0;
i < ev->
links->len;
i++)
653 if(*text_needle && ev->
json)
655 gchar *jl = g_ascii_strdown(ev->
json, -1);
656 const gboolean
m = strstr(jl, text_needle) != NULL;
665 if(!
_g.search_list)
return;
667 if(!query || !*query)
669 gtk_widget_show_all(
_g.search_list);
674 gchar *text_needle = g_ascii_strdown(query, -1);
675 const char *hash_needle = g_str_has_prefix(text_needle,
"0x") ? text_needle + 2 : text_needle;
678 for(guint
i = 0;
i < evs->len;
i++)
686 gtk_widget_show_all(
_g.search_list);
691 const char *txt = gtk_entry_get_text(GTK_ENTRY(e));
693 if(txt && *txt) gtk_notebook_set_current_page(GTK_NOTEBOOK(
_g.notebook),
_g.page_search);
699 if(!
_g.timeline_scroll)
return G_SOURCE_REMOVE;
700 GtkAdjustment *adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(
_g.timeline_scroll));
701 if(adj) gtk_adjustment_set_value(adj, gtk_adjustment_get_upper(adj));
702 return G_SOURCE_REMOVE;
707 if(!
_g.window)
return G_SOURCE_REMOVE;
710 const int page = gtk_notebook_get_current_page(GTK_NOTEBOOK(
_g.notebook));
723 GtkAdjustment *adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(
_g.timeline_scroll));
724 const gboolean at_bottom = !adj
725 || gtk_adjustment_get_value(adj)
726 >= gtk_adjustment_get_upper(adj) - gtk_adjustment_get_page_size(adj) - 4.0;
729 _g.last_seq = newlast;
735 return G_SOURCE_CONTINUE;
741 g_hash_table_remove_all(
_g.decl_map);
769 if((
int)page_num ==
_g.page_grouped)
771 else if((
int)page_num ==
_g.page_memory)
773 else if((
int)page_num ==
_g.page_search)
779 if(
_g.timer_id) g_source_remove(
_g.timer_id);
781 if(
_g.decl_map) g_hash_table_destroy(
_g.decl_map);
782 if(
_g.group_map) g_hash_table_destroy(
_g.group_map);
783 g_free(
_g.scroll_target);
784 memset(&
_g, 0,
sizeof(
_g));
791 gtk_window_present(GTK_WINDOW(
_g.window));
795 _g.decl_map = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
796 _g.group_map = g_hash_table_new_full(g_str_hash, g_str_equal, g_free,
_group_free);
798 _g.window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
799 gtk_window_set_title(GTK_WINDOW(
_g.window), _(
"Event supervisor"));
800 gtk_window_set_default_size(GTK_WINDOW(
_g.window), 1000, 640);
802 g_signal_connect(
_g.window,
"destroy", G_CALLBACK(
_on_destroy), NULL);
804 GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
805 gtk_container_set_border_width(GTK_CONTAINER(vbox), 8);
806 gtk_container_add(GTK_CONTAINER(
_g.window), vbox);
809 GtkWidget *bar = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
810 gtk_box_pack_start(GTK_BOX(vbox), bar,
FALSE,
FALSE, 0);
812 GtkWidget *record = gtk_check_button_new_with_label(_(
"Record"));
813 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(record),
TRUE);
816 gtk_box_pack_start(GTK_BOX(bar), record,
FALSE,
FALSE, 0);
818 GtkWidget *refresh = gtk_button_new_with_label(_(
"Refresh"));
819 g_signal_connect(refresh,
"clicked", G_CALLBACK(
_on_refresh), NULL);
820 gtk_box_pack_start(GTK_BOX(bar), refresh,
FALSE,
FALSE, 0);
822 GtkWidget *clear = gtk_button_new_with_label(_(
"Clear"));
823 g_signal_connect(clear,
"clicked", G_CALLBACK(
_on_clear), NULL);
824 gtk_box_pack_start(GTK_BOX(bar), clear,
FALSE,
FALSE, 0);
826 gtk_box_pack_start(GTK_BOX(bar), gtk_label_new(_(
"Group by")),
FALSE,
FALSE, 0);
827 _g.groupby = gtk_combo_box_text_new();
828 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(
_g.groupby),
"domain");
829 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(
_g.groupby),
"thread");
830 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(
_g.groupby),
"op");
831 gtk_combo_box_set_active(GTK_COMBO_BOX(
_g.groupby), 0);
833 gtk_box_pack_start(GTK_BOX(bar),
_g.groupby,
FALSE,
FALSE, 0);
836 _g.search_entry = gtk_search_entry_new();
837 gtk_entry_set_placeholder_text(GTK_ENTRY(
_g.search_entry), _(
"search hash or text…"));
838 gtk_widget_set_size_request(
_g.search_entry, 220, -1);
840 gtk_box_pack_end(GTK_BOX(bar),
_g.search_entry,
FALSE,
FALSE, 0);
842 _g.count_label = gtk_label_new(
"");
843 gtk_box_pack_end(GTK_BOX(bar),
_g.count_label,
FALSE,
FALSE, 0);
846 _g.notebook = gtk_notebook_new();
848 gtk_box_pack_start(GTK_BOX(vbox),
_g.notebook,
TRUE,
TRUE, 0);
850 _g.timeline_list = gtk_list_box_new();
851 gtk_list_box_set_selection_mode(GTK_LIST_BOX(
_g.timeline_list), GTK_SELECTION_SINGLE);
852 _g.timeline_scroll = gtk_scrolled_window_new(NULL, NULL);
853 gtk_container_add(GTK_CONTAINER(
_g.timeline_scroll),
_g.timeline_list);
854 _g.page_timeline = gtk_notebook_append_page(GTK_NOTEBOOK(
_g.notebook),
_g.timeline_scroll,
855 gtk_label_new(_(
"Timeline")));
857 _g.grouped_list = gtk_list_box_new();
858 gtk_list_box_set_selection_mode(GTK_LIST_BOX(
_g.grouped_list), GTK_SELECTION_NONE);
859 GtkWidget *sw2 = gtk_scrolled_window_new(NULL, NULL);
860 gtk_container_add(GTK_CONTAINER(sw2),
_g.grouped_list);
861 _g.page_grouped = gtk_notebook_append_page(GTK_NOTEBOOK(
_g.notebook), sw2, gtk_label_new(_(
"Grouped")));
863 _g.mem_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 2);
864 gtk_container_set_border_width(GTK_CONTAINER(
_g.mem_box), 6);
865 GtkWidget *sw3 = gtk_scrolled_window_new(NULL, NULL);
866 gtk_container_add(GTK_CONTAINER(sw3),
_g.mem_box);
867 _g.page_memory = gtk_notebook_append_page(GTK_NOTEBOOK(
_g.notebook), sw3, gtk_label_new(_(
"Memory")));
869 _g.search_list = gtk_list_box_new();
870 gtk_list_box_set_selection_mode(GTK_LIST_BOX(
_g.search_list), GTK_SELECTION_NONE);
871 GtkWidget *sw4 = gtk_scrolled_window_new(NULL, NULL);
872 gtk_container_add(GTK_CONTAINER(sw4),
_g.search_list);
873 _g.page_search = gtk_notebook_append_page(GTK_NOTEBOOK(
_g.notebook), sw4, gtk_label_new(_(
"Search")));
876 GList *pages = gtk_container_get_children(GTK_CONTAINER(
_g.notebook));
877 for(GList *l = pages; l; l = l->next)
878 gtk_container_child_set(GTK_CONTAINER(
_g.notebook), GTK_WIDGET(l->data),
"tab-expand",
TRUE,
879 "tab-fill",
TRUE, NULL);
882 gtk_widget_show_all(
_g.window);
static const dt_aligned_pixel_simd_t const dt_adaptation_t const float p
const dt_colormatrix_t dt_aligned_pixel_t out
GtkWidget * dt_ui_main_window(dt_ui_t *ui)
get the main window widget
void dt_image_cache_get_usage(dt_image_cache_t *cache, size_t *current, size_t *max)
GArray * dt_image_cache_get_entries_stats(dt_image_cache_t *cache)
float *const restrict const size_t k
GArray * dt_mipmap_cache_get_entries_stats(dt_mipmap_cache_t *cache)
void dt_mipmap_cache_get_usage(dt_mipmap_cache_t *cache, size_t *current, size_t *max)
int dt_opencl_is_enabled(void)
size_t dt_dev_pixelpipe_cache_get_vram_total(void)
GArray * dt_dev_pixelpipe_cache_get_entries_stats(dt_dev_pixelpipe_cache_t *cache)
void dt_dev_pixelpipe_cache_get_usage(dt_dev_pixelpipe_cache_t *cache, size_t *current, size_t *max)
Pixelpipe cache for storing intermediate results in the pixelpipe.
void copy(double *dest, double *source, size_t num_el)
Copy a flat buffer.
struct _GtkWidget GtkWidget
unsigned __int64 uint64_t
struct dt_dev_pixelpipe_cache_t * pixelpipe_cache
struct dt_gui_gtk_t * gui
struct dt_mipmap_cache_t * mipmap_cache
struct dt_image_cache_t * image_cache
void dt_supervisor_events_free(GPtrArray *events)
void dt_supervisor_set_recording(const gboolean on)
void dt_supervisor_events_clear(void)
GPtrArray * dt_supervisor_events_snapshot(void)
GPtrArray * dt_supervisor_events_snapshot_since(const uint64_t after_seq, uint64_t *out_last_seq)
uint64_t dt_supervisor_image_key(const int32_t imgid)
guint dt_supervisor_events_count(void)
uint64_t dt_supervisor_mipmap_key(const int32_t imgid, const int mip)
static GtkWidget * _event_widget(const dt_sv_logged_event_t *ev)
GtkWidget * timeline_list
static gboolean _poll(gpointer u)
static void _wire_hash_label(GtkWidget *label)
static void _group_set_header(_group_t *g)
GtkWidget * timeline_scroll
static void _run_search(const char *query)
static void _on_groupby_changed(GtkComboBox *c, gpointer u)
uint64_t grouped_last_seq
#define TIMELINE_MAX_ROWS
static void _clear_list(GtkWidget *list)
static void _timeline_append(const dt_sv_logged_event_t *ev)
#define MEMORY_REFRESH_TICKS
static gint _cmp_image_imgid(gconstpointer a, gconstpointer b)
static void _on_search_changed(GtkSearchEntry *e, gpointer u)
static void _links_free(gpointer p)
static void _group_free(gpointer p)
static const char * _domain_color(const char *d)
static void _on_toggle(GtkToggleButton *t, gpointer u)
void dt_gui_supervisor_window_show(void)
static gboolean _on_label_button(GtkWidget *label, GdkEventButton *e, gpointer u)
static gboolean _on_link(GtkLabel *label, gchar *uri, gpointer user_data)
static void _grouped_append(const dt_sv_logged_event_t *ev, const char *by)
static void _update_count(void)
static void _add_usage_bar(GtkWidget *box, const char *title, const size_t cur, const size_t max)
static gint _cmp_mip_size(gconstpointer a, gconstpointer b)
static gboolean _event_matches(const dt_sv_logged_event_t *ev, const char *hash_needle, const char *text_needle)
static gchar * _hashhex(const uint64_t h)
static void _on_search_this_hash(GtkMenuItem *item, gpointer u)
static void _rebuild_grouped_now(void)
static void _on_destroy(GtkWidget *w, gpointer u)
static void _on_record_toggled(GtkToggleButton *t, gpointer u)
static void _on_page_changed(GtkNotebook *nb, GtkWidget *page, guint page_num, gpointer u)
static GtkWidget * _collapsible(const char *header_markup, GtkWidget *body, const gboolean expanded)
static gint _cmp_pixel_size(gconstpointer a, gconstpointer b)
static void _rebuild_memory(void)
static gboolean _hex_contains(const uint64_t h, const char *needle)
static const char * _group_key(const dt_sv_logged_event_t *ev, const char *by)
static void _full_reload(void)
static void _scroll_row_into_view(GtkWidget *row)
static gchar * _header_markup(const dt_sv_logged_event_t *ev)
static GtkWidget * _event_body_from(const char *json, GArray *links)
static gchar * _pretty_json(const char *compact)
static void _on_refresh(GtkButton *b, gpointer u)
static gboolean _scroll_target_idle(gpointer u)
static void _timeline_trim(void)
static void _add_mem_item(GtkWidget *box, const char *markup, const char *trailing)
static void _on_clear(GtkButton *b, gpointer u)
static gboolean _scroll_bottom_idle(gpointer u)
static void _grouped_catch_up(void)
typedef double((*spd)(unsigned long int wavelength, double TempK))