Limit tooltip width
This commit is contained in:
parent
0f43318798
commit
10ca7f0762
1 changed files with 24 additions and 21 deletions
|
@ -28,7 +28,7 @@
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
|
|
||||||
static int x, y, width, height;
|
static int x, y, width, height;
|
||||||
static int just_shown;
|
static gboolean just_shown;
|
||||||
|
|
||||||
// the next functions are helper functions for tooltip handling
|
// the next functions are helper functions for tooltip handling
|
||||||
void start_show_timeout();
|
void start_show_timeout();
|
||||||
|
@ -48,7 +48,7 @@ void default_tooltip()
|
||||||
g_tooltip.font_color.rgb[1] = 1;
|
g_tooltip.font_color.rgb[1] = 1;
|
||||||
g_tooltip.font_color.rgb[2] = 1;
|
g_tooltip.font_color.rgb[2] = 1;
|
||||||
g_tooltip.font_color.alpha = 1;
|
g_tooltip.font_color.alpha = 1;
|
||||||
just_shown = 0;
|
just_shown = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cleanup_tooltip()
|
void cleanup_tooltip()
|
||||||
|
@ -116,7 +116,7 @@ void tooltip_trigger_show(Area *area, Panel *p, XEvent *e)
|
||||||
// Position the tooltip in the center of the area
|
// Position the tooltip in the center of the area
|
||||||
x = area->posx + MIN(area->width / 3, 22) + e->xmotion.x_root - e->xmotion.x;
|
x = area->posx + MIN(area->width / 3, 22) + e->xmotion.x_root - e->xmotion.x;
|
||||||
y = area->posy + area->height / 2 + e->xmotion.y_root - e->xmotion.y;
|
y = area->posy + area->height / 2 + e->xmotion.y_root - e->xmotion.y;
|
||||||
just_shown = 1;
|
just_shown = TRUE;
|
||||||
g_tooltip.panel = p;
|
g_tooltip.panel = p;
|
||||||
if (g_tooltip.mapped && g_tooltip.area != area) {
|
if (g_tooltip.mapped && g_tooltip.area != area) {
|
||||||
tooltip_copy_text(area);
|
tooltip_copy_text(area);
|
||||||
|
@ -132,8 +132,7 @@ void tooltip_show(void *arg)
|
||||||
int mx, my;
|
int mx, my;
|
||||||
Window w;
|
Window w;
|
||||||
XTranslateCoordinates(server.display, server.root_win, g_tooltip.panel->main_win, x, y, &mx, &my, &w);
|
XTranslateCoordinates(server.display, server.root_win, g_tooltip.panel->main_win, x, y, &mx, &my, &w);
|
||||||
Area *area;
|
Area *area = click_area(g_tooltip.panel, mx, my);
|
||||||
area = click_area(g_tooltip.panel, mx, my);
|
|
||||||
if (!g_tooltip.mapped && area->_get_tooltip_text) {
|
if (!g_tooltip.mapped && area->_get_tooltip_text) {
|
||||||
tooltip_copy_text(area);
|
tooltip_copy_text(area);
|
||||||
g_tooltip.mapped = True;
|
g_tooltip.mapped = True;
|
||||||
|
@ -145,20 +144,26 @@ void tooltip_show(void *arg)
|
||||||
|
|
||||||
void tooltip_update_geometry()
|
void tooltip_update_geometry()
|
||||||
{
|
{
|
||||||
cairo_surface_t *cs;
|
Panel *panel = g_tooltip.panel;
|
||||||
cairo_t *c;
|
int screen_width = server.monitors[panel->monitor].x + server.monitors[panel->monitor].width;
|
||||||
PangoLayout *layout;
|
|
||||||
cs = cairo_xlib_surface_create(server.display, g_tooltip.window, server.visual, width, height);
|
cairo_surface_t *cs = cairo_xlib_surface_create(server.display, g_tooltip.window, server.visual, width, height);
|
||||||
c = cairo_create(cs);
|
cairo_t *c = cairo_create(cs);
|
||||||
layout = pango_cairo_create_layout(c);
|
PangoLayout *layout = pango_cairo_create_layout(c);
|
||||||
|
|
||||||
pango_layout_set_font_description(layout, g_tooltip.font_desc);
|
pango_layout_set_font_description(layout, g_tooltip.font_desc);
|
||||||
pango_layout_set_text(layout, g_tooltip.tooltip_text, -1);
|
|
||||||
PangoRectangle r1, r2;
|
PangoRectangle r1, r2;
|
||||||
|
pango_layout_set_text(layout, "1234567890", -1);
|
||||||
|
pango_layout_get_pixel_extents(layout, &r1, &r2);
|
||||||
|
int max_width = MIN(r2.width * 7, screen_width * 2 / 3);
|
||||||
|
pango_layout_set_width(layout, max_width * PANGO_SCALE);
|
||||||
|
|
||||||
|
pango_layout_set_text(layout, g_tooltip.tooltip_text, -1);
|
||||||
|
pango_layout_set_wrap(layout, PANGO_WRAP_WORD);
|
||||||
pango_layout_get_pixel_extents(layout, &r1, &r2);
|
pango_layout_get_pixel_extents(layout, &r1, &r2);
|
||||||
width = 2 * g_tooltip.bg->border.width + 2 * g_tooltip.paddingx + r2.width;
|
width = 2 * g_tooltip.bg->border.width + 2 * g_tooltip.paddingx + r2.width;
|
||||||
height = 2 * g_tooltip.bg->border.width + 2 * g_tooltip.paddingy + r2.height;
|
height = 2 * g_tooltip.bg->border.width + 2 * g_tooltip.paddingy + r2.height;
|
||||||
|
|
||||||
Panel *panel = g_tooltip.panel;
|
|
||||||
if (panel_horizontal && panel_position & BOTTOM)
|
if (panel_horizontal && panel_position & BOTTOM)
|
||||||
y = panel->posy - height;
|
y = panel->posy - height;
|
||||||
else if (panel_horizontal && panel_position & TOP)
|
else if (panel_horizontal && panel_position & TOP)
|
||||||
|
@ -178,7 +183,6 @@ void tooltip_adjust_geometry()
|
||||||
// adjust coordinates and size to not go offscreen
|
// adjust coordinates and size to not go offscreen
|
||||||
// it seems quite impossible that the height needs to be adjusted, but we do it anyway.
|
// it seems quite impossible that the height needs to be adjusted, but we do it anyway.
|
||||||
|
|
||||||
int min_x, min_y, max_width, max_height;
|
|
||||||
Panel *panel = g_tooltip.panel;
|
Panel *panel = g_tooltip.panel;
|
||||||
int screen_width = server.monitors[panel->monitor].x + server.monitors[panel->monitor].width;
|
int screen_width = server.monitors[panel->monitor].x + server.monitors[panel->monitor].width;
|
||||||
int screen_height = server.monitors[panel->monitor].y + server.monitors[panel->monitor].height;
|
int screen_height = server.monitors[panel->monitor].y + server.monitors[panel->monitor].height;
|
||||||
|
@ -186,6 +190,7 @@ void tooltip_adjust_geometry()
|
||||||
y >= server.monitors[panel->monitor].y)
|
y >= server.monitors[panel->monitor].y)
|
||||||
return; // no adjustment needed
|
return; // no adjustment needed
|
||||||
|
|
||||||
|
int min_x, min_y, max_width, max_height;
|
||||||
if (panel_horizontal) {
|
if (panel_horizontal) {
|
||||||
min_x = 0;
|
min_x = 0;
|
||||||
max_width = server.monitors[panel->monitor].width;
|
max_width = server.monitors[panel->monitor].width;
|
||||||
|
@ -230,17 +235,14 @@ void tooltip_update()
|
||||||
if (just_shown) {
|
if (just_shown) {
|
||||||
if (!panel_horizontal)
|
if (!panel_horizontal)
|
||||||
y -= height / 2; // center vertically
|
y -= height / 2; // center vertically
|
||||||
just_shown = 0;
|
just_shown = FALSE;
|
||||||
}
|
}
|
||||||
tooltip_adjust_geometry();
|
tooltip_adjust_geometry();
|
||||||
XMoveResizeWindow(server.display, g_tooltip.window, x, y, width, height);
|
XMoveResizeWindow(server.display, g_tooltip.window, x, y, width, height);
|
||||||
|
|
||||||
// Stuff for drawing the tooltip
|
// Stuff for drawing the tooltip
|
||||||
cairo_surface_t *cs;
|
cairo_surface_t *cs = cairo_xlib_surface_create(server.display, g_tooltip.window, server.visual, width, height);
|
||||||
cairo_t *c;
|
cairo_t *c = cairo_create(cs);
|
||||||
PangoLayout *layout;
|
|
||||||
cs = cairo_xlib_surface_create(server.display, g_tooltip.window, server.visual, width, height);
|
|
||||||
c = cairo_create(cs);
|
|
||||||
Color bc = g_tooltip.bg->fill_color;
|
Color bc = g_tooltip.bg->fill_color;
|
||||||
Border b = g_tooltip.bg->border;
|
Border b = g_tooltip.bg->border;
|
||||||
if (server.real_transparency) {
|
if (server.real_transparency) {
|
||||||
|
@ -262,8 +264,9 @@ void tooltip_update()
|
||||||
|
|
||||||
Color fc = g_tooltip.font_color;
|
Color fc = g_tooltip.font_color;
|
||||||
cairo_set_source_rgba(c, fc.rgb[0], fc.rgb[1], fc.rgb[2], fc.alpha);
|
cairo_set_source_rgba(c, fc.rgb[0], fc.rgb[1], fc.rgb[2], fc.alpha);
|
||||||
layout = pango_cairo_create_layout(c);
|
PangoLayout *layout = pango_cairo_create_layout(c);
|
||||||
pango_layout_set_font_description(layout, g_tooltip.font_desc);
|
pango_layout_set_font_description(layout, g_tooltip.font_desc);
|
||||||
|
pango_layout_set_wrap(layout, PANGO_WRAP_WORD);
|
||||||
pango_layout_set_text(layout, g_tooltip.tooltip_text, -1);
|
pango_layout_set_text(layout, g_tooltip.tooltip_text, -1);
|
||||||
PangoRectangle r1, r2;
|
PangoRectangle r1, r2;
|
||||||
pango_layout_get_pixel_extents(layout, &r1, &r2);
|
pango_layout_get_pixel_extents(layout, &r1, &r2);
|
||||||
|
|
Loading…
Reference in a new issue