GPU: show more descriptive labels on unsupported GPU dialog

Thanks to Ray Molenkamp for the help with the Windows implementation.

Fixes T70521

Differential Revision: https://developer.blender.org/D6023
This commit is contained in:
Brecht Van Lommel 2019-10-09 13:36:56 +02:00
parent 26b1216629
commit cf682b9dab
12 changed files with 101 additions and 50 deletions

@ -112,7 +112,7 @@ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SAFESEH:NO")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /SAFESEH:NO")
list(APPEND PLATFORM_LINKLIBS
ws2_32 vfw32 winmm kernel32 user32 gdi32 comdlg32
ws2_32 vfw32 winmm kernel32 user32 gdi32 comdlg32 Comctl32
advapi32 shfolder shell32 ole32 oleaut32 uuid psapi Dbghelp
)

@ -70,6 +70,8 @@ extern GHOST_TSuccess GHOST_DisposeSystem(GHOST_SystemHandle systemhandle);
* \param systemhandle The handle to the system
* \param title Title of the message box
* \param message Message of the message box
* \param help_label Text to show on the help button that opens a link
* \param continue_label Text to show on the ok button that continues
* \param link Optional (hyper)link to a webpage to show when pressing help
* \param dialog_options Options to configure the message box.
* \return void.
@ -77,6 +79,8 @@ extern GHOST_TSuccess GHOST_DisposeSystem(GHOST_SystemHandle systemhandle);
extern void GHOST_ShowMessageBox(GHOST_SystemHandle systemhandle,
const char *title,
const char *message,
const char *help_label,
const char *continue_label,
const char *link,
GHOST_DialogOptions dialog_options);

@ -446,11 +446,15 @@ class GHOST_ISystem {
*
* \param title The title of the message box
* \param message The message to display
* \param help_label Help button label
* \param continue_label Continue button label
* \param link An optional hyperlink
* \param dialog_options Options how to display the message
*/
virtual GHOST_TSuccess showMessageBox(const char * /*title*/,
const char * /*message*/,
const char * /*help_label*/,
const char * /*continue_label*/,
const char * /*link*/,
GHOST_DialogOptions /*dialog_options*/) const = 0;

@ -50,11 +50,13 @@ GHOST_TSuccess GHOST_DisposeSystem(GHOST_SystemHandle systemhandle)
void GHOST_ShowMessageBox(GHOST_SystemHandle systemhandle,
const char *title,
const char *message,
const char *help_label,
const char *continue_label,
const char *link,
GHOST_DialogOptions dialog_options)
{
GHOST_ISystem *system = (GHOST_ISystem *)systemhandle;
system->showMessageBox(title, message, link, dialog_options);
system->showMessageBox(title, message, help_label, continue_label, link, dialog_options);
}
GHOST_EventConsumerHandle GHOST_CreateEventConsumer(GHOST_EventCallbackProcPtr eventCallback,

@ -313,11 +313,15 @@ class GHOST_System : public GHOST_ISystem {
* Show a system message box
* \param title The title of the message box
* \param message The message to display
* \param help_label Help button label
* \param continue_label Continue button label
* \param link An optional hyperlink
* \param dialog_options Options how to display the message
*/
virtual GHOST_TSuccess showMessageBox(const char * /*title*/,
const char * /*message*/,
const char * /*help_label */,
const char * /*continue_label */,
const char * /*link*/,
GHOST_DialogOptions /*dialog_options*/) const
{

@ -28,6 +28,13 @@
# define _WIN32_IE 0x0501 /* shipped before XP, so doesn't impose additional requirements */
#endif
/* clang-format off */
#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
/* clang-format on */
#include <commctrl.h>
#include <shlobj.h>
#include <tlhelp32.h>
#include <psapi.h>
@ -35,6 +42,7 @@
#include <windowsx.h>
#include "utfconv.h"
#include "utf_winfunc.h"
#include "GHOST_DisplayManagerWin32.h"
#include "GHOST_EventButton.h"
@ -511,6 +519,7 @@ GHOST_TSuccess GHOST_SystemWin32::getButtons(GHOST_Buttons &buttons) const
GHOST_TSuccess GHOST_SystemWin32::init()
{
GHOST_TSuccess success = GHOST_System::init();
InitCommonControls();
/* Disable scaling on high DPI displays on Vista */
HMODULE
@ -1773,41 +1782,51 @@ void GHOST_SystemWin32::putClipboard(GHOST_TInt8 *buffer, bool selection) const
/** \name Message Box
* \{ */
static const char *MESSAGE_BOX_HELP_LINK_PTR = NULL;
VOID CALLBACK showMessageBoxCallBack(LPHELPINFO lpHelpInfo)
{
if (MESSAGE_BOX_HELP_LINK_PTR) {
ShellExecute(NULL, "open", MESSAGE_BOX_HELP_LINK_PTR, NULL, NULL, SW_SHOWNORMAL);
}
}
GHOST_TSuccess GHOST_SystemWin32::showMessageBox(const char *title,
const char *message,
const char *help_label,
const char *continue_label,
const char *link,
GHOST_DialogOptions dialog_options) const
{
uint style = MB_OK |
(dialog_options & GHOST_DialogError ?
MB_ICONERROR :
dialog_options & GHOST_DialogWarning ? MB_ICONWARNING : MB_ICONINFORMATION);
bool show_help = link && strlen(link);
if (show_help) {
GHOST_ASSERT(MESSAGE_BOX_HELP_LINK_PTR == NULL,
"showMessageBox: MESSAGE_BOX_HELP_LINK_PTR is in use");
style |= MB_HELP;
MESSAGE_BOX_HELP_LINK_PTR = link;
const wchar_t *title_16 = alloc_utf16_from_8(title, 0);
const wchar_t *message_16 = alloc_utf16_from_8(message, 0);
const wchar_t *help_label_16 = alloc_utf16_from_8(help_label, 0);
const wchar_t *continue_label_16 = alloc_utf16_from_8(continue_label, 0);
int nButtonPressed = 0;
TASKDIALOGCONFIG config = {0};
const TASKDIALOG_BUTTON buttons[] = {{IDOK, help_label_16}, {IDCONTINUE, continue_label_16}};
config.cbSize = sizeof(config);
config.hInstance = 0;
config.dwCommonButtons = 0;
config.pszMainIcon = (dialog_options & GHOST_DialogError ?
TD_ERROR_ICON :
dialog_options & GHOST_DialogWarning ? TD_WARNING_ICON :
TD_INFORMATION_ICON);
config.pszWindowTitle = L"Blender";
config.pszMainInstruction = title_16;
config.pszContent = message_16;
config.pButtons = (link) ? buttons : buttons + 1;
config.cButtons = (link) ? 2 : 1;
TaskDialogIndirect(&config, &nButtonPressed, NULL, NULL);
switch (nButtonPressed) {
case IDOK:
ShellExecute(NULL, "open", link, NULL, NULL, SW_SHOWNORMAL);
break;
case IDCONTINUE:
break;
default:
break; // should never happen
}
MSGBOXPARAMSA message_box_params = {0};
message_box_params.cbSize = sizeof(MSGBOXCALLBACK);
message_box_params.lpszText = message;
message_box_params.lpszCaption = title;
message_box_params.dwStyle = style;
message_box_params.lpszText = message;
message_box_params.lpfnMsgBoxCallback = showMessageBoxCallBack;
free((void *)title_16);
free((void *)message_16);
free((void *)help_label_16);
free((void *)continue_label_16);
MessageBoxIndirectA(&message_box_params);
MESSAGE_BOX_HELP_LINK_PTR = NULL;
return GHOST_kSuccess;
}
/* \} */

@ -29,9 +29,6 @@
# error WIN32 only!
#endif // WIN32
/* require Windows XP or newer */
#undef _WIN32_WINNT
#define _WIN32_WINNT 0x501
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
@ -208,11 +205,15 @@ class GHOST_SystemWin32 : public GHOST_System {
* Show a system message box
* \param title The title of the message box
* \param message The message to display
* \param help_label Help button label
* \param continue_label Continue button label
* \param link An optional hyperlink
* \param dialog_options Options how to display the message
*/
GHOST_TSuccess showMessageBox(const char *title,
const char *message,
const char *help_label,
const char *continue_label,
const char *link,
GHOST_DialogOptions dialog_options) const;

@ -2176,7 +2176,7 @@ class DialogData {
height(175),
padding_x(10),
padding_y(5),
button_width(50),
button_width(130),
button_height(24),
button_inset_x(10),
button_border_size(1),
@ -2247,6 +2247,8 @@ static void split(const char *text, const char *seps, char ***str, int *count)
GHOST_TSuccess GHOST_SystemX11::showMessageBox(const char *title,
const char *message,
const char *help_label,
const char *continue_label,
const char *link,
GHOST_DialogOptions) const
{
@ -2325,20 +2327,24 @@ GHOST_TSuccess GHOST_SystemX11::showMessageBox(const char *title,
text_splitted[i],
(int)strlen(text_splitted[i]));
}
dialog_data.drawButton(m_display, window, buttonBorderGC, buttonGC, 1, "Ok");
dialog_data.drawButton(m_display, window, buttonBorderGC, buttonGC, 1, continue_label);
if (strlen(link)) {
dialog_data.drawButton(m_display, window, buttonBorderGC, buttonGC, 2, "Help");
dialog_data.drawButton(m_display, window, buttonBorderGC, buttonGC, 2, help_label);
}
}
else if (e.type == ButtonRelease) {
if (dialog_data.isInsideButton(e, 1)) {
break;
}
else if (strlen(link) && dialog_data.isInsideButton(e, 2)) {
string cmd = "xdg-open \"" + string(link) + "\"";
if (system(cmd.c_str()) != 0) {
GHOST_PRINTF("GHOST_SystemX11::showMessageBox: Unable to run system command [%s]", cmd);
else if (dialog_data.isInsideButton(e, 2)) {
if (strlen(link)) {
string cmd = "xdg-open \"" + string(link) + "\"";
if (system(cmd.c_str()) != 0) {
GHOST_PRINTF("GHOST_SystemX11::showMessageBox: Unable to run system command [%s]",
cmd);
}
}
break;
}
}
}

@ -237,11 +237,15 @@ class GHOST_SystemX11 : public GHOST_System {
* Show a system message box
* \param title The title of the message box
* \param message The message to display
* \param help_label Help button label
* \param continue_label Continue button label
* \param link An optional hyperlink
* \param dialog_options Options how to display the message
*/
GHOST_TSuccess showMessageBox(const char *title,
const char *message,
const char *help_label,
const char *continue_label,
const char *link,
GHOST_DialogOptions dialog_options) const;
#ifdef WITH_XDND

@ -152,10 +152,11 @@ bool WM_platform_support_perform_checks()
/* TODO: Extra space is needed for the split function in GHOST_SystemX11. We should change
* the behavior in GHOST_SystemX11. */
STR_CONCAT(message, slen, "\n \n");
STR_CONCAT(message,
slen,
CTX_IFACE_(BLT_I18NCONTEXT_ID_WINDOWMANAGER,
"Press help to see if the support can be improved."));
STR_CONCAT(
message,
slen,
CTX_IFACE_(BLT_I18NCONTEXT_ID_WINDOWMANAGER,
"Newer graphics drivers may be available to improve Blender support."));
STR_CONCAT(message, slen, "\n \n");
STR_CONCAT(message, slen, CTX_IFACE_(BLT_I18NCONTEXT_ID_WINDOWMANAGER, "Graphics card:\n"));
STR_CONCAT(message, slen, GPU_platform_gpu_name());
@ -176,10 +177,11 @@ bool WM_platform_support_perform_checks()
"Your graphics card or driver is not supported."));
STR_CONCAT(message, slen, "\n \n");
STR_CONCAT(message,
slen,
CTX_IFACE_(BLT_I18NCONTEXT_ID_WINDOWMANAGER,
"Press help to see if the support can be improved."));
STR_CONCAT(
message,
slen,
CTX_IFACE_(BLT_I18NCONTEXT_ID_WINDOWMANAGER,
"Newer graphics drivers may be available to improve Blender support."));
STR_CONCAT(message, slen, "\n \n");
STR_CONCAT(message, slen, CTX_IFACE_(BLT_I18NCONTEXT_ID_WINDOWMANAGER, "Graphics card:\n"));
@ -209,8 +211,9 @@ bool WM_platform_support_perform_checks()
result = true;
}
else if (show_message) {
WM_ghost_show_message_box(title, message, link, dialog_options);
WM_ghost_show_message_box(
title, message, "Find Latest Drivers", "Continue Anyway", link, dialog_options);
}
return result;
}
}

@ -2435,10 +2435,12 @@ void WM_opengl_context_release(void *context)
void WM_ghost_show_message_box(const char *title,
const char *message,
const char *help_label,
const char *continue_label,
const char *link,
GHOST_DialogOptions dialog_options)
{
BLI_assert(g_system);
GHOST_ShowMessageBox(g_system, title, message, link, dialog_options);
GHOST_ShowMessageBox(g_system, title, message, help_label, continue_label, link, dialog_options);
}
/** \} */

@ -34,6 +34,8 @@
* In all other cases this message box should not be used. */
void WM_ghost_show_message_box(const char *title,
const char *message,
const char *help_label,
const char *continue_label,
const char *link,
GHOST_DialogOptions dialog_options);