//
// Viewport.hh for pekwm
// Copyright (C)  2003-2004 Claes Nasten <pekdon{@}pekdon{.}net>
//
// This program is licensed under the GNU GPL.
// See the LICENSE file for more information.
//

#include "../config.h"

#ifndef _VIEWPORT_HH_
#define _VIEWPORT_HH_

#include "pekwm.hh"
#include "PWinObj.hh"

#include <list>
#include <vector>

class PScreen;

class Viewport {
public:
	Viewport(uint ws, const std::list<PWinObj*> &wo_list);
	~Viewport(void);

	inline int getX(void) const { return _x; }
	inline int getY(void) const { return _y; }
	inline uint getWidth(void) const { return _width; }
	inline uint getHeight(void) const { return _height; }
	inline uint getCols(void) const { return _cols; }
	inline uint getRows(void) const { return _rows; }

	inline int getXMax(void) const { return _x_max; }
	inline int getYMax(void) const { return _y_max; }

	inline uint getCol(PWinObj *wo) {
		int x = wo->getX() + wo->getWidth() / 2 + _x;
		if (x < 0) // for safe unsigned cast
			x = 0;
		else if (x > _x_max)
			x = _x_max;
		return (x / _v_width);
	}
	inline uint getRow(PWinObj *wo) {
		int y = wo->getY() + wo->getHeight() / 2 + _y;
		if (y < 0) // for safe unsigned cast
			y = 0;
		else if (y > _y_max)
			y = _height;
		return (y / _v_height);
	}
	inline bool isInside(PWinObj *wo) {
		if ((wo->getRX() > 0) && (wo->getX() < signed(_v_width)) &&
				(wo->getBY() > 0) && (wo->getY() < signed(_v_height))) {
			return true;
		}
		return false;
	}

	bool move(int x, int y, bool warp = false, int wx = 0, int wy = 0);
	bool moveDirection(DirectionType dir, bool warp = true);
	void moveDrag(int x, int y);
	bool moveToWO(PWinObj *wo);
	void scroll(int x_off, int y_off);
	void gotoColRow(uint col, uint row);

	void hintsUpdate(void);
	void hintSetViewport(void);
	void hintSetGeometry(void);
	void hintSetWorkarea(void);

#ifdef HAVE_XRANDR
	void updateGeometry(void);
#endif // HAVE_XRANDR

	void reload(void);
	void makeAllInsideReal(void);
	void makeAllInsideVirtual(void);
	void makeWOInsideReal(PWinObj *wo);
	void makeWOInsideVirtual(PWinObj *wo);

private:
	PScreen *_scr;
	uint _ws;
	const std::list<PWinObj*> &_wo_list;

	int _x, _y;
	uint _v_width, _v_height;
	uint _width, _height;

	int _x_max, _y_max;
	uint _cols, _rows;
};

#endif // _VIEWPORT_HH_


syntax highlighted by Code2HTML, v. 0.9.1