Add a command line option for choosing a monitor for osd display
This commit is contained in:
parent
5c08e40e12
commit
3934bbe02f
|
@ -25,6 +25,7 @@
|
|||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <getopt.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include <sys/soundcard.h>
|
||||
|
||||
|
@ -45,6 +46,8 @@
|
|||
" -k disable grabing volume control keys\n" \
|
||||
" -m <dev> oss mixer device [/dev/mixer]\n" \
|
||||
" or alsa card name [default]\n" \
|
||||
" -o <num> display osd on this monitor number or name [0]\n" \
|
||||
" use -1 to disable osd\n" \
|
||||
" -v verbose -> id, long name, name\n" \
|
||||
|
||||
/* The global configuration */
|
||||
|
@ -73,6 +76,8 @@ void config_init(void)
|
|||
config.scrollstep = 0.03;
|
||||
config.osd = 1;
|
||||
config.osd_color = (char *) default_osd_color;
|
||||
config.osd_monitor_number = 0;
|
||||
config.osd_monitor_name = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -122,7 +127,7 @@ void parse_cli_options(int argc, char **argv)
|
|||
config.verbose = false;
|
||||
error_found = false;
|
||||
for (;;) {
|
||||
opt = getopt(argc, argv, ":a:d:e:f:hkm:v");
|
||||
opt = getopt(argc, argv, ":a:d:e:f:hkm:o:v");
|
||||
if (opt == -1)
|
||||
break;
|
||||
|
||||
|
@ -178,6 +183,24 @@ void parse_cli_options(int argc, char **argv)
|
|||
config.mixer_device = strdup(optarg);
|
||||
break;
|
||||
|
||||
case 'o': ;
|
||||
char *end;
|
||||
long mon = strtol(optarg, &end, 10);
|
||||
if (end == optarg + strlen(optarg)) {
|
||||
if ((mon > INT_MAX) || (mon < -1)) {
|
||||
fprintf(stderr, "wmix:error: unreasonable monitor number provided\n");
|
||||
error_found = true;
|
||||
} else {
|
||||
if (mon == -1)
|
||||
config.osd = 0;
|
||||
else
|
||||
config.osd_monitor_number = (int)mon;
|
||||
}
|
||||
} else {
|
||||
config.osd_monitor_name = strdup(optarg);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'v':
|
||||
config.verbose = true;
|
||||
break;
|
||||
|
|
|
@ -40,6 +40,8 @@ extern struct _Config {
|
|||
|
||||
float scrollstep; /* scroll mouse step adjustment */
|
||||
char *osd_color; /* osd color */
|
||||
char *osd_monitor_name; /* monitor name to display osd on */
|
||||
int osd_monitor_number; /* monitor number to display osd on */
|
||||
|
||||
char *exclude_channel[EXCLUDE_MAX_COUNT + 1]; /* Devices to exclude from GUI's list */
|
||||
} config;
|
||||
|
|
44
wmix/ui_x.c
44
wmix/ui_x.c
|
@ -335,6 +335,35 @@ void new_window(char *name, int width, int height)
|
|||
XMapWindow(display, win);
|
||||
}
|
||||
|
||||
XRRCrtcInfo *crtc_info_by_output_name(char *monitor)
|
||||
{
|
||||
XRRScreenResources *screen = XRRGetScreenResources(display, DefaultRootWindow(display));
|
||||
for (int i = 0; i < screen->noutput; i++) {
|
||||
XRROutputInfo *output_info = XRRGetOutputInfo(display, screen, screen->outputs[i]);
|
||||
if (!strcmp(monitor, output_info->name)) {
|
||||
XRRCrtcInfo *crtc_info = XRRGetCrtcInfo(display, screen, output_info->crtc);
|
||||
XRRFreeOutputInfo(output_info);
|
||||
XRRFreeScreenResources(screen);
|
||||
return crtc_info;
|
||||
}
|
||||
XRRFreeOutputInfo(output_info);
|
||||
}
|
||||
XRRFreeScreenResources(screen);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
XRRCrtcInfo *crtc_info_by_output_number(int monitor)
|
||||
{
|
||||
XRRScreenResources *screen = XRRGetScreenResources(display, DefaultRootWindow(display));
|
||||
if (monitor >= screen->ncrtc) {
|
||||
fprintf(stderr, "wmix:warning: Requested osd monitor number is out of range, clamping\n");
|
||||
monitor = screen->ncrtc - 1;
|
||||
}
|
||||
XRRCrtcInfo *crtc_info = XRRGetCrtcInfo(display, screen, screen->crtcs[monitor]);
|
||||
XRRFreeScreenResources(screen);
|
||||
return crtc_info;
|
||||
}
|
||||
|
||||
void new_osd(int height)
|
||||
{
|
||||
Window osd;
|
||||
|
@ -345,18 +374,27 @@ void new_osd(int height)
|
|||
XSetWindowAttributes xattributes;
|
||||
int win_layer = 6;
|
||||
XFontStruct *fs = NULL;
|
||||
XRRScreenResources *screen;
|
||||
XRRCrtcInfo *crtc_info;
|
||||
int width;
|
||||
int x;
|
||||
int y;
|
||||
|
||||
if (have_randr) {
|
||||
screen = XRRGetScreenResources(display, DefaultRootWindow(display));
|
||||
crtc_info = XRRGetCrtcInfo(display, screen, screen->crtcs[0]);
|
||||
if (config.osd_monitor_name) {
|
||||
crtc_info = crtc_info_by_output_name(config.osd_monitor_name);
|
||||
if (crtc_info == NULL) {
|
||||
fprintf(stderr, "wmix:warning: Requested osd monitor not found, falling back to default\n");
|
||||
crtc_info = crtc_info_by_output_number(0);
|
||||
}
|
||||
}
|
||||
else {
|
||||
crtc_info = crtc_info_by_output_number(config.osd_monitor_number);
|
||||
}
|
||||
|
||||
width = crtc_info->width - 200;
|
||||
x = crtc_info->x + 100;
|
||||
y = crtc_info->y + crtc_info->height - 120;
|
||||
XRRFreeCrtcInfo(crtc_info);
|
||||
if (dockapp.osd &&
|
||||
width == dockapp.osd_width &&
|
||||
x == dockapp.osd_x &&
|
||||
|
|
Loading…
Reference in a new issue