summaryrefslogtreecommitdiffstats
path: root/kgamma/kcmkgamma/xvidextwrap.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kgamma/kcmkgamma/xvidextwrap.cpp')
-rw-r--r--kgamma/kcmkgamma/xvidextwrap.cpp170
1 files changed, 170 insertions, 0 deletions
diff --git a/kgamma/kcmkgamma/xvidextwrap.cpp b/kgamma/kcmkgamma/xvidextwrap.cpp
new file mode 100644
index 00000000..9d8136d9
--- /dev/null
+++ b/kgamma/kcmkgamma/xvidextwrap.cpp
@@ -0,0 +1,170 @@
+/***************************************************************************
+ xvidextwrap.cpp - description
+ -------------------
+ begin : Sat Jan 5 2002
+ copyright : (C) 2002 by Michael v.Ostheim
+ email : MvOstheim@web.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+#include <X11/Xos.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/extensions/xf86vmode.h>
+
+#include <stdlib.h>
+#include <iostream>
+#include <fstream>
+
+#include <vector>
+#include <string>
+
+#include <config.h>
+
+#ifdef HAVE_SSTREAM
+#include <sstream>
+#else
+#include <strstream.h>
+#define istringstream istrstream
+#endif
+
+#include <kdebug.h>
+
+#include "xf86configpath.h"
+#include "xvidextwrap.h"
+
+using namespace std;
+
+
+XVidExtWrap::XVidExtWrap(bool* OK, const char* displayname) {
+ if ((dpy = XOpenDisplay(displayname))) {
+ screen = DefaultScreen(dpy);
+ setGammaLimits(0.1, 10.0);
+ *OK = true;
+ }
+ else {
+ kdDebug() << "KGamma: unable to open display " << displayname << endl;
+ *OK = false;
+ }
+}
+
+XVidExtWrap::~XVidExtWrap() {
+ if (dpy) XCloseDisplay(dpy);
+}
+
+int XVidExtWrap::_DefaultScreen() {
+ return DefaultScreen(dpy);
+}
+
+/** We have to parse XF86Config to get the number of screens, because */
+/** ScreenCount() from X11/Xlib.h does not count correctly with xinerama */
+int XVidExtWrap::_ScreenCount() {
+ int count = 0;
+ bool section = false;
+ XF86ConfigPath Path;
+
+ std::ifstream in( Path.get() );
+
+ if ( in.is_open() ) {
+ std::string s, buf;
+ std::vector<string> words;
+
+ while (getline(in, s,'\n')) {
+ words.clear();
+ istringstream ss(s.c_str());
+ while (ss >> buf) words.push_back(buf); // Split "s" into words
+
+ if ( !words.empty() ) {
+ if ( words[0] == "Section" && words.size() > 1 ) {
+ if ( words[1] == "\"ServerLayout\"" ) section = true;
+ }
+ else if ( words[0] == "EndSection" )
+ section = false;
+ if ( section && words[0] == "Screen" ) ++count;
+ }
+ } //end while
+ in.close();
+
+ }
+
+ if ( !count ) count = 1; //If failed,fill count with a valid value;
+
+ return( count );
+}
+
+const char* XVidExtWrap::DisplayName() {
+ return DisplayString(dpy);
+}
+
+void XVidExtWrap::setGamma(int channel, float gam, bool* OK) {
+ XF86VidModeGamma gamma;
+
+ if ( gam >= mingamma && gam <= maxgamma ) {
+ if (!XF86VidModeGetGamma(dpy, screen, &gamma)) {
+ kdDebug() << "KGamma: Unable to query gamma correction" << endl;
+ if ( OK ) *OK = false;
+ }
+ else {
+ switch (channel) {
+ case Value:
+ gamma.red = gam;
+ gamma.green = gam;
+ gamma.blue = gam; break;
+ case Red:
+ gamma.red = gam; break;
+ case Green:
+ gamma.green = gam; break;
+ case Blue:
+ gamma.blue = gam;
+ };
+ if (!XF86VidModeSetGamma(dpy, screen, &gamma)) {
+ kdDebug() << "KGamma: Unable to set gamma correction" << endl;
+ if ( OK ) *OK = false;
+ }
+ else {
+ XFlush(dpy);
+ if ( OK ) *OK = true;
+ }
+ }
+ }
+}
+
+float XVidExtWrap::getGamma(int channel, bool* OK) {
+ XF86VidModeGamma gamma;
+ float gam = 0;
+
+ if (!XF86VidModeGetGamma(dpy, screen, &gamma)) {
+ kdDebug() << "KGamma: Unable to query gamma correction" << endl;
+ if ( OK ) *OK = false;
+ }
+ else {
+ switch (channel) {
+ case Value:
+ gam = gamma.red; break;
+ case Red:
+ gam = gamma.red; break;
+ case Green:
+ gam = gamma.green; break;
+ case Blue:
+ gam = gamma.blue;
+ };
+ if ( OK ) *OK = true;
+ }
+ return(gam);
+}
+
+void XVidExtWrap::setGammaLimits( float min, float max ) {
+ mingamma = (min < 0.1) ? 0.1 : min;
+ maxgamma = (max > 10.0) ? 10.0 : max;
+}
+
+#ifdef istringstream
+#undef istringstream
+#endif