diff options
Diffstat (limited to 'x11.c')
-rw-r--r-- | x11.c | 243 |
1 files changed, 243 insertions, 0 deletions
@@ -0,0 +1,243 @@ +/* + * Hardware Information, version 0.3 + * Copyright (C) 2003 Leandro Pereira <leandro@linuxmag.com.br> + * + * May be modified and/or distributed under the terms of GNU GPL version 2. + * + * This module contains code from xdpyinfo.c, by Jim Fulton, MIT X Consortium + * Copyright 1988, 1998 The Open Group + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name of The Open Group shall not be + * used in advertising or otherwise to promote the sale, use or other dealings + * in this Software without prior written authorization from The Open Group. + */ + +#include "hardinfo.h" +#include "x11.h" + +#include <stdlib.h> + +X11Info * +x11_get_info(void) +{ + X11Info *info; + Display *dpy; + gint default_screen = 0, color_depth = 0; + gchar *buf; + + dpy = XOpenDisplay(NULL); + if(!dpy) return NULL; + + info = g_new0(X11Info, 1); + + buf = DisplayString(dpy); + if (*buf == ':') + info->display = g_strdup_printf(_("Local display (%s)"), buf); + else + info->display = g_strdup_printf(_("Remote display (%s)"), buf); + + info->vendor = g_strdup(ServerVendor(dpy)); + + if (strstr(ServerVendor(dpy), "XFree86")) { + int vendrel = VendorRelease(dpy); + + if (vendrel < 336) { + /* + * vendrel was set incorrectly for 3.3.4 and 3.3.5, so handle + * those cases here. + */ + buf = g_strdup_printf + ("%d.%d.%d", vendrel / 100, (vendrel / 10) % 10, + vendrel % 10); + } else if (vendrel < 3900) { + /* 3.3.x versions, other than the exceptions handled above */ + buf = g_strdup_printf("%d.%d", vendrel / 1000, (vendrel / 100) % 10); + if (((vendrel / 10) % 10) || (vendrel % 10)) { + gchar *buf2; + + buf2 = g_strdup_printf(".%d", (vendrel / 10) % 10); + buf = g_strconcat(buf, buf2, NULL); + g_free(buf2); + + if (vendrel % 10) { + buf2 = g_strdup_printf(".%d", vendrel % 10); + buf = g_strconcat(buf, buf2, NULL); + g_free(buf2); + } + } + } else if (vendrel < 40000000) { + gchar *buf2; + /* 4.0.x versions */ + buf = g_strdup_printf("%d.%d", vendrel / 1000, (vendrel / 10) % 10); + + if (vendrel % 10) { + buf2 = g_strdup_printf(".%d", vendrel % 10); + buf = g_strconcat(buf, buf2, NULL); + g_free(buf2); + } + } else { + /* post-4.0.x */ + buf = g_strdup_printf("%d.%d.%d", vendrel / 10000000, + (vendrel / 100000) % 100, + (vendrel / 1000) % 100); + if (vendrel % 1000) { + gchar *buf2; + + buf2 = g_strdup_printf(".%d", vendrel % 1000); + buf = g_strconcat(buf, buf2, NULL); + g_free(buf2); + } + } + } + if (buf) { + info->xf86version = g_strdup(buf); + g_free(buf); + } + + default_screen = DefaultScreen(dpy); + color_depth = XDefaultDepth(dpy, default_screen); + info->screen_size = g_strdup_printf("%dx%d pixels (%d bpp)", + DisplayWidth(dpy, default_screen), + DisplayHeight(dpy, default_screen), + color_depth); + + + if (info->xf86version) { + info->version = g_strdup_printf(_("XFree86 version %s (protocol version %d.%d)"), + info->xf86version, ProtocolVersion(dpy), + ProtocolRevision(dpy)); + } else { + info->version = g_strdup_printf(_("%d (protocol version %d.%d)"), + VendorRelease(dpy), ProtocolVersion(dpy), + ProtocolRevision(dpy)); + } + + XCloseDisplay(dpy); + + return info; +} + +GtkWidget * +x11_get_widget(MainWindow * mainwindow) +{ + GtkWidget *label, *hbox; + GtkWidget *table; +#ifdef GTK2 + GtkWidget *pixmap; + gchar *buf; +#endif + X11Info *info; + + if (!mainwindow) + return NULL; + + info = x11_get_info(); + + if (!info) + return NULL; + + hbox = gtk_hbox_new(FALSE, 0); + gtk_widget_show(hbox); + +#ifdef GTK2 + buf = g_strdup_printf("%s/x11.png", IMG_PREFIX); + pixmap = gtk_image_new_from_file(buf); + gtk_widget_set_usize(GTK_WIDGET(pixmap), 64, 0); + gtk_widget_show(pixmap); + gtk_box_pack_start(GTK_BOX(hbox), pixmap, FALSE, FALSE, 0); + g_free(buf); +#endif + + table = gtk_table_new(4, 2, FALSE); + gtk_widget_show(table); + gtk_box_pack_start(GTK_BOX(hbox), table, TRUE, TRUE, 0); + gtk_container_set_border_width(GTK_CONTAINER(table), 10); + gtk_table_set_row_spacings(GTK_TABLE(table), 4); + gtk_table_set_col_spacings(GTK_TABLE(table), 4); + + /* + * Table headers + */ +#ifdef GTK2 + label = gtk_label_new(_("<b>Display:</b>")); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); +#else + label = gtk_label_new(_("Display:")); +#endif + gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1); + gtk_widget_show(label); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + +#ifdef GTK2 + label = gtk_label_new(_("<b>Vendor:</b>")); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); +#else + label = gtk_label_new(_("Vendor:")); +#endif + gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2); + gtk_widget_show(label); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + +#ifdef GTK2 + label = gtk_label_new(_("<b>Release:</b>")); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); +#else + label = gtk_label_new(_("Release:")); +#endif + gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 2, 3); + gtk_widget_show(label); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + +#ifdef GTK2 + label = gtk_label_new(_("<b>Resolution:</b>")); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); +#else + label = gtk_label_new(_("Resolution:")); +#endif + gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 3, 4); + gtk_widget_show(label); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + + /* + * Table content + */ + label = gtk_label_new(info->display); + gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 0, 1); + gtk_widget_show(label); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + + label = gtk_label_new(info->vendor); + gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 1, 2); + gtk_widget_show(label); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + + label = gtk_label_new(info->version); + gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 2, 3); + gtk_widget_show(label); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + + label = gtk_label_new(info->screen_size); + gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 3, 4); + gtk_widget_show(label); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + + g_free(info); + + return hbox; +} |