uint2 MCUIDC::getwidth() { MCGFloat t_scale; t_scale = MCResGetPixelScale(); return ceil(device_getwidth() / t_scale) ; }
// IM-2014-01-29: [[ HiDPI ]] Apply screen struts to given MCDisplay array bool MCScreenDC::apply_partial_struts(MCDisplay *p_displays, uint32_t p_display_count) { if (MCstrutpartialatom == None || MCclientlistatom == None) return false; bool t_success = true; x11::Atom t_ret; int t_format, t_status; x11::Window *t_clients = nil; unsigned long t_client_count, t_after; x11::Atom XA_WINDOW = x11::gdk_x11_atom_to_xatom_for_display(dpy, gdk_atom_intern_static_string("WINDOW")); x11::Atom XA_CARDINAL = x11::gdk_x11_atom_to_xatom_for_display(dpy, gdk_atom_intern_static_string("CARDINAL")); t_status = x11::XGetWindowProperty(x11::gdk_x11_display_get_xdisplay(dpy), x11::gdk_x11_drawable_get_xid(getroot()), x11::gdk_x11_atom_to_xatom_for_display(dpy, MCclientlistatom), 0, -1, False,XA_WINDOW, &t_ret, &t_format, &t_client_count, &t_after, (unsigned char **)&t_clients); t_success = t_status == Success && t_ret == XA_WINDOW && t_format == 32; if (t_success) { int32_t t_screenwidth, t_screenheight; t_screenwidth = device_getwidth(); t_screenheight = device_getheight(); for (uindex_t i = 0; t_success && i < t_client_count; i++) { unsigned long t_strut_count; unsigned long *t_struts = nil; t_status = x11::XGetWindowProperty(x11::gdk_x11_display_get_xdisplay(dpy), t_clients[i], x11::gdk_x11_atom_to_xatom_for_display(dpy, MCstrutpartialatom), 0, 12, False, XA_CARDINAL, &t_ret, &t_format, &t_strut_count, &t_after, (unsigned char **)&t_struts); if (t_status == Success && t_ret == XA_CARDINAL && t_format == 32 && t_strut_count == 12) { MCRectangle t_strut_rect = {0,0,0,0}; MCRectangle t_strut_test = {0,0,0,0}; if (t_struts[0] > 0) { // LEFT t_strut_rect.x = t_struts[0]; t_strut_rect.y = 0; t_strut_rect.width = t_screenwidth - t_strut_rect.x; t_strut_rect.height = t_screenheight; t_strut_test = t_strut_rect; t_strut_test.y = t_struts[4]; t_strut_test.height = t_struts[5] - t_strut_test.y; } else if (t_struts[1] > 0) { // RIGHT t_strut_rect.x = 0; t_strut_rect.y = 0; t_strut_rect.width = t_screenwidth - t_struts[1]; t_strut_rect.height = t_screenheight; t_strut_test = t_strut_rect; t_strut_test.y = t_struts[6]; t_strut_test.height = t_struts[7] - t_strut_test.y; } else if (t_struts[2] > 0) { // TOP t_strut_rect.x = 0; t_strut_rect.y = t_struts[2]; t_strut_rect.width = t_screenwidth; t_strut_rect.height = t_screenheight - t_strut_rect.y; t_strut_test = t_strut_rect; t_strut_test.x = t_struts[8]; t_strut_test.width = t_struts[9] - t_strut_test.x; } else if (t_struts[3] > 0) { // BOTTOM t_strut_rect.x = 0; t_strut_rect.y = 0; t_strut_rect.width = t_screenwidth; t_strut_rect.height = t_screenheight - t_struts[3]; t_strut_test = t_strut_rect; t_strut_test.x = t_struts[10]; t_strut_test.width = t_struts[11] - t_strut_test.x; } for (uindex_t s = 0; s < p_display_count; s++) { MCRectangle t_workarea = p_displays[s].workarea; MCRectangle t_test = MCU_intersect_rect(t_strut_test, t_workarea); if (t_test.width != 0 && t_test.height != 0) t_workarea = MCU_intersect_rect(t_strut_rect, t_workarea); p_displays[s].workarea = t_workarea; } } if (t_struts != nil) x11::XFree(t_struts); } } if (t_clients != nil) x11::XFree(t_clients); return t_success; }