diff options
author | Rami Santina <[email protected]> | 2010-10-18 23:06:50 +0300 |
---|---|---|
committer | Rami Santina <[email protected]> | 2010-10-18 23:06:50 +0300 |
commit | c74be6eeeb273cd7530ac7e94c3128cb5fa1e420 (patch) | |
tree | ac8169f6f4e6a5116ba3dedc67abf66df7a5d24e /src/newt/native/X11Window.c | |
parent | 735ebb60ead9996106dfcb958ddfbb6b00b407fd (diff) |
Added Screen Rotation manipulation API (with X11 impl)
Added screen rotation change capability with impl for X11 (using Xrandr)
com.jogamp.newt.Screen: added 2 methods which cover screen roation lifecycle
setScreenRotation(int rot): Change the Screen Rotation to
one of the rotations defined in ScreenMode, namely:
ROTATE_0, ROTATE_90, ROTATE_180, ROTATE_270
int getCurrentScreenRotation(): Get the Current screen rotation
returns -1 if not implemented natively.
+++++++++++++++++++++++++
Notes:
1- At init the original rotation is called natively and cached,
when screen is destroyed the rotation is reverted.
2- On X11 with Nvidia: you need to edit /etc/X11/xorg.conf:
Add the following line:
Option "RandRRotation" "on"
in Section "Device" after BoardName.
+++++++++++++++
Added TestScreenMode02NEWT which includes 4 tests
1- Rotate 90
2- Rotate 180
3- Rotate 270
4- Rotate with screen mode change
should fail if screen rotation not implemented natively.
(4) withh fail if screen mode not impl natively as well.
Diffstat (limited to 'src/newt/native/X11Window.c')
-rw-r--r-- | src/newt/native/X11Window.c | 106 |
1 files changed, 102 insertions, 4 deletions
diff --git a/src/newt/native/X11Window.c b/src/newt/native/X11Window.c index 26bce0c63..7fcbd83da 100644 --- a/src/newt/native/X11Window.c +++ b/src/newt/native/X11Window.c @@ -756,16 +756,30 @@ JNIEXPORT jint JNICALL Java_com_jogamp_newt_impl_x11_X11Screen_getDesktopScreenM return (jint)original_size_id; } -static void X11Screen_changeScreenMode(Display* dpy, Window root, int screen_indx, XRRScreenSize *xrrs, int screenModeIndex, short freq) +static void X11Screen_changeScreenMode(Display* dpy, Window root, int screen_indx, XRRScreenSize *xrrs, int screenModeIndex, short freq, int rotation) { int num_rates; //number of available rates for selected mode index short *rates = XRRRates(dpy, screen_indx, screenModeIndex, &num_rates); XRRScreenConfiguration *conf = XRRGetScreenInfo(dpy, root); + int rot = RR_Rotate_0; + + if(rotation == 90) + { + rot = RR_Rotate_90; + } + else if(rotation == 180) + { + rot = RR_Rotate_180; + } + else if(rotation == 270) + { + rot = RR_Rotate_270; + } // Change the resolution DBG_PRINT("\nCHANGED TO %i x %i PIXELS, %i Hz\n\n", xrrs[screenModeIndex].width, xrrs[screenModeIndex].height, selectedFreq); - XRRSetScreenConfigAndRate(dpy, conf, root, screenModeIndex, RR_Rotate_0, freq, CurrentTime); + XRRSetScreenConfigAndRate(dpy, conf, root, screenModeIndex, rot, freq, CurrentTime); //free XRRFreeScreenConfigInfo(conf); @@ -777,7 +791,7 @@ static void X11Screen_changeScreenMode(Display* dpy, Window root, int screen_ind * Signature: (JIIS)V */ JNIEXPORT void JNICALL Java_com_jogamp_newt_impl_x11_X11Screen_setScreenMode0 - (JNIEnv *env, jobject object, jlong display, jint scrn_indx, jint mode_indx, jshort freq) + (JNIEnv *env, jobject object, jlong display, jint scrn_indx, jint mode_indx, jshort freq, jint rotation) { Display *dpy = (Display *) (intptr_t) display; Window root = RootWindow(dpy, (int)scrn_indx); @@ -792,7 +806,7 @@ JNIEXPORT void JNICALL Java_com_jogamp_newt_impl_x11_X11Screen_setScreenMode0 return; } - X11Screen_changeScreenMode(dpy, root, (int)scrn_indx, xrrs, screenModeIndex, (short)freq); + X11Screen_changeScreenMode(dpy, root, (int)scrn_indx, xrrs, screenModeIndex, (short)freq, (int)rotation); } #define NUM_SCREEN_MODE_PROPERTIES 3 @@ -885,6 +899,90 @@ JNIEXPORT jshort JNICALL Java_com_jogamp_newt_impl_x11_X11Screen_getCurrentScree return original_rate; } +/* + * Class: com_jogamp_newt_impl_x11_X11Screen + * Method: getCurrentScreenRotation0 + * Signature: (JI)I + */ +JNIEXPORT jint JNICALL Java_com_jogamp_newt_impl_x11_X11Screen_getCurrentScreenRotation0 + (JNIEnv *env, jobject object, jlong display, jint scrn_indx) +{ + Display *dpy = (Display *) (intptr_t) display; + Window root = RootWindow(dpy, (int)scrn_indx); + + //get current resolutions and frequencies + XRRScreenConfiguration *conf = XRRGetScreenInfo(dpy, root); + + Rotation rotation; + XRRConfigCurrentConfiguration(conf, &rotation); + + //free + XRRFreeScreenConfigInfo(conf); + + int rot = -1; + + if(rotation == RR_Rotate_0) { + rot = 0; + } + else if(rotation == RR_Rotate_90) { + rot = 90; + } + else if(rotation == RR_Rotate_180) { + rot = 180; + } + else if(rotation == RR_Rotate_270) { + rot = 270; + } + + return rot; +} + +/* + * Class: com_jogamp_newt_impl_x11_X11Screen + * Method: setScreenRotation0 + * Signature: (JII)V + */ +JNIEXPORT void JNICALL Java_com_jogamp_newt_impl_x11_X11Screen_setScreenRotation0 + (JNIEnv *env, jobject object, jlong display, jint scrn_indx, jint rotation) +{ + Display *dpy = (Display *) (intptr_t) display; + Window root = RootWindow(dpy, (int)scrn_indx); + + int rot = -1; + + if(rotation == 0) + { + rot = RR_Rotate_0; + } + else if(rotation == 90) + { + rot = RR_Rotate_90; + } + else if(rotation == 180) + { + rot = RR_Rotate_180; + } + else if(rotation == 270) + { + rot = RR_Rotate_270; + } + else + { + return; + } + + XRRScreenConfiguration *conf = XRRGetScreenInfo(dpy, root); + + Rotation current_rotation; + SizeID current_mode_id = XRRConfigCurrentConfiguration(conf, ¤t_rotation); + short current_rate = XRRConfigCurrentRate(conf); + + XRRSetScreenConfigAndRate(dpy, conf, root, current_mode_id, rot, current_rate, CurrentTime); + + //free + XRRFreeScreenConfigInfo(conf); +} + /** * Window */ |