westoy: Use subsurfaces for tooltips instead of transient windows
Transient windows, at least not as they are today, don't exist in xdg_shell. Subsurfaces allow for specially placed surfaces relative to a window, so use these instead.
This commit is contained in:
committed by
Kristian Høgsberg
parent
e22952bb13
commit
7f4386e90a
+8
-44
@@ -139,7 +139,6 @@ enum {
|
|||||||
TYPE_TOPLEVEL,
|
TYPE_TOPLEVEL,
|
||||||
TYPE_FULLSCREEN,
|
TYPE_FULLSCREEN,
|
||||||
TYPE_MAXIMIZED,
|
TYPE_MAXIMIZED,
|
||||||
TYPE_TRANSIENT,
|
|
||||||
TYPE_MENU,
|
TYPE_MENU,
|
||||||
TYPE_CUSTOM
|
TYPE_CUSTOM
|
||||||
};
|
};
|
||||||
@@ -382,7 +381,6 @@ struct menu {
|
|||||||
|
|
||||||
struct tooltip {
|
struct tooltip {
|
||||||
struct widget *parent;
|
struct widget *parent;
|
||||||
struct window *window;
|
|
||||||
struct widget *widget;
|
struct widget *widget;
|
||||||
char *entry;
|
char *entry;
|
||||||
struct task tooltip_task;
|
struct task tooltip_task;
|
||||||
@@ -1977,6 +1975,7 @@ tooltip_redraw_handler(struct widget *widget, void *data)
|
|||||||
int32_t width, height;
|
int32_t width, height;
|
||||||
|
|
||||||
cr = widget_cairo_create(widget);
|
cr = widget_cairo_create(widget);
|
||||||
|
cairo_translate(cr, widget->allocation.x, widget->allocation.y);
|
||||||
cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
|
cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
|
||||||
cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 0.0);
|
cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 0.0);
|
||||||
cairo_paint(cr);
|
cairo_paint(cr);
|
||||||
@@ -1996,7 +1995,7 @@ tooltip_redraw_handler(struct widget *widget, void *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static cairo_text_extents_t
|
static cairo_text_extents_t
|
||||||
get_text_extents(struct tooltip *tooltip)
|
get_text_extents(struct display *display, struct tooltip *tooltip)
|
||||||
{
|
{
|
||||||
cairo_t *cr;
|
cairo_t *cr;
|
||||||
cairo_text_extents_t extents;
|
cairo_text_extents_t extents;
|
||||||
@@ -2005,7 +2004,7 @@ get_text_extents(struct tooltip *tooltip)
|
|||||||
* created yet, and parent does not have a valid surface
|
* created yet, and parent does not have a valid surface
|
||||||
* outside repaint, either.
|
* outside repaint, either.
|
||||||
*/
|
*/
|
||||||
cr = cairo_create(tooltip->window->display->dummy_surface);
|
cr = cairo_create(display->dummy_surface);
|
||||||
cairo_text_extents(cr, tooltip->entry, &extents);
|
cairo_text_extents(cr, tooltip->entry, &extents);
|
||||||
cairo_destroy(cr);
|
cairo_destroy(cr);
|
||||||
|
|
||||||
@@ -2017,7 +2016,6 @@ window_create_tooltip(struct tooltip *tooltip)
|
|||||||
{
|
{
|
||||||
struct widget *parent = tooltip->parent;
|
struct widget *parent = tooltip->parent;
|
||||||
struct display *display = parent->window->display;
|
struct display *display = parent->window->display;
|
||||||
struct window *window;
|
|
||||||
const int offset_y = 27;
|
const int offset_y = 27;
|
||||||
const int margin = 3;
|
const int margin = 3;
|
||||||
cairo_text_extents_t extents;
|
cairo_text_extents_t extents;
|
||||||
@@ -2025,18 +2023,13 @@ window_create_tooltip(struct tooltip *tooltip)
|
|||||||
if (tooltip->widget)
|
if (tooltip->widget)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
window = window_create_transient(display, parent->window, tooltip->x,
|
tooltip->widget = window_add_subsurface(parent->window, tooltip, SUBSURFACE_DESYNCHRONIZED);
|
||||||
tooltip->y + offset_y,
|
|
||||||
WL_SHELL_SURFACE_TRANSIENT_INACTIVE);
|
|
||||||
if (!window)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
tooltip->window = window;
|
extents = get_text_extents(display, tooltip);
|
||||||
tooltip->widget = window_add_widget(tooltip->window, tooltip);
|
|
||||||
|
|
||||||
extents = get_text_extents(tooltip);
|
|
||||||
widget_set_redraw_handler(tooltip->widget, tooltip_redraw_handler);
|
widget_set_redraw_handler(tooltip->widget, tooltip_redraw_handler);
|
||||||
window_schedule_resize(window, extents.width + 20, 20 + margin * 2);
|
widget_set_allocation(tooltip->widget,
|
||||||
|
tooltip->x, tooltip->y + offset_y,
|
||||||
|
extents.width + 20, 20 + margin * 2);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -2052,9 +2045,7 @@ widget_destroy_tooltip(struct widget *parent)
|
|||||||
|
|
||||||
if (tooltip->widget) {
|
if (tooltip->widget) {
|
||||||
widget_destroy(tooltip->widget);
|
widget_destroy(tooltip->widget);
|
||||||
window_destroy(tooltip->window);
|
|
||||||
tooltip->widget = NULL;
|
tooltip->widget = NULL;
|
||||||
tooltip->window = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
close(tooltip->tooltip_fd);
|
close(tooltip->tooltip_fd);
|
||||||
@@ -2118,7 +2109,6 @@ widget_set_tooltip(struct widget *parent, char *entry, float x, float y)
|
|||||||
parent->tooltip = tooltip;
|
parent->tooltip = tooltip;
|
||||||
tooltip->parent = parent;
|
tooltip->parent = parent;
|
||||||
tooltip->widget = NULL;
|
tooltip->widget = NULL;
|
||||||
tooltip->window = NULL;
|
|
||||||
tooltip->x = x;
|
tooltip->x = x;
|
||||||
tooltip->y = y;
|
tooltip->y = y;
|
||||||
tooltip->entry = strdup(entry);
|
tooltip->entry = strdup(entry);
|
||||||
@@ -4085,12 +4075,6 @@ window_is_fullscreen(struct window *window)
|
|||||||
return window->type == TYPE_FULLSCREEN;
|
return window->type == TYPE_FULLSCREEN;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
window_is_transient(struct window *window)
|
|
||||||
{
|
|
||||||
return window->type == TYPE_TRANSIENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
configure_request_completed(void *data, struct wl_callback *callback, uint32_t time)
|
configure_request_completed(void *data, struct wl_callback *callback, uint32_t time)
|
||||||
{
|
{
|
||||||
@@ -4437,26 +4421,6 @@ window_create_custom(struct display *display)
|
|||||||
return window_create_internal(display, TYPE_CUSTOM);
|
return window_create_internal(display, TYPE_CUSTOM);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct window *
|
|
||||||
window_create_transient(struct display *display, struct window *parent,
|
|
||||||
int32_t x, int32_t y, uint32_t flags)
|
|
||||||
{
|
|
||||||
struct window *window;
|
|
||||||
|
|
||||||
window = window_create_internal(parent->display, TYPE_TRANSIENT);
|
|
||||||
|
|
||||||
window->x = x;
|
|
||||||
window->y = y;
|
|
||||||
|
|
||||||
if (display->shell)
|
|
||||||
wl_shell_surface_set_transient(
|
|
||||||
window->shell_surface,
|
|
||||||
parent->main_surface->surface,
|
|
||||||
window->x, window->y, flags);
|
|
||||||
|
|
||||||
return window;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
menu_set_item(struct menu *menu, int sy)
|
menu_set_item(struct menu *menu, int sy)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -270,9 +270,6 @@ typedef void (*widget_axis_handler_t)(struct widget *widget,
|
|||||||
struct window *
|
struct window *
|
||||||
window_create(struct display *display);
|
window_create(struct display *display);
|
||||||
struct window *
|
struct window *
|
||||||
window_create_transient(struct display *display, struct window *parent,
|
|
||||||
int32_t x, int32_t y, uint32_t flags);
|
|
||||||
struct window *
|
|
||||||
window_create_custom(struct display *display);
|
window_create_custom(struct display *display);
|
||||||
|
|
||||||
int
|
int
|
||||||
@@ -362,9 +359,6 @@ display_surface_damage(struct display *display, cairo_surface_t *cairo_surface,
|
|||||||
void
|
void
|
||||||
window_set_buffer_type(struct window *window, enum window_buffer_type type);
|
window_set_buffer_type(struct window *window, enum window_buffer_type type);
|
||||||
|
|
||||||
int
|
|
||||||
window_is_transient(struct window *window);
|
|
||||||
|
|
||||||
int
|
int
|
||||||
window_is_fullscreen(struct window *window);
|
window_is_fullscreen(struct window *window);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user