diff --git a/nvidia-settings/src/gtk+-2.x/ctkui.c b/nvidia-settings/src/gtk+-2.x/ctkui.c index ce5ef08..85283c8 100644 --- a/nvidia-settings/src/gtk+-2.x/ctkui.c +++ b/nvidia-settings/src/gtk+-2.x/ctkui.c @@ -76,3 +76,16 @@ void ctk_main(ParsedAttribute *p, gtk_main(); } + +void ctk_ext_display_message(const char *msg) +{ + GtkWidget *dlg = + gtk_message_dialog_new (NULL, + GTK_DIALOG_MODAL, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + msg); + + gtk_dialog_run(GTK_DIALOG(dlg)); + gtk_widget_destroy (dlg); +} diff --git a/nvidia-settings/src/gtk+-2.x/ctkui.h b/nvidia-settings/src/gtk+-2.x/ctkui.h index 872c48c..fc00f2e 100644 --- a/nvidia-settings/src/gtk+-2.x/ctkui.h +++ b/nvidia-settings/src/gtk+-2.x/ctkui.h @@ -33,5 +33,6 @@ void ctk_main(ParsedAttribute*, CtrlSystem*, const char *page); +void ctk_ext_display_message(const char *msg); #endif /* __CTK_UI_H__ */ diff --git a/nvidia-settings/src/libXNVCtrlAttributes/NvCtrlAttributes.c b/nvidia-settings/src/libXNVCtrlAttributes/NvCtrlAttributes.c index c3bf158..48dddfe 100644 --- a/nvidia-settings/src/libXNVCtrlAttributes/NvCtrlAttributes.c +++ b/nvidia-settings/src/libXNVCtrlAttributes/NvCtrlAttributes.c @@ -1959,3 +1959,8 @@ NvCtrlEventHandleNextEvent(NvCtrlEventHandle *handle, CtrlEvent *event) return NvCtrlSuccess; } +NvCtrlErrorType last_error = NvCtrlNoError; + +NvCtrlErrorType NvCtrlGetLastError() { + return last_error; +} diff --git a/nvidia-settings/src/libXNVCtrlAttributes/NvCtrlAttributes.h b/nvidia-settings/src/libXNVCtrlAttributes/NvCtrlAttributes.h index 636d7e2..1dc8a50 100644 --- a/nvidia-settings/src/libXNVCtrlAttributes/NvCtrlAttributes.h +++ b/nvidia-settings/src/libXNVCtrlAttributes/NvCtrlAttributes.h @@ -301,6 +301,10 @@ typedef enum { NvCtrlError } ReturnStatus; +typedef enum { + NvCtrlNoError = 0, + NvCtrlUnableLoadInfo +} NvCtrlErrorType; /* GLX FBConfig attribute structure */ @@ -865,6 +869,10 @@ NvCtrlEventHandlePending(NvCtrlEventHandle *handle, Bool *pending); ReturnStatus NvCtrlEventHandleNextEvent(NvCtrlEventHandle *handle, CtrlEvent *event); - +/* + * NvCtrlGetLastError() - Returns the last occurred error + */ +NvCtrlErrorType +NvCtrlGetLastError(); #endif /* __NVCTRL_ATTRIBUTES__ */ diff --git a/nvidia-settings/src/libXNVCtrlAttributes/NvCtrlAttributesUtils.c b/nvidia-settings/src/libXNVCtrlAttributes/NvCtrlAttributesUtils.c --- a/nvidia-settings/src/libXNVCtrlAttributes/NvCtrlAttributesUtils.c +++ b/nvidia-settings/src/libXNVCtrlAttributes/NvCtrlAttributesUtils.c @@ -828,6 +828,7 @@ static const char *get_display_name(Ctrl } } +extern NvCtrlErrorType last_error; static Bool load_system_info(CtrlSystem *system, const char *display) { @@ -868,7 +869,7 @@ static Bool load_system_info(CtrlSystem system->has_nvml = (nvmlQueryTarget != NULL); if (system->has_nvml == FALSE) { - nv_error_msg("Unable to load info from any available system"); + last_error = NvCtrlUnableLoadInfo; return FALSE; } diff --git a/nvidia-settings/src/nvidia-settings.c b/nvidia-settings/src/nvidia-settings.c --- a/nvidia-settings/src/nvidia-settings.c +++ b/nvidia-settings/src/nvidia-settings.c @@ -48,6 +48,7 @@ typedef struct { char *(*fn_ctk_get_display)(void); void (*fn_ctk_main)(ParsedAttribute *, ConfigProperties *, CtrlSystem *, const char *); + void (*fn_ctk_ext_display_message)(const char *); } GtkLibraryData; @@ -121,6 +122,10 @@ static void load_and_resolve_libdata(con libdata->fn_ctk_main = dlsym(libdata->gui_lib_handle, "ctk_main"); symbol_error += check_and_save_dlerror(&libdata->error_msg); + libdata->fn_ctk_ext_display_message = dlsym(libdata->gui_lib_handle, "ctk_ext_display_message"); + if (!libdata->fn_ctk_ext_display_message) + dlerror(); + if (symbol_error > 0 || libdata->fn_ctk_init_check == NULL || libdata->fn_ctk_get_display == NULL || @@ -326,6 +331,19 @@ int main(int argc, char **argv) nv_parsed_attribute_clean(p); system = NvCtrlGetSystem(op->ctrl_display, &systems); if (!system || !system->dpy) { + NvCtrlErrorType ec = NvCtrlGetLastError(); + if (ec) { + const char *msg = "Unknown error occurred."; + + switch (ec) { + case NvCtrlUnableLoadInfo: + msg = "Unable to load info from any available system."; + } + + nv_error_msg(msg); + if (libdata.fn_ctk_ext_display_message) + libdata.fn_ctk_ext_display_message(msg); + } return 1; } ret = nv_write_config_file(op->config, system, p, &conf);