获取有关 X11 中离鼠标光标最近的显示器的信息 [英] Getting information about nearest monitor to mouse cursor in X11

查看:20
本文介绍了获取有关 X11 中离鼠标光标最近的显示器的信息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在多显示器系统中,我需要获取有关距离鼠标光标位置最近的显示器的大小和坐标等信息.我之前在 Windows 上做过,我想知道在 Linux X11 上怎么做.

I need to get information such as size and coordinates about nearest monitor to the mouse cursor position in multi-monitor systems. I've done it before in Windows and I want to know how to do it in Linux X11.

使用下面的代码我可以测量整个屏幕大小的总和,但不能单独测量每个显示器.

Using the code below I can measure the sum of whole screens size but cannot measure each monitor separately.

Screen *screen = DefaultScreenOfDisplay(DisplayHandle);
int xx = screen->width / 2 - Settings::WindowWidth / 2;
int yy = screen->height / 2 - Settings::WindowHeight / 2;

我之前的代码:

POINT mouse_position;
GetCursorPos(&mouse_position);
HMONITOR hMonitor = MonitorFromPoint(mouse_position, MONITOR_DEFAULTTOPRIMARY);
MONITORINFOEX monitor_info;
memset(&monitor_info, 0, sizeof(MONITORINFOEX));
monitor_info.cbSize = sizeof(MONITORINFOEX);
GetMonitorInfo(hMonitor, &monitor_info);

// CREATE WINDOW IN CENTER OF MONITOR //
int edge = GetSystemMetrics(SM_CXEDGE);
int fixed_frame = GetSystemMetrics(SM_CXFIXEDFRAME);
int monitor_width =  monitor_info.rcMonitor.right - monitor_info.rcMonitor.left;
int monitor_height =  monitor_info.rcMonitor.bottom - monitor_info.rcMonitor.top;
int xx = monitor_width / 2 - Settings::WindowWidth / 2;
int yy = monitor_height / 2 - Settings::WindowHeight / 2;
int win_x = xx - edge + monitor_info.rcMonitor.left;
int win_y = yy - fixed_frame + monitor_info.rcMonitor.top;

谢谢

推荐答案

如果您有两台显示器组成一个桌面,请使用 Xinerama 扩展.下面的代码选择可用显示器的最大屏幕,但您会明白的.

If you have two monitors that form a single desktop, use the Xinerama extension. The code below picks the largest screen of the available monitors, but you'll get the idea.

#include <X11/extensions/Xinerama.h>

// By default go fullscreen
m_winWidth = DisplayWidth (m_display, m_screenNo);
m_winHeight = DisplayHeight (m_display, m_screenNo);
// But, with Xinerama, use the largest physical screen
if (XineramaIsActive (m_display))
{
  int m = 0;
  int pixels = 0;

  XineramaScreenInfo *xs = XineramaQueryScreens (m_display, &m);

  if (0 != xs && m > 0)
  {
    for (int i = 0; i < m; i++)
    {
      //printf ("%dx%d, [%d, %d] %d\n", xs[i].width, xs[i].height, xs[i].x_org, xs[i].y_org, xs[i].screen_number);
      if (xs[i].width * xs[i].height > pixels)
      {
        m_xineramaScreen = xs[i].screen_number; // pick screen
        pixels = xs[i].width * xs[i].height;
        m_winWidth = xs[i].width;
        m_winHeight = xs[i].height;
      }
    }

    XFree (xs);
  }
}

这篇关于获取有关 X11 中离鼠标光标最近的显示器的信息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆