parent
462e53d6c8
commit
385572ec64
@ -68,6 +68,10 @@ option(WITH_XSYNC "XSYNC support" OFF)
|
|||||||
option(WITH_XCOMPOSITE "XCOMPOSITE support" OFF)
|
option(WITH_XCOMPOSITE "XCOMPOSITE support" OFF)
|
||||||
option(WITH_XKB "XKB support" ON)
|
option(WITH_XKB "XKB support" ON)
|
||||||
|
|
||||||
|
if(NOT DEFINED ENABLE_XRANDR_MONITORS)
|
||||||
|
set(ENABLE_XRANDR_MONITORS OFF CACHE STRING "Enable XRandR monitor feature (requires version 1.5+)")
|
||||||
|
endif()
|
||||||
|
|
||||||
# }}}
|
# }}}
|
||||||
# Set cache vars {{{
|
# Set cache vars {{{
|
||||||
|
|
||||||
|
@ -67,6 +67,7 @@ colored_option(STATUS " Enable mpd ${ENABLE_MPD}" ENABLE_MPD "32;1" "3
|
|||||||
colored_option(STATUS " Enable network ${ENABLE_NETWORK}" ENABLE_NETWORK "32;1" "37;2")
|
colored_option(STATUS " Enable network ${ENABLE_NETWORK}" ENABLE_NETWORK "32;1" "37;2")
|
||||||
message(STATUS "--------------------------")
|
message(STATUS "--------------------------")
|
||||||
colored_option(STATUS " XRANDR support ${WITH_XRANDR}" WITH_XRANDR "32;1" "37;2")
|
colored_option(STATUS " XRANDR support ${WITH_XRANDR}" WITH_XRANDR "32;1" "37;2")
|
||||||
|
colored_option(STATUS " + XRandR monitors ${ENABLE_XRANDR_MONITORS}" ENABLE_XRANDR_MONITORS "32;1" "37;2")
|
||||||
colored_option(STATUS " XRENDER support ${WITH_XRENDER}" WITH_XRENDER "32;1" "37;2")
|
colored_option(STATUS " XRENDER support ${WITH_XRENDER}" WITH_XRENDER "32;1" "37;2")
|
||||||
colored_option(STATUS " XDAMAGE support ${WITH_XDAMAGE}" WITH_XDAMAGE "32;1" "37;2")
|
colored_option(STATUS " XDAMAGE support ${WITH_XDAMAGE}" WITH_XDAMAGE "32;1" "37;2")
|
||||||
colored_option(STATUS " XSYNC support ${WITH_XSYNC}" WITH_XSYNC "32;1" "37;2")
|
colored_option(STATUS " XSYNC support ${WITH_XSYNC}" WITH_XSYNC "32;1" "37;2")
|
||||||
|
@ -6,7 +6,7 @@ add_subdirectory(zsh)
|
|||||||
|
|
||||||
set(MODULES_LEFT "bspwm i3 xwindow")
|
set(MODULES_LEFT "bspwm i3 xwindow")
|
||||||
set(MODULES_CENTER "")
|
set(MODULES_CENTER "")
|
||||||
set(MODULES_RIGHT "backlight volume xkeyboard memory cpu wlan eth battery temperature date powermenu")
|
set(MODULES_RIGHT "xbacklight volume xkeyboard memory cpu wlan eth battery temperature date powermenu")
|
||||||
|
|
||||||
# Strip disabled modules {{{
|
# Strip disabled modules {{{
|
||||||
|
|
||||||
@ -20,7 +20,7 @@ if(NOT ENABLE_NETWORK)
|
|||||||
string(REPLACE " wlan eth" "" MODULES_RIGHT ${MODULES_RIGHT})
|
string(REPLACE " wlan eth" "" MODULES_RIGHT ${MODULES_RIGHT})
|
||||||
endif()
|
endif()
|
||||||
if(NOT WITH_XRANDR)
|
if(NOT WITH_XRANDR)
|
||||||
string(REPLACE "backlight " "" MODULES_RIGHT ${MODULES_RIGHT})
|
string(REPLACE "xbacklight " "backlight-acpi " MODULES_RIGHT ${MODULES_RIGHT})
|
||||||
endif()
|
endif()
|
||||||
if(NOT WITH_XKB)
|
if(NOT WITH_XKB)
|
||||||
string(REPLACE "xkeyboard " "" MODULES_RIGHT ${MODULES_RIGHT})
|
string(REPLACE "xkeyboard " "" MODULES_RIGHT ${MODULES_RIGHT})
|
||||||
|
@ -164,7 +164,7 @@ icon-repeat =
|
|||||||
toggle-on-foreground = ${colors.primary}
|
toggle-on-foreground = ${colors.primary}
|
||||||
toggle-off-foreground = #66
|
toggle-off-foreground = #66
|
||||||
|
|
||||||
[module/backlight]
|
[module/xbacklight]
|
||||||
type = internal/xbacklight
|
type = internal/xbacklight
|
||||||
|
|
||||||
format = <label> <bar>
|
format = <label> <bar>
|
||||||
@ -181,6 +181,11 @@ bar-empty = ─
|
|||||||
bar-empty-font = 2
|
bar-empty-font = 2
|
||||||
bar-empty-foreground = ${colors.foreground-alt}
|
bar-empty-foreground = ${colors.foreground-alt}
|
||||||
|
|
||||||
|
[module/backlight-acpi]
|
||||||
|
inherit = module/xbacklight
|
||||||
|
type = internal/backlight
|
||||||
|
card = intel_backlight
|
||||||
|
|
||||||
[module/cpu]
|
[module/cpu]
|
||||||
type = internal/cpu
|
type = internal/cpu
|
||||||
interval = 2
|
interval = 2
|
||||||
|
@ -6,11 +6,12 @@
|
|||||||
_polybar() {
|
_polybar() {
|
||||||
_arguments -n : \
|
_arguments -n : \
|
||||||
'(-h --help)'{-h,--help}'[Display help text and exit]' \
|
'(-h --help)'{-h,--help}'[Display help text and exit]' \
|
||||||
'(-v --version)'{-v,--version}'[Display version information and exit]' \
|
'(-v --version)'{-v,--version}'[Display build details and exit]' \
|
||||||
'(-l --log)'{-l,--log=}'[Set the logging verbosity (default: warning)]:verbosity level:(error warning info trace)' \
|
'(-l --log)'{-l,--log=}'[Set the logging verbosity (default: warning)]:verbosity level:(error warning info trace)' \
|
||||||
'(-l --log -q --quiet)'{-q,--quiet}'[Be quiet (will override -l)]' \
|
'(-l --log -q --quiet)'{-q,--quiet}'[Be quiet (will override -l)]' \
|
||||||
'(-c --config)'{-c,--config=}'[Path to the configuration file]:configuration file:_files' \
|
'(-c --config)'{-c,--config=}'[Path to the configuration file]:configuration file:_files' \
|
||||||
'(-r --reload)'{-r,--reload}'[Reload when the configuration has been modified]' \
|
'(-r --reload)'{-r,--reload}'[Reload when the configuration has been modified]' \
|
||||||
|
'(-m --list-monitors)'{-m,--list-monitors}'[Print list of available monitors and exit]' \
|
||||||
'1:bar name:_polybar_list_names'
|
'1:bar name:_polybar_list_names'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,10 +37,10 @@
|
|||||||
#if ENABLE_CURL
|
#if ENABLE_CURL
|
||||||
#include "modules/github.hpp"
|
#include "modules/github.hpp"
|
||||||
#endif
|
#endif
|
||||||
#if WITH_XKB
|
#if ENABLE_XKEYBOARD
|
||||||
#include "modules/xkeyboard.hpp"
|
#include "modules/xkeyboard.hpp"
|
||||||
#endif
|
#endif
|
||||||
#if not(ENABLE_I3 && ENABLE_MPD && ENABLE_NETWORK && ENABLE_ALSA && ENABLE_CURL && WITH_XKB)
|
#if not(ENABLE_I3 && ENABLE_MPD && ENABLE_NETWORK && ENABLE_ALSA && ENABLE_CURL && ENABLE_XKEYBOARD)
|
||||||
#include "modules/unsupported.hpp"
|
#include "modules/unsupported.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#if ENABLE_I3 && ENABLE_MPD && ENABLE_NETWORK && ENABLE_ALSA && ENABLE_CURL && WITH_XKB
|
#if ENABLE_I3 && ENABLE_MPD && ENABLE_NETWORK && ENABLE_ALSA && ENABLE_CURL && ENABLE_XKEYBOARD
|
||||||
#error "Support has been enabled for all optional modules"
|
#error "Support has been enabled for all optional modules"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -46,7 +46,7 @@ namespace modules {
|
|||||||
#if not ENABLE_CURL
|
#if not ENABLE_CURL
|
||||||
DEFINE_UNSUPPORTED_MODULE(github_module, "internal/github");
|
DEFINE_UNSUPPORTED_MODULE(github_module, "internal/github");
|
||||||
#endif
|
#endif
|
||||||
#if not WITH_XKB
|
#if not ENABLE_XKEYBOARD
|
||||||
DEFINE_UNSUPPORTED_MODULE(xkeyboard_module, "internal/xkeyboard");
|
DEFINE_UNSUPPORTED_MODULE(xkeyboard_module, "internal/xkeyboard");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,19 @@
|
|||||||
#cmakedefine01 WITH_XSYNC
|
#cmakedefine01 WITH_XSYNC
|
||||||
#cmakedefine01 WITH_XCOMPOSITE
|
#cmakedefine01 WITH_XCOMPOSITE
|
||||||
#cmakedefine01 WITH_XKB
|
#cmakedefine01 WITH_XKB
|
||||||
|
|
||||||
|
#if WITH_XRANDR
|
||||||
|
#cmakedefine01 ENABLE_XRANDR_MONITORS
|
||||||
|
#else
|
||||||
|
#define ENABLE_XRANDR_MONITORS 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if WITH_XKB
|
||||||
|
#define ENABLE_XKEYBOARD 1
|
||||||
|
#else
|
||||||
|
#define ENABLE_XKEYBOARD 0
|
||||||
|
#endif
|
||||||
|
|
||||||
#cmakedefine XPP_EXTENSION_LIST @XPP_EXTENSION_LIST@
|
#cmakedefine XPP_EXTENSION_LIST @XPP_EXTENSION_LIST@
|
||||||
|
|
||||||
#cmakedefine DEBUG_LOGGER
|
#cmakedefine DEBUG_LOGGER
|
||||||
@ -83,6 +96,15 @@ const auto print_build_info = [](bool extended = false) {
|
|||||||
(ENABLE_NETWORK ? '+' : '-'));
|
(ENABLE_NETWORK ? '+' : '-'));
|
||||||
if (extended) {
|
if (extended) {
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
printf("X extensions: %cxrandr (%cmonitors) %cxrender %cxdamage %cxsync %cxcomposite %cxkb\n",
|
||||||
|
(WITH_XRANDR ? '+' : '-'),
|
||||||
|
(ENABLE_XRANDR_MONITORS ? '+' : '-'),
|
||||||
|
(WITH_XRENDER ? '+' : '-'),
|
||||||
|
(WITH_XDAMAGE ? '+' : '-'),
|
||||||
|
(WITH_XSYNC ? '+' : '-'),
|
||||||
|
(WITH_XCOMPOSITE ? '+' : '-'),
|
||||||
|
(WITH_XKB ? '+' : '-'));
|
||||||
|
printf("\n");
|
||||||
printf("Build type: @CMAKE_BUILD_TYPE@\n");
|
printf("Build type: @CMAKE_BUILD_TYPE@\n");
|
||||||
printf("Compiler: @CMAKE_CXX_COMPILER@\n");
|
printf("Compiler: @CMAKE_CXX_COMPILER@\n");
|
||||||
printf("Compiler flags: @CMAKE_CXX_FLAGS@\n");
|
printf("Compiler flags: @CMAKE_CXX_FLAGS@\n");
|
||||||
|
@ -46,8 +46,10 @@ using monitor_t = shared_ptr<randr_output>;
|
|||||||
namespace randr_util {
|
namespace randr_util {
|
||||||
void query_extension(connection& conn);
|
void query_extension(connection& conn);
|
||||||
|
|
||||||
|
bool check_monitor_support();
|
||||||
|
|
||||||
monitor_t make_monitor(xcb_randr_output_t randr, string name, uint16_t w, uint16_t h, int16_t x, int16_t y);
|
monitor_t make_monitor(xcb_randr_output_t randr, string name, uint16_t w, uint16_t h, int16_t x, int16_t y);
|
||||||
vector<monitor_t> get_monitors(connection& conn, xcb_window_t root, bool connected_only = false);
|
vector<monitor_t> get_monitors(connection& conn, xcb_window_t root, bool connected_only = false, bool realloc = false);
|
||||||
|
|
||||||
void get_backlight_range(connection& conn, const monitor_t& mon, backlight_values& dst);
|
void get_backlight_range(connection& conn, const monitor_t& mon, backlight_values& dst);
|
||||||
void get_backlight_value(connection& conn, const monitor_t& mon, backlight_values& dst);
|
void get_backlight_value(connection& conn, const monitor_t& mon, backlight_values& dst);
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
\fBpolybar\fR \- A fast and easy-to-use tool status bar.
|
\fBpolybar\fR \- A fast and easy-to-use tool status bar.
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.P
|
.P
|
||||||
polybar \fIBAR-NAME\fR [\fB\-c\fR \fICONFIG\fR|\fB\-l\fR \fILOG_LEVEL\fR|\fB\-d\fR \fIPARAM\fR|\fB\f-q\fR|\fB\-r\fR|\fB\f-s\fR|\fB\-w\fR]
|
polybar \fIBAR-NAME\fR [\fB\-c\fR \fICONFIG\fR|\fB\-l\fR \fILOG_LEVEL\fR|\fB\-d\fR \fIPARAM\fR|\fB\f-q\fR|\fB\-r\fR|\fB\-m\fR|\fB\f-s\fR|\fB\-w\fR]
|
||||||
.P
|
.P
|
||||||
polybar [\fB\-h\fR | \fB\-\-help\fR]
|
polybar [\fB\-h\fR | \fB\-\-help\fR]
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
@ -14,10 +14,10 @@ Please report issues by creating a ticket on GitHub (\fIhttps://github.com/jaagr
|
|||||||
Mandatory arguments to long options are mandatory for short options too.
|
Mandatory arguments to long options are mandatory for short options too.
|
||||||
.TP
|
.TP
|
||||||
\fB\-h\fR, \fB\-\-help\fR
|
\fB\-h\fR, \fB\-\-help\fR
|
||||||
Show help and program options.
|
Display help text and exit.
|
||||||
.TP
|
.TP
|
||||||
\fB\-v\fR, \fB\-\-version\fR
|
\fB\-v\fR, \fB\-\-version\fR
|
||||||
Print version information.
|
Display build details and exit.
|
||||||
.TP
|
.TP
|
||||||
\fB\-l\fR, \fB\-\-log\fR=\fILEVEL\fR
|
\fB\-l\fR, \fB\-\-log\fR=\fILEVEL\fR
|
||||||
Set how verbose \fBpolybar\fR's logging is. \fILEVEL\fR must be one of: `error`, `warning` or `info`.
|
Set how verbose \fBpolybar\fR's logging is. \fILEVEL\fR must be one of: `error`, `warning` or `info`.
|
||||||
@ -29,13 +29,16 @@ Be quiet (will override -l).
|
|||||||
Specify the path to the configuration file. By default, configuration files are read from \fI$XDG_CONFIG_HOME/.config/polybar\fR. When the \fI$XDG_CONFIG_HOME\fR variable is absent, then \fI~/.config/polybar\fR directory is used instead.
|
Specify the path to the configuration file. By default, configuration files are read from \fI$XDG_CONFIG_HOME/.config/polybar\fR. When the \fI$XDG_CONFIG_HOME\fR variable is absent, then \fI~/.config/polybar\fR directory is used instead.
|
||||||
.TP
|
.TP
|
||||||
\fB\-r\fR, \fB\-\-reload\fR
|
\fB\-r\fR, \fB\-\-reload\fR
|
||||||
Reload the application when the config file has been modified. (NOTE: Its recommended to only use this when setting up the bar).
|
Reload the application when the config file has been modified.
|
||||||
.TP
|
.TP
|
||||||
\fB\-d\fR, \fB\-\-dump\fR=\fIPARAM\fR
|
\fB\-d\fR, \fB\-\-dump\fR=\fIPARAM\fR
|
||||||
Show the value of the specified parameter \fIPARAM\fR in the section [bar/\fIBAR-NAME\fR] inside the configuration file.
|
Print the value of the specified parameter \fIPARAM\fR in the section [bar/\fIBAR-NAME\fR] inside the configuration file and exit.
|
||||||
|
.TP
|
||||||
|
\fB\-m\fR, \fB\-\-list\-monitors\fR
|
||||||
|
Print list of available monitors and exit.
|
||||||
.TP
|
.TP
|
||||||
\fB\-w\fR, \fB\-\-print\-wmname\fR
|
\fB\-w\fR, \fB\-\-print\-wmname\fR
|
||||||
Print the generated \fIWM_NAME\fR.
|
Print the generated \fIWM_NAME\fR and exit.
|
||||||
.TP
|
.TP
|
||||||
\fB\-s\fR, \fB\-\-stdout\fR
|
\fB\-s\fR, \fB\-\-stdout\fR
|
||||||
Dump content to stdout instead of rendering an X window.
|
Dump content to stdout instead of rendering an X window.
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <iostream>
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
|
@ -240,9 +240,9 @@ bar::bar(connection& conn, signal_emitter& emitter, const config& config, const
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (m_opts.size.w <= 0 || m_opts.size.w > m_opts.monitor->w) {
|
if (m_opts.size.w <= 0 || m_opts.size.w > m_opts.monitor->w) {
|
||||||
throw application_error("Resulting bar width is out of bounds");
|
throw application_error("Resulting bar width is out of bounds (" + to_string(m_opts.size.w) + ")");
|
||||||
} else if (m_opts.size.h <= 0 || m_opts.size.h > m_opts.monitor->h) {
|
} else if (m_opts.size.h <= 0 || m_opts.size.h > m_opts.monitor->h) {
|
||||||
throw application_error("Resulting bar height is out of bounds");
|
throw application_error("Resulting bar height is out of bounds (" + to_string(m_opts.size.h) + ")");
|
||||||
}
|
}
|
||||||
|
|
||||||
m_opts.size.w = math_util::cap<int>(m_opts.size.w, 0, m_opts.monitor->w);
|
m_opts.size.w = math_util::cap<int>(m_opts.size.w, 0, m_opts.monitor->w);
|
||||||
|
@ -102,8 +102,7 @@ void screen::handle(const evt::randr_screen_change_notify& evt) {
|
|||||||
if (screen->width_in_pixels != m_size.w || screen->height_in_pixels != m_size.h) {
|
if (screen->width_in_pixels != m_size.w || screen->height_in_pixels != m_size.h) {
|
||||||
changed = true;
|
changed = true;
|
||||||
} else {
|
} else {
|
||||||
auto monitors = randr_util::get_monitors(m_connection, m_root, true);
|
auto monitors = randr_util::get_monitors(m_connection, m_root, true, true);
|
||||||
|
|
||||||
for (size_t n = 0; n < monitors.size(); n++) {
|
for (size_t n = 0; n < monitors.size(); n++) {
|
||||||
if (n < m_monitors.size() && monitors[n]->output != m_monitors[n]->output) {
|
if (n < m_monitors.size() && monitors[n]->output != m_monitors[n]->output) {
|
||||||
changed = true;
|
changed = true;
|
||||||
|
25
src/main.cpp
25
src/main.cpp
@ -1,5 +1,3 @@
|
|||||||
#include <X11/Xlib-xcb.h>
|
|
||||||
|
|
||||||
#include "common.hpp"
|
#include "common.hpp"
|
||||||
#include "components/bar.hpp"
|
#include "components/bar.hpp"
|
||||||
#include "components/command_line.hpp"
|
#include "components/command_line.hpp"
|
||||||
@ -23,14 +21,15 @@ using namespace polybar;
|
|||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
// clang-format off
|
// clang-format off
|
||||||
const command_line::options opts{
|
const command_line::options opts{
|
||||||
command_line::option{"-h", "--help", "Show help options"},
|
command_line::option{"-h", "--help", "Display this help and exit"},
|
||||||
command_line::option{"-v", "--version", "Print version information"},
|
command_line::option{"-v", "--version", "Display build details and exit"},
|
||||||
command_line::option{"-l", "--log", "Set the logging verbosity (default: WARNING)", "LEVEL", {"error", "warning", "info", "trace"}},
|
command_line::option{"-l", "--log", "Set the logging verbosity (default: WARNING)", "LEVEL", {"error", "warning", "info", "trace"}},
|
||||||
command_line::option{"-q", "--quiet", "Be quiet (will override -l)"},
|
command_line::option{"-q", "--quiet", "Be quiet (will override -l)"},
|
||||||
command_line::option{"-c", "--config", "Path to the configuration file", "FILE"},
|
command_line::option{"-c", "--config", "Path to the configuration file", "FILE"},
|
||||||
command_line::option{"-r", "--reload", "Reload when the configuration has been modified"},
|
command_line::option{"-r", "--reload", "Reload when the configuration has been modified"},
|
||||||
command_line::option{"-d", "--dump", "Show value of PARAM in section [bar_name]", "PARAM"},
|
command_line::option{"-d", "--dump", "Print value of PARAM in section [bar_name] and exit", "PARAM"},
|
||||||
command_line::option{"-w", "--print-wmname", "Print the generated WM_NAME"},
|
command_line::option{"-m", "--list-monitors", "Print list of available monitors and exit"},
|
||||||
|
command_line::option{"-w", "--print-wmname", "Print the generated WM_NAME and exit"},
|
||||||
command_line::option{"-s", "--stdout", "Output data to stdout instead of drawing the X window"},
|
command_line::option{"-s", "--stdout", "Output data to stdout instead of drawing the X window"},
|
||||||
};
|
};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
@ -102,11 +101,21 @@ int main(int argc, char** argv) {
|
|||||||
// Dump requested data
|
// Dump requested data
|
||||||
//==================================================
|
//==================================================
|
||||||
if (cli->has("dump")) {
|
if (cli->has("dump")) {
|
||||||
std::cout << conf.get(conf.section(), cli->get("dump")) << std::endl;
|
printf("%s\n", conf.get(conf.section(), cli->get("dump")).c_str());
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
if (cli->has("print-wmname")) {
|
if (cli->has("print-wmname")) {
|
||||||
std::cout << bar::make(true)->settings().wmname << std::endl;
|
printf("%s\n", bar::make(true)->settings().wmname.c_str());
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
|
if (cli->has("list-monitors")) {
|
||||||
|
for (auto&& mon : randr_util::get_monitors(conn, conn.root(), true)) {
|
||||||
|
if (ENABLE_XRANDR_MONITORS && mon->output == XCB_NONE) {
|
||||||
|
printf("%s: %ix%i+%i+%i\n", mon->name.c_str(), mon->w, mon->h, mon->x, mon->y);
|
||||||
|
} else {
|
||||||
|
printf("%s: %ix%i+%i+%i (XRandR monitor)\n", mon->name.c_str(), mon->w, mon->h, mon->x, mon->y);
|
||||||
|
}
|
||||||
|
}
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,7 +43,8 @@ namespace modules {
|
|||||||
randr_util::get_backlight_range(m_connection, m_output, backlight);
|
randr_util::get_backlight_range(m_connection, m_output, backlight);
|
||||||
randr_util::get_backlight_value(m_connection, m_output, backlight);
|
randr_util::get_backlight_value(m_connection, m_output, backlight);
|
||||||
} catch (const exception& err) {
|
} catch (const exception& err) {
|
||||||
throw module_error("No backlight data found for \"" + output + "\", stopping module...");
|
m_log.err("%s: Could not get data (err: %s)", name(), err.what());
|
||||||
|
throw module_error("Not supported for \"" + output + "\"");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create window that will proxy all RandR notify events
|
// Create window that will proxy all RandR notify events
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include "components/types.hpp"
|
#include "components/types.hpp"
|
||||||
#include "errors.hpp"
|
#include "errors.hpp"
|
||||||
|
#include "settings.hpp"
|
||||||
#include "utils/string.hpp"
|
#include "utils/string.hpp"
|
||||||
#include "x11/atoms.hpp"
|
#include "x11/atoms.hpp"
|
||||||
#include "x11/connection.hpp"
|
#include "x11/connection.hpp"
|
||||||
@ -30,17 +31,33 @@ bool randr_output::match(const position& p) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
namespace randr_util {
|
namespace randr_util {
|
||||||
|
/**
|
||||||
|
* XRandR version
|
||||||
|
*/
|
||||||
|
static uint32_t g_major_version = 0;
|
||||||
|
static uint32_t g_minor_version = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Query for the XRandR extension
|
* Query for the XRandR extension
|
||||||
*/
|
*/
|
||||||
void query_extension(connection& conn) {
|
void query_extension(connection& conn) {
|
||||||
conn.randr().query_version(XCB_RANDR_MAJOR_VERSION, XCB_RANDR_MINOR_VERSION);
|
auto ext = conn.randr().query_version(XCB_RANDR_MAJOR_VERSION, XCB_RANDR_MINOR_VERSION);
|
||||||
|
|
||||||
|
g_major_version = ext->major_version;
|
||||||
|
g_minor_version = ext->minor_version;
|
||||||
|
|
||||||
if (!conn.extension<xpp::randr::extension>()->present) {
|
if (!conn.extension<xpp::randr::extension>()->present) {
|
||||||
throw application_error("Missing X extension: Randr");
|
throw application_error("Missing X extension: Randr");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check for XRandR monitor support
|
||||||
|
*/
|
||||||
|
bool check_monitor_support() {
|
||||||
|
return ENABLE_XRANDR_MONITORS && g_major_version >= 1 && g_minor_version >= 5;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Define monitor
|
* Define monitor
|
||||||
*/
|
*/
|
||||||
@ -58,24 +75,40 @@ namespace randr_util {
|
|||||||
/**
|
/**
|
||||||
* Create a list of all available randr outputs
|
* Create a list of all available randr outputs
|
||||||
*/
|
*/
|
||||||
vector<monitor_t> get_monitors(connection& conn, xcb_window_t root, bool connected_only) {
|
vector<monitor_t> get_monitors(connection& conn, xcb_window_t root, bool connected_only, bool realloc) {
|
||||||
vector<monitor_t> monitors;
|
static vector<monitor_t> monitors;
|
||||||
auto outputs = conn.get_screen_resources(root).outputs();
|
|
||||||
|
|
||||||
for (auto it = outputs.begin(); it != outputs.end(); it++) {
|
if (realloc) {
|
||||||
|
monitors.clear();
|
||||||
|
} else if (!monitors.empty()) {
|
||||||
|
return monitors;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (check_monitor_support()) {
|
||||||
|
for (auto&& mon : conn.get_monitors(root, true).monitors()) {
|
||||||
try {
|
try {
|
||||||
auto info = conn.get_output_info(*it);
|
auto name = conn.get_atom_name(mon.name).name();
|
||||||
|
monitors.emplace_back(make_monitor(XCB_NONE, move(name), mon.width, mon.height, mon.x, mon.y));
|
||||||
|
} catch (const exception&) {
|
||||||
|
// silently ignore output
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto&& output : conn.get_screen_resources(root).outputs()) {
|
||||||
|
try {
|
||||||
|
auto info = conn.get_output_info(output);
|
||||||
if (info->crtc == XCB_NONE) {
|
if (info->crtc == XCB_NONE) {
|
||||||
continue;
|
continue;
|
||||||
}
|
} else if (connected_only && info->connection != XCB_RANDR_CONNECTION_CONNECTED) {
|
||||||
if (connected_only && info->connection != XCB_RANDR_CONNECTION_CONNECTED) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
auto crtc = conn.get_crtc_info(info->crtc);
|
auto crtc = conn.get_crtc_info(info->crtc);
|
||||||
string name{info.name().begin(), info.name().end()};
|
auto name_iter = info.name();
|
||||||
monitors.emplace_back(make_monitor(*it, move(name), crtc->width, crtc->height, crtc->x, crtc->y));
|
string name{name_iter.begin(), name_iter.end()};
|
||||||
} catch (const xpp::randr::error::bad_crtc&) {
|
monitors.emplace_back(make_monitor(output, move(name), crtc->width, crtc->height, crtc->x, crtc->y));
|
||||||
} catch (const xpp::randr::error::bad_output&) {
|
} catch (const exception&) {
|
||||||
|
// silently ignore output
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,6 +128,8 @@ namespace randr_util {
|
|||||||
for (auto& monitor : monitors) {
|
for (auto& monitor : monitors) {
|
||||||
if ((*m) == monitor || monitor->w == 0) {
|
if ((*m) == monitor || monitor->w == 0) {
|
||||||
continue;
|
continue;
|
||||||
|
} else if (check_monitor_support() && (monitor->output == XCB_NONE || (*m)->output == XCB_NONE)) {
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
|
Loading…
Reference in New Issue
Block a user