xrdp/xrdp/funcs.c

241 lines
4.8 KiB
C
Raw Normal View History

2004-10-02 07:48:09 +08:00
/*
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
xrdp: A Remote Desktop Protocol server.
2008-01-30 15:30:10 +08:00
Copyright (C) Jay Sorg 2004-2008
2004-10-02 07:48:09 +08:00
simple functions
*/
#include "xrdp.h"
/*****************************************************************************/
2005-03-06 11:44:27 +08:00
/* returns boolean */
2005-06-28 11:00:43 +08:00
int APP_CC
rect_contains_pt(struct xrdp_rect* in, int x, int y)
2004-10-02 07:48:09 +08:00
{
if (x < in->left)
2005-03-06 11:44:27 +08:00
{
2004-10-02 07:48:09 +08:00
return 0;
2005-03-06 11:44:27 +08:00
}
2004-10-02 07:48:09 +08:00
if (y < in->top)
2005-03-06 11:44:27 +08:00
{
2004-10-02 07:48:09 +08:00
return 0;
2005-03-06 11:44:27 +08:00
}
2004-10-02 07:48:09 +08:00
if (x >= in->right)
2005-03-06 11:44:27 +08:00
{
2004-10-02 07:48:09 +08:00
return 0;
2005-03-06 11:44:27 +08:00
}
2004-10-02 07:48:09 +08:00
if (y >= in->bottom)
2005-03-06 11:44:27 +08:00
{
2004-10-02 07:48:09 +08:00
return 0;
2005-03-06 11:44:27 +08:00
}
2004-10-02 07:48:09 +08:00
return 1;
}
/*****************************************************************************/
2005-06-28 11:00:43 +08:00
int APP_CC
rect_intersect(struct xrdp_rect* in1, struct xrdp_rect* in2,
struct xrdp_rect* out)
2004-10-02 07:48:09 +08:00
{
int rv;
struct xrdp_rect dumby;
if (out == 0)
2005-03-06 11:44:27 +08:00
{
2004-10-02 07:48:09 +08:00
out = &dumby;
2005-03-06 11:44:27 +08:00
}
2004-10-02 07:48:09 +08:00
*out = *in1;
if (in2->left > in1->left)
2005-03-06 11:44:27 +08:00
{
2004-10-02 07:48:09 +08:00
out->left = in2->left;
2005-03-06 11:44:27 +08:00
}
2004-10-02 07:48:09 +08:00
if (in2->top > in1->top)
2005-03-06 11:44:27 +08:00
{
2004-10-02 07:48:09 +08:00
out->top = in2->top;
2005-03-06 11:44:27 +08:00
}
2004-10-02 07:48:09 +08:00
if (in2->right < in1->right)
2005-03-06 11:44:27 +08:00
{
2004-10-02 07:48:09 +08:00
out->right = in2->right;
2005-03-06 11:44:27 +08:00
}
2004-10-02 07:48:09 +08:00
if (in2->bottom < in1->bottom)
2005-03-06 11:44:27 +08:00
{
2004-10-02 07:48:09 +08:00
out->bottom = in2->bottom;
2005-03-06 11:44:27 +08:00
}
2004-10-02 07:48:09 +08:00
rv = !ISRECTEMPTY(*out);
if (!rv)
2005-03-06 11:44:27 +08:00
{
2004-10-02 07:48:09 +08:00
g_memset(out, 0, sizeof(struct xrdp_rect));
2005-03-06 11:44:27 +08:00
}
2004-10-02 07:48:09 +08:00
return rv;
}
2005-08-18 08:32:11 +08:00
/*****************************************************************************/
/* returns boolean */
int APP_CC
rect_contained_by(struct xrdp_rect* in1, int left, int top,
int right, int bottom)
{
if (left < in1->left || top < in1->top ||
right > in1->right || bottom > in1->bottom)
{
return 0;
}
else
{
return 1;
}
}
2004-10-06 11:35:59 +08:00
/*****************************************************************************/
/* adjust the bounds to fit in the bitmap */
/* return false if there is nothing to draw else return true */
2005-06-28 11:00:43 +08:00
int APP_CC
check_bounds(struct xrdp_bitmap* b, int* x, int* y, int* cx, int* cy)
2004-10-06 11:35:59 +08:00
{
if (*x >= b->width)
2005-03-06 11:44:27 +08:00
{
2004-10-06 11:35:59 +08:00
return 0;
2005-03-06 11:44:27 +08:00
}
2004-10-06 11:35:59 +08:00
if (*y >= b->height)
2005-03-06 11:44:27 +08:00
{
2004-10-06 11:35:59 +08:00
return 0;
2005-03-06 11:44:27 +08:00
}
2004-10-06 11:35:59 +08:00
if (*x < 0)
{
*cx += *x;
*x = 0;
}
if (*y < 0)
{
*cy += *y;
*y = 0;
}
if (*cx <= 0)
2005-03-06 11:44:27 +08:00
{
2004-10-06 11:35:59 +08:00
return 0;
2005-03-06 11:44:27 +08:00
}
2004-10-06 11:35:59 +08:00
if (*cy <= 0)
2005-03-06 11:44:27 +08:00
{
2004-10-06 11:35:59 +08:00
return 0;
2005-03-06 11:44:27 +08:00
}
2004-10-06 11:35:59 +08:00
if (*x + *cx > b->width)
2005-03-06 11:44:27 +08:00
{
2004-10-06 11:35:59 +08:00
*cx = b->width - *x;
2005-03-06 11:44:27 +08:00
}
2004-10-06 11:35:59 +08:00
if (*y + *cy > b->height)
2005-03-06 11:44:27 +08:00
{
2004-10-06 11:35:59 +08:00
*cy = b->height - *y;
2005-03-06 11:44:27 +08:00
}
2004-10-06 11:35:59 +08:00
return 1;
}
2004-10-25 11:23:48 +08:00
/*****************************************************************************/
/* add a ch at index position in text, index starts at 0 */
/* if index = -1 add it to the end */
2005-06-28 11:00:43 +08:00
int APP_CC
2007-09-23 15:43:16 +08:00
add_char_at(char* text, int text_size, twchar ch, int index)
2004-10-25 11:23:48 +08:00
{
int len;
int i;
2007-09-23 15:43:16 +08:00
twchar* wstr;
2004-10-25 11:23:48 +08:00
2007-09-23 15:43:16 +08:00
len = g_mbstowcs(0, text, 0);
wstr = (twchar*)g_malloc((len + 16) * sizeof(twchar), 0);
g_mbstowcs(wstr, text, len + 1);
if ((index >= len) || (index < 0))
2004-10-25 11:23:48 +08:00
{
2007-09-23 15:43:16 +08:00
wstr[len] = ch;
wstr[len + 1] = 0;
g_wcstombs(text, wstr, text_size);
g_free(wstr);
2004-10-25 11:23:48 +08:00
return 0;
}
2007-09-23 15:43:16 +08:00
for (i = (len - 1); i >= index; i--)
{
2007-09-23 15:43:16 +08:00
wstr[i + 1] = wstr[i];
}
2007-09-23 15:43:16 +08:00
wstr[i + 1] = ch;
wstr[len + 1] = 0;
g_wcstombs(text, wstr, text_size);
g_free(wstr);
2004-10-25 11:23:48 +08:00
return 0;
}
/*****************************************************************************/
/* remove a ch at index position in text, index starts at 0 */
/* if index = -1 remove it from the end */
2005-06-28 11:00:43 +08:00
int APP_CC
2007-09-23 15:43:16 +08:00
remove_char_at(char* text, int text_size, int index)
2004-10-25 11:23:48 +08:00
{
int len;
int i;
2007-09-23 15:43:16 +08:00
twchar* wstr;
2004-10-25 11:23:48 +08:00
2007-09-23 15:43:16 +08:00
len = g_mbstowcs(0, text, 0);
2004-10-25 11:23:48 +08:00
if (len <= 0)
{
2004-10-25 11:23:48 +08:00
return 0;
}
2007-09-23 15:43:16 +08:00
wstr = (twchar*)g_malloc((len + 16) * sizeof(twchar), 0);
g_mbstowcs(wstr, text, len + 1);
if ((index >= (len - 1)) || (index < 0))
2004-10-25 11:23:48 +08:00
{
2007-09-23 15:43:16 +08:00
wstr[len - 1] = 0;
g_wcstombs(text, wstr, text_size);
g_free(wstr);
2004-10-25 11:23:48 +08:00
return 0;
}
2007-09-23 15:43:16 +08:00
for (i = index; i < (len - 1); i++)
{
2007-09-23 15:43:16 +08:00
wstr[i] = wstr[i + 1];
}
2007-09-23 15:43:16 +08:00
wstr[len - 1] = 0;
g_wcstombs(text, wstr, text_size);
g_free(wstr);
2004-10-25 11:23:48 +08:00
return 0;
}
2004-11-12 12:43:08 +08:00
/*****************************************************************************/
2005-06-28 11:00:43 +08:00
int APP_CC
set_string(char** in_str, const char* in)
2004-11-12 12:43:08 +08:00
{
if (in_str == 0)
{
2004-11-12 12:43:08 +08:00
return 0;
}
2004-11-12 12:43:08 +08:00
g_free(*in_str);
*in_str = g_strdup(in);
return 0;
}
2007-09-23 15:43:16 +08:00
/*****************************************************************************/
int APP_CC
wchar_repeat(twchar* dest, int dest_size_in_wchars, twchar ch, int repeat)
{
int index;
for (index = 0; index < repeat; index++)
{
if (index >= dest_size_in_wchars)
{
break;
}
dest[index] = ch;
}
return 0;
}