File: renderer.hpp

package info (click to toggle)
polybar 3.7.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 3,108 kB
  • sloc: cpp: 30,424; python: 3,750; sh: 284; makefile: 83
file content (141 lines) | stat: -rw-r--r-- 3,623 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#pragma once

#include <cairo/cairo.h>

#include <bitset>
#include <memory>

#include "cairo/fwd.hpp"
#include "common.hpp"
#include "components/renderer_interface.hpp"
#include "components/types.hpp"
#include "events/signal_fwd.hpp"
#include "events/signal_receiver.hpp"
#include "x11/extensions/fwd.hpp"
#include "x11/types.hpp"

POLYBAR_NS

// fwd {{{
class connection;
class config;
class logger;
class background_manager;
class bg_slice;
// }}}

using std::map;

struct alignment_block {
  cairo_pattern_t* pattern;
  /**
   * The x-position where the next thing will be rendered.
   */
  double x;
  double y;
  /**
   * The total width of this block.
   *
   * This is always >= x, but may be larger because a negative offset may
   * decrease x, but the width doesn't change.
   */
  double width;
};

class renderer : public renderer_interface,
                 public signal_receiver<SIGN_PRIORITY_RENDERER, signals::ui::request_snapshot> {
 public:
  using make_type = unique_ptr<renderer>;
  static make_type make(const bar_settings& bar, tags::action_context& action_ctxt, const config&);

  explicit renderer(connection& conn, signal_emitter& sig, const config&, const logger& logger, const bar_settings& bar,
      background_manager& background_manager, tags::action_context& action_ctxt);
  ~renderer();

  xcb_window_t window() const;
  xcb_visualtype_t* visual() const;
  int depth() const;

  void begin(xcb_rectangle_t rect);
  void end();
  void flush();

  void render_offset(const tags::context& ctxt, const extent_val offset) override;
  void render_text(const tags::context& ctxt, const string&&) override;

  void change_alignment(const tags::context& ctxt) override;

  double get_x(const tags::context& ctxt) const override;

  double get_alignment_start(const alignment align) const override;

  void apply_tray_position(const tags::context& context) override;

 protected:
  void fill_background();
  void fill_overline(rgba color, double x, double w);
  void fill_underline(rgba color, double x, double w);
  void fill_borders();
  void draw_offset(const tags::context& ctxt, rgba color, double x, double w);

  double block_x(alignment a) const;
  double block_y(alignment a) const;
  double block_w(alignment a) const;
  double block_h(alignment a) const;

  void increase_x(double dx);

  void flush(alignment a);
  void highlight_clickable_areas();

  bool on(const signals::ui::request_snapshot& evt) override;

 protected:
  struct reserve_area {
    edge side{edge::NONE};
    unsigned int size{0U};
  };

 private:
  connection& m_connection;
  signal_emitter& m_sig;
  const config& m_conf;
  const logger& m_log;
  const bar_settings& m_bar;
  std::shared_ptr<bg_slice> m_background;

  int m_depth{-1};
  xcb_window_t m_window;
  xcb_colormap_t m_colormap{XCB_NONE};
  xcb_visualtype_t* m_visual;
  xcb_gcontext_t m_gcontext;

  /**
   * Background pixmap for the bar window
   *
   * All bar contents are rendered onto this.
   */
  xcb_pixmap_t m_pixmap;

  xcb_rectangle_t m_rect{0, 0, 0U, 0U};
  reserve_area m_cleararea{};

  unique_ptr<cairo::context> m_context;
  unique_ptr<cairo::xcb_surface> m_surface;
  map<alignment, alignment_block> m_blocks;
  cairo_pattern_t* m_cornermask{};

  cairo_operator_t m_comp_bg{CAIRO_OPERATOR_SOURCE};
  cairo_operator_t m_comp_fg{CAIRO_OPERATOR_OVER};
  cairo_operator_t m_comp_ol{CAIRO_OPERATOR_OVER};
  cairo_operator_t m_comp_ul{CAIRO_OPERATOR_OVER};
  cairo_operator_t m_comp_border{CAIRO_OPERATOR_OVER};
  bool m_pseudo_transparency{false};

  alignment m_align;

  bool m_fixedcenter;
  string m_snapshot_dst;
};

POLYBAR_NS_END