screen_c.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. //#include "../base/os.h"
  2. #if defined(IS_MACOSX)
  3. #include <ApplicationServices/ApplicationServices.h>
  4. #elif defined(USE_X11)
  5. #include <X11/Xlib.h>
  6. #include <X11/Xresource.h>
  7. // #include "../base/xdisplay_c.h"
  8. #endif
  9. intptr scaleX();
  10. double sys_scale(int32_t display_id) {
  11. #if defined(IS_MACOSX)
  12. CGDirectDisplayID displayID = (CGDirectDisplayID) display_id;
  13. if (displayID == -1) {
  14. displayID = CGMainDisplayID();
  15. }
  16. CGDisplayModeRef modeRef = CGDisplayCopyDisplayMode(displayID);
  17. double pixelWidth = CGDisplayModeGetPixelWidth(modeRef);
  18. double targetWidth = CGDisplayModeGetWidth(modeRef);
  19. return pixelWidth / targetWidth;
  20. #elif defined(USE_X11)
  21. Display *dpy = XOpenDisplay(NULL);
  22. int scr = 0; /* Screen number */
  23. double xres = ((((double) DisplayWidth(dpy, scr)) * 25.4) /
  24. ((double) DisplayWidthMM(dpy, scr)));
  25. char *rms = XResourceManagerString(dpy);
  26. if (rms) {
  27. XrmDatabase db = XrmGetStringDatabase(rms);
  28. if (db) {
  29. XrmValue value;
  30. char *type = NULL;
  31. if (XrmGetResource(db, "Xft.dpi", "String", &type, &value)) {
  32. if (value.addr) {
  33. xres = atof(value.addr);
  34. }
  35. }
  36. XrmDestroyDatabase(db);
  37. }
  38. }
  39. XCloseDisplay (dpy);
  40. return xres / 96.0;
  41. #elif defined(IS_WINDOWS)
  42. double s = scaleX() / 96.0;
  43. return s;
  44. #endif
  45. }
  46. intptr scaleX(){
  47. #if defined(IS_MACOSX)
  48. return 0;
  49. #elif defined(USE_X11)
  50. return 0;
  51. #elif defined(IS_WINDOWS)
  52. // Get desktop dc
  53. HDC desktopDc = GetDC(NULL);
  54. // Get native resolution
  55. intptr horizontalDPI = GetDeviceCaps(desktopDc, LOGPIXELSX);
  56. return horizontalDPI;
  57. #endif
  58. }
  59. MMSizeInt32 getMainDisplaySize(void) {
  60. #if defined(IS_MACOSX)
  61. CGDirectDisplayID displayID = CGMainDisplayID();
  62. CGRect displayRect = CGDisplayBounds(displayID);
  63. CGSize size = displayRect.size;
  64. return MMSizeInt32Make((int32_t)size.width, (int32_t)size.height);
  65. #elif defined(USE_X11)
  66. Display *display = XGetMainDisplay();
  67. const int screen = DefaultScreen(display);
  68. return MMSizeInt32Make(
  69. (int32_t)DisplayWidth(display, screen),
  70. (int32_t)DisplayHeight(display, screen));
  71. #elif defined(IS_WINDOWS)
  72. return MMSizeInt32Make(
  73. (int32_t)GetSystemMetrics(SM_CXSCREEN),
  74. (int32_t)GetSystemMetrics(SM_CYSCREEN));
  75. #endif
  76. }
  77. MMRectInt32 getScreenRect(int32_t display_id) {
  78. #if defined(IS_MACOSX)
  79. CGDirectDisplayID displayID = (CGDirectDisplayID) display_id;
  80. if (display_id == -1) {
  81. displayID = CGMainDisplayID();
  82. }
  83. CGRect displayRect = CGDisplayBounds(displayID);
  84. CGPoint point = displayRect.origin;
  85. CGSize size = displayRect.size;
  86. return MMRectInt32Make(
  87. (int32_t)point.x, (int32_t)point.y,
  88. (int32_t)size.width, (int32_t)size.height);
  89. #elif defined(USE_X11)
  90. Display *display = XGetMainDisplay();
  91. const int screen = DefaultScreen(display);
  92. return MMRectInt32Make(
  93. (int32_t)0, (int32_t)0,
  94. (int32_t)DisplayWidth(display, screen),
  95. (int32_t)DisplayHeight(display, screen));
  96. #elif defined(IS_WINDOWS)
  97. if (GetSystemMetrics(SM_CMONITORS) == 1
  98. || display_id == -1 || display_id == 0) {
  99. return MMRectInt32Make(
  100. (int32_t)0,
  101. (int32_t)0,
  102. (int32_t)GetSystemMetrics(SM_CXSCREEN),
  103. (int32_t)GetSystemMetrics(SM_CYSCREEN));
  104. } else {
  105. return MMRectInt32Make(
  106. (int32_t)GetSystemMetrics(SM_XVIRTUALSCREEN),
  107. (int32_t)GetSystemMetrics(SM_YVIRTUALSCREEN),
  108. (int32_t)GetSystemMetrics(SM_CXVIRTUALSCREEN),
  109. (int32_t)GetSystemMetrics(SM_CYVIRTUALSCREEN));
  110. }
  111. #endif
  112. }
  113. bool pointVisibleOnMainDisplay(MMPointInt32 point){
  114. MMSizeInt32 displaySize = getMainDisplaySize();
  115. return point.x < displaySize.w && point.y < displaySize.h;
  116. }