📄 gdkscreen-x11.c
字号:
* * Since: 2.2 **/void gdk_screen_get_monitor_geometry (GdkScreen *screen, gint monitor_num, GdkRectangle *dest){ g_return_if_fail (GDK_IS_SCREEN (screen)); g_return_if_fail (monitor_num < GDK_SCREEN_X11 (screen)->num_monitors); g_return_if_fail (monitor_num >= 0); *dest = GDK_SCREEN_X11 (screen)->monitors[monitor_num];}/** * gdk_x11_screen_get_xscreen: * @screen: a #GdkScreen. * @returns: an Xlib <type>Screen*</type> * * Returns the screen of a #GdkScreen. * * Since: 2.2 */Screen *gdk_x11_screen_get_xscreen (GdkScreen *screen){ return GDK_SCREEN_X11 (screen)->xscreen;}/** * gdk_x11_screen_get_screen_number: * @screen: a #GdkScreen. * @returns: the position of @screen among the screens of * its display. * * Returns the index of a #GdkScreen. * * Since: 2.2 */intgdk_x11_screen_get_screen_number (GdkScreen *screen){ return GDK_SCREEN_X11 (screen)->screen_num;}GdkScreen *_gdk_x11_screen_new (GdkDisplay *display, gint screen_number) { GdkScreen *screen; GdkScreenX11 *screen_x11; GdkDisplayX11 *display_x11 = GDK_DISPLAY_X11 (display); screen = g_object_new (GDK_TYPE_SCREEN_X11, NULL); screen_x11 = GDK_SCREEN_X11 (screen); screen_x11->display = display; screen_x11->xdisplay = display_x11->xdisplay; screen_x11->xscreen = ScreenOfDisplay (display_x11->xdisplay, screen_number); screen_x11->screen_num = screen_number; screen_x11->xroot_window = RootWindow (display_x11->xdisplay,screen_number); screen_x11->wmspec_check_window = None; /* we want this to be always non-null */ screen_x11->window_manager_name = g_strdup ("unknown"); init_xinerama_support (screen); init_randr_support (screen); _gdk_visual_init (screen); _gdk_windowing_window_init (screen); return screen;}#ifdef HAVE_XINERAMAstatic gbooleancheck_solaris_xinerama (GdkScreen *screen){#ifdef HAVE_SOLARIS_XINERAMA if (XineramaGetState (GDK_SCREEN_XDISPLAY (screen), gdk_screen_get_number (screen))) { XRectangle monitors[MAXFRAMEBUFFERS]; unsigned char hints[16]; gint result; GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (screen); result = XineramaGetInfo (GDK_SCREEN_XDISPLAY (screen), gdk_screen_get_number (screen), monitors, hints, &screen_x11->num_monitors); /* Yes I know it should be Success but the current implementation returns the num of monitor*/ if (result == 0) { /* FIXME: We need to trap errors, since XINERAMA isn't always XINERAMA. */ g_error ("error while retrieving Xinerama information"); } else { int i; screen_x11->monitors = g_new0 (GdkRectangle, screen_x11->num_monitors); for (i = 0; i < screen_x11->num_monitors; i++) { screen_x11->monitors[i].x = monitors[i].x; screen_x11->monitors[i].y = monitors[i].y; screen_x11->monitors[i].width = monitors[i].width; screen_x11->monitors[i].height = monitors[i].height; } return TRUE; } }#endif /* HAVE_SOLARIS_XINERAMA */ return FALSE;}static gbooleancheck_xfree_xinerama (GdkScreen *screen){#ifdef HAVE_XFREE_XINERAMA if (XineramaIsActive (GDK_SCREEN_XDISPLAY (screen))) { GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (screen); XineramaScreenInfo *monitors = XineramaQueryScreens (GDK_SCREEN_XDISPLAY (screen), &screen_x11->num_monitors); if (screen_x11->num_monitors <= 0) { /* FIXME: We need to trap errors, since XINERAMA isn't always XINERAMA. * I don't think the num_monitors <= 0 check has any validity. */ g_error ("error while retrieving Xinerama information"); } else { int i; screen_x11->monitors = g_new0 (GdkRectangle, screen_x11->num_monitors); for (i = 0; i < screen_x11->num_monitors; i++) { screen_x11->monitors[i].x = monitors[i].x_org; screen_x11->monitors[i].y = monitors[i].y_org; screen_x11->monitors[i].width = monitors[i].width; screen_x11->monitors[i].height = monitors[i].height; } XFree (monitors); return TRUE; } }#endif /* HAVE_XFREE_XINERAMA */ return FALSE;}#endif /* HAVE_XINERAMA */static voidinit_xinerama_support (GdkScreen * screen){ GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (screen);#ifdef HAVE_XINERAMA int opcode, firstevent, firsterror;#endif if (screen_x11->monitors) g_free (screen_x11->monitors); #ifdef HAVE_XINERAMA if (XQueryExtension (GDK_SCREEN_XDISPLAY (screen), "XINERAMA", &opcode, &firstevent, &firsterror)) { if (check_solaris_xinerama (screen) || check_xfree_xinerama (screen)) return; }#endif /* HAVE_XINERAMA */ /* No Xinerama */#ifdef G_ENABLE_DEBUG if (_gdk_debug_flags & GDK_DEBUG_XINERAMA) { /* Fake Xinerama mode by splitting the screen into 4 monitors. * Also draw a little cross to make the monitor boundaries visible. */ XSetWindowAttributes atts; Window win; gint w, h; w = WidthOfScreen (screen_x11->xscreen); h = HeightOfScreen (screen_x11->xscreen); screen_x11->num_monitors = 4; screen_x11->monitors = g_new0 (GdkRectangle, 4); screen_x11->monitors[0].x = 0; screen_x11->monitors[0].y = 0; screen_x11->monitors[0].width = w / 2; screen_x11->monitors[0].height = h / 2; screen_x11->monitors[1].x = w / 2; screen_x11->monitors[1].y = 0; screen_x11->monitors[1].width = w / 2; screen_x11->monitors[1].height = h / 2; screen_x11->monitors[2].x = 0; screen_x11->monitors[2].y = h / 2; screen_x11->monitors[2].width = w / 2; screen_x11->monitors[2].height = h / 2; screen_x11->monitors[3].x = w / 2; screen_x11->monitors[3].y = h / 2; screen_x11->monitors[3].width = w / 2; screen_x11->monitors[3].height = h / 2; atts.override_redirect = 1; atts.background_pixel = WhitePixel(GDK_SCREEN_XDISPLAY (screen), screen_x11->screen_num); win = XCreateWindow(GDK_SCREEN_XDISPLAY (screen), screen_x11->xroot_window, 0, h / 2, w, 1, 0, DefaultDepth(GDK_SCREEN_XDISPLAY (screen), screen_x11->screen_num), InputOutput, DefaultVisual(GDK_SCREEN_XDISPLAY (screen), screen_x11->screen_num), CWOverrideRedirect|CWBackPixel, &atts); XMapRaised(GDK_SCREEN_XDISPLAY (screen), win); win = XCreateWindow(GDK_SCREEN_XDISPLAY (screen), screen_x11->xroot_window, w/2 , 0, 1, h, 0, DefaultDepth(GDK_SCREEN_XDISPLAY (screen), screen_x11->screen_num), InputOutput, DefaultVisual(GDK_SCREEN_XDISPLAY (screen), screen_x11->screen_num), CWOverrideRedirect|CWBackPixel, &atts); XMapRaised(GDK_SCREEN_XDISPLAY (screen), win); } else#endif { screen_x11->num_monitors = 1; screen_x11->monitors = g_new0 (GdkRectangle, 1); screen_x11->monitors[0].x = 0; screen_x11->monitors[0].y = 0; screen_x11->monitors[0].width = WidthOfScreen (screen_x11->xscreen); screen_x11->monitors[0].height = HeightOfScreen (screen_x11->xscreen); }}static voidinit_randr_support (GdkScreen * screen){ GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (screen); XSelectInput (GDK_SCREEN_XDISPLAY (screen), screen_x11->xroot_window, StructureNotifyMask);}void_gdk_x11_screen_size_changed (GdkScreen *screen, XEvent *event){#ifdef HAVE_RANDR if (!XRRUpdateConfiguration (event)) return;#else if (event->type == ConfigureNotify) { XConfigureEvent *rcevent = (XConfigureEvent *) event; Screen *xscreen = gdk_x11_screen_get_xscreen (screen); xscreen->width = rcevent->width; xscreen->height = rcevent->height; } else return;#endif init_xinerama_support (screen); g_signal_emit_by_name (screen, "size_changed");}void_gdk_x11_screen_window_manager_changed (GdkScreen *screen){ g_signal_emit (screen, signals[WINDOW_MANAGER_CHANGED], 0);}/** * _gdk_windowing_substitute_screen_number: * @display_name : The name of a display, in the form used by * gdk_display_open (). If %NULL a default value * will be used. On X11, this is derived from the DISPLAY * environment variable. * @screen_number : The number of a screen within the display * referred to by @display_name. * * Modifies a @display_name to make @screen_number the default * screen when the display is opened. * * Return value: a newly allocated string holding the resulting * display name. Free with g_free(). */gchar * _gdk_windowing_substitute_screen_number (const gchar *display_name, gint screen_number){ GString *str; gchar *p; if (!display_name) display_name = getenv ("DISPLAY"); if (!display_name) return NULL; str = g_string_new (display_name); p = strrchr (str->str, '.'); if (p && p > strchr (str->str, ':')) g_string_truncate (str, p - str->str); g_string_append_printf (str, ".%d", screen_number); return g_string_free (str, FALSE);}/** * gdk_screen_make_display_name: * @screen: a #GdkScreen * * Determines the name to pass to gdk_display_open() to get * a #GdkDisplay with this screen as the default screen. * * Return value: a newly allocated string, free with g_free() * * Since: 2.2 **/gchar *gdk_screen_make_display_name (GdkScreen *screen){ const gchar *old_display; g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); old_display = gdk_display_get_name (gdk_screen_get_display (screen)); return _gdk_windowing_substitute_screen_number (old_display, gdk_screen_get_number (screen));}#define __GDK_SCREEN_X11_C__#include "gdkaliasdef.c"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -