Refactor panel refresh; new debug option debug_frames

This commit is contained in:
o9000
2017-03-04 12:19:35 +01:00
parent cb72aa7996
commit d7f294d7c2
14 changed files with 93 additions and 64 deletions

View File

@@ -80,7 +80,9 @@ timeout *detect_compositor_timer = NULL;
int detect_compositor_timer_counter = 0;
gboolean debug_fps = FALSE;
gboolean debug_frames = FALSE;
float *fps_distribution = NULL;
int frame = 0;
void create_fps_distribution()
{
@@ -468,6 +470,7 @@ void init(int argc, char *argv[])
debug_geometry = getenv("DEBUG_GEOMETRY") != NULL;
debug_gradients = getenv("DEBUG_GRADIENTS") != NULL;
debug_fps = getenv("DEBUG_FPS") != NULL;
debug_frames = getenv("DEBUG_FRAMES") != NULL;
if (debug_fps)
create_fps_distribution();
}
@@ -650,28 +653,17 @@ void cleanup()
cleanup_fps_distribution();
}
void get_snapshot(const char *path)
void dump_panel_to_file(const Panel *panel, const char *path)
{
Panel *panel = &panels[0];
if (panel->area.width > server.monitors[0].width)
panel->area.width = server.monitors[0].width;
panel->temp_pmap =
XCreatePixmap(server.display, server.root_win, panel->area.width, panel->area.height, server.depth);
render_panel(panel);
XSync(server.display, False);
imlib_context_set_drawable(panel->temp_pmap);
Imlib_Image img = imlib_create_image_from_drawable(0, 0, 0, panel->area.width, panel->area.height, 1);
if (!img) {
XImage *ximg =
XGetImage(server.display, panel->temp_pmap, 0, 0, panel->area.width, panel->area.height, AllPlanes, ZPixmap);
XGetImage(server.display, panel->temp_pmap, 0, 0, panel->area.width, panel->area.height, AllPlanes, ZPixmap);
if (ximg) {
DATA32 *pixels = calloc(panel->area.width * panel->area.height, sizeof(DATA32));
DATA32 *pixels = (DATA32 *)calloc(panel->area.width * panel->area.height, sizeof(DATA32));
for (int x = 0; x < panel->area.width; x++) {
for (int y = 0; y < panel->area.height; y++) {
DATA32 xpixel = XGetPixel(ximg, x, y);
@@ -702,6 +694,22 @@ void get_snapshot(const char *path)
}
}
void get_snapshot(const char *path)
{
Panel *panel = &panels[0];
if (panel->area.width > server.monitors[0].width)
panel->area.width = server.monitors[0].width;
panel->temp_pmap =
XCreatePixmap(server.display, server.root_win, panel->area.width, panel->area.height, server.depth);
render_panel(panel);
XSync(server.display, False);
dump_panel_to_file(panel, path);
}
void window_action(Task *task, MouseAction action)
{
if (!task)
@@ -869,7 +877,7 @@ void event_button_motion_notify(XEvent *e)
task_iter->data = drag_iter->data;
drag_iter->data = temp;
event_taskbar->area.resize_needed = 1;
panel_refresh = TRUE;
schedule_panel_redraw();
task_dragged = 1;
}
}
@@ -900,7 +908,7 @@ void event_button_motion_notify(XEvent *e)
event_taskbar->area.resize_needed = 1;
drag_taskbar->area.resize_needed = 1;
task_dragged = 1;
panel_refresh = TRUE;
schedule_panel_redraw();
panel->area.resize_needed = 1;
}
}
@@ -1055,7 +1063,7 @@ void update_desktop_names()
for (GSList *l = list; l; l = l->next)
g_free(l->data);
g_slist_free(list);
panel_refresh = TRUE;
schedule_panel_redraw();
}
void update_task_desktop(Task *task)
@@ -1065,7 +1073,7 @@ void update_task_desktop(Task *task)
remove_task(task);
task = add_task(win);
reset_active_task();
panel_refresh = TRUE;
schedule_panel_redraw();
}
void event_property_notify(XEvent *e)
@@ -1125,7 +1133,7 @@ void event_property_notify(XEvent *e)
update_all_taskbars_visibility();
if (old_desktop != server.desktop)
tooltip_trigger_hide();
panel_refresh = TRUE;
schedule_panel_redraw();
} else if (old_desktop != server.desktop) {
tooltip_trigger_hide();
for (int i = 0; i < num_panels; i++) {
@@ -1144,7 +1152,7 @@ void event_property_notify(XEvent *e)
if (task->desktop == ALL_DESKTOPS) {
task->area.on_screen = always_show_all_desktop_tasks;
taskbar->area.resize_needed = 1;
panel_refresh = TRUE;
schedule_panel_redraw();
if (taskbar_mode == MULTI_DESKTOP)
panel->area.resize_needed = 1;
}
@@ -1195,14 +1203,14 @@ void event_property_notify(XEvent *e)
fprintf(stderr, "%s %d: win = root, atom = _NET_CLIENT_LIST\n", __FUNCTION__, __LINE__);
taskbar_refresh_tasklist();
update_all_taskbars_visibility();
panel_refresh = TRUE;
schedule_panel_redraw();
}
// Change active
else if (at == server.atom._NET_ACTIVE_WINDOW) {
if (debug)
fprintf(stderr, "%s %d: win = root, atom = _NET_ACTIVE_WINDOW\n", __FUNCTION__, __LINE__);
reset_active_task();
panel_refresh = TRUE;
schedule_panel_redraw();
} else if (at == server.atom._XROOTPMAP_ID || at == server.atom._XROOTMAP_ID) {
if (debug)
fprintf(stderr, "%s %d: win = root, atom = _XROOTPMAP_ID\n", __FUNCTION__, __LINE__);
@@ -1210,7 +1218,7 @@ void event_property_notify(XEvent *e)
for (int i = 0; i < num_panels; i++) {
set_panel_background(&panels[i]);
}
panel_refresh = TRUE;
schedule_panel_redraw();
}
} else {
TrayWindow *traywin = systray_find_icon(win);
@@ -1241,7 +1249,7 @@ void event_property_notify(XEvent *e)
XGetWindowAttributes(server.display, win, &wa);
if (wa.map_state == IsViewable && !window_is_skip_taskbar(win)) {
if ((task = add_task(win)))
panel_refresh = TRUE;
schedule_panel_redraw();
}
}
return;
@@ -1257,7 +1265,7 @@ void event_property_notify(XEvent *e)
}
if (taskbar_sort_method == TASKBAR_SORT_TITLE)
sort_taskbar_for_win(win);
panel_refresh = TRUE;
schedule_panel_redraw();
}
}
// Demand attention
@@ -1277,7 +1285,7 @@ void event_property_notify(XEvent *e)
}
if (window_is_skip_taskbar(win)) {
remove_task(task);
panel_refresh = TRUE;
schedule_panel_redraw();
}
} else if (at == server.atom.WM_STATE) {
// Iconic state
@@ -1285,12 +1293,12 @@ void event_property_notify(XEvent *e)
if (window_is_iconified(win))
state = TASK_ICONIFIED;
set_task_state(task, state);
panel_refresh = TRUE;
schedule_panel_redraw();
}
// Window icon changed
else if (at == server.atom._NET_WM_ICON) {
task_update_icon(task);
panel_refresh = TRUE;
schedule_panel_redraw();
}
// Window desktop changed
else if (at == server.atom._NET_WM_DESKTOP) {
@@ -1307,7 +1315,7 @@ void event_property_notify(XEvent *e)
}
XFree(wmhints);
task_update_icon(task);
panel_refresh = TRUE;
schedule_panel_redraw();
}
if (!server.got_root_win)
@@ -1322,7 +1330,7 @@ void event_expose(XEvent *e)
if (!panel)
return;
// TODO : one panel_refresh per panel ?
panel_refresh = TRUE;
schedule_panel_redraw();
}
void event_configure_notify(XEvent *e)
@@ -1370,7 +1378,7 @@ void event_configure_notify(XEvent *e)
set_task_state(task, TASK_ACTIVE);
active_task = task;
}
panel_refresh = TRUE;
schedule_panel_redraw();
}
}
}
@@ -1748,7 +1756,7 @@ start:
if (first_render) {
first_render = FALSE;
if (panel_shrink)
panel_refresh = TRUE;
schedule_panel_redraw();
}
if (debug_fps)
ts_render_finished = get_time();
@@ -1764,9 +1772,10 @@ start:
double fps_low, fps_median, fps_high, fps_samples;
fps_compute_stats(&fps_low, &fps_median, &fps_high, &fps_samples);
fprintf(stderr,
BLUE "fps = %.0f (low %.0f, med %.0f, high %.0f, samples %.0f) : processing %.0f%%, rendering %.0f%%, "
BLUE "frame %d: fps = %.0f (low %.0f, med %.0f, high %.0f, samples %.0f) : processing %.0f%%, rendering %.0f%%, "
"flushing %.0f%%" RESET "\n",
fps,
frame,
fps,
fps_low,
fps_median,
fps_high,
@@ -1775,6 +1784,14 @@ start:
render_ratio * 100,
flush_ratio * 100);
}
if (debug_frames) {
for (int i = 0; i < num_panels; i++) {
char path[256];
sprintf(path, "tint2-%d-panel-%d-frame-%d.png", getpid(), i, frame);
dump_panel_to_file(&panels[i], path);
}
}
frame++;
}
// Create a File Description Set containing x11_fd
@@ -1819,7 +1836,7 @@ start:
for (l_instance = execp->backend->instances; l_instance; l_instance = l_instance->next) {
Execp *instance = l_instance->data;
instance->area.resize_needed = TRUE;
panel_refresh = TRUE;
schedule_panel_redraw();
}
}
}