draw: text extents now gets len as arg

Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
Julien Danjou 2008-07-10 15:06:09 +02:00
parent ad58260243
commit 750040be68
5 changed files with 16 additions and 8 deletions

View File

@ -993,12 +993,13 @@ draw_rotate(draw_context_t *ctx,
* \param phys_screen Physical screen number. * \param phys_screen Physical screen number.
* \param font Font to use. * \param font Font to use.
* \param text The text. * \param text The text.
* \param len The text length.
* \param pdata The parser data to fill. * \param pdata The parser data to fill.
* \return Text height and width. * \return Text height and width.
*/ */
area_t area_t
draw_text_extents(xcb_connection_t *conn, int phys_screen, font_t *font, draw_text_extents(xcb_connection_t *conn, int phys_screen, font_t *font,
const char *text, draw_parser_data_t *parser_data) const char *text, ssize_t len, draw_parser_data_t *parser_data)
{ {
cairo_surface_t *surface; cairo_surface_t *surface;
cairo_t *cr; cairo_t *cr;
@ -1006,9 +1007,8 @@ draw_text_extents(xcb_connection_t *conn, int phys_screen, font_t *font,
PangoRectangle ext; PangoRectangle ext;
xcb_screen_t *s = xutil_screen_get(conn, phys_screen); xcb_screen_t *s = xutil_screen_get(conn, phys_screen);
area_t geom = { 0, 0, 0, 0 }; area_t geom = { 0, 0, 0, 0 };
ssize_t len;
if(!(len = a_strlen(text))) if(!len)
return geom; return geom;
parser_data->connection = conn; parser_data->connection = conn;

View File

@ -214,7 +214,7 @@ void draw_image_delete(draw_image_t **);
void draw_image(draw_context_t *, int, int, int, draw_image_t *); void draw_image(draw_context_t *, int, int, int, draw_image_t *);
void draw_image_from_argb_data(draw_context_t *, int, int, int, int, int, unsigned char *); void draw_image_from_argb_data(draw_context_t *, int, int, int, int, int, unsigned char *);
void draw_rotate(draw_context_t *, xcb_drawable_t, xcb_drawable_t, int, int, int, int, double, int, int); void draw_rotate(draw_context_t *, xcb_drawable_t, xcb_drawable_t, int, int, int, int, double, int, int);
area_t draw_text_extents(xcb_connection_t *, int, font_t *, const char *, draw_parser_data_t *); area_t draw_text_extents(xcb_connection_t *, int, font_t *, const char *, ssize_t, draw_parser_data_t *);
alignment_t draw_align_fromstr(const char *, ssize_t); alignment_t draw_align_fromstr(const char *, ssize_t);
const char *draw_align_tostr(alignment_t); const char *draw_align_tostr(alignment_t);

View File

@ -252,6 +252,8 @@ mouse_infobox_draw(draw_context_t *ctx,
simplewindow_refresh_pixmap(sw); simplewindow_refresh_pixmap(sw);
} }
#define MOUSE_INFOBOX_STRING_DEFAULT "0000x0000+0000+0000"
/** Initialize the infobox window. /** Initialize the infobox window.
* \param phys_screen Physical screen number. * \param phys_screen Physical screen number.
* \param border Border size of the client. * \param border Border size of the client.
@ -272,7 +274,9 @@ mouse_infobox_new(int phys_screen, int border, area_t geometry,
geom = draw_text_extents(globalconf.connection, geom = draw_text_extents(globalconf.connection,
globalconf.default_screen, globalconf.default_screen,
globalconf.font, globalconf.font,
"0000x0000+0000+0000", &pdata); MOUSE_INFOBOX_STRING_DEFAULT,
sizeof(MOUSE_INFOBOX_STRING_DEFAULT),
&pdata);
geom.x = geometry.x + ((2 * border + geometry.width) - geom.width) / 2; geom.x = geometry.x + ((2 * border + geometry.width) - geom.width) / 2;
geom.y = geometry.y + ((2 * border + geometry.height) - geom.height) / 2; geom.y = geometry.y + ((2 * border + geometry.height) - geom.height) / 2;

View File

@ -93,6 +93,7 @@ taglist_draw(draw_context_t *ctx, int screen, widget_node_t *w,
area_t area; area_t area;
taglist_drawn_area_t *tda; taglist_drawn_area_t *tda;
int prev_width = 0; int prev_width = 0;
size_t len;
tag_array_t *tags = &globalconf.screens[screen].tags; tag_array_t *tags = &globalconf.screens[screen].tags;
const char **text = p_alloca(const char *, tags->len); const char **text = p_alloca(const char *, tags->len);
@ -124,13 +125,13 @@ taglist_draw(draw_context_t *ctx, int screen, widget_node_t *w,
luaA_dofunction(globalconf.L, data->label, 1, 1); luaA_dofunction(globalconf.L, data->label, 1, 1);
if(lua_isstring(globalconf.L, -1)) if(lua_isstring(globalconf.L, -1))
text[i] = lua_tostring(globalconf.L, -1); text[i] = lua_tolstring(globalconf.L, -1, &len);
lua_pop(globalconf.L, 1); lua_pop(globalconf.L, 1);
draw_parser_data_init(&pdata[i]); draw_parser_data_init(&pdata[i]);
area = draw_text_extents(ctx->connection, ctx->phys_screen, area = draw_text_extents(ctx->connection, ctx->phys_screen,
globalconf.font, text[i], &pdata[i]); globalconf.font, text[i], len, &pdata[i]);
if(pdata[i].bg_image) if(pdata[i].bg_image)
area.width = MAX(area.width, pdata[i].bg_resize ? w->area.height : pdata[i].bg_image->width); area.width = MAX(area.width, pdata[i].bg_resize ? w->area.height : pdata[i].bg_image->width);

View File

@ -29,6 +29,8 @@ typedef struct
{ {
/** Textbox text */ /** Textbox text */
char *text; char *text;
/** Textbox text length */
size_t len;
/** Textbox width */ /** Textbox width */
int width; int width;
} textbox_data_t; } textbox_data_t;
@ -59,7 +61,7 @@ textbox_draw(draw_context_t *ctx, int screen __attribute__ ((unused)),
{ {
draw_parser_data_init(&pdata); draw_parser_data_init(&pdata);
w->area.width = draw_text_extents(ctx->connection, ctx->phys_screen, w->area.width = draw_text_extents(ctx->connection, ctx->phys_screen,
globalconf.font, d->text, &pdata).width; globalconf.font, d->text, d->len, &pdata).width;
if(w->area.width > ctx->width - used) if(w->area.width > ctx->width - used)
w->area.width = ctx->width - used; w->area.width = ctx->width - used;
@ -145,6 +147,7 @@ luaA_textbox_newindex(lua_State *L, awesome_token_t token)
{ {
p_delete(&d->text); p_delete(&d->text);
a_iso2utf8(&d->text, buf, len); a_iso2utf8(&d->text, buf, len);
d->len = len;
} }
break; break;
case A_TK_WIDTH: case A_TK_WIDTH: