From 4f891e21b36ddfbcecc9760fee589d8b0f22e7fb Mon Sep 17 00:00:00 2001 From: TingPing Date: Mon, 2 Mar 2015 18:34:03 -0500 Subject: [PATCH] sysinfo: Add display resolution --- plugins/sysinfo/sysinfo-backend.h | 1 + plugins/sysinfo/sysinfo.c | 1 + plugins/sysinfo/win32/backend.c | 54 +++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/plugins/sysinfo/sysinfo-backend.h b/plugins/sysinfo/sysinfo-backend.h index c69a0853..eb10407c 100644 --- a/plugins/sysinfo/sysinfo-backend.h +++ b/plugins/sysinfo/sysinfo-backend.h @@ -26,6 +26,7 @@ char *sysinfo_backend_get_disk(void); char *sysinfo_backend_get_memory(void); char *sysinfo_backend_get_cpu(void); char *sysinfo_backend_get_gpu(void); +char *sysinfo_backend_get_resolution (void); char *sysinfo_backend_get_sound(void); char *sysinfo_backend_get_uptime(void); char *sysinfo_backend_get_network(void); diff --git a/plugins/sysinfo/sysinfo.c b/plugins/sysinfo/sysinfo.c index 10c9d796..2d57923a 100644 --- a/plugins/sysinfo/sysinfo.c +++ b/plugins/sysinfo/sysinfo.c @@ -64,6 +64,7 @@ static hwinfo hwinfos[] = { {"memory", "Memory", sysinfo_backend_get_memory}, {"storage", "Storage", sysinfo_backend_get_disk}, {"vga", "VGA", sysinfo_backend_get_gpu}, + {"display", "Display", sysinfo_backend_get_resolution, TRUE}, {"sound", "Sound", sysinfo_backend_get_sound, TRUE}, {"ethernet", "Ethernet", sysinfo_backend_get_network, TRUE}, {"uptime", "Uptime", sysinfo_backend_get_uptime}, diff --git a/plugins/sysinfo/win32/backend.c b/plugins/sysinfo/win32/backend.c index 26779961..196be0b1 100644 --- a/plugins/sysinfo/win32/backend.c +++ b/plugins/sysinfo/win32/backend.c @@ -42,6 +42,7 @@ typedef enum QUERY_WMI_CPU, QUERY_WMI_VGA, QUERY_WMI_HDD, + QUERY_WMI_RES, } QueryWmiType; void print_info (void); @@ -49,6 +50,7 @@ int get_cpu_arch (void); char *query_wmi (QueryWmiType mode); char *read_os_name (IWbemClassObject *object); char *read_cpu_info (IWbemClassObject *object); +char *read_res_info (IWbemClassObject *object); char *read_vga_name (IWbemClassObject *object); guint64 hdd_capacity; @@ -117,6 +119,12 @@ sysinfo_backend_get_gpu (void) return g_strdup (vga_name); } +char * +sysinfo_backend_get_resolution (void) +{ + return query_wmi (QUERY_WMI_RES); +} + char * sysinfo_backend_get_os (void) { @@ -203,6 +211,9 @@ static char *query_wmi (QueryWmiType type) case QUERY_WMI_HDD: query = SysAllocString (L"SELECT Name, Capacity, FreeSpace FROM Win32_Volume"); break; + case QUERY_WMI_RES: + query = SysAllocString (L"SELECT CurrentHorizontalResolution, CurrentVerticalResolution, CurrentRefreshRate FROM Win32_VideoController"); + break; default: goto release_queryLanguageName; } @@ -245,6 +256,10 @@ static char *query_wmi (QueryWmiType type) line = read_hdd_info (object); break; + case QUERY_WMI_RES: + line = read_res_info (object); + break; + default: break; } @@ -393,6 +408,42 @@ static char *read_vga_name (IWbemClassObject *object) return name_utf8; } +static char *read_res_info (IWbemClassObject *object) +{ + HRESULT hr; + VARIANT variant; + guint64 xres, yres, rate; + + hr = object->lpVtbl->Get (object, L"CurrentHorizontalResolution", 0, &variant, NULL, NULL); + if (FAILED (hr)) + { + return NULL; + } + + xres = variant_to_uint64 (&variant); + VariantClear (&variant); + + hr = object->lpVtbl->Get (object, L"CurrentVerticalResolution", 0, &variant, NULL, NULL); + if (FAILED (hr)) + { + return NULL; + } + + yres = variant_to_uint64 (&variant); + VariantClear (&variant); + + hr = object->lpVtbl->Get (object, L"CurrentRefreshRate", 0, &variant, NULL, NULL); + if (FAILED (hr)) + { + return NULL; + } + + rate = variant_to_uint64 (&variant); + VariantClear (&variant); + + return g_strdup_printf ("%"G_GUINT64_FORMAT"x%"G_GUINT64_FORMAT" (%"G_GUINT64_FORMAT"Hz)", xres, yres, rate); +} + static char *read_hdd_info (IWbemClassObject *object) { HRESULT hr; @@ -481,6 +532,9 @@ static guint64 variant_to_uint64 (VARIANT *variant) { switch (V_VT (variant)) { + case VT_I4: + return (guint64)MAX(variant->intVal, 0); + case VT_UI8: return variant->ullVal;