diff --git a/src/Makefile b/src/Makefile
index 200e2e73..3902905e 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -640,7 +640,8 @@ OBJS = main.o init.o graph.o $(APIOBJ) misc.o special.o \
transform.o pversion.o factory.o $(PLATFORMOBJ) \
fileformats.o miscfileformats.o libraw2crtc.o \
brush_ops.o buttons_effects.o layers.o \
- oldies.o tiles.o colorred.o unicode.o gfx2surface.o
+ oldies.o tiles.o colorred.o unicode.o gfx2surface.o \
+ gfx2log.o
ifndef NORECOIL
OBJS += loadrecoil.o recoil.o
endif
diff --git a/src/fileformats.c b/src/fileformats.c
index 704f349c..c3cabbad 100644
--- a/src/fileformats.c
+++ b/src/fileformats.c
@@ -79,6 +79,7 @@
#endif
#endif
+#include "gfx2log.h"
#include "errors.h"
#include "global.h"
#include "loadsave.h"
diff --git a/src/gfx2log.c b/src/gfx2log.c
new file mode 100644
index 00000000..f2af27c7
--- /dev/null
+++ b/src/gfx2log.c
@@ -0,0 +1,67 @@
+/* vim:expandtab:ts=2 sw=2:
+*/
+/* Grafx2 - The Ultimate 256-color bitmap paint program
+
+ Copyright 2018 Thomas Bernard
+ Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)
+
+ Grafx2 is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; version 2
+ of the License.
+
+ Grafx2 is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Grafx2; if not, see
+*/
+
+#if defined(USE_SDL2)
+#include
+#endif
+#include
+#include "gfx2log.h"
+
+GFX2_Log_priority_T GFX2_verbosity_level = GFX2_INFO;
+
+extern void GFX2_Log(GFX2_Log_priority_T priority, const char * fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ GFX2_LogV(priority, fmt, ap);
+ va_end(ap);
+}
+
+extern void GFX2_LogV(GFX2_Log_priority_T priority, const char * fmt, va_list ap)
+{
+ if ((unsigned)GFX2_verbosity_level < (unsigned)priority)
+ return;
+#if defined(USE_SDL2)
+ {
+ int sdl_priority;
+ switch(priority)
+ {
+ case GFX2_ERROR:
+ sdl_priority = SDL_LOG_PRIORITY_ERROR;
+ break;
+ case GFX2_WARNING:
+ sdl_priority = SDL_LOG_PRIORITY_WARN;
+ break;
+ case GFX2_INFO:
+ sdl_priority = SDL_LOG_PRIORITY_INFO;
+ break;
+ case GFX2_DEBUG:
+ sdl_priority = SDL_LOG_PRIORITY_DEBUG;
+ break;
+ default:
+ sdl_priority = SDL_LOG_PRIORITY_CRITICAL; // unknown
+ }
+ SDL_LogMessageV(SDL_LOG_CATEGORY_APPLICATION, sdl_priority, fmt, ap);
+ }
+#endif
+ vfprintf((unsigned)priority >= GFX2_INFO ? stdout : stderr, fmt, ap);
+}
diff --git a/src/gfx2log.h b/src/gfx2log.h
new file mode 100644
index 00000000..287b67ca
--- /dev/null
+++ b/src/gfx2log.h
@@ -0,0 +1,39 @@
+/* vim:expandtab:ts=2 sw=2:
+*/
+/* Grafx2 - The Ultimate 256-color bitmap paint program
+
+ Copyright 2018 Thomas Bernard
+ Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)
+
+ Grafx2 is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; version 2
+ of the License.
+
+ Grafx2 is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Grafx2; if not, see
+*/
+#ifndef GFX2LOG_H_DEFINED
+#define GFX2LOG_H_DEFINED
+
+#include
+
+typedef enum {
+ GFX2_ERROR = 0,
+ GFX2_WARNING,
+ GFX2_INFO,
+ GFX2_DEBUG
+} GFX2_Log_priority_T;
+
+extern GFX2_Log_priority_T GFX2_verbosity_level;
+
+extern void GFX2_Log(GFX2_Log_priority_T priority, const char * fmt, ...);
+
+extern void GFX2_LogV(GFX2_Log_priority_T priority, const char * fmt, va_list ap);
+
+#endif
diff --git a/src/input.c b/src/input.c
index 5740ea60..88df701d 100644
--- a/src/input.c
+++ b/src/input.c
@@ -40,6 +40,7 @@
#include
#endif
+#include "gfx2log.h"
#include "global.h"
#include "keyboard.h"
#include "screen.h"
@@ -1264,7 +1265,6 @@ int Get_input(int sleep_time)
case KeyPress:
{
KeySym sym;
- //printf("key code = %d state=0x%08x\n", event.xkey.keycode, event.xkey.state);
// right/left window 40 Mod4Mask
// left alt = 8 Mod1Mask
// right alt = 80 Mod5Mask
@@ -1279,7 +1279,8 @@ int Get_input(int sleep_time)
mod |= MOD_META;
//sym = XKeycodeToKeysym(X11_display, event.xkey.keycode, 0);
sym = XkbKeycodeToKeysym(X11_display, event.xkey.keycode, 0, 0);
- //printf("sym = %04lx %s\t\tmod=%04x\n", sym, XKeysymToString(sym), mod);
+ GFX2_Log(GFX2_DEBUG, "key code = %3d state=0x%08x sym = 0x%04lx %s\tmod=%04x\n",
+ event.xkey.keycode, event.xkey.state, sym, XKeysymToString(sym), mod);
Key = mod | (sym & 0x0fff);
//sym = XkbKeycodeToKeysym(X11_display, event.xkey.keycode, 0, event.xkey.state);
if (((sym & 0xf000) != 0xf000) || IsKeypadKey(sym)) // test for standard key or KeyPad
@@ -1364,7 +1365,7 @@ int Get_input(int sleep_time)
user_feedback_required = Move_cursor_with_constraints();
break;
case Expose:
- printf("Expose (%d,%d) (%d,%d)\n", event.xexpose.x, event.xexpose.y, event.xexpose.width, event.xexpose.height);
+ GFX2_Log(GFX2_DEBUG, "Expose (%d,%d) (%d,%d)\n", event.xexpose.x, event.xexpose.y, event.xexpose.width, event.xexpose.height);
Update_rect(event.xexpose.x, event.xexpose.y,
event.xexpose.width, event.xexpose.height);
break;
@@ -1387,7 +1388,7 @@ int Get_input(int sleep_time)
case ClientMessage:
if (event.xclient.message_type == XInternAtom(X11_display,"WM_PROTOCOLS", False))
{
- if (event.xclient.data.l[0] == XInternAtom(X11_display, "WM_DELETE_WINDOW", False))
+ if ((Atom)event.xclient.data.l[0] == XInternAtom(X11_display, "WM_DELETE_WINDOW", False))
{
Quit_is_required = 1;
user_feedback_required = 1;
@@ -1402,10 +1403,11 @@ int Get_input(int sleep_time)
//int list = event.xclient.data.l[1] & 1;
xdnd_version = event.xclient.data.l[1] >> 24;
xdnd_source = event.xclient.data.l[0];
+ GFX2_Log(GFX2_DEBUG, "XdndEnter version=%d source=%lu\n", xdnd_version, xdnd_source);
}
else if (event.xclient.message_type == XInternAtom(X11_display, "XdndLeave", False))
{
- //printf("XdndLeave\n");
+ GFX2_Log(GFX2_DEBUG, "XdndLeave\n");
}
else if (event.xclient.message_type == XInternAtom(X11_display, "XdndPosition", False))
{
@@ -1534,7 +1536,7 @@ int Get_input(int sleep_time)
}
break;
default:
- printf("event.type = %d\n", event.type);
+ GFX2_Log(GFX2_INFO, "X11 event.type = %d not handled\n", event.type);
}
}
// If the cursor was moved since last update,
diff --git a/src/loadsave.c b/src/loadsave.c
index d361f869..6af11aaa 100644
--- a/src/loadsave.c
+++ b/src/loadsave.c
@@ -47,6 +47,7 @@
#include
#endif
+#include "gfx2log.h"
#include "buttons.h"
#include "const.h"
#include "errors.h"
@@ -624,7 +625,7 @@ void Load_image(T_IO_Context *context)
if (File_error>0)
{
- fprintf(stderr,"Unable to load file %s (error %d)!\n",context->File_name, File_error);
+ GFX2_Log(GFX2_WARNING, "Unable to load file %s (error %d)! format:%s\n", context->File_name, File_error, format->Label);
if (context->Type!=CONTEXT_SURFACE)
Error(0);
}
diff --git a/src/main.c b/src/main.c
index ccac8bf4..629aba7b 100644
--- a/src/main.c
+++ b/src/main.c
@@ -69,6 +69,7 @@
#endif
#endif
+#include "gfx2log.h"
#include "const.h"
#include "struct.h"
#include "global.h"
@@ -124,6 +125,7 @@ void Display_syntax(void)
"Syntax: grafx2 [] [] []\n\n"
" can be:\n"
"\t-? -h -H -help for this help screen\n"
+ "\t-verbose to increase log verbosity\n"
"\t-wide to emulate a video mode with wide pixels (2x1)\n"
"\t-tall to emulate a video mode with tall pixels (1x2)\n"
"\t-double to emulate a video mode with double pixels (2x2)\n"
@@ -278,7 +280,8 @@ enum CMD_PARAMS
CMDPARAM_RGB,
CMDPARAM_GAMMA,
CMDPARAM_SKIN,
- CMDPARAM_SIZE
+ CMDPARAM_SIZE,
+ CMDPARAM_VERBOSE,
};
struct {
@@ -302,6 +305,7 @@ struct {
{"gamma", CMDPARAM_GAMMA},
{"skin", CMDPARAM_SKIN},
{"size", CMDPARAM_SIZE},
+ {"verbose", CMDPARAM_VERBOSE},
};
#define ARRAY_SIZE(x) (int)(sizeof(x) / sizeof(x[0]))
@@ -493,6 +497,9 @@ int Analyze_command_line(int argc, char * argv[], char *main_filename, char *mai
exit(0);
}
break;
+ case CMDPARAM_VERBOSE:
+ GFX2_verbosity_level++;
+ break;
default:
// Si ce n'est pas un paramètre, c'est le nom du fichier à ouvrir
if (file_in_command_line > 1)
diff --git a/src/x11screen.c b/src/x11screen.c
index 9039fa86..533a5260 100644
--- a/src/x11screen.c
+++ b/src/x11screen.c
@@ -29,6 +29,7 @@
#include "screen.h"
#include "gfx2surface.h"
#include "loadsave.h"
+#include "gfx2log.h"
Display * X11_display = NULL;
Window X11_window = 0;
@@ -52,7 +53,7 @@ void GFX2_Set_mode(int *width, int *height, int fullscreen)
X11_display = XOpenDisplay(NULL);// NULL is equivalent to getenv("DISPLAY")
if (X11_display == NULL)
{
- fprintf(stderr, "X11: cannot open display\n");
+ GFX2_Log(GFX2_ERROR, "X11: cannot open display\n");
exit(1);
}
s = DefaultScreen(X11_display);
@@ -64,12 +65,12 @@ void GFX2_Set_mode(int *width, int *height, int fullscreen)
int i;
int count = 0;
int * depths = XListDepths(X11_display, s, &count);
- printf("DefaultDepth = %d, DisplayPlanes = %d\n", DefaultDepth(X11_display, s), DisplayPlanes(X11_display, s));
+ GFX2_Log(GFX2_DEBUG, "DefaultDepth = %d, DisplayPlanes = %d\n", DefaultDepth(X11_display, s), DisplayPlanes(X11_display, s));
if (depths != NULL)
{
for (i = 0; i < count; i++)
- printf(" %d", depths[i]);
- printf("\n");
+ GFX2_Log(GFX2_DEBUG, " %d", depths[i]);
+ GFX2_Log(GFX2_DEBUG, "\n");
XFree(depths);
}
}
@@ -184,7 +185,7 @@ void GFX2_Set_mode(int *width, int *height, int fullscreen)
32, 0/**width * 4*/);
if(X11_image == NULL)
{
- fprintf(stderr, "XCreateImage failed\n");
+ GFX2_Log(GFX2_ERROR, "XCreateImage failed\n");
exit(1);
}
}