1 #pragma once
2 
3 #include <cairo/cairo-xcb.h>
4 
5 #include "cairo/types.hpp"
6 #include "common.hpp"
7 #include "errors.hpp"
8 #include "utils/color.hpp"
9 #include "utils/string.hpp"
10 
11 POLYBAR_NS
12 
13 namespace cairo {
14   /**
15    * \brief Base surface
16    */
17   class surface {
18    public:
surface(cairo_surface_t * s)19     explicit surface(cairo_surface_t* s) : m_s(s) {}
~surface()20     virtual ~surface() {
21       cairo_surface_destroy(m_s);
22     }
23 
operator cairo_surface_t*() const24     operator cairo_surface_t*() const {
25       return m_s;
26     }
27 
flush()28     void flush() {
29       cairo_surface_flush(m_s);
30     }
31 
show(bool clear=true)32     void show(bool clear = true) {
33       if (clear) {
34         cairo_surface_show_page(m_s);
35       } else {
36         cairo_surface_copy_page(m_s);
37       }
38     }
39 
dirty()40     void dirty() {
41       cairo_surface_mark_dirty(m_s);
42     }
43 
dirty(const rect & r)44     void dirty(const rect& r) {
45       cairo_surface_mark_dirty_rectangle(m_s, r.x, r.y, r.w, r.h);
46     }
47 
write_png(const string & dst)48     void write_png(const string& dst) {
49       auto status = cairo_surface_write_to_png(m_s, dst.c_str());
50       if (status != CAIRO_STATUS_SUCCESS) {
51         throw application_error(sstream() << "cairo_surface_write_to_png(): " << cairo_status_to_string(status));
52       }
53     }
54 
55    protected:
56     cairo_surface_t* m_s;
57   };
58 
59   /**
60    * \brief Surface for xcb
61    */
62   class xcb_surface : public surface {
63    public:
xcb_surface(xcb_connection_t * c,xcb_pixmap_t p,xcb_visualtype_t * v,int w,int h)64     explicit xcb_surface(xcb_connection_t* c, xcb_pixmap_t p, xcb_visualtype_t* v, int w, int h)
65         : surface(cairo_xcb_surface_create(c, p, v, w, h)) {}
66 
~xcb_surface()67     ~xcb_surface() override {}
68 
set_drawable(xcb_drawable_t d,int w,int h)69     void set_drawable(xcb_drawable_t d, int w, int h) {
70       cairo_surface_flush(m_s);
71       cairo_xcb_surface_set_drawable(m_s, d, w, h);
72     }
73   };
74 }
75 
76 POLYBAR_NS_END
77