[PATCH 16/18] Add synxrrd daemon
Peter Hutterer
peter.hutterer at who-t.net
Wed Oct 13 21:06:01 PDT 2010
On Wed, Oct 13, 2010 at 08:18:56AM +0200, Takashi Iwai wrote:
> At Wed, 13 Oct 2010 14:19:49 +1000,
> Peter Hutterer wrote:
> >
> > On Fri, Oct 08, 2010 at 07:22:40PM +0200, Takashi Iwai wrote:
> > > This is a daemon program to sync Xrandr rotation with the synaptics device.
> >
> > can we please integrate this with the respective DEs instead?
>
> Sorry, I don't understand well. What is DE meant here?
whoop, sorry. Desktop environment.
The point here is that instead of having yet another daemon, the same
feature could be integrated into the respective gnome/kde/etc. tools that
let you rotate the monitor. This also allows for more flexible and
user-specific configuration.
Cheers,
Peter
>
> > Cheers,
> > Peter
> >
> > > Signed-off-by: Takashi Iwai <tiwai at suse.de>
> > > ---
> > > tools/Makefile.am | 5 +-
> > > tools/synxrrd.c | 186 +++++++++++++++++++++++++++++++++++++++++++++++++++++
> > > 2 files changed, 190 insertions(+), 1 deletions(-)
> > > create mode 100644 tools/synxrrd.c
> > >
> > > diff --git a/tools/Makefile.am b/tools/Makefile.am
> > > index 2ad48f6..1111576 100644
> > > --- a/tools/Makefile.am
> > > +++ b/tools/Makefile.am
> > > @@ -18,7 +18,7 @@
> > > # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
> > > # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> > >
> > > -bin_PROGRAMS = synclient syndaemon
> > > +bin_PROGRAMS = synclient syndaemon synxrrd
> > >
> > > AM_CPPFLAGS = -I$(top_srcdir)/include -I$(sdkdir)
> > > AM_CFLAGS = $(XI_CFLAGS)
> > > @@ -30,3 +30,6 @@ syndaemon_SOURCES = syndaemon.c
> > > syndaemon_CFLAGS = $(AM_CFLAGS) $(XTST_CFLAGS)
> > > syndaemon_LDFLAGS = $(AM_LDFLAGS) $(XTST_LIBS)
> > >
> > > +synxrrd_SOURCES = synxrrd.c
> > > +synxrrd_LDFLAGS = -lXrandr $(XLIB_LIBS) $(XI_LIBS)
> > > +
> > > diff --git a/tools/synxrrd.c b/tools/synxrrd.c
> > > new file mode 100644
> > > index 0000000..9f00e5b
> > > --- /dev/null
> > > +++ b/tools/synxrrd.c
> > > @@ -0,0 +1,186 @@
> > > +/*
> > > + * synxrrd.c
> > > + * Copyright (C) 2010 Takashi Iwai <tiwai at suse.de>
> > > + */
> > > +
> > > +#include <stdio.h>
> > > +#include <stdarg.h>
> > > +#include <stdlib.h>
> > > +#include <string.h>
> > > +#include <unistd.h>
> > > +#include <X11/Xlib.h>
> > > +#include <X11/extensions/Xrandr.h>
> > > +
> > > +#define progname "synxrrd"
> > > +
> > > +static int verbose;
> > > +static const char *laptop_name;
> > > +
> > > +static int is_laptop(const char *name)
> > > +{
> > > + if (laptop_name) {
> > > + if (!strcmp(name, laptop_name))
> > > + return 1;
> > > + } else {
> > > + if (strstr(name, "LVDS") ||
> > > + strstr(name, "Lvds") ||
> > > + strstr(name, "LVDs"))
> > > + return 1;
> > > + if (strstr(name, "LCD"))
> > > + return 1;
> > > + }
> > > + return 0;
> > > +}
> > > +
> > > +static int current_rotation = -1; /* unknown */
> > > +
> > > +static int (*xerror_saved)(Display *, XErrorEvent *);
> > > +static int xerror_code;
> > > +
> > > +static int xerror_ignore(Display *dpy, XErrorEvent *err)
> > > +{
> > > + xerror_code = err->error_code;
> > > + return 0;
> > > +}
> > > +
> > > +extern int (*_XErrorFunction)(Display *, XErrorEvent *);
> > > +extern int _XDefaultError(Display *dpy, XErrorEvent *event);
> > > +
> > > +static void xerror_save(void)
> > > +{
> > > + xerror_code = 0;
> > > + xerror_saved = _XErrorFunction;
> > > + _XErrorFunction = xerror_ignore;
> > > +}
> > > +
> > > +static int xerror_restore(void)
> > > +{
> > > + _XErrorFunction = xerror_saved;
> > > + return xerror_code;
> > > +}
> > > +
> > > +static void notify_synaptics(XRRCrtcInfo *cres)
> > > +{
> > > + int rotation;
> > > + char buf[256];
> > > +
> > > + if (cres->rotation & 8)
> > > + rotation = 3;
> > > + else if (cres->rotation & 4)
> > > + rotation = 2;
> > > + else if (cres->rotation & 2)
> > > + rotation = 1;
> > > + else
> > > + rotation = 0;
> > > + if (current_rotation == rotation)
> > > + return;
> > > + current_rotation = rotation;
> > > + if (verbose)
> > > + fprintf(stderr, "%s: notified rotation %d\n",
> > > + progname, current_rotation);
> > > + sprintf(buf, "synclient Orientation=%d", current_rotation);
> > > + system(buf);
> > > +}
> > > +
> > > +static void update_screen(Display *dpy, Window root)
> > > +{
> > > + XRRScreenResources *res;
> > > + int i;
> > > +
> > > + res = XRRGetScreenResources(dpy, root);
> > > + if (!res)
> > > + return;
> > > + for (i = 0; i < res->noutput; i++) {
> > > + XRROutputInfo *info;
> > > +
> > > + info = XRRGetOutputInfo(dpy, res, res->outputs[i]);
> > > + if (!info)
> > > + continue;
> > > + if (is_laptop(info->name)) {
> > > + RRCrtc crtc = info->crtc;
> > > + XRRCrtcInfo *cres;
> > > +
> > > + XRRFreeOutputInfo(info);
> > > + cres = XRRGetCrtcInfo(dpy, res, crtc);
> > > + if (!cres)
> > > + continue;
> > > + notify_synaptics(cres);
> > > + XRRFreeCrtcInfo(cres);
> > > + break;
> > > + }
> > > + XRRFreeOutputInfo(info);
> > > + }
> > > + XRRFreeScreenResources(res);
> > > +}
> > > +
> > > +static void synxrr_daemon(Display *dpy, Window root)
> > > +{
> > > + int event_base, error_base;
> > > +
> > > + XRRQueryExtension(dpy, &event_base, &error_base);
> > > +
> > > + XRRSelectInput(dpy, root, RRScreenChangeNotifyMask);
> > > +
> > > + for (;;) {
> > > + XEvent event;
> > > +
> > > + XNextEvent(dpy, &event);
> > > + xerror_save();
> > > + XRRUpdateConfiguration(&event);
> > > + switch (event.type - event_base) {
> > > + case RRScreenChangeNotify:
> > > + update_screen(dpy, root);
> > > + break;
> > > + }
> > > + xerror_restore();
> > > + }
> > > +}
> > > +
> > > +static void usage(void)
> > > +{
> > > + fprintf(stderr, "usage: %s [options]\n", progname);
> > > + fprintf(stderr, " options\n");
> > > + fprintf(stderr, " -d display set X display name\n");
> > > + fprintf(stderr, " -l name xrandr output name for laptop display\n");
> > > + fprintf(stderr, " -v verbose mode\n");
> > > +}
> > > +
> > > +int main(int argc, char **argv)
> > > +{
> > > + Display *dpy;
> > > + Window root;
> > > + const char *display_name = NULL;
> > > + const char *device_name;
> > > + int c;
> > > +
> > > + while ((c = getopt(argc, argv, "d:l:v")) != -1) {
> > > + switch (c) {
> > > + case 'd':
> > > + display_name = optarg;
> > > + break;
> > > + case 'l':
> > > + laptop_name = optarg;
> > > + break;
> > > + case 'v':
> > > + verbose++;
> > > + break;
> > > + default:
> > > + usage();
> > > + return 1;
> > > + }
> > > + }
> > > +
> > > + device_name = argv[optind];
> > > +
> > > + dpy = XOpenDisplay(display_name);
> > > + if (!dpy) {
> > > + perror("open display");
> > > + return 1;
> > > + }
> > > +
> > > + root = DefaultRootWindow(dpy);
> > > + update_screen(dpy, root);
> > > + synxrr_daemon(dpy, root);
> > > +
> > > + return 0;
> > > +}
> > > --
> > > 1.7.3.1
> > >
> >
Cheers,
Peter
More information about the xorg-devel
mailing list