mirror of
https://github.com/davatorium/rofi.git
synced 2025-07-31 21:59:25 -04:00
Issue #303: Create one pango context from xlib surface
- Create one pango context and set font options from main xlib surface - Set font type on global pango context. - Use CAIRO_OPERATOR_OVER for drawing text (otherwise subpixel rendering is not done).
This commit is contained in:
parent
0d0016e9fe
commit
38fabb6b1b
5 changed files with 43 additions and 30 deletions
|
@ -1,5 +1,6 @@
|
||||||
1.0.0 (unreleased):
|
1.0.0 (unreleased):
|
||||||
|
Bug fixes:
|
||||||
|
- Fix subpixel rendering. (#303)
|
||||||
0.15.12:
|
0.15.12:
|
||||||
New features:
|
New features:
|
||||||
- Initial `-dump` command for dmenu mode. (#216)
|
- Initial `-dump` command for dmenu mode. (#216)
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include <X11/Xutil.h>
|
#include <X11/Xutil.h>
|
||||||
#include <pango/pango.h>
|
#include <pango/pango.h>
|
||||||
#include <pango/pango-fontmap.h>
|
#include <pango/pango-fontmap.h>
|
||||||
|
#include <pango/pangocairo.h>
|
||||||
#include <cairo.h>
|
#include <cairo.h>
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
@ -231,4 +232,5 @@ void textbox_delete ( textbox *tb, int pos, int dlen );
|
||||||
|
|
||||||
void textbox_moveresize ( textbox *tb, int x, int y, int w, int h );
|
void textbox_moveresize ( textbox *tb, int x, int y, int w, int h );
|
||||||
int textbox_get_estimated_char_height ( void );
|
int textbox_get_estimated_char_height ( void );
|
||||||
|
void textbox_set_pango_context ( PangoContext *p );
|
||||||
#endif //ROFI_TEXTBOX_H
|
#endif //ROFI_TEXTBOX_H
|
||||||
|
|
|
@ -268,6 +268,28 @@ static Window create_window ( Display *display )
|
||||||
draw = cairo_create ( surface );
|
draw = cairo_create ( surface );
|
||||||
cairo_set_operator ( draw, CAIRO_OPERATOR_SOURCE );
|
cairo_set_operator ( draw, CAIRO_OPERATOR_SOURCE );
|
||||||
|
|
||||||
|
// Set up pango context.
|
||||||
|
cairo_font_options_t *fo = cairo_font_options_create ();
|
||||||
|
// Take font description from xlib surface
|
||||||
|
cairo_surface_get_font_options ( surface, fo );
|
||||||
|
PangoContext *p = pango_cairo_create_context ( draw );
|
||||||
|
// Set the font options from the xlib surface
|
||||||
|
pango_cairo_context_set_font_options ( p, fo );
|
||||||
|
// Setup dpi
|
||||||
|
if ( config.dpi > 0 ) {
|
||||||
|
PangoFontMap *font_map = pango_cairo_font_map_get_default ();
|
||||||
|
pango_cairo_font_map_set_resolution ( (PangoCairoFontMap *) font_map, (double) config.dpi );
|
||||||
|
}
|
||||||
|
// Setup font.
|
||||||
|
PangoFontDescription *pfd = pango_font_description_from_string ( config.menu_font );
|
||||||
|
pango_context_set_font_description ( p, pfd );
|
||||||
|
pango_font_description_free ( pfd );
|
||||||
|
// Tell textbox to use this context.
|
||||||
|
textbox_set_pango_context ( p );
|
||||||
|
// cleanup
|
||||||
|
g_object_unref ( p );
|
||||||
|
cairo_font_options_destroy ( fo );
|
||||||
|
|
||||||
// // make it an unmanaged window
|
// // make it an unmanaged window
|
||||||
if ( !normal_window_mode && !config.fullscreen ) {
|
if ( !normal_window_mode && !config.fullscreen ) {
|
||||||
window_set_atom_prop ( display, box, netatoms[_NET_WM_STATE], &netatoms[_NET_WM_STATE_ABOVE], 1 );
|
window_set_atom_prop ( display, box, netatoms[_NET_WM_STATE], &netatoms[_NET_WM_STATE_ABOVE], 1 );
|
||||||
|
|
|
@ -34,7 +34,6 @@
|
||||||
#include <X11/XKBlib.h>
|
#include <X11/XKBlib.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
#include <pango/pangocairo.h>
|
|
||||||
#include "rofi.h"
|
#include "rofi.h"
|
||||||
#include "textbox.h"
|
#include "textbox.h"
|
||||||
#include "keyb.h"
|
#include "keyb.h"
|
||||||
|
@ -76,10 +75,7 @@ textbox* textbox_create ( TextboxFlags flags, short x, short y, short w, short h
|
||||||
|
|
||||||
tb->main_surface = cairo_image_surface_create ( get_format (), tb->w, tb->h );
|
tb->main_surface = cairo_image_surface_create ( get_format (), tb->w, tb->h );
|
||||||
tb->main_draw = cairo_create ( tb->main_surface );
|
tb->main_draw = cairo_create ( tb->main_surface );
|
||||||
tb->layout = pango_cairo_create_layout ( tb->main_draw );
|
tb->layout = pango_layout_new ( p_context );
|
||||||
PangoFontDescription *pfd = pango_font_description_from_string ( config.menu_font );
|
|
||||||
pango_layout_set_font_description ( tb->layout, pfd );
|
|
||||||
pango_font_description_free ( pfd );
|
|
||||||
textbox_font ( tb, tbft );
|
textbox_font ( tb, tbft );
|
||||||
|
|
||||||
if ( ( flags & TB_WRAP ) == TB_WRAP ) {
|
if ( ( flags & TB_WRAP ) == TB_WRAP ) {
|
||||||
|
@ -239,8 +235,6 @@ static void texbox_update ( textbox *tb )
|
||||||
}
|
}
|
||||||
tb->main_surface = cairo_image_surface_create ( get_format (), tb->w, tb->h );
|
tb->main_surface = cairo_image_surface_create ( get_format (), tb->w, tb->h );
|
||||||
tb->main_draw = cairo_create ( tb->main_surface );
|
tb->main_draw = cairo_create ( tb->main_surface );
|
||||||
PangoFontDescription *pfd = pango_font_description_from_string ( config.menu_font );
|
|
||||||
pango_font_description_free ( pfd );
|
|
||||||
cairo_set_operator ( tb->main_draw, CAIRO_OPERATOR_SOURCE );
|
cairo_set_operator ( tb->main_draw, CAIRO_OPERATOR_SOURCE );
|
||||||
|
|
||||||
pango_cairo_update_layout ( tb->main_draw, tb->layout );
|
pango_cairo_update_layout ( tb->main_draw, tb->layout );
|
||||||
|
@ -300,19 +294,20 @@ static void texbox_update ( textbox *tb )
|
||||||
cairo_set_source_rgba ( tb->main_draw, col.red, col.green, col.blue, col.alpha * scale );
|
cairo_set_source_rgba ( tb->main_draw, col.red, col.green, col.blue, col.alpha * scale );
|
||||||
cairo_paint ( tb->main_draw );
|
cairo_paint ( tb->main_draw );
|
||||||
|
|
||||||
// Set ARGB
|
|
||||||
col = tb->color_fg;
|
col = tb->color_fg;
|
||||||
cairo_set_source_rgba ( tb->main_draw, col.red, col.green, col.blue, col.alpha * scale );
|
cairo_set_source_rgba ( tb->main_draw, col.red, col.green, col.blue, col.alpha * scale );
|
||||||
cairo_move_to ( tb->main_draw, x, y );
|
|
||||||
pango_cairo_show_layout ( tb->main_draw, tb->layout );
|
|
||||||
|
|
||||||
//cairo_fill(tb->draw);
|
|
||||||
// draw the cursor
|
// draw the cursor
|
||||||
if ( tb->flags & TB_EDITABLE ) {
|
if ( tb->flags & TB_EDITABLE ) {
|
||||||
cairo_rectangle ( tb->main_draw, x + cursor_x, y, cursor_width, font_height );
|
cairo_rectangle ( tb->main_draw, x + cursor_x, y, cursor_width, font_height );
|
||||||
cairo_fill ( tb->main_draw );
|
cairo_fill ( tb->main_draw );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set ARGB
|
||||||
|
// We need to set over, otherwise subpixel hinting wont work.
|
||||||
|
cairo_set_operator ( tb->main_draw, CAIRO_OPERATOR_OVER );
|
||||||
|
cairo_move_to ( tb->main_draw, x, y );
|
||||||
|
pango_cairo_show_layout ( tb->main_draw, tb->layout );
|
||||||
|
|
||||||
tb->update = FALSE;
|
tb->update = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -658,11 +653,12 @@ void textbox_setup ( Display *display )
|
||||||
parse_color ( display, config.menu_hlfg_active, &( colors[ACTIVE].hlfg ) );
|
parse_color ( display, config.menu_hlfg_active, &( colors[ACTIVE].hlfg ) );
|
||||||
parse_color ( display, config.menu_hlbg_active, &( colors[ACTIVE].hlbg ) );
|
parse_color ( display, config.menu_hlbg_active, &( colors[ACTIVE].hlbg ) );
|
||||||
}
|
}
|
||||||
PangoFontMap *font_map = pango_cairo_font_map_get_default ();
|
}
|
||||||
if ( config.dpi > 0 ) {
|
|
||||||
pango_cairo_font_map_set_resolution ( (PangoCairoFontMap *) font_map, (double) config.dpi );
|
void textbox_set_pango_context ( PangoContext *p )
|
||||||
}
|
{
|
||||||
p_context = pango_font_map_create_context ( font_map );
|
textbox_cleanup ();
|
||||||
|
p_context = g_object_ref ( p );
|
||||||
}
|
}
|
||||||
|
|
||||||
void textbox_cleanup ( void )
|
void textbox_cleanup ( void )
|
||||||
|
@ -699,26 +695,18 @@ int textbox_get_font_width ( textbox *tb )
|
||||||
|
|
||||||
double textbox_get_estimated_char_width ( void )
|
double textbox_get_estimated_char_width ( void )
|
||||||
{
|
{
|
||||||
PangoFontDescription *pfd = pango_font_description_from_string ( config.menu_font );
|
|
||||||
// Get width
|
// Get width
|
||||||
PangoFontMetrics *metric = pango_context_get_metrics ( p_context, pfd, NULL );
|
PangoFontMetrics *metric = pango_context_get_metrics ( p_context, NULL, NULL );
|
||||||
int width = pango_font_metrics_get_approximate_char_width ( metric );
|
int width = pango_font_metrics_get_approximate_char_width ( metric );
|
||||||
pango_font_metrics_unref ( metric );
|
pango_font_metrics_unref ( metric );
|
||||||
|
|
||||||
pango_font_description_free ( pfd );
|
|
||||||
return ( width ) / (double) PANGO_SCALE;
|
return ( width ) / (double) PANGO_SCALE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int textbox_get_estimated_char_height ( void )
|
int textbox_get_estimated_char_height ( void )
|
||||||
{
|
{
|
||||||
// Set font.
|
|
||||||
PangoFontDescription *pfd = pango_font_description_from_string ( config.menu_font );
|
|
||||||
|
|
||||||
// Get width
|
// Get width
|
||||||
PangoFontMetrics *metric = pango_context_get_metrics ( p_context, pfd, NULL );
|
PangoFontMetrics *metric = pango_context_get_metrics ( p_context, NULL, NULL );
|
||||||
int height = pango_font_metrics_get_ascent ( metric ) + pango_font_metrics_get_descent ( metric );
|
int height = pango_font_metrics_get_ascent ( metric ) + pango_font_metrics_get_descent ( metric );
|
||||||
pango_font_metrics_unref ( metric );
|
pango_font_metrics_unref ( metric );
|
||||||
|
|
||||||
pango_font_description_free ( pfd );
|
|
||||||
return ( height ) / PANGO_SCALE + 2 * SIDE_MARGIN;
|
return ( height ) / PANGO_SCALE + 2 * SIDE_MARGIN;
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,7 +92,7 @@ int main ( G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv )
|
||||||
config.menu_bg_alt = config.menu_bg;
|
config.menu_bg_alt = config.menu_bg;
|
||||||
textbox_setup ( display );
|
textbox_setup ( display );
|
||||||
textbox *box = textbox_create ( TB_EDITABLE | TB_AUTOWIDTH | TB_AUTOHEIGHT, 0, 0, -1, -1,
|
textbox *box = textbox_create ( TB_EDITABLE | TB_AUTOWIDTH | TB_AUTOHEIGHT, 0, 0, -1, -1,
|
||||||
NORMAL, "test" );
|
NORMAL, "test" );
|
||||||
TASSERT ( box != NULL );
|
TASSERT ( box != NULL );
|
||||||
|
|
||||||
textbox_cursor_end ( box );
|
textbox_cursor_end ( box );
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue