/****************************************************************************
- * Copyright (c) 1998 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2004,2005 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
****************************************************************************/
/****************************************************************************
- * Author: Juergen Pfeifer <Juergen.Pfeifer@T-Online.de> 1995,1997 *
+ * Author: Juergen Pfeifer, 1995,1997 *
****************************************************************************/
/***************************************************************************
* Module m_cursor *
-* Correctly position a menus cursor *
+* Correctly position a menu's cursor *
***************************************************************************/
#include "menu.priv.h"
-MODULE_ID("$Id: m_cursor.c,v 1.9 1998/02/11 12:13:50 tom Exp $")
+MODULE_ID("$Id: m_cursor.c,v 1.20 2005/10/22 23:03:32 tom Exp $")
/*---------------------------------------------------------------------------
-| Facility : libnmenu
-| Function : pos_menu_cursor
-|
-| Description : Position logical cursor to current item in menu
+| Facility : libnmenu
+| Function : _nc_menu_cursor_pos
+|
+| Description : Return position of logical cursor to current item
|
| Return Values : E_OK - success
| E_BAD_ARGUMENT - invalid menu
| E_NOT_POSTED - Menu is not posted
+--------------------------------------------------------------------------*/
-int pos_menu_cursor(const MENU * menu)
+NCURSES_EXPORT(int)
+_nc_menu_cursor_pos(const MENU * menu, const ITEM * item, int *pY, int *pX)
{
- if (!menu)
- RETURN(E_BAD_ARGUMENT);
+ if (!menu || !pX || !pY)
+ return (E_BAD_ARGUMENT);
else
{
- ITEM *item;
- int x, y;
- WINDOW *win, *sub;
-
- if ( !( menu->status & _POSTED ) )
- RETURN(E_NOT_POSTED);
-
- item = menu->curitem;
- assert(item);
-
- x = item->x * (menu->spc_cols + menu->itemlen);
- y = (item->y - menu->toprow) * menu->spc_rows;
+ if ((ITEM *) 0 == item)
+ item = menu->curitem;
+ assert(item != (ITEM *) 0);
+
+ if (!(menu->status & _POSTED))
+ return (E_NOT_POSTED);
+
+ *pX = item->x * (menu->spc_cols + menu->itemlen);
+ *pY = (item->y - menu->toprow) * menu->spc_rows;
+ }
+ return (E_OK);
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnmenu
+| Function : pos_menu_cursor
+|
+| Description : Position logical cursor to current item in menu
+|
+| Return Values : E_OK - success
+| E_BAD_ARGUMENT - invalid menu
+| E_NOT_POSTED - Menu is not posted
++--------------------------------------------------------------------------*/
+NCURSES_EXPORT(int)
+pos_menu_cursor(const MENU * menu)
+{
+ WINDOW *win, *sub;
+ int x = 0, y = 0;
+ int err = _nc_menu_cursor_pos(menu, (ITEM *) 0, &y, &x);
+
+ T((T_CALLED("pos_menu_cursor(%p)"), menu));
+
+ if (E_OK == err)
+ {
win = menu->userwin ? menu->userwin : stdscr;
sub = menu->usersub ? menu->usersub : win;
assert(win && sub);
-
+
if ((menu->opt & O_SHOWMATCH) && (menu->pindex > 0))
- x += ( menu->pindex + menu->marklen - 1);
-
- wmove(sub,y,x);
-
- if ( win != sub )
+ x += (menu->pindex + menu->marklen - 1);
+
+ wmove(sub, y, x);
+
+ if (win != sub)
{
wcursyncup(sub);
wsyncup(sub);
untouchwin(sub);
- }
+ }
}
- RETURN(E_OK);
+ RETURN(err);
}
/* m_cursor.c ends here */