GFX2_MessageBox()
Especially useful to display startup errors
This commit is contained in:
parent
80ff6f7dfd
commit
b0f1117bbc
12
src/main.c
12
src/main.c
@ -200,10 +200,8 @@ void Display_syntax(void)
|
|||||||
}
|
}
|
||||||
fputs(modes, stdout);
|
fputs(modes, stdout);
|
||||||
|
|
||||||
#if defined(WIN32)
|
GFX2_MessageBox(syntax, "GrafX2", GFX2_MB_INFO);
|
||||||
MessageBoxA(GFX2_Get_Window_Handle(), syntax, "GrafX2", MB_OK);
|
GFX2_MessageBox(modes, "GrafX2", GFX2_MB_INFO);
|
||||||
MessageBoxA(GFX2_Get_Window_Handle(), modes, "GrafX2", MB_OK);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------- Sortie impromptue ----------------------------
|
// ---------------------------- Sortie impromptue ----------------------------
|
||||||
@ -281,12 +279,10 @@ void Error_function(int error_code, const char *filename, int line_number, const
|
|||||||
if(msg != NULL)
|
if(msg != NULL)
|
||||||
{
|
{
|
||||||
fputs(msg, stderr);
|
fputs(msg, stderr);
|
||||||
#if defined(WIN32)
|
#if defined(WIN32) && defined(_DEBUG)
|
||||||
#if defined(_DEBUG)
|
|
||||||
OutputDebugStringA(msg);
|
OutputDebugStringA(msg);
|
||||||
#endif
|
#endif
|
||||||
MessageBoxA(GFX2_Get_Window_Handle(), msg, "GrafX2 error", MB_OK | MB_ICONERROR);
|
GFX2_MessageBox(msg, "GrafX2 error", GFX2_MB_ERROR);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (error_code == ERROR_COMMAND_LINE)
|
if (error_code == ERROR_COMMAND_LINE)
|
||||||
|
|||||||
19
src/screen.h
19
src/screen.h
@ -94,4 +94,23 @@ void Set_mouse_position(void);
|
|||||||
*/
|
*/
|
||||||
int GFX2_GetScreenSize(int * width, int * height);
|
int GFX2_GetScreenSize(int * width, int * height);
|
||||||
|
|
||||||
|
#if defined(USE_SDL2)
|
||||||
|
#define GFX2_MB_INFO SDL_MESSAGEBOX_INFORMATION
|
||||||
|
#define GFX2_MB_ERROR SDL_MESSAGEBOX_ERROR
|
||||||
|
#define GFX2_MB_WARNING SDL_MESSAGEBOX_WARNING
|
||||||
|
#elif defined(WIN32)
|
||||||
|
#define GFX2_MB_INFO MB_OK
|
||||||
|
#define GFX2_MB_ERROR (MB_OK|MB_ICONERROR)
|
||||||
|
#define GFX2_MB_WARNING (MB_OK|MB_ICONWARNING)
|
||||||
|
#else
|
||||||
|
#define GFX2_MB_INFO 1
|
||||||
|
#define GFX2_MB_ERROR 2
|
||||||
|
#define GFX2_MB_WARNING 3
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display a modal message
|
||||||
|
*/
|
||||||
|
int GFX2_MessageBox(const char * text, const char * caption, unsigned int type);
|
||||||
|
|
||||||
#endif // SCREEN_H_INCLUDED
|
#endif // SCREEN_H_INCLUDED
|
||||||
|
|||||||
@ -796,3 +796,13 @@ void Set_mouse_position(void)
|
|||||||
SDL_WarpMouseInWindow(NULL, Mouse_X*Pixel_width, Mouse_Y*Pixel_height);
|
SDL_WarpMouseInWindow(NULL, Mouse_X*Pixel_width, Mouse_Y*Pixel_height);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int GFX2_MessageBox(const char * text, const char * caption, unsigned int type)
|
||||||
|
{
|
||||||
|
#if defined(USE_SDL2)
|
||||||
|
return SDL_ShowSimpleMessageBox(type, caption, text, Window_SDL);
|
||||||
|
#elif defined(WIN32)
|
||||||
|
return MessageBoxA(GFX2_Get_Window_Handle(), text, caption, type);
|
||||||
|
#endif
|
||||||
|
// TODO : display for MacOS : http://blog.jorgearimany.com/2010/05/messagebox-from-windows-to-mac.html
|
||||||
|
}
|
||||||
|
|||||||
@ -704,3 +704,8 @@ int GFX2_GetScreenSize(int * width, int * height)
|
|||||||
|
|
||||||
return (*width > 0 && *height > 0);
|
return (*width > 0 && *height > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int GFX2_MessageBox(const char * text, const char * caption, unsigned int type)
|
||||||
|
{
|
||||||
|
return MessageBoxA(GFX2_Get_Window_Handle(), text, caption, type);
|
||||||
|
}
|
||||||
|
|||||||
120
src/x11screen.c
120
src/x11screen.c
@ -342,3 +342,123 @@ void Set_mouse_position(void)
|
|||||||
0, 0, 0, 0,
|
0, 0, 0, 0,
|
||||||
Mouse_X * Pixel_width, Mouse_Y * Pixel_height);
|
Mouse_X * Pixel_width, Mouse_Y * Pixel_height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int GFX2_MessageBox(const char * text, const char * caption, unsigned int type)
|
||||||
|
{
|
||||||
|
const char * p;
|
||||||
|
const char * lf;
|
||||||
|
int line_count = 0;
|
||||||
|
int s;
|
||||||
|
Window win, parent;
|
||||||
|
GC gc;
|
||||||
|
int quit = 0;
|
||||||
|
Atom wmDelete, atoms[2];
|
||||||
|
char * atom_name;
|
||||||
|
|
||||||
|
if (X11_display == NULL)
|
||||||
|
X11_display = XOpenDisplay(NULL);// NULL is equivalent to getenv("DISPLAY")
|
||||||
|
if (X11_display == NULL)
|
||||||
|
{
|
||||||
|
GFX2_Log(GFX2_ERROR, "X11: cannot open display\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
for (p = text; p != NULL; p = strchr(p, '\n'))
|
||||||
|
{
|
||||||
|
p++;
|
||||||
|
line_count++;
|
||||||
|
}
|
||||||
|
GFX2_Log(GFX2_DEBUG, "GFX2_MessageBox() text line_count = %d\n", line_count);
|
||||||
|
s = DefaultScreen(X11_display);
|
||||||
|
parent = X11_window ? X11_window : RootWindow(X11_display, s);
|
||||||
|
win = XCreateSimpleWindow(X11_display, parent, 0, 0, 480, line_count * 16, 1,
|
||||||
|
BlackPixel(X11_display, s), WhitePixel(X11_display, s));
|
||||||
|
{
|
||||||
|
XSizeHints * hints = XAllocSizeHints();
|
||||||
|
hints->min_width = hints->max_width = 480;
|
||||||
|
hints->min_height = hints->max_height = line_count * 16;
|
||||||
|
hints->flags = PMinSize | PMaxSize;
|
||||||
|
XSetWMNormalHints(X11_display, win, hints);
|
||||||
|
XFree(hints);
|
||||||
|
}
|
||||||
|
gc = XCreateGC(X11_display, win, 0, NULL);
|
||||||
|
XSelectInput(X11_display, win, ExposureMask | ButtonPressMask | ButtonReleaseMask | KeyPressMask | KeyReleaseMask);
|
||||||
|
wmDelete = XInternAtom(X11_display, "WM_DELETE_WINDOW", True);
|
||||||
|
XSetWMProtocols(X11_display, win, &wmDelete, 1);
|
||||||
|
atoms[0] = XInternAtom(X11_display, "_NET_WM_WINDOW_TYPE_DIALOG", False);
|
||||||
|
XChangeProperty(X11_display, win, XInternAtom(X11_display, "_NET_WM_WINDOW_TYPE", False), XA_ATOM, 32, PropModeReplace, (unsigned char *)atoms, 1);
|
||||||
|
atoms[0] = XInternAtom(X11_display, "_NET_WM_ACTION_MOVE", False);
|
||||||
|
atoms[1] = XInternAtom(X11_display, "_NET_WM_ACTION_CLOSE", False);
|
||||||
|
XChangeProperty(X11_display, win, XInternAtom(X11_display, "_NET_WM_ALLOWED_ACTIONS", False), XA_ATOM, 32, PropModeReplace, (unsigned char *)atoms, 2);
|
||||||
|
XMapWindow(X11_display, win);
|
||||||
|
XStoreName(X11_display, win, caption);
|
||||||
|
XFlush(X11_display);
|
||||||
|
|
||||||
|
while (!quit)
|
||||||
|
{
|
||||||
|
XEvent e;
|
||||||
|
XNextEvent(X11_display, &e);
|
||||||
|
switch (e.type)
|
||||||
|
{
|
||||||
|
case KeyPress:
|
||||||
|
case ButtonPress:
|
||||||
|
break;
|
||||||
|
case KeyRelease:
|
||||||
|
{
|
||||||
|
KeySym sym;
|
||||||
|
sym = XkbKeycodeToKeysym(X11_display, e.xkey.keycode, 0, 0);
|
||||||
|
GFX2_Log(GFX2_DEBUG, "keyrelease code= %3d state=0x%08x sym = 0x%04lx %s\n",
|
||||||
|
e.xkey.keycode, e.xkey.state, sym, XKeysymToString(sym));
|
||||||
|
if (sym == XK_Escape)
|
||||||
|
quit = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ButtonRelease:
|
||||||
|
quit = 1;
|
||||||
|
break;
|
||||||
|
case Expose:
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
int y = 16;
|
||||||
|
// print text
|
||||||
|
for (p = text; p != NULL; p = lf)
|
||||||
|
{
|
||||||
|
int x = 0;
|
||||||
|
while (*p == '\t')
|
||||||
|
{
|
||||||
|
p++;
|
||||||
|
x += 32;
|
||||||
|
}
|
||||||
|
lf = strchr(p, '\n');
|
||||||
|
if (lf == NULL)
|
||||||
|
len = (int)strlen(p);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
len = (int)(lf - p);
|
||||||
|
lf++;
|
||||||
|
}
|
||||||
|
XDrawString(X11_display, win, gc, x, y, p, len);
|
||||||
|
y += 16;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ClientMessage:
|
||||||
|
atom_name = XGetAtomName(X11_display, e.xclient.message_type);
|
||||||
|
GFX2_Log(GFX2_DEBUG, "ClientMessage type %s\n", atom_name);
|
||||||
|
XFree(atom_name);
|
||||||
|
if (e.xclient.message_type == XInternAtom(X11_display, "WM_PROTOCOLS", False))
|
||||||
|
{
|
||||||
|
atom_name = XGetAtomName(X11_display, (Atom)e.xclient.data.l[0]);
|
||||||
|
GFX2_Log(GFX2_DEBUG, " l[0] = %s\n", atom_name);
|
||||||
|
XFree(atom_name);
|
||||||
|
if ((Atom)e.xclient.data.l[0] == wmDelete)
|
||||||
|
quit = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
GFX2_Log(GFX2_DEBUG, "X11 event type %d\n", e.type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
XFreeGC(X11_display, gc);
|
||||||
|
XDestroyWindow(X11_display, win);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user