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