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