[go: up one dir, main page]

Menu

[f3709a]: / src / display.c  Maximize  Restore  History

Download this file

116 lines (102 with data), 3.2 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/*
roxterm - GTK+ 2.0 terminal emulator with tabs
Copyright (C) 2004 Tony Houghton <h@realh.co.uk>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "defns.h"
#include <ctype.h>
#include <string.h>
static char *get_screen_dot(const char *display_name)
{
char *n, *dot;
dot = strrchr(display_name, '.');
if (dot && *(dot + 1))
{
for (n = dot + 1; *n; ++n)
{
if (!isdigit(*n))
{
dot = NULL;
break;
}
}
}
else
{
dot = NULL;
}
return dot;
}
static GdkScreen *get_matching_screen(const char *display_name,
GdkDisplay *dpy, gboolean name_includes_screen)
{
GdkScreen *screen = NULL;
char *scrn_name = NULL;
if (!name_includes_screen)
{
char *dot;
screen = gdk_display_get_default_screen(dpy);
scrn_name = gdk_screen_make_display_name(screen);
dot = get_screen_dot(scrn_name);
if (dot)
*dot = 0;
if (strcmp(display_name, scrn_name))
screen = NULL;
}
else
{
int n = gdk_display_get_n_screens(dpy);
while (--n >= 0)
{
screen = gdk_display_get_screen(dpy, n);
scrn_name = gdk_screen_make_display_name(screen);
if (strcmp(display_name, scrn_name))
screen = NULL;
else
break;
}
}
g_free(scrn_name);
return screen;
}
GdkScreen *display_get_screen_for_name(const char *display_name)
{
static GdkDisplayManager *dpy_mgr = NULL;
GSList *node, *dpy_list;
gboolean name_inc_scrn;
GdkDisplay *dpy = NULL;
GdkScreen *screen = NULL;
if (!display_name)
return gdk_screen_get_default();
name_inc_scrn = get_screen_dot(display_name) != NULL;;
if (!dpy_mgr)
dpy_mgr = gdk_display_manager_get();
dpy_list = gdk_display_manager_list_displays(dpy_mgr);
for (node = dpy_list; node; node = g_slist_next(node))
{
dpy = node->data;
screen = get_matching_screen(display_name, dpy, name_inc_scrn);
if (screen)
break;
}
g_slist_free(dpy_list);
if (screen)
return screen;
dpy = gdk_display_open(display_name);
if (!dpy)
return NULL;
screen = get_matching_screen(display_name, dpy, name_inc_scrn);
if (!screen)
g_object_unref(dpy);
return screen;
}