psb_xrandr.c revision 643778eb83b8dfe3bbf433855b311d4fefa95e21
1643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang#include "psb_xrandr.h"
2643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang#include "psb_x11.h"
3643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
4643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangpsb_xrandr_info_p psb_xrandr_info;
5643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangstatic psb_xrandr_crtc_p crtc_head, crtc_tail;
6643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangstatic psb_xrandr_output_p output_head, output_tail;
7643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangstatic pthread_mutex_t psb_extvideo_mutex;
8643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangstatic XRRScreenResources *res;
9643778eb83b8dfe3bbf433855b311d4fefa95e21Fei JiangDisplay *dpy;
10643778eb83b8dfe3bbf433855b311d4fefa95e21Fei JiangWindow root;
11643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangint screen;
12643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
13643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang#define USE_XRANDR_THREAD
14643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang//#undef USE_XRANDR_THREAD
15643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
16643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang#define MWM_HINTS_DECORATIONS (1L << 1)
17643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangtypedef struct
18643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
19643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        int flags;
20643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        int functions;
21643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        int decorations;
22643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        int input_mode;
23643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        int status;
24643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang} MWMHints;
25643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
26643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangstatic char* location2string(psb_xrandr_location location)
27643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
28643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    switch (location)
29643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    {
30643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	case ABOVE:
31643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    return "ABOVE";
32643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    break;
33643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	case BELOW:
34643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    return "BELOW";
35643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    break;
36643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	case LEFT_OF:
37643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    return "LEFT_OF";
38643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    break;
39643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	case RIGHT_OF:
40643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    return "RIGHT_OF";
41643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    break;
42643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	default:
43643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    return "NORMAL";
44643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    break;
45643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
46643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
47643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
48643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangstatic psb_xrandr_output_p get_output_by_id(RROutput output_id)
49643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
50643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    psb_xrandr_output_p p_output;
51643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    for (p_output = output_head; p_output; p_output = p_output->next) {
52643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	if (p_output->output_id == output_id)
53643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    return p_output;
54643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
55643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    return NULL;
56643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
57643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
58643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangstatic psb_xrandr_crtc_p get_crtc_by_id(RRCrtc crtc_id)
59643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
60643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    psb_xrandr_crtc_p p_crtc;
61643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    for (p_crtc = crtc_head; p_crtc; p_crtc = p_crtc->next)
62643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	if (p_crtc->crtc_id == crtc_id)
63643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    return p_crtc;
64643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    return NULL;
65643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
66643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
67643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangstatic void psb_extvideo_prop()
68643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
69643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    psb_xrandr_crtc_p p_crtc;
70643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    psb_xrandr_output_p p_output;
71643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang#if 0
72643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    int i, j, nprop, actual_format;
73643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    unsigned long nitems, bytes_after;
74643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    Atom *props;
75643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    Atom actual_type;
76643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    unsigned char* prop;
77643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    unsigned char* prop_name;
78643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang#endif
79643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    psb_xrandr_info->output_changed = 1;
80643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    if (psb_xrandr_info->nconnected_output == 1)
81643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    {
82643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	for (p_output = output_head; p_output; p_output = p_output->next)
83643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    if (p_output->connection == RR_Connected)
84643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		psb_xrandr_info->primary_output = p_output;
85643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
86643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	for (p_crtc = crtc_head; p_crtc; p_crtc = p_crtc->next)
87643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	{
88643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    if (p_crtc->noutput == 0)
89643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		continue;
90643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    else
91643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		psb_xrandr_info->primary_crtc = p_crtc;
92643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	}
93643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
94643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode = SINGLE;
95643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
96643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    else if (psb_xrandr_info->nconnected_output >= 2)
97643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    {
98643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	for (p_output = output_head; p_output; p_output = p_output->next)
99643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	{
100643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    if (p_output->connection != RR_Connected)
101643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		continue;
102643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
103643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    if (!strcmp(p_output->name, "MIPI0"))
104643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    {
105643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		psb_xrandr_info->primary_output = p_output;
106643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		psb_xrandr_info->primary_crtc = p_output->crtc;
107643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    }
108643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    else if (!strcmp(p_output->name, "MIPI1"))
109643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    {
110643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang                psb_xrandr_info->mipi1_connected = 1;
111643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		psb_xrandr_info->extend_output = p_output;
112643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		psb_xrandr_info->extend_crtc = p_output->crtc;
113643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    }
114643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    else if (!strcmp(p_output->name, "TMDS0-1"))
115643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    {
116643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	        psb_xrandr_info->hdmi_connected = 1;
117643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		psb_xrandr_info->extend_output = p_output;
118643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		psb_xrandr_info->extend_crtc = p_output->crtc;
119643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    }
120643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	}
121643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
122643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	if (!psb_xrandr_info->primary_crtc || !psb_xrandr_info->extend_crtc || !psb_xrandr_info->primary_output || !psb_xrandr_info->extend_output)
123643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	{
124643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    psb__error_message("failed to get primary/extend crtc/output\n");
125643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    return;
126643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	}
127643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
128643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	if (psb_xrandr_info->primary_crtc->x == 0 && psb_xrandr_info->primary_crtc->y == 0 \
129643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    && psb_xrandr_info->extend_crtc->x == 0 && psb_xrandr_info->extend_crtc->y == 0)
130643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode = CLONE;
131643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	else {
132643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode = EXTENDED;
133643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
134643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    if (psb_xrandr_info->primary_crtc->y == psb_xrandr_info->extend_crtc->height)
135643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		psb_xrandr_info->extend_crtc->location = ABOVE;
136643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    else if (psb_xrandr_info->extend_crtc->y == psb_xrandr_info->primary_crtc->height)
137643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		psb_xrandr_info->extend_crtc->location = BELOW;
138643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    else if (psb_xrandr_info->primary_crtc->x == psb_xrandr_info->extend_crtc->width)
139643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		psb_xrandr_info->extend_crtc->location = LEFT_OF;
140643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    else if (psb_xrandr_info->extend_crtc->x == psb_xrandr_info->primary_crtc->width)
141643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		psb_xrandr_info->extend_crtc->location = RIGHT_OF;
142643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	}
143643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang#if 0
144643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	props = XRRListOutputProperties(dpy, psb_xrandr_info->extend_output->output_id, &nprop);
145643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	for (i = 0; i < nprop; i++) {
146643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    XRRGetOutputProperty(dpy, psb_xrandr_info->extend_output->output_id, props[i],
147643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang				 0, 100, False, False, AnyPropertyType, &actual_type, &actual_format,
148643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang				 &nitems, &bytes_after, &prop);
149643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
150643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    XRRQueryOutputProperty(dpy, psb_xrandr_info->extend_output->output_id, props[i]);
151643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    prop_name = XGetAtomName(dpy, props[i]);
152643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
153643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    if (!strcmp(prop_name, "ExtVideoMode"))
154643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		for (j = 0; j < nitems; j++)
155643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		    psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode = (int)((INT32*)prop)[j];
156643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    else if (!strcmp(prop_name, "ExtVideoMode_XRes"))
157643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		for (j = 0; j < nitems; j++)
158643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		    psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_XRes = (int)((INT32*)prop)[j];
159643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    else if (!strcmp(prop_name, "ExtVideoMode_YRes"))
160643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		for (j = 0; j < nitems; j++)
161643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		    psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_YRes = (int)((INT32*)prop)[j];
162643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    else if (!strcmp(prop_name, "ExtVideoMode_X_Offset"))
163643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		for (j = 0; j < nitems; j++)
164643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		    psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_X_Offset = (int)((INT32*)prop)[j];
165643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    else if (!strcmp(prop_name, "ExtVideoMode_Y_Offset"))
166643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		for (j = 0; j < nitems; j++)
167643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		    psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_Y_Offset = (int)((INT32*)prop)[j];
168643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    else if (!strcmp(prop_name, "ExtVideoMode_Center"))
169643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		for (j = 0; j < nitems; j++)
170643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		    psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_Center = (int)((INT32*)prop)[j];
171643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    else if (!strcmp(prop_name, "ExtVideoMode_SubTitle"))
172643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		for (j = 0; j < nitems; j++)
173643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		    psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_SubTitle = (int)((INT32*)prop)[j];
174643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	}
175643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
176643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	if (psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode == CLONE)
177643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    psb_xrandr_info->extend_crtc->location = NORMAL;
178643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	else if (psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode == EXTENDED) {
179643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    if (psb_xrandr_info->primary_crtc->y == psb_xrandr_info->extend_crtc->height)
180643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		psb_xrandr_info->extend_crtc->location = ABOVE;
181643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    else if (psb_xrandr_info->extend_crtc->y == psb_xrandr_info->primary_crtc->height)
182643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		psb_xrandr_info->extend_crtc->location = BELOW;
183643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    else if (psb_xrandr_info->primary_crtc->x == psb_xrandr_info->extend_crtc->width)
184643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		psb_xrandr_info->extend_crtc->location = LEFT_OF;
185643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    else if (psb_xrandr_info->extend_crtc->x == psb_xrandr_info->primary_crtc->width)
186643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		psb_xrandr_info->extend_crtc->location = RIGHT_OF;
187643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	}
188643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang#if 0
189643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	else if (psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode == EXTENDEDVIDEO) {
190643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    if (psb_xrandr_info->primary_crtc->y == psb_xrandr_info->extend_crtc->height)
191643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		psb_xrandr_info->extend_crtc->location = ABOVE;
192643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    else if (psb_xrandr_info->extend_crtc->y == psb_xrandr_info->primary_crtc->height)
193643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		psb_xrandr_info->extend_crtc->location = BELOW;
194643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    else if (psb_xrandr_info->primary_crtc->x == psb_xrandr_info->extend_crtc->width)
195643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		psb_xrandr_info->extend_crtc->location = LEFT_OF;
196643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    else if (psb_xrandr_info->extend_crtc->x == psb_xrandr_info->primary_crtc->width)
197643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		psb_xrandr_info->extend_crtc->location = RIGHT_OF;
198643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	}
199643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang#endif
200643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang#endif
201643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
202643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
203643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
204643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangvoid psb_xrandr_refresh()
205643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
206643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    int i, j;
207643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
208643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    XRROutputInfo *output_info;
209643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    XRRCrtcInfo *crtc_info;
210643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
211643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    psb_xrandr_crtc_p p_crtc;
212643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    psb_xrandr_output_p p_output;
213643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
214643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_lock(&psb_extvideo_mutex);
215643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
216643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    if (psb_xrandr_info)
217643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    {
218643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	if (psb_xrandr_info->hdmi_extvideo_prop)
219643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    free(psb_xrandr_info->hdmi_extvideo_prop);
220643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
221643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang 	free(psb_xrandr_info);
222643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
223643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	psb_xrandr_info = NULL;
224643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
225643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
226643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    psb_xrandr_info = (psb_xrandr_info_p)calloc(1, sizeof(psb_xrandr_info_s));
227643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    memset(psb_xrandr_info, 0, sizeof(psb_xrandr_info_s));
228643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
229643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    psb_xrandr_info->hdmi_extvideo_prop = (psb_extvideo_prop_p)calloc(1, sizeof(psb_extvideo_prop_s));
230643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    memset(psb_xrandr_info->hdmi_extvideo_prop, 0, sizeof(psb_extvideo_prop_s));
231643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
232643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    //deinit crtc
233643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    if (crtc_head)
234643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    {
235643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	while (crtc_head)
236643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	{
237643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    crtc_tail = crtc_head->next;
238643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
239643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    free(crtc_head->output);
240643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    free(crtc_head);
241643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
242643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    crtc_head = crtc_tail;
243643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	}
244643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	crtc_head = crtc_tail = NULL;
245643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
246643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
247643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    for (i = 0; i < res->ncrtc; i++)
248643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    {
249643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	crtc_info = XRRGetCrtcInfo (dpy, res, res->crtcs[i]);
250643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	if (crtc_info)
251643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	{
252643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    p_crtc = (psb_xrandr_crtc_p)calloc(1, sizeof(psb_xrandr_crtc_s));
253643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    if (!p_crtc)
254643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		psb__error_message("output of memory\n");
255643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
256643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    if (i == 0)
257643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		crtc_head = crtc_tail = p_crtc;
258643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
259643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    p_crtc->crtc_id = res->crtcs[i];
260643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    p_crtc->x = crtc_info->x;
261643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    p_crtc->y = crtc_info->y;
262643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    p_crtc->width = crtc_info->width;
263643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    p_crtc->height = crtc_info->height;
264643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    p_crtc->crtc_mode = crtc_info->mode;
265643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    p_crtc->noutput = crtc_info->noutput;
266643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
267643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    crtc_tail->next = p_crtc;
268643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    p_crtc->next = NULL;
269643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    crtc_tail = p_crtc;
270643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	}
271643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	else{
272643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    psb__error_message("failed to get crtc_info\n");
273643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang            pthread_mutex_unlock(&psb_extvideo_mutex);
274643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    return;
275643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	}
276643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
277643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
278643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    //deinit output
279643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    if (output_head)
280643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    {
281643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	while (output_head)
282643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	{
283643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    output_tail = output_head->next;
284643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
285643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    free(output_head);
286643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
287643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    output_head = output_tail;
288643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	}
289643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	output_head = output_tail = NULL;
290643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
291643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
292643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    for (i = 0; i < res->noutput; i++)
293643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    {
294643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	output_info = XRRGetOutputInfo(dpy, res, res->outputs[i]);
295643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	if (output_info)
296643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	{
297643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    p_output = (psb_xrandr_output_p)calloc(1, sizeof(psb_xrandr_output_s));
298643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    if (!output_info)
299643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		psb__error_message("output of memory\n");
300643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
301643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    if (i == 0)
302643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		output_head = output_tail = p_output;
303643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
304643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    p_output->output_id = res->outputs[i];
305643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
306643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    p_output->connection = output_info->connection;
307643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    if (p_output->connection == RR_Connected)
308643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		psb_xrandr_info->nconnected_output++;
309643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
310643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    p_output->mm_width = output_info->mm_width;
311643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    p_output->mm_height = output_info->mm_height;
312643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
313643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    strcpy(p_output->name, output_info->name);
314643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
315643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    if (output_info->crtc)
316643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		p_output->crtc = get_crtc_by_id(output_info->crtc);
317643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    else
318643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		p_output->crtc = NULL;
319643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
320643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
321643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    output_tail->next = p_output;
322643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    p_output->next = NULL;
323643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    output_tail = p_output;
324643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	}
325643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	else
326643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	{
327643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    psb__error_message("failed to get output_info\n");
328643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    pthread_mutex_unlock(&psb_extvideo_mutex);
329643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    return;
330643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	}
331643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
332643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
333643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    for (p_crtc = crtc_head; p_crtc; p_crtc = p_crtc->next)
334643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    {
335643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	crtc_info = XRRGetCrtcInfo (dpy, res, p_crtc->crtc_id);
336643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
337643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	p_crtc->output = (psb_xrandr_output_p)calloc(p_crtc->noutput, sizeof(psb_xrandr_output_s));
338643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
339643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	for (j = 0; j < crtc_info->noutput; j++)
340643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	{
341643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    p_output = get_output_by_id(crtc_info->outputs[j]);
342643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    if (p_output)
343643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		p_crtc->output[j] = p_output;
344643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    else
345643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		p_crtc->output[j] = NULL;
346643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	}
347643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
348643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
349643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    psb_extvideo_prop();
350643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_unlock(&psb_extvideo_mutex);
351643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
352643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
353643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangstatic void psb_xrandr_exit_thread()
354643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
355643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_lock(&psb_extvideo_mutex);
356643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
357643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    //free crtc
358643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    if (crtc_head)
359643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    {
360643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	while (crtc_head)
361643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	{
362643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    crtc_tail = crtc_head->next;
363643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
364643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    free(crtc_head);
365643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
366643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    crtc_head = crtc_tail;
367643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	}
368643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	crtc_head = crtc_tail = NULL;
369643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
370643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
371643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    //free output
372643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    if (output_head)
373643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    {
374643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	while (output_head)
375643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	{
376643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    output_tail = output_head->next;
377643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
378643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    free(output_head);
379643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
380643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    output_head = output_tail;
381643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	}
382643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	output_head = output_tail = NULL;
383643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
384643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
385643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    if (psb_xrandr_info->hdmi_extvideo_prop)
386643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	free(psb_xrandr_info->hdmi_extvideo_prop);
387643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
388643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    if (psb_xrandr_info)
389643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	free(psb_xrandr_info);
390643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
391643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_unlock(&psb_extvideo_mutex);
392643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_destroy(&psb_extvideo_mutex);
393643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
394643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    psb__information_message("xrandr thread exit safely\n");
395643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_exit(NULL);
396643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
397643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
398643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangvoid psb_xrandr_thread()
399643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
400643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    int event_base, error_base;
401643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    XEvent event;
402643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    XRRQueryExtension(dpy, &event_base, &error_base);
403643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    XRRSelectInput(dpy, root, RRScreenChangeNotifyMask | RRCrtcChangeNotifyMask | RROutputChangeNotifyMask | RROutputPropertyNotifyMask);
404643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
405643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    psb__information_message("psb xrandr thread start\n");
406643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
407643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    while (1)
408643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    {
409643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	XNextEvent(dpy, (XEvent *)&event);
410643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	if (event.type == ClientMessage) {
411643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    psb__information_message("receive ClientMessage event, thread should exit\n");
412643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    XClientMessageEvent *evt;
413643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    evt = (XClientMessageEvent*)&event;
414643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    if (evt->message_type == psb_exit_atom)
415643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		psb_xrandr_exit_thread();
416643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	}
417643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	switch (event.type - event_base) {
418643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    case RRNotify_OutputChange:
419643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		XRRUpdateConfiguration (&event);
420643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		psb__information_message("receive RRNotify_OutputChange event, refresh output/crtc info\n");
421643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		psb_xrandr_refresh();
422643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		break;
423643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    default:
424643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		break;
425643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        }
426643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
427643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
428643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
429643778eb83b8dfe3bbf433855b311d4fefa95e21Fei JiangWindow psb_xrandr_create_full_screen_window()
430643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
431643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    int x, y, width, height;
432643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    Window win;
433643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
434643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    x = psb_xrandr_info->extend_crtc->x;
435643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    y = psb_xrandr_info->extend_crtc->y;
436643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    width = psb_xrandr_info->extend_crtc->width;
437643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    height = psb_xrandr_info->extend_crtc->height;
438643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
439643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    win = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), x, y, width, height, 0, 0, 0);
440643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
441643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    MWMHints mwmhints;
442643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    Atom MOTIF_WM_HINTS;
443643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
444643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    mwmhints.flags = MWM_HINTS_DECORATIONS;
445643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    mwmhints.decorations = 0; /* MWM_DECOR_BORDER */
446643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    MOTIF_WM_HINTS = XInternAtom(dpy, "_MOTIF_WM_HINTS", False);
447643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    XChangeProperty(dpy, win, MOTIF_WM_HINTS, MOTIF_WM_HINTS, sizeof(long)*8,
448643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang		    PropModeReplace, (unsigned char*) &mwmhints, sizeof(mwmhints)/sizeof(long));
449643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
450643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    XSetWindowAttributes attributes;
451643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    attributes.override_redirect = 1;
452643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    unsigned long valuemask;
453643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    valuemask = CWOverrideRedirect ;
454643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    XChangeWindowAttributes(dpy, win, valuemask, &attributes);
455643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
456643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    XMapWindow(dpy, win);
457643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    XFlush(dpy);
458643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    return win;
459643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
460643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
461643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang#if 0
462643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangvoid show_current()
463643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
464643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    int i, ret;
465643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    int x, y, widht, height;
466643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    psb_xrandr_location location;
467643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
468643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    ret = pthread_mutex_trylock(&psb_extvideo_mutex);
469643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    if (ret != 0)
470643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    {
471643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	printf("mutex busy, should not read\n");
472643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	return;
473643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
474643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
475643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    if (psb_xrandr_single_mode())
476643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    {
477643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	printf("single mode\n");
478643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	printf("primary crtc info:\n");
479643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
480643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	ret = psb_xrandr_primary_crtc_coordinate(&x, &y, &widht, &height);
481643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
482643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	if (!ret)
483643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    printf("failed to get primary crtc info\n");
484643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	else
485643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	{
486643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    printf("\tx = %d, y = %d, widht = %d, height = %d\n", x, y, widht, height);
487643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    printf("\tcrtc id: %08x, crtc mode: %08x, ", psb_xrandr_info->primary_crtc->crtc_id, psb_xrandr_info->primary_crtc->crtc_mode);
488643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    for (i = 0; i < psb_xrandr_info->primary_crtc->noutput; i++)
489643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    printf("output: %08x\n", psb_xrandr_info->primary_crtc->output[i]->output_id);
490643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	}
491643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
492643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    else if (psb_xrandr_clone_mode())
493643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    {
494643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	printf("clone mode\n");
495643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
496643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	ret = psb_xrandr_primary_crtc_coordinate(&x, &y, &widht, &height);
497643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
498643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	if (!ret)
499643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    printf("failed to get primary crtc info\n");
500643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	else
501643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	{
502643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    printf("primary crtc info:\n");
503643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    printf("\tx = %d, y = %d, widht = %d, height = %d\n", x, y, widht, height);
504643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    printf("\tcrtc id: %08x, crtc mode: %08x, ", psb_xrandr_info->primary_crtc->crtc_id, psb_xrandr_info->primary_crtc->crtc_mode);
505643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    for (i = 0; i < psb_xrandr_info->primary_crtc->noutput; i++)
506643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    printf("output: %08x\n", psb_xrandr_info->primary_crtc->output[i]->output_id);
507643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	}
508643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
509643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	ret = psb_xrandr_extend_crtc_coordinate(&x, &y, &widht, &height, &location);
510643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
511643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	if (!ret)
512643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    printf("failed to get clone crtc info\n");
513643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	else
514643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	{
515643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    printf("clone crtc info:\n");
516643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    printf("\tx = %d, y = %d, widht = %d, height = %d, location = %s\n", x, y, widht, height, location2string(location));
517643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    printf("\tcrtc id: %08x, crtc mode: %08x, ", psb_xrandr_info->extend_crtc->crtc_id, psb_xrandr_info->extend_crtc->crtc_mode);
518643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    for (i = 0; i < psb_xrandr_info->extend_crtc->noutput; i++)
519643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    printf("output: %08x\n", psb_xrandr_info->extend_crtc->output[i]->output_id);
520643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	}
521643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
522643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    else if (psb_xrandr_extend_mode())
523643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    {
524643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	printf("extend mode\n");
525643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	ret = psb_xrandr_primary_crtc_coordinate(&x, &y, &widht, &height);
526643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
527643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	if (!ret)
528643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    printf("failed to get primary crtc info\n");
529643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	else
530643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	{
531643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    printf("primary crtc info:\n");
532643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    printf("\tx = %d, y = %d, widht = %d, height = %d\n", x, y, widht, height);
533643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    printf("\tcrtc id: %08x, crtc mode: %08x, ", psb_xrandr_info->primary_crtc->crtc_id, psb_xrandr_info->primary_crtc->crtc_mode);
534643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    for (i = 0; i < psb_xrandr_info->primary_crtc->noutput; i++)
535643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    printf("output: %08x\n", psb_xrandr_info->primary_crtc->output[i]->output_id);
536643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	}
537643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
538643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	ret = psb_xrandr_extend_crtc_coordinate(&x, &y, &widht, &height, &location);
539643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
540643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	if (!ret)
541643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    printf("failed to get extend crtc info\n");
542643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	else
543643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	{
544643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    printf("extend crtc info:\n");
545643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    printf("\tx = %d, y = %d, widht = %d, height = %d, location = %s\n", x, y, widht, height, location2string(location));
546643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    printf("\tcrtc id: %08x, crtc mode: %08x, ", psb_xrandr_info->extend_crtc->crtc_id, psb_xrandr_info->extend_crtc->crtc_mode);
547643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    for (i = 0; i < psb_xrandr_info->extend_crtc->noutput; i++)
548643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    printf("output: %08x\n", psb_xrandr_info->extend_crtc->output[i]->output_id);
549643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	}
550643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
551643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    else if (psb_xrandr_extvideo_mode())
552643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	printf("extvideo mode\n");
553643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
554643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_unlock(&psb_extvideo_mutex);
555643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
556643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang#endif
557643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangint psb_xrandr_hdmi_connected()
558643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
559643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    int ret;
560643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_lock(&psb_extvideo_mutex);
561643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    ret = psb_xrandr_info->hdmi_connected;
562643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_unlock(&psb_extvideo_mutex);
563643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    return ret;
564643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
565643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
566643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangint psb_xrandr_mipi1_connected()
567643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
568643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    int ret;
569643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_lock(&psb_extvideo_mutex);
570643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    ret = psb_xrandr_info->mipi1_connected;
571643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_unlock(&psb_extvideo_mutex);
572643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    return ret;
573643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
574643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
575643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangint psb_xrandr_single_mode()
576643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
577643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    int ret;
578643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_lock(&psb_extvideo_mutex);
579643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    ret = (psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode == SINGLE) ? 1 : 0;
580643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_unlock(&psb_extvideo_mutex);
581643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    return ret;
582643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
583643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
584643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangint psb_xrandr_clone_mode()
585643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
586643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    int ret;
587643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_lock(&psb_extvideo_mutex);
588643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    ret = (psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode == CLONE) ? 1 : 0;
589643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_unlock(&psb_extvideo_mutex);
590643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    return ret;
591643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
592643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
593643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangint psb_xrandr_extend_mode()
594643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
595643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    int ret;
596643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_lock(&psb_extvideo_mutex);
597643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    ret = (psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode == EXTENDED) ? 1 : 0;
598643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_unlock(&psb_extvideo_mutex);
599643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    return ret;
600643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
601643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
602643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangint psb_xrandr_extvideo_mode()
603643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
604643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    int ret;
605643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_lock(&psb_extvideo_mutex);
606643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    ret = (psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode == EXTENDEDVIDEO) ? 1 : 0;
607643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_unlock(&psb_extvideo_mutex);
608643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    return ret;
609643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
610643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
611643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiangint psb_xrandr_outputchanged()
612643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
613643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    int ret;
614643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_lock(&psb_extvideo_mutex);
615643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    if (psb_xrandr_info->output_changed){
616643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        psb_xrandr_info->output_changed = 0;
617643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        ret = 1;
618643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    } else
619643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        ret = 0;
620643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_unlock(&psb_extvideo_mutex);
621643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    return ret;
622643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
623643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
624643778eb83b8dfe3bbf433855b311d4fefa95e21Fei JiangVAStatus psb_xrandr_extvideo_mode_prop(unsigned int *xres, unsigned int *yres, unsigned int *xoffset,
625643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang			      unsigned int *yoffset, psb_extvideo_center *center, psb_extvideo_subtitle *subtitle)
626643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
627643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_lock(&psb_extvideo_mutex);
628643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
629643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    if (psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode != EXTENDEDVIDEO){
630643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        pthread_mutex_unlock(&psb_extvideo_mutex);
631643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	return VA_STATUS_ERROR_UNKNOWN;
632643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
633643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
634643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    *xres = psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_XRes;
635643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    *yres = psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_YRes;
636643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    *xoffset = psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_X_Offset;
637643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    *yoffset = psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_Y_Offset;
638643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    *center = psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_Center;
639643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    *subtitle = psb_xrandr_info->hdmi_extvideo_prop->ExtVideoMode_SubTitle;
640643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
641643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_unlock(&psb_extvideo_mutex);
642643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    return VA_STATUS_SUCCESS;
643643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
644643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
645643778eb83b8dfe3bbf433855b311d4fefa95e21Fei JiangVAStatus psb_xrandr_primary_crtc_coordinate(int *x, int *y, int *width, int *height)
646643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
647643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_lock(&psb_extvideo_mutex);
648643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    psb_xrandr_crtc_p crtc = psb_xrandr_info->primary_crtc;;
649643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    if (crtc) {
650643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	*x = crtc->x;
651643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	*y = crtc->y;
652643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	*width = crtc->width - 1;
653643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	*height = crtc->height - 1;
654643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	pthread_mutex_unlock(&psb_extvideo_mutex);
655643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	psb__information_message("crtc %08x coordinate: x = %d, y = %d, widht = %d, height = %d\n",
656643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang				  psb_xrandr_info->primary_crtc->crtc_id, x, y, width, height);
657643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	return VA_STATUS_SUCCESS;
658643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
659643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_unlock(&psb_extvideo_mutex);
660643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    return VA_STATUS_ERROR_UNKNOWN;
661643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
662643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
663643778eb83b8dfe3bbf433855b311d4fefa95e21Fei JiangVAStatus psb_xrandr_extend_crtc_coordinate(int *x, int *y, int *width, int *height, psb_xrandr_location *location)
664643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
665643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_lock(&psb_extvideo_mutex);
666643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
667643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    if (psb_xrandr_info->nconnected_output == 1 || !psb_xrandr_info->extend_crtc){
668643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	pthread_mutex_unlock(&psb_extvideo_mutex);
669643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	return VA_STATUS_ERROR_UNKNOWN;
670643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
671643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
672643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    *x = psb_xrandr_info->extend_crtc->x;
673643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    *y = psb_xrandr_info->extend_crtc->y;
674643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    *width = psb_xrandr_info->extend_crtc->width - 1;
675643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    *height = psb_xrandr_info->extend_crtc->height - 1;
676643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    *location = psb_xrandr_info->extend_crtc->location;
677643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
678643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_unlock(&psb_extvideo_mutex);
679643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    psb__information_message("crtc %08x coordinate: x = %d, y = %d, widht = %d, height = %d, location = %s\n",
680643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang			     psb_xrandr_info->extend_crtc->crtc_id, x, y, width, height, location2string(psb_xrandr_info->extend_crtc->location));
681643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    return VA_STATUS_SUCCESS;
682643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
683643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
684643778eb83b8dfe3bbf433855b311d4fefa95e21Fei JiangVAStatus psb_xrandr_deinit(Drawable draw)
685643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
686643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang#ifdef USE_XRANDR_THREAD
687643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    int ret;
688643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    XSelectInput(dpy, draw, StructureNotifyMask);
689643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    XClientMessageEvent xevent;
690643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    xevent.type = ClientMessage;
691643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    xevent.message_type = psb_exit_atom;
692643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    xevent.window = draw;
693643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    xevent.format = 32;
694643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    ret = XSendEvent(dpy, draw, 0, 0, (XEvent*)&xevent);
695643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    XFlush(dpy);
696643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    if (ret == 0) {
697643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	psb__information_message("send thread exit event to drawable: %08x\n success", draw);
698643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	return VA_STATUS_SUCCESS;
699643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
700643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    else {
701643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	psb__information_message("send thread exit event to drawable: %08x failed\n", draw);
702643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	return VA_STATUS_ERROR_UNKNOWN;
703643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
704643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang#else
705643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    //free crtc
706643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    if (crtc_head)
707643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    {
708643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	while (crtc_head)
709643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	{
710643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    crtc_tail = crtc_head->next;
711643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
712643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    free(crtc_head);
713643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
714643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    crtc_head = crtc_tail;
715643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	}
716643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	crtc_head = crtc_tail = NULL;
717643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
718643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
719643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    //free output
720643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    if (output_head)
721643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    {
722643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	while (output_head)
723643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	{
724643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    output_tail = output_head->next;
725643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
726643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    free(output_head);
727643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
728643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	    output_head = output_tail;
729643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	}
730643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	output_head = output_tail = NULL;
731643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
732643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
733643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    if (psb_xrandr_info->hdmi_extvideo_prop)
734643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	free(psb_xrandr_info->hdmi_extvideo_prop);
735643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
736643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    if (psb_xrandr_info)
737643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	free(psb_xrandr_info);
738643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
739643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_destroy(&psb_extvideo_mutex);
740643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang#endif
741643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
742643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
743643778eb83b8dfe3bbf433855b311d4fefa95e21Fei JiangVAStatus psb_xrandr_init (VADriverContextP ctx)
744643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang{
745643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    int	major, minor;
746643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_t id;
747643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
748643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    dpy = (Display *)ctx->native_dpy;
749643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    screen = DefaultScreen (dpy);
750643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    psb_exit_atom = XInternAtom(dpy, "psb_exit_atom", 0);
751643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
752643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    if (screen >= ScreenCount (dpy)) {
753643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	psb__error_message("Invalid screen number %d (display has %d)\n",
754643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang			    screen, ScreenCount (dpy));
755643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	return VA_STATUS_ERROR_UNKNOWN;
756643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
757643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
758643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    root = RootWindow (dpy, screen);
759643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
760643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    if (!XRRQueryVersion (dpy, &major, &minor))
761643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    {
762643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	psb__error_message("RandR extension missing\n");
763643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	return VA_STATUS_ERROR_UNKNOWN;
764643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
765643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
766643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    res = XRRGetScreenResources (dpy, root);
767643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    if (!res)
768643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	psb__error_message("failed to get screen resources\n");
769643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
770643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_mutex_init(&psb_extvideo_mutex, NULL);
771643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
772643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    psb_xrandr_refresh();
773643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang#ifdef USE_XRANDR_THREAD
774643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    pthread_create(&id, NULL, (void*)psb_xrandr_thread, NULL);
775643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang#endif
776643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    /*while(1) { sleep(1);
777643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang	show_current();
778643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }*/
779643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
780643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    return 0;
781643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang}
782