refactor(bar): use Gtk enums for position and orientation
Ensure that the position and the corresponding CSS class on window are always set.
This commit is contained in:
		
							parent
							
								
									28cd9dff47
								
							
						
					
					
						commit
						2f555a6936
					
				|  | @ -62,7 +62,7 @@ class BarSurface { | |||
|   virtual void setLayer(bar_layer layer) = 0; | ||||
|   virtual void setMargins(const struct bar_margins &margins) = 0; | ||||
|   virtual void setPassThrough(bool enable) = 0; | ||||
|   virtual void setPosition(const std::string_view &position) = 0; | ||||
|   virtual void setPosition(Gtk::PositionType position) = 0; | ||||
|   virtual void setSize(uint32_t width, uint32_t height) = 0; | ||||
|   virtual void commit(){}; | ||||
| 
 | ||||
|  | @ -89,8 +89,9 @@ class Bar { | |||
|   Json::Value config; | ||||
|   struct wl_surface *surface; | ||||
|   bool visible = true; | ||||
|   bool vertical = false; | ||||
|   Gtk::Window window; | ||||
|   Gtk::Orientation orientation = Gtk::ORIENTATION_HORIZONTAL; | ||||
|   Gtk::PositionType position = Gtk::POS_TOP; | ||||
| 
 | ||||
|   int x_global; | ||||
|   int y_global; | ||||
|  |  | |||
							
								
								
									
										159
									
								
								src/bar.cpp
								
								
								
								
							
							
						
						
									
										159
									
								
								src/bar.cpp
								
								
								
								
							|  | @ -93,6 +93,32 @@ void from_json(const Json::Value& j, bar_mode& m) { | |||
|   } | ||||
| } | ||||
| 
 | ||||
| /* Deserializer for enum Gtk::PositionType */ | ||||
| void from_json(const Json::Value& j, Gtk::PositionType& pos) { | ||||
|   if (j == "left") { | ||||
|     pos = Gtk::POS_LEFT; | ||||
|   } else if (j == "right") { | ||||
|     pos = Gtk::POS_RIGHT; | ||||
|   } else if (j == "top") { | ||||
|     pos = Gtk::POS_TOP; | ||||
|   } else if (j == "bottom") { | ||||
|     pos = Gtk::POS_BOTTOM; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| Glib::ustring to_string(Gtk::PositionType pos) { | ||||
|   switch (pos) { | ||||
|     case Gtk::POS_LEFT: | ||||
|       return "left"; | ||||
|     case Gtk::POS_RIGHT: | ||||
|       return "right"; | ||||
|     case Gtk::POS_TOP: | ||||
|       return "top"; | ||||
|     case Gtk::POS_BOTTOM: | ||||
|       return "bottom"; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /* Deserializer for JSON Object -> map<string compatible type, Value>
 | ||||
|  * Assumes that all the values in the object are deserializable to the same type. | ||||
|  */ | ||||
|  | @ -158,18 +184,26 @@ struct GLSSurfaceImpl : public BarSurface, public sigc::trackable { | |||
|     } | ||||
|   } | ||||
| 
 | ||||
|   void setPosition(const std::string_view& position) override { | ||||
|   void setPosition(Gtk::PositionType position) override { | ||||
|     auto unanchored = GTK_LAYER_SHELL_EDGE_BOTTOM; | ||||
|     vertical_ = false; | ||||
|     if (position == "bottom") { | ||||
|       unanchored = GTK_LAYER_SHELL_EDGE_TOP; | ||||
|     } else if (position == "left") { | ||||
|       unanchored = GTK_LAYER_SHELL_EDGE_RIGHT; | ||||
|       vertical_ = true; | ||||
|     } else if (position == "right") { | ||||
|       vertical_ = true; | ||||
|       unanchored = GTK_LAYER_SHELL_EDGE_LEFT; | ||||
|     } | ||||
|     orientation_ = Gtk::ORIENTATION_HORIZONTAL; | ||||
|     switch (position) { | ||||
|       case Gtk::POS_LEFT: | ||||
|         unanchored = GTK_LAYER_SHELL_EDGE_RIGHT; | ||||
|         orientation_ = Gtk::ORIENTATION_VERTICAL; | ||||
|         break; | ||||
|       case Gtk::POS_RIGHT: | ||||
|         unanchored = GTK_LAYER_SHELL_EDGE_LEFT; | ||||
|         orientation_ = Gtk::ORIENTATION_VERTICAL; | ||||
|         break; | ||||
|       case Gtk::POS_TOP: | ||||
|         unanchored = GTK_LAYER_SHELL_EDGE_BOTTOM; | ||||
|         break; | ||||
|       case Gtk::POS_BOTTOM: | ||||
|         unanchored = GTK_LAYER_SHELL_EDGE_TOP; | ||||
|         break; | ||||
|     }; | ||||
| 
 | ||||
|     for (auto edge : {GTK_LAYER_SHELL_EDGE_LEFT, GTK_LAYER_SHELL_EDGE_RIGHT, | ||||
|                       GTK_LAYER_SHELL_EDGE_TOP, GTK_LAYER_SHELL_EDGE_BOTTOM}) { | ||||
|       gtk_layer_set_anchor(window_.gobj(), edge, unanchored != edge); | ||||
|  | @ -178,10 +212,10 @@ struct GLSSurfaceImpl : public BarSurface, public sigc::trackable { | |||
|     // Disable anchoring for other edges too if the width
 | ||||
|     // or the height has been set to a value other than 'auto'
 | ||||
|     // otherwise the bar will use all space
 | ||||
|     if (vertical_ && height_ > 1) { | ||||
|     if (orientation_ == Gtk::ORIENTATION_VERTICAL && height_ > 1) { | ||||
|       gtk_layer_set_anchor(window_.gobj(), GTK_LAYER_SHELL_EDGE_BOTTOM, false); | ||||
|       gtk_layer_set_anchor(window_.gobj(), GTK_LAYER_SHELL_EDGE_TOP, false); | ||||
|     } else if (!vertical_ && width_ > 1) { | ||||
|     } else if (orientation_ == Gtk::ORIENTATION_HORIZONTAL && width_ > 1) { | ||||
|       gtk_layer_set_anchor(window_.gobj(), GTK_LAYER_SHELL_EDGE_LEFT, false); | ||||
|       gtk_layer_set_anchor(window_.gobj(), GTK_LAYER_SHELL_EDGE_RIGHT, false); | ||||
|     } | ||||
|  | @ -195,11 +229,11 @@ struct GLSSurfaceImpl : public BarSurface, public sigc::trackable { | |||
| 
 | ||||
|  private: | ||||
|   Gtk::Window& window_; | ||||
|   Gtk::Orientation orientation_ = Gtk::ORIENTATION_HORIZONTAL; | ||||
|   std::string output_name_; | ||||
|   uint32_t width_; | ||||
|   uint32_t height_; | ||||
|   bool passthrough_ = false; | ||||
|   bool vertical_ = false; | ||||
| 
 | ||||
|   void onMap(GdkEventAny* ev) { setPassThrough(passthrough_); } | ||||
| 
 | ||||
|  | @ -212,7 +246,7 @@ struct GLSSurfaceImpl : public BarSurface, public sigc::trackable { | |||
|      * Note: forced resizing to a window smaller than required by GTK would not work with | ||||
|      * gtk-layer-shell. | ||||
|      */ | ||||
|     if (vertical_) { | ||||
|     if (orientation_ == Gtk::ORIENTATION_VERTICAL) { | ||||
|       if (width_ > 1 && ev->width > static_cast<int>(width_)) { | ||||
|         spdlog::warn(MIN_WIDTH_MSG, width_, ev->width); | ||||
|       } | ||||
|  | @ -304,15 +338,21 @@ struct RawSurfaceImpl : public BarSurface, public sigc::trackable { | |||
|     } | ||||
|   } | ||||
| 
 | ||||
|   void setPosition(const std::string_view& position) override { | ||||
|     anchor_ = HORIZONTAL_ANCHOR | ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP; | ||||
|     if (position == "bottom") { | ||||
|       anchor_ = HORIZONTAL_ANCHOR | ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM; | ||||
|     } else if (position == "left") { | ||||
|       anchor_ = VERTICAL_ANCHOR | ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT; | ||||
|     } else if (position == "right") { | ||||
|       anchor_ = VERTICAL_ANCHOR | ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT; | ||||
|     } | ||||
|   void setPosition(Gtk::PositionType position) override { | ||||
|     switch (position) { | ||||
|       case Gtk::POS_LEFT: | ||||
|         anchor_ = VERTICAL_ANCHOR | ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT; | ||||
|         break; | ||||
|       case Gtk::POS_RIGHT: | ||||
|         anchor_ = VERTICAL_ANCHOR | ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT; | ||||
|         break; | ||||
|       case Gtk::POS_TOP: | ||||
|         anchor_ = HORIZONTAL_ANCHOR | ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP; | ||||
|         break; | ||||
|       case Gtk::POS_BOTTOM: | ||||
|         anchor_ = HORIZONTAL_ANCHOR | ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM; | ||||
|         break; | ||||
|     }; | ||||
| 
 | ||||
|     // updating already mapped window
 | ||||
|     if (layer_surface_) { | ||||
|  | @ -493,17 +533,18 @@ waybar::Bar::Bar(struct waybar_output* w_output, const Json::Value& w_config) | |||
|   window.set_decorated(false); | ||||
|   window.get_style_context()->add_class(output->name); | ||||
|   window.get_style_context()->add_class(config["name"].asString()); | ||||
|   window.get_style_context()->add_class(config["position"].asString()); | ||||
| 
 | ||||
|   auto position = config["position"].asString(); | ||||
|   from_json(config["position"], position); | ||||
|   orientation = (position == Gtk::POS_LEFT || position == Gtk::POS_RIGHT) | ||||
|                     ? Gtk::ORIENTATION_VERTICAL | ||||
|                     : Gtk::ORIENTATION_HORIZONTAL; | ||||
| 
 | ||||
|   if (position == "right" || position == "left") { | ||||
|     left_ = Gtk::Box(Gtk::ORIENTATION_VERTICAL, 0); | ||||
|     center_ = Gtk::Box(Gtk::ORIENTATION_VERTICAL, 0); | ||||
|     right_ = Gtk::Box(Gtk::ORIENTATION_VERTICAL, 0); | ||||
|     box_ = Gtk::Box(Gtk::ORIENTATION_VERTICAL, 0); | ||||
|     vertical = true; | ||||
|   } | ||||
|   window.get_style_context()->add_class(to_string(position)); | ||||
| 
 | ||||
|   left_ = Gtk::Box(orientation, 0); | ||||
|   center_ = Gtk::Box(orientation, 0); | ||||
|   right_ = Gtk::Box(orientation, 0); | ||||
|   box_ = Gtk::Box(orientation, 0); | ||||
| 
 | ||||
|   left_.get_style_context()->add_class("modules-left"); | ||||
|   center_.get_style_context()->add_class("modules-center"); | ||||
|  | @ -829,34 +870,38 @@ void waybar::Bar::onConfigure(GdkEventConfigure* ev) { | |||
| 
 | ||||
| void waybar::Bar::configureGlobalOffset(int width, int height) { | ||||
|   auto monitor_geometry = *output->monitor->property_geometry().get_value().gobj(); | ||||
|   auto position = config["position"].asString(); | ||||
|   int x; | ||||
|   int y; | ||||
|   if (position == "bottom") { | ||||
|     if (width + margins_.left + margins_.right >= monitor_geometry.width) | ||||
|   switch (position) { | ||||
|     case Gtk::POS_BOTTOM: | ||||
|       if (width + margins_.left + margins_.right >= monitor_geometry.width) | ||||
|         x = margins_.left; | ||||
|       else | ||||
|         x = (monitor_geometry.width - width) / 2; | ||||
|       y = monitor_geometry.height - height - margins_.bottom; | ||||
|       break; | ||||
|     case Gtk::POS_LEFT: | ||||
|       x = margins_.left; | ||||
|     else | ||||
|       x = (monitor_geometry.width - width) / 2; | ||||
|     y = monitor_geometry.height - height - margins_.bottom; | ||||
|   } else if (position == "left") { | ||||
|     x = margins_.left; | ||||
|     if (height + margins_.top + margins_.bottom >= monitor_geometry.height) | ||||
|       if (height + margins_.top + margins_.bottom >= monitor_geometry.height) | ||||
|         y = margins_.top; | ||||
|       else | ||||
|         y = (monitor_geometry.height - height) / 2; | ||||
|       break; | ||||
|     case Gtk::POS_RIGHT: | ||||
|       x = monitor_geometry.width - width - margins_.right; | ||||
|       if (height + margins_.top + margins_.bottom >= monitor_geometry.height) | ||||
|         y = margins_.top; | ||||
|       else | ||||
|         y = (monitor_geometry.height - height) / 2; | ||||
|       break; | ||||
|     case Gtk::POS_TOP: | ||||
|       // position is top
 | ||||
|       if (width + margins_.left + margins_.right >= monitor_geometry.width) | ||||
|         x = margins_.left; | ||||
|       else | ||||
|         x = (monitor_geometry.width - width) / 2; | ||||
|       y = margins_.top; | ||||
|     else | ||||
|       y = (monitor_geometry.height - height) / 2; | ||||
|   } else if (position == "right") { | ||||
|     x = monitor_geometry.width - width - margins_.right; | ||||
|     if (height + margins_.top + margins_.bottom >= monitor_geometry.height) | ||||
|       y = margins_.top; | ||||
|     else | ||||
|       y = (monitor_geometry.height - height) / 2; | ||||
|   } else { | ||||
|     // position is top
 | ||||
|     if (width + margins_.left + margins_.right >= monitor_geometry.width) | ||||
|       x = margins_.left; | ||||
|     else | ||||
|       x = (monitor_geometry.width - width) / 2; | ||||
|     y = margins_.top; | ||||
|       break; | ||||
|   } | ||||
| 
 | ||||
|   x_global = x + monitor_geometry.x; | ||||
|  |  | |||
|  | @ -93,7 +93,7 @@ Tags::Tags(const std::string &id, const waybar::Bar &bar, const Json::Value &con | |||
|       status_manager_{nullptr}, | ||||
|       seat_{nullptr}, | ||||
|       bar_(bar), | ||||
|       box_{bar.vertical ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL, 0}, | ||||
|       box_{bar.orientation, 0}, | ||||
|       output_status_{nullptr} { | ||||
|   struct wl_display *display = Client::inst()->wl_display; | ||||
|   struct wl_registry *registry = wl_display_get_registry(display); | ||||
|  |  | |||
|  | @ -34,9 +34,7 @@ int Workspaces::windowRewritePriorityFunction(std::string const &window_rule) { | |||
| } | ||||
| 
 | ||||
| Workspaces::Workspaces(const std::string &id, const Bar &bar, const Json::Value &config) | ||||
|     : AModule(config, "workspaces", id, false, false), | ||||
|       m_bar(bar), | ||||
|       m_box(bar.vertical ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL, 0) { | ||||
|     : AModule(config, "workspaces", id, false, false), m_bar(bar), m_box(bar.orientation, 0) { | ||||
|   modulesReady = true; | ||||
|   parseConfig(config); | ||||
| 
 | ||||
|  |  | |||
|  | @ -81,7 +81,7 @@ auto supportsLockStates(const libevdev* dev) -> bool { | |||
| waybar::modules::KeyboardState::KeyboardState(const std::string& id, const Bar& bar, | ||||
|                                               const Json::Value& config) | ||||
|     : AModule(config, "keyboard-state", id, false, !config["disable-scroll"].asBool()), | ||||
|       box_(bar.vertical ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL, 0), | ||||
|       box_(bar.orientation, 0), | ||||
|       numlock_label_(""), | ||||
|       capslock_label_(""), | ||||
|       numlock_format_(config_["format"].isString() ? config_["format"].asString() | ||||
|  |  | |||
|  | @ -87,7 +87,7 @@ Tags::Tags(const std::string &id, const waybar::Bar &bar, const Json::Value &con | |||
|       control_{nullptr}, | ||||
|       seat_{nullptr}, | ||||
|       bar_(bar), | ||||
|       box_{bar.vertical ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL, 0}, | ||||
|       box_{bar.orientation, 0}, | ||||
|       output_status_{nullptr} { | ||||
|   struct wl_display *display = Client::inst()->wl_display; | ||||
|   struct wl_registry *registry = wl_display_get_registry(display); | ||||
|  |  | |||
|  | @ -6,7 +6,7 @@ namespace waybar::modules::SNI { | |||
| 
 | ||||
| Tray::Tray(const std::string& id, const Bar& bar, const Json::Value& config) | ||||
|     : AModule(config, "tray", id), | ||||
|       box_(bar.vertical ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL, 0), | ||||
|       box_(bar.orientation, 0), | ||||
|       watcher_(SNI::Watcher::getInstance()), | ||||
|       host_(nb_hosts_, config, bar, std::bind(&Tray::onAdd, this, std::placeholders::_1), | ||||
|             std::bind(&Tray::onRemove, this, std::placeholders::_1)) { | ||||
|  |  | |||
|  | @ -27,7 +27,7 @@ int Workspaces::convertWorkspaceNameToNum(std::string name) { | |||
| Workspaces::Workspaces(const std::string &id, const Bar &bar, const Json::Value &config) | ||||
|     : AModule(config, "workspaces", id, false, !config["disable-scroll"].asBool()), | ||||
|       bar_(bar), | ||||
|       box_(bar.vertical ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL, 0) { | ||||
|       box_(bar.orientation, 0) { | ||||
|   if (config["format-icons"]["high-priority-named"].isArray()) { | ||||
|     for (auto &it : config["format-icons"]["high-priority-named"]) { | ||||
|       high_priority_named_.push_back(it.asString()); | ||||
|  |  | |||
|  | @ -277,7 +277,7 @@ Task::Task(const waybar::Bar &bar, const Json::Value &config, Taskbar *tbar, | |||
|       handle_{tl_handle}, | ||||
|       seat_{seat}, | ||||
|       id_{global_id++}, | ||||
|       content_{bar.vertical ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL, 0} { | ||||
|       content_{bar.orientation, 0} { | ||||
|   zwlr_foreign_toplevel_handle_v1_add_listener(handle_, &toplevel_handle_impl, this); | ||||
| 
 | ||||
|   button.set_relief(Gtk::RELIEF_NONE); | ||||
|  | @ -730,7 +730,7 @@ static const wl_registry_listener registry_listener_impl = {.global = handle_glo | |||
| Taskbar::Taskbar(const std::string &id, const waybar::Bar &bar, const Json::Value &config) | ||||
|     : waybar::AModule(config, "taskbar", id, false, false), | ||||
|       bar_(bar), | ||||
|       box_{bar.vertical ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL, 0}, | ||||
|       box_{bar.orientation, 0}, | ||||
|       manager_{nullptr}, | ||||
|       seat_{nullptr} { | ||||
|   box_.set_name("taskbar"); | ||||
|  |  | |||
|  | @ -21,9 +21,7 @@ std::map<std::string, std::string> Workspace::icons_map_; | |||
| 
 | ||||
| WorkspaceManager::WorkspaceManager(const std::string &id, const waybar::Bar &bar, | ||||
|                                    const Json::Value &config) | ||||
|     : waybar::AModule(config, "workspaces", id, false, false), | ||||
|       bar_(bar), | ||||
|       box_(bar.vertical ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL, 0) { | ||||
|     : waybar::AModule(config, "workspaces", id, false, false), bar_(bar), box_(bar.orientation, 0) { | ||||
|   auto config_sort_by_name = config_["sort-by-name"]; | ||||
|   if (config_sort_by_name.isBool()) { | ||||
|     sort_by_name_ = config_sort_by_name.asBool(); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue