/* Public Domain Curses */

#include <curspriv.h>

RCSID("$Id: getyx.c,v 1.29 2008/07/15 17:13:26 wmcbrine Exp $")

/*man-start**************************************************************

  Name:                                                         getyx

  Synopsis:
        void getyx(WINDOW *win, int y, int x);
        void getparyx(WINDOW *win, int y, int x);
        void getbegyx(WINDOW *win, int y, int x);
        void getmaxyx(WINDOW *win, int y, int x);

        void getsyx(int y, int x);
        int setsyx(int y, int x);

        int getbegy(WINDOW *win);
        int getbegx(WINDOW *win);
        int getcury(WINDOW *win);
        int getcurx(WINDOW *win);
        int getpary(WINDOW *win);
        int getparx(WINDOW *win);
        int getmaxy(WINDOW *win);
        int getmaxx(WINDOW *win);

  Description:
        The getyx() macro (defined in curses.h -- the prototypes here
        are merely illustrative) puts the current cursor position of the
        specified window into y and x. getbegyx() and getmaxyx() return
        the starting coordinates and size of the specified window,
        respectively. getparyx() returns the starting coordinates of the
        parent's window, if the specified window is a subwindow;
        otherwise it sets y and x to -1. These are all macros.

        getsyx() gets the coordinates of the virtual screen cursor, and
        stores them in y and x. If leaveok() is TRUE, it returns -1, -1.
        If lines have been removed with ripoffline(), then getsyx()
        includes these lines in its count; so, the returned y and x
        values should only be used with setsyx().

        setsyx() sets the virtual screen cursor to the y, x coordinates.
        If y, x are -1, -1, leaveok() is set TRUE.

        getsyx() and setsyx() are meant to be used by a library routine
        that manipulates curses windows without altering the position of
        the cursor. Note that getsyx() is defined only as a macro.

        getbegy(), getbegx(), getcurx(), getcury(), getmaxy(),
        getmaxx(), getpary(), and getparx() return the appropriate
        coordinate or size values, or ERR in the case of a NULL window.

  Portability                                X/Open    BSD    SYS V
        getyx                                   Y       Y       Y
        getparyx                                -       -      4.0
        getbegyx                                -       -      3.0
        getmaxyx                                -       -      3.0
        getsyx                                  -       -      3.0
        setsyx                                  -       -      3.0
        getbegy                                 -       -       -
        getbegx                                 -       -       -
        getcury                                 -       -       -
        getcurx                                 -       -       -
        getpary                                 -       -       -
        getparx                                 -       -       -
        getmaxy                                 -       -       -
        getmaxx                                 -       -       -

**man-end****************************************************************/

int getbegy(WINDOW *win)
{
    PDC_LOG(("getbegy() - called\n"));

    return win ? win->_begy : ERR;
}

int getbegx(WINDOW *win)
{
    PDC_LOG(("getbegx() - called\n"));

    return win ? win->_begx : ERR;
}

int getcury(WINDOW *win)
{
    PDC_LOG(("getcury() - called\n"));

    return win ? win->_cury : ERR;
}

int getcurx(WINDOW *win)
{
    PDC_LOG(("getcurx() - called\n"));

    return win ? win->_curx : ERR;
}

int getpary(WINDOW *win)
{
    PDC_LOG(("getpary() - called\n"));

    return win ? win->_pary : ERR;
}

int getparx(WINDOW *win)
{
    PDC_LOG(("getparx() - called\n"));

    return win ? win->_parx : ERR;
}

int getmaxy(WINDOW *win)
{
    PDC_LOG(("getmaxy() - called\n"));

    return win ? win->_maxy : ERR;
}

int getmaxx(WINDOW *win)
{
    PDC_LOG(("getmaxx() - called\n"));

    return win ? win->_maxx : ERR;
}

int setsyx(int y, int x)
{
    PDC_LOG(("setsyx() - called\n"));

    if(y == -1 && x == -1)
    {
        curscr->_leaveit = TRUE;
        return OK;
    }
    else
    {
        curscr->_leaveit = FALSE;
        return wmove(curscr, y, x);
    }
}
