/**
 * Copyright 2013 JogAmp Community. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 *    1. Redistributions of source code must retain the above copyright notice, this list of
 *       conditions and the following disclaimer.
 *
 *    2. Redistributions in binary form must reproduce the above copyright notice, this list
 *       of conditions and the following disclaimer in the documentation and/or other materials
 *       provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * The views and conclusions contained in the software and documentation are those of the
 * authors and should not be interpreted as representing official policies, either expressed
 * or implied, of JogAmp Community.
 */
package jogamp.newt.driver.x11;

import java.util.List;

import com.jogamp.nativewindow.util.RectangleImmutable;

import jogamp.newt.MonitorModeProps;

import com.jogamp.common.util.VersionNumber;
import com.jogamp.newt.MonitorDevice;
import com.jogamp.newt.MonitorMode;

public interface RandR {
    public static final VersionNumber version110 = new VersionNumber(1, 1, 0);
    public static final VersionNumber version130 = new VersionNumber(1, 3, 0);
    public static final VersionNumber version140 = new VersionNumber(1, 4, 0);

    VersionNumber getVersion();
    @Override
    String toString();

    void dumpInfo(final long dpy, final int screen_idx);

    /**
     * Encapsulate initial device query allowing caching of internal data structures.
     * Methods covered:
     * <ul>
     *   <li>{@link #getMonitorDeviceIds(long, ScreenDriver)}</li>
     *   <li>{@link #getAvailableRotations(long, ScreenDriver, int)}</li>
     *   <li>{@link #getMonitorModeProps(long, ScreenDriver, int)}</li>
     *   <li>{@link #getCurrentMonitorModeProps(long, ScreenDriver, int)}</li>
     *   <li>{@link #getMonitorDeviceProps(long, ScreenDriver, List, int, MonitorMode)}</li>
     * </ul>
     * <p>
     * Above methods may be called w/o begin/end, in which case no
     * internal data structures can be cached:
     * </p>
     * @param dpy TODO
     * @param screen TODO
     * @return TODO
     */
    boolean beginInitialQuery(long dpy, ScreenDriver screen);
    void endInitialQuery(long dpy, ScreenDriver screen);

    int[] getMonitorDeviceIds(final long dpy, final ScreenDriver screen);
    int[] getAvailableRotations(final long dpy, final ScreenDriver screen, final int crt_id);
    /**
     *
     * @param dpy
     * @param screen
     * @param mode_idx w/o indexing rotation
     * @return props w/o actual rotation
     */
    int[] getMonitorModeProps(final long dpy, final ScreenDriver screen, final int mode_idx);
    int[] getMonitorDeviceProps(final long dpy, final ScreenDriver screen, MonitorModeProps.Cache cache, final int crt_id);
    String getMonitorName(final long dpy, final ScreenDriver screen, final int crt_id);
    int[] getMonitorDeviceViewport(final long dpy, final ScreenDriver screen, final int crt_id);
    int[] getCurrentMonitorModeProps(final long dpy, final ScreenDriver screen, final int crt_id);
    /** The device shall be locked, blocking message handling.  */
    boolean setCurrentMonitorModeStart(final long dpy, final ScreenDriver screen, MonitorDevice monitor, final MonitorMode mode);
    /** The device must not be locked, allowing message handling. */
    boolean setCurrentMonitorModeWait(final ScreenDriver screen);
    /** Invoked from Display's EDT thread for message handling. */
    void sendRRScreenChangeNotify(final long dpy, final long event);

    void updateScreenViewport(final long dpy, final ScreenDriver screen, RectangleImmutable viewport);
}
