summaryrefslogtreecommitdiff
path: root/src/rmd_setbrwindow.c
blob: 08d0997b6904d97989a756d5bba05b230e78dbcb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/******************************************************************************
*                            recordMyDesktop                                  *
*******************************************************************************
*                                                                             *
*            Copyright (C) 2006,2007,2008 John Varouhakis                     *
*                                                                             *
*                                                                             *
*   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., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA  *
*                                                                             *
*                                                                             *
*                                                                             *
*   For further information contact me at johnvarouhakis@gmail.com            *
******************************************************************************/

#include "config.h"
#include "rmd_setbrwindow.h"

#include "rmd_types.h"


boolean rmdSetBRWindow(	Display *dpy,
			BRWindow *brwin,
			DisplaySpecs *specs,
			ProgArgs *args)
{
	//before we start recording we have to make sure the ranges are valid
	if (args->windowid == 0) {//root window
		//first set it up
		brwin->windowid		= specs->root;
		brwin->winrect.x	= 0;
		brwin->winrect.y	= 0;
		brwin->winrect.width	= specs->width;
		brwin->winrect.height	= specs->height;

		brwin->rrect.x		= args->x;
		brwin->rrect.y		= args->y;
		brwin->rrect.width	= args->width ? args->width : brwin->winrect.width - args->x;
		brwin->rrect.height	= args->height ? args->height : brwin->winrect.height - args->y;

		//and then check validity
		if (	brwin->rrect.x + brwin->rrect.width > specs->width ||
			brwin->rrect.y + brwin->rrect.height > specs->height) {

			fprintf(stderr,	"Window size specification out of bounds!"
					"(current resolution:%dx%d)\n",
					specs->width, specs->height);
			return FALSE;
		}
	} else {
		int			transl_x, transl_y;
		Window			wchid;
		XWindowAttributes	attribs;

		XSelectInput(dpy, args->windowid, VisibilityChangeMask | StructureNotifyMask);
		XGetWindowAttributes(dpy, args->windowid, &attribs);

		while (attribs.map_state == IsUnviewable || attribs.map_state == IsUnmapped) {
			XEvent	ev;

			fprintf(stderr, "Waiting for window to be mapped and visible!\n");
			XWindowEvent(dpy, args->windowid, VisibilityChangeMask|StructureNotifyMask, &ev);
			XGetWindowAttributes(dpy, args->windowid, &attribs);
		}

		XTranslateCoordinates(	dpy,
					specs->root,
					args->windowid,
					attribs.x,
					attribs.y,
					&transl_x,
					&transl_y,
					&wchid);

		brwin->winrect.x	= attribs.x - transl_x;
		brwin->winrect.y	= attribs.y - transl_y;
		brwin->winrect.width	= attribs.width;
		brwin->winrect.height	= attribs.height;

		/* XXX FIXME: this check is partial at best, surely windows can be off the low
		 * sides of the screen too...
		 */
		if (	brwin->winrect.x + brwin->winrect.width > specs->width ||
			brwin->winrect.y + brwin->winrect.height > specs->height) {

			fprintf(stderr,"Window must be on visible screen area!\n");
			return FALSE;
		}

		brwin->rrect.x		= brwin->winrect.x + args->x;
		brwin->rrect.y		= brwin->winrect.y + args->y;
		brwin->rrect.width	= args->width ? args->width : brwin->winrect.width - args->x;
		brwin->rrect.height	= args->height ? args->height : brwin->winrect.height - args->y;

		if (	args->x + brwin->rrect.width > brwin->winrect.width ||
			args->y + brwin->rrect.height > brwin->winrect.height) {

			fprintf(stderr, "Specified Area is larger than window!\n");
			return FALSE;
		}
	}

	fprintf(stderr,	"Initial recording window is set to:\n"
			"X:%d   Y:%d	Width:%d	Height:%d\n",
			brwin->rrect.x, brwin->rrect.y,
			brwin->rrect.width, brwin->rrect.height);

	return TRUE;
}
© All Rights Reserved