polybar/include/x11/fonts.hpp

80 lines
1.5 KiB
C++
Raw Normal View History

2016-11-02 19:22:45 +00:00
#pragma once
#include <X11/Xft/Xft.h>
#include <xcb/xcbext.h>
#include "common.hpp"
#include "components/logger.hpp"
#include "x11/color.hpp"
#include "x11/types.hpp"
2016-11-19 05:22:44 +00:00
POLYBAR_NS
2016-11-02 19:22:45 +00:00
2016-11-20 22:04:31 +00:00
// fwd
class connection;
2016-11-02 19:22:45 +00:00
#define XFT_MAXCHARS (1 << 16)
extern array<char, XFT_MAXCHARS> xft_widths;
extern array<wchar_t, XFT_MAXCHARS> xft_chars;
struct fonttype {
fonttype() {}
XftFont* xft;
xcb_font_t ptr;
int offset_y = 0;
int ascent = 0;
int descent = 0;
int height = 0;
int width = 0;
uint16_t char_max = 0;
uint16_t char_min = 0;
vector<xcb_charinfo_t> width_lut;
};
struct fonttype_deleter {
2016-11-20 22:04:31 +00:00
void operator()(fonttype* f);
2016-11-02 19:22:45 +00:00
};
using font_t = unique_ptr<fonttype, fonttype_deleter>;
2016-11-20 22:04:31 +00:00
class font_manager {
2016-11-02 19:22:45 +00:00
public:
2016-11-20 22:04:31 +00:00
explicit font_manager(connection& conn, const logger& logger);
~font_manager();
2016-11-02 19:22:45 +00:00
void set_preferred_font(int index);
bool load(string name, int fontindex = -1, int offset_y = 0);
font_t& match_char(uint16_t chr);
int char_width(font_t& font, uint16_t chr);
XftColor xftcolor();
void allocate_color(XRenderColor color, bool initial_alloc = false);
void set_gcontext_font(gcontext& gc, xcb_font_t font);
protected:
bool open_xcb_font(font_t& fontptr, string fontname);
bool has_glyph(font_t& font, uint16_t chr);
private:
connection& m_connection;
const logger& m_logger;
Display* m_display = nullptr;
Visual* m_visual = nullptr;
Colormap m_colormap;
map<int, font_t> m_fonts;
int m_fontindex = -1;
XftColor m_xftcolor;
};
2016-11-20 22:04:31 +00:00
di::injector<unique_ptr<font_manager>> configure_font_manager();
2016-11-02 19:22:45 +00:00
2016-11-19 05:22:44 +00:00
POLYBAR_NS_END