diff --git a/.vscode/settings.json b/.vscode/settings.json
index 9de80d9f..23073df0 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -55,6 +55,8 @@
"streambuf": "cpp",
"cinttypes": "cpp",
"typeinfo": "cpp",
- "*.ui": "cpp"
+ "*.ui": "cpp",
+ "bitset": "cpp",
+ "regex": "cpp"
}
}
\ No newline at end of file
diff --git a/libs/opendx/opendx.cpp b/libs/opendx/opendx.cpp
index 64b9df24..9db1d613 100644
--- a/libs/opendx/opendx.cpp
+++ b/libs/opendx/opendx.cpp
@@ -48,6 +48,9 @@ HWND CreateWindowExA(
gtk_widget_show(GTK_WIDGET(window));
}
+ // TODO: find a no-signal way
+ // g_signal_connect(window, "destroy", G_CALLBACK(on_window_destroy), NULL);
+
return window;
}
@@ -78,8 +81,7 @@ BOOL GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax)
BOOL PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) {
BOOL r = g_main_context_pending(NULL);
-
- //i know this is wrong, but i need to get the sample working
+
if (r) {
g_main_context_iteration(NULL, true);
} else {
diff --git a/tests/basic_window.cpp b/tests/basic_window.cpp
index 991212ea..0cc5b0bc 100644
--- a/tests/basic_window.cpp
+++ b/tests/basic_window.cpp
@@ -34,7 +34,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
MSG msg;
//ZeroMemory(&msg, sizeof(msg));
while (msg.message != WM_QUIT) {
- if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
+ if (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)) {
//TranslateMessage(&msg);
//DispatchMessage(&msg);
} else {
diff --git a/tools/dxdiag/layout/MainWindow.ui b/tools/dxdiag/layout/MainWindow.ui
index ed7c041f..fb971120 100644
--- a/tools/dxdiag/layout/MainWindow.ui
+++ b/tools/dxdiag/layout/MainWindow.ui
@@ -1,4 +1,4 @@
-R"XXX(
+R"XML(
-)XXX"
\ No newline at end of file
+)XML"
\ No newline at end of file
diff --git a/tools/dxdiag/locale/en_US.hpp b/tools/dxdiag/locale/en_US.hpp
index 7d758d73..59a30d86 100644
--- a/tools/dxdiag/locale/en_US.hpp
+++ b/tools/dxdiag/locale/en_US.hpp
@@ -2,7 +2,7 @@
#include
/**
- * TODO Complete with @see /include/types/Translation.hpp
+ * TODO Complete with project://include/types/Translation.hpp
*/
Translation_t Translation_enUS() {
Translation_t r;
diff --git a/tools/dxdiag/locale/es_ES.hpp b/tools/dxdiag/locale/es_ES.hpp
index 0def8fc2..534e975a 100644
--- a/tools/dxdiag/locale/es_ES.hpp
+++ b/tools/dxdiag/locale/es_ES.hpp
@@ -1,11 +1,12 @@
#pragma once
#include
+#include "en_US.hpp"
/**
- * TODO Complete with @see /include/types/Translation.hpp
+ * TODO Complete with @see project://include/types/Translation.hpp
*/
Translation_t Translation_esES() {
- Translation_t r;
+ Translation_t r = Translation_enUS();
//Common texts
r.yes = (char*) "Sí";
diff --git a/tools/dxdiag/locale/pt_BR.hpp b/tools/dxdiag/locale/pt_BR.hpp
index da461faa..6c33c3ca 100644
--- a/tools/dxdiag/locale/pt_BR.hpp
+++ b/tools/dxdiag/locale/pt_BR.hpp
@@ -10,6 +10,21 @@ Translation_t Translation_ptBR() {
//Common texts
r.yes = (char*) "Sim";
+ r.no = (char*) "Não";
+ r.not_available = (char*) "Indisponível";
+ r.enabled = (char*) "Habilitado";
+
+ //Tab names
+ r.tab_system = (char*) "Sistema";
+ r.tab_display = (char*) "Exibição";
+ r.tab_sound = (char*) "Som";
+ r.tab_input = (char*) "Entrada";
+
+ //Buttons
+ r.btn_help = (char*) "Ajuda";
+ r.btn_next = (char*) "Próximo";
+ r.btn_save = (char*) "Salvar";
+ r.btn_exit = (char*) "Sair";
return r;
}
diff --git a/tools/dxdiag/main.cpp b/tools/dxdiag/main.cpp
index 996b0ee5..88037bf6 100644
--- a/tools/dxdiag/main.cpp
+++ b/tools/dxdiag/main.cpp
@@ -1,8 +1,8 @@
-#pragma once
+#include
+
+#include //GTK4
#include
-#include
-#include //GTK4
#include "layout/MainWindow.hpp"
#include "src/SystemTab.hpp"
@@ -22,7 +22,7 @@ int main(int argc, char *argv[])
GtkWidget *window = GTK_WIDGET(gtk_builder_get_object(builder, "main_window"));
//setup events and show the screen:
- SystemTab::setup(builder);
+ new SystemTab(builder);
gtk_widget_show(GTK_WIDGET(window));
while (g_list_model_get_n_items (gtk_window_get_toplevels ()) > 0)
diff --git a/tools/dxdiag/src/SystemTab.hpp b/tools/dxdiag/src/SystemTab.hpp
index 13bb64eb..390b1c38 100644
--- a/tools/dxdiag/src/SystemTab.hpp
+++ b/tools/dxdiag/src/SystemTab.hpp
@@ -1,23 +1,31 @@
#pragma once
-#include
#include
#include
+#include
#include
#include
#include
#include
#include
+#include
#include
#include
#include
-namespace SystemTab {
+#include
+
+#include
+#include "../locale/en_US.hpp"
+#include "../locale/pt_BR.hpp"
+#include "../locale/es_ES.hpp"
+
+class SystemTab {
/**
* Set the text from "date_val"to the actual date/time.
*/
- gboolean updateTime(GtkLabel* label) {
+ public:static gboolean updateTime(GtkLabel* label) {
time_t t = time(NULL);
- struct tm *time = localtime(&t);
+ struct tm* time = localtime(&t);
gchar str_time[40];
strftime(str_time, sizeof(str_time), "%A, %b %d, %Y, %I:%M:%S %p", time);
@@ -33,7 +41,7 @@ namespace SystemTab {
/**
* set a timeout event every 500ms to set the actual date/time
*/
- gboolean onRealizeTime(GtkLabel* label) {
+ public:static gboolean onRealizeTime(GtkLabel* label) {
std::cout << "SystemTab::onRealizeTime()\n";
g_timeout_add (500, (GSourceFunc) SystemTab::updateTime, label);
@@ -43,7 +51,7 @@ namespace SystemTab {
/**
* Set the text from "pc_val" to the unix hostname.
*/
- gboolean setHostname(GtkLabel* label) {
+ public:static gboolean setHostname(GtkLabel* label) {
char hostname[1024];
gethostname(hostname, sizeof hostname);
@@ -57,7 +65,7 @@ namespace SystemTab {
return FALSE;
}
- std::string exec(const char* cmd) {
+ public:static std::string exec(const char* cmd) {
std::vector buffer(1024);
std::string result;
FILE* pipe = popen(cmd, "r");
@@ -72,7 +80,7 @@ namespace SystemTab {
return result;
}
- gboolean setOperatingSystem(GtkLabel* label) {
+ public:static gboolean setOperatingSystem(GtkLabel* label) {
std::string distro = exec("lsb_release -i | awk '{print $3}'");
std::string distro_version = exec("lsb_release -r | awk '{print $2}'");
std::string kernel_version = exec("uname -r");
@@ -85,7 +93,8 @@ namespace SystemTab {
//arch.erase(std::remove(arch.begin(), arch.end(), '\n'), arch.end());
std::string os_info = distro + " " + arch + " (" + distro_version + ", kernel " + kernel_version + ")";
-
+ os_info = std::regex_replace(os_info, std::regex("\n"), "");
+
// Convert the string to const gchar*
const gchar* text = os_info.c_str();
@@ -97,25 +106,16 @@ namespace SystemTab {
return FALSE;
}
- gboolean setLanguage(GtkLabel* label) {
+ public:static gboolean setLanguage(GtkLabel* label) {
char buffer[128];
+ std::string locale = setlocale(LC_CTYPE, NULL);
std::string lang, region;
- // Get the LC_MESSAGES locale
- std::FILE* fp = popen("locale | grep LC_MESSAGES | cut -d= -f2 | cut -d_ -f1", "r");
- std::fgets(buffer, 128, fp);
- lang = buffer;
- pclose(fp);
-
- // Get the LC_CTYPE locale
- fp = popen("locale | grep LC_CTYPE | cut -d= -f2 | cut -d_ -f2", "r");
- std::fgets(buffer, 128, fp);
- region = buffer;
- pclose(fp);
-
- // Remove newline characters
- lang.erase(lang.size() - 1, 1);
+ // get the language and region from the locale
+ lang = locale.substr(0, locale.find("_"));
+ region = locale.substr(locale.find("_") + 1);
region.erase(region.size() - 1, 1);
+ region = region.substr(0, region.find("."));
// Return the formatted string
std::string str = lang + " (Regional Setting: " + region + ")";
@@ -129,7 +129,7 @@ namespace SystemTab {
return FALSE;
}
- gboolean setManufacturer(GtkLabel* label) {
+ public:static gboolean setManufacturer(GtkLabel* label) {
std::ifstream file("/sys/class/dmi/id/sys_vendor");
std::string manufacturer;
@@ -147,7 +147,7 @@ namespace SystemTab {
return FALSE;
}
- gboolean setModel(GtkLabel* label) {
+ public:static gboolean setModel(GtkLabel* label) {
std::ifstream file("/sys/class/dmi/id/product_name");
std::string model;
@@ -165,7 +165,7 @@ namespace SystemTab {
return FALSE;
}
- gboolean setBIOS(GtkLabel* label) {
+ public:static gboolean setBIOS(GtkLabel* label) {
std::ifstream file("/sys/class/dmi/id/bios_version");
std::string bios;
@@ -183,7 +183,7 @@ namespace SystemTab {
return FALSE;
}
- std::string getCpuModelName() {
+ public:static std::string getCpuModelName() {
std::ifstream file("/proc/cpuinfo");
std::string line;
@@ -196,7 +196,7 @@ namespace SystemTab {
return "Unknown";
}
- int getCpuCoreCount() {
+ public:static int getCpuCoreCount() {
std::ifstream file("/proc/cpuinfo");
std::string line;
int core_count = 0;
@@ -210,7 +210,7 @@ namespace SystemTab {
return core_count;
}
- double getCpuFrequency() {
+ public:static double getCpuFrequency() {
std::ifstream file("/proc/cpuinfo");
std::string line;
double frequency = 0.0;
@@ -224,10 +224,10 @@ namespace SystemTab {
return frequency;
}
- std::string getCpuInfo() {
- int core_count = getCpuCoreCount();
- double frequency = getCpuFrequency() / 1000;
- std::string model_name = getCpuModelName();
+ public:static std::string getCpuInfo() {
+ int core_count = SystemTab::getCpuCoreCount();
+ double frequency = SystemTab::getCpuFrequency() / 1000;
+ std::string model_name = SystemTab::getCpuModelName();
std::ostringstream frequency_stream;
frequency_stream << std::fixed << std::setprecision(2) << frequency / core_count;
@@ -236,19 +236,18 @@ namespace SystemTab {
return model_name + " (" + std::to_string(core_count) + " CPUs), ~" + formatted_frequency + "GHz";
}
- gboolean setCPU(GtkLabel* label) {
+ public:static gboolean setCPU(GtkLabel* label) {
std::string cpu = SystemTab::getCpuInfo();
const gchar* text = cpu.c_str();
gtk_label_set_text(label, text);
gtk_widget_queue_draw(GTK_WIDGET(label));
gtk_widget_queue_draw(gtk_widget_get_parent(GTK_WIDGET(label)));
- gtk_widget_show(GTK_WIDGET(label));
-
+ // gtk_widget_show(GTK_WIDGET(label));
return FALSE;
}
- gboolean setRAM(GtkLabel* label) {
+ public:static gboolean setRAM(GtkLabel* label) {
std::ifstream file("/proc/meminfo");
std::string line;
std::string ram = "0MB RAM";
@@ -270,8 +269,7 @@ namespace SystemTab {
return FALSE;
}
- gboolean updateSwap(GtkLabel* label) {
-
+ public:static gboolean updateSwap(GtkLabel* label) {
struct sysinfo info;
sysinfo(&info);
@@ -287,17 +285,72 @@ namespace SystemTab {
gtk_widget_show(GTK_WIDGET(label));
}
- gboolean setSwap(GtkLabel* label) {
- g_timeout_add (500, (GSourceFunc) SystemTab::updateSwap, label);
+ public:static gboolean setSwap(GtkLabel* label) {
+ g_timeout_add(500, (GSourceFunc) SystemTab::updateSwap, label);
return FALSE;
}
/**
* setup IDs and it's events
*/
- void setup(GtkBuilder* builder) {
+ public:SystemTab(GtkBuilder* builder) {
std::cout << "SystemTab::setup()\n";
+ this->setupLang(builder);
+ this->setupSignals(builder);
+ }
+
+ private:void setupLang(GtkBuilder* builder) {
+ //get system locale
+ const char* locale = setlocale(LC_CTYPE, NULL);
+ Translation_t lang;
+
+ //instantiate Translation_{locale}() from tools/dxdiag/locale/{locale}.hpp
+ if (
+ strcmp(locale, "pt_BR.UTF-8") == 0 ||
+ strcmp(locale, "pt_PT.UTF-8") == 0
+ ) {
+ lang = Translation_ptBR(); // >:)
+ } else if (strcmp(locale, "es_ES.UTF-8")) {
+ lang = Translation_esES();
+ } else {
+ lang = Translation_enUS();
+ }
+
+ //set texts
+ GtkLabel* tab_system = GTK_LABEL(gtk_builder_get_object(builder, "tab_system_txt"));
+ gtk_label_set_text(tab_system, lang.tab_system);
+ GtkLabel* system_description = GTK_LABEL(gtk_builder_get_object(builder, "system_description"));
+ gtk_label_set_text(system_description, lang.system_description);
+ GtkLabel* system_info_label = GTK_LABEL(gtk_builder_get_object(builder, "system_info_label"));
+ gtk_label_set_text(system_info_label, lang.system_info_label);
+ GtkLabel* system_info_currentDate = GTK_LABEL(gtk_builder_get_object(builder, "system_info_currentDate"));
+ gtk_label_set_text(system_info_currentDate, lang.system_info_currentDate);
+ GtkLabel* system_info_pcName = GTK_LABEL(gtk_builder_get_object(builder, "system_info_pcName"));
+ gtk_label_set_text(system_info_pcName, lang.system_info_pcName);
+ GtkLabel* system_info_os = GTK_LABEL(gtk_builder_get_object(builder, "system_info_os"));
+ gtk_label_set_text(system_info_os, lang.system_info_os);
+ GtkLabel* system_info_language = GTK_LABEL(gtk_builder_get_object(builder, "system_info_language"));
+ gtk_label_set_text(system_info_language, lang.system_info_language);
+ GtkLabel* system_info_manufacturer = GTK_LABEL(gtk_builder_get_object(builder, "system_info_manufacturer"));
+ gtk_label_set_text(system_info_manufacturer, lang.system_info_manufacturer);
+ GtkLabel* system_info_model = GTK_LABEL(gtk_builder_get_object(builder, "system_info_model"));
+ gtk_label_set_text(system_info_model, lang.system_info_model);
+ GtkLabel* system_info_bios = GTK_LABEL(gtk_builder_get_object(builder, "system_info_bios"));
+ gtk_label_set_text(system_info_bios, lang.system_info_bios);
+ GtkLabel* system_info_processor = GTK_LABEL(gtk_builder_get_object(builder, "system_info_processor"));
+ gtk_label_set_text(system_info_processor, lang.system_info_processor);
+ GtkLabel* system_info_memory = GTK_LABEL(gtk_builder_get_object(builder, "system_info_memory"));
+ gtk_label_set_text(system_info_memory, lang.system_info_memory);
+ GtkLabel* system_info_pageFile = GTK_LABEL(gtk_builder_get_object(builder, "system_info_pageFile"));
+ gtk_label_set_text(system_info_pageFile, lang.system_info_pageFile);
+ GtkLabel* system_info_directxVersion = GTK_LABEL(gtk_builder_get_object(builder, "system_info_directxVersion"));
+ gtk_label_set_text(system_info_directxVersion, lang.system_info_directxVersion);
+ GtkLabel* system_info_opendxVersion = GTK_LABEL(gtk_builder_get_object(builder, "system_info_opendxVersion"));
+ gtk_label_set_text(system_info_opendxVersion, lang.system_info_opendxVersion);
+ }
+
+ private:void setupSignals(GtkBuilder* builder) {
GtkLabel* date_val = GTK_LABEL(gtk_builder_get_object(builder, "date_val"));
g_signal_connect (date_val, "realize", G_CALLBACK (SystemTab::onRealizeTime), NULL);
GtkLabel* pc_val = GTK_LABEL(gtk_builder_get_object(builder, "pc_val"));
@@ -319,4 +372,4 @@ namespace SystemTab {
GtkLabel* swap_val = GTK_LABEL(gtk_builder_get_object(builder, "swap_val"));
g_signal_connect (swap_val, "realize", G_CALLBACK (SystemTab::setSwap), NULL);
}
-}
+};