Use separate buffers for i3bar statusline for each workspace, track short and long renders separately, fixes #1824

This commit is contained in:
David Simon
2015-10-26 11:27:09 -04:00
parent 30c3729a24
commit 071f11f9b9
5 changed files with 156 additions and 135 deletions

View File

@ -31,6 +31,14 @@ typedef enum {
ALIGN_RIGHT
} blockalign_t;
/* This data structure describes the way a status block should be rendered. These
* variables are updated each time the statusline is re-rendered. */
struct status_block_render_desc {
uint32_t width;
uint32_t x_offset;
uint32_t x_append;
};
/* This data structure represents one JSON dictionary, multiple of these make
* up one status line. */
struct status_block {
@ -56,11 +64,9 @@ struct status_block {
/* The amount of pixels necessary to render a separater after the block. */
uint32_t sep_block_width;
/* The amount of pixels necessary to render this block. These variables are
* only temporarily used in refresh_statusline(). */
uint32_t width;
uint32_t x_offset;
uint32_t x_append;
/* Continuously-updated information on how to render this status block. */
struct status_block_render_desc full_render;
struct status_block_render_desc short_render;
/* Optional */
char *name;

View File

@ -46,8 +46,14 @@ struct i3_output {
int ws; /* The number of the currently visible ws */
rect rect; /* The rect (relative to the root window) */
/* Off-screen buffer for preliminary rendering. */
/* Off-screen buffer for preliminary rendering of the bar. */
surface_t buffer;
/* Off-screen buffer for pre-rendering the statusline, separated to make clipping easier. */
surface_t statusline_buffer;
/* How much of statusline_buffer's horizontal space was used on last statusline render. */
int statusline_width;
/* Whether statusline block short texts where used on last statusline render. */
bool statusline_short_text;
/* The actual window on which we draw. */
surface_t bar;