mirror of
https://codeberg.org/dwl/dwl.git
synced 2025-12-17 02:13:18 +00:00
Setting monitor modes in config
This commit is contained in:
parent
4bf2923f4e
commit
4f8c148977
@ -28,9 +28,9 @@ static const Layout layouts[] = {
|
|||||||
* The order in which monitors are defined determines their position.
|
* The order in which monitors are defined determines their position.
|
||||||
* Non-configured monitors are always added to the left. */
|
* Non-configured monitors are always added to the left. */
|
||||||
static const MonitorRule monrules[] = {
|
static const MonitorRule monrules[] = {
|
||||||
/* name mfact nmaster scale layout rotate/reflect x y */
|
/* name mfact nmaster scale layout rotate/reflect x y w h rate */
|
||||||
/* example of a HiDPI laptop monitor:
|
/* example of a HiDPI laptop monitor:
|
||||||
{ "eDP-1", 0.5, 1, 2, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, 0, 0 },
|
{ "eDP-1", 0.5, 1, 2, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, 0, 0, 1920, 1080, 60000 },
|
||||||
*/
|
*/
|
||||||
/* the order in which monitors are defined here affects the order in which
|
/* the order in which monitors are defined here affects the order in which
|
||||||
* focusmon and tagmon cycle trough the monitors */
|
* focusmon and tagmon cycle trough the monitors */
|
||||||
|
|||||||
48
dwl.c
48
dwl.c
@ -188,6 +188,9 @@ typedef struct {
|
|||||||
enum wl_output_transform rr;
|
enum wl_output_transform rr;
|
||||||
int x;
|
int x;
|
||||||
int y;
|
int y;
|
||||||
|
int w;
|
||||||
|
int h;
|
||||||
|
int refresh;
|
||||||
} MonitorRule;
|
} MonitorRule;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -277,6 +280,7 @@ static void setfloating(Client *c, int floating);
|
|||||||
static void setfullscreen(Client *c, int fullscreen);
|
static void setfullscreen(Client *c, int fullscreen);
|
||||||
static void setlayout(const Arg *arg);
|
static void setlayout(const Arg *arg);
|
||||||
static void setmfact(const Arg *arg);
|
static void setmfact(const Arg *arg);
|
||||||
|
static void setmode(struct wlr_output *output, int width, int height, int refresh);
|
||||||
static void setmon(Client *c, Monitor *m, unsigned int newtags);
|
static void setmon(Client *c, Monitor *m, unsigned int newtags);
|
||||||
static void setup(void);
|
static void setup(void);
|
||||||
static void sigchld(int unused);
|
static void sigchld(int unused);
|
||||||
@ -820,12 +824,6 @@ createmon(struct wl_listener *listener, void *data)
|
|||||||
size_t nlayers;
|
size_t nlayers;
|
||||||
Monitor *m, *moni, *insertmon = NULL;
|
Monitor *m, *moni, *insertmon = NULL;
|
||||||
|
|
||||||
/* The mode is a tuple of (width, height, refresh rate), and each
|
|
||||||
* monitor supports only a specific set of modes. We just pick the
|
|
||||||
* monitor's preferred mode; a more sophisticated compositor would let
|
|
||||||
* the user configure it. */
|
|
||||||
wlr_output_set_mode(wlr_output, wlr_output_preferred_mode(wlr_output));
|
|
||||||
|
|
||||||
/* Allocates and configures monitor state using configured rules */
|
/* Allocates and configures monitor state using configured rules */
|
||||||
m = wlr_output->data = calloc(1, sizeof(*m));
|
m = wlr_output->data = calloc(1, sizeof(*m));
|
||||||
m->wlr_output = wlr_output;
|
m->wlr_output = wlr_output;
|
||||||
@ -833,6 +831,7 @@ createmon(struct wl_listener *listener, void *data)
|
|||||||
m->position = -1;
|
m->position = -1;
|
||||||
for (r = monrules; r < END(monrules); r++) {
|
for (r = monrules; r < END(monrules); r++) {
|
||||||
if (!r->name || strstr(wlr_output->name, r->name)) {
|
if (!r->name || strstr(wlr_output->name, r->name)) {
|
||||||
|
setmode(wlr_output, r->w, r->h, r->refresh);
|
||||||
m->mfact = r->mfact;
|
m->mfact = r->mfact;
|
||||||
m->nmaster = r->nmaster;
|
m->nmaster = r->nmaster;
|
||||||
wlr_output_set_scale(wlr_output, r->scale);
|
wlr_output_set_scale(wlr_output, r->scale);
|
||||||
@ -1951,6 +1950,43 @@ setmfact(const Arg *arg)
|
|||||||
arrange(selmon);
|
arrange(selmon);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
setmode(struct wlr_output *output, int w, int h, int refresh) {
|
||||||
|
struct wlr_output_mode *mode, *best = NULL;
|
||||||
|
|
||||||
|
/* If the monitor has no custom configuration, use preferred mode */
|
||||||
|
if (!w || !h || !refresh) {
|
||||||
|
wlr_output_set_mode(output, wlr_output_preferred_mode(output));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the monitor lists no modes, attempt a custom mode */
|
||||||
|
if (wl_list_empty(&output->modes)) {
|
||||||
|
wlr_output_set_custom_mode(output, w, h, refresh);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Loop through the monitor's modes use if exact match */
|
||||||
|
wl_list_for_each(mode, &output->modes, link) {
|
||||||
|
if (mode->width == w && mode->height == h) {
|
||||||
|
if(mode->refresh == refresh) {
|
||||||
|
wlr_output_set_mode(output, mode);
|
||||||
|
best = mode;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
best = mode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fallback to trying a custom mode if resolution has no matches */
|
||||||
|
if (NULL == best) {
|
||||||
|
wlr_output_set_custom_mode(output, w, h, refresh);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
wlr_output_set_mode(output, best);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
setmon(Client *c, Monitor *m, unsigned int newtags)
|
setmon(Client *c, Monitor *m, unsigned int newtags)
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user