[Pkg-wmaker-commits] [wmix] 36/44: Draw osd only on the primary monitor if randr extensions are available
Doug Torrance
dtorrance-guest at moszumanska.debian.org
Fri Sep 29 10:40:14 UTC 2017
This is an automated email from the git hooks/post-receive script.
dtorrance-guest pushed a commit to branch upstream
in repository wmix.
commit fa2e41056dc6b0b89203972d7d42f4c9a3e5eeba
Author: Johannes Holmberg <johannes at update.uu.se>
Date: Wed Sep 16 21:19:43 2015 -0400
Draw osd only on the primary monitor if randr extensions are available
---
Makefile | 4 ++--
include/ui_x.h | 6 ++++--
ui_x.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++-----
wmix.c | 22 ++++++++++++++++++++--
4 files changed, 72 insertions(+), 11 deletions(-)
diff --git a/Makefile b/Makefile
index 6e94a34..d62273c 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
CC = gcc
-CFLAGS = -std=gnu99 -O3 -W -Wall `pkg-config --cflags alsa`
+CFLAGS = -std=gnu99 -O3 -W -Wall `pkg-config --cflags alsa xrandr`
LDFLAGS = -L/usr/X11R6/lib
-LIBS = -lXpm -lXext -lX11 -lm `pkg-config --libs alsa`
+LIBS = -lXpm -lXext -lX11 -lm `pkg-config --libs alsa xrandr`
OBJECTS = misc.o config.o mixer-alsa.o mixer-oss.o ui_x.o mmkeys.o wmix.o
# where to install this program (also for packaging stuff)
diff --git a/include/ui_x.h b/include/ui_x.h
index 087d473..22f1f9b 100644
--- a/include/ui_x.h
+++ b/include/ui_x.h
@@ -18,11 +18,11 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-void dockapp_init (Display *x_display);
+void dockapp_init (Display *x_display, Bool randr);
void new_window (char *name, int width, int height);
-void new_osd (int width, int height);
+void new_osd (int height);
void update_osd (float volume, bool up);
void map_osd (void);
void unmap_osd (void);
@@ -38,3 +38,5 @@ void knob_turn (float delta);
void slider_move (float delta);
unsigned long get_color (Display *display, char *color_name);
+
+void ui_rrnotify (void);
diff --git a/ui_x.c b/ui_x.c
index ef034c5..eb1123a 100644
--- a/ui_x.c
+++ b/ui_x.c
@@ -35,6 +35,7 @@
#include <X11/extensions/shape.h>
#include <X11/xpm.h>
#include <X11/cursorfont.h>
+#include <X11/extensions/Xrandr.h>
#include "include/master.xpm"
#include "include/led-on.xpm"
@@ -70,6 +71,8 @@ struct _Dockapp {
Window osd;
GC osd_gc;
int osd_width;
+ int osd_x;
+ int osd_y;
bool osd_mapped;
};
@@ -103,11 +106,15 @@ static Cursor hand_cursor;
static Cursor null_cursor;
static Cursor norm_cursor;
static Cursor bar_cursor;
+static Bool have_randr;
/* public methods */
-void dockapp_init(Display *x_display)
+void dockapp_init(Display *x_display, Bool randr)
{
display = x_display;
+ have_randr = randr;
+ dockapp.osd = 0;
+ dockapp.gc = 0;
}
void redraw_window(void)
@@ -328,7 +335,7 @@ void new_window(char *name, int width, int height)
XMapWindow(display, win);
}
-void new_osd(int width, int height)
+void new_osd(int height)
{
Window osd;
Pixel fg, bg;
@@ -338,20 +345,45 @@ void new_osd(int width, 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]);
+ width = crtc_info->width - 200;
+ x = crtc_info->x + 100;
+ y = crtc_info->y + crtc_info->height - 120;
+ if (dockapp.osd &&
+ width == dockapp.osd_width &&
+ x == dockapp.osd_x &&
+ y == dockapp.osd_y) {
+ // Nothing important has changed.
+ return;
+ }
+ } else {
+ width = DisplayWidth(display, DefaultScreen(display)) - 200;
+ x = 100;
+ y = DisplayHeight(display, 0) - 120;
+ }
sizehints.flags = USSize | USPosition;
- sizehints.x = (DisplayWidth(display, 0) - width) / 2;
- sizehints.y = (DisplayHeight(display, 0) - 120);
+ sizehints.x = x;
+ sizehints.y = y;
sizehints.width = width;
sizehints.height = height;
xattributes.save_under = True;
xattributes.override_redirect = True;
xattributes.cursor = None;
-
fg = WhitePixel(display, DefaultScreen(display));
bg = BlackPixel(display, DefaultScreen(display));
+ if (dockapp.osd)
+ XDestroyWindow(display, dockapp.osd);
osd = XCreateSimpleWindow(display, DefaultRootWindow(display),
sizehints.x, sizehints.y, width, height,
0, fg, bg);
@@ -398,6 +430,8 @@ void new_osd(int width, int height)
}
}
+ if (dockapp.osd_gc)
+ XFreeGC(display, dockapp.osd_gc);
gc =
XCreateGC(display, osd,
GCForeground | GCBackground | GCGraphicsExposures,
@@ -407,6 +441,8 @@ void new_osd(int width, int height)
dockapp.osd = osd;
dockapp.osd_gc = gc;
dockapp.osd_width = width;
+ dockapp.osd_x = x;
+ dockapp.osd_y = y;
dockapp.osd_mapped = false;
}
@@ -613,3 +649,8 @@ unsigned long get_color(Display *display, char *color_name)
return color.pixel;
}
+
+void ui_rrnotify()
+{
+ new_osd(60);
+}
diff --git a/wmix.c b/wmix.c
index 13d1593..c0ef6ba 100644
--- a/wmix.c
+++ b/wmix.c
@@ -30,6 +30,7 @@
#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
+#include <X11/extensions/Xrandr.h>
#include "include/common.h"
#include "include/mixer.h"
@@ -64,6 +65,8 @@ static void choose_api(int api);
int main(int argc, char **argv)
{
XEvent event;
+ int rr_event_base, rr_error_base;
+ Bool have_randr;
config_init();
parse_cli_options(argc, argv);
@@ -89,12 +92,21 @@ int main(int argc, char **argv)
fprintf(stderr, "wmix:error: Unable to open display \"%s\"\n", name);
return EXIT_FAILURE;
}
+
+ have_randr = XRRQueryExtension(display, &rr_event_base, &rr_error_base);
+ if (have_randr) {
+ int rr_mask = RRScreenChangeNotifyMask;
+ XRRSelectInput(display,
+ RootWindow(display, DefaultScreen(display)),
+ rr_mask);
+ }
+
display_width = (float)DisplayWidth(display, DefaultScreen(display)) / 4.0;
display_height = (float)DisplayHeight(display, DefaultScreen(display)) / 2.0;
- dockapp_init(display);
+ dockapp_init(display, have_randr);
new_window("wmix", 64, 64);
- new_osd(DisplayWidth(display, DefaultScreen(display)) - 200, 60);
+ new_osd(60);
if (config.mmkeys)
mmkey_install(display);
@@ -152,6 +164,12 @@ int main(int argc, char **argv)
XCloseDisplay(display);
return EXIT_SUCCESS;
default:
+ if (have_randr) {
+ if (event.type == rr_event_base + RRScreenChangeNotify) {
+ XRRUpdateConfiguration(&event);
+ ui_rrnotify();
+ }
+ }
break;
}
} else {
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-wmaker/wmix.git
More information about the Pkg-wmaker-commits
mailing list