Add a sample application that runs on unix.


git-svn-id: http://skia.googlecode.com/svn/trunk@938 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/unix_test_app/DrawBlueSample.cpp b/unix_test_app/DrawBlueSample.cpp
new file mode 100644
index 0000000..7e58d32
--- /dev/null
+++ b/unix_test_app/DrawBlueSample.cpp
@@ -0,0 +1,17 @@
+#include "SkCanvas.h"
+#include "SkColor.h"
+#include "SampleCode.h"
+#include "SkView.h"
+
+class DrawBlue : public SkView {
+
+public:
+     DrawBlue() {}
+protected:
+    virtual void onDraw(SkCanvas* canvas) {
+        canvas->drawColor(SK_ColorBLUE);
+    }
+};
+
+static SkView* MyFactory() { return new DrawBlue; }
+static SkViewRegister reg(MyFactory);
diff --git a/unix_test_app/main.cpp b/unix_test_app/main.cpp
new file mode 100644
index 0000000..6be43c0
--- /dev/null
+++ b/unix_test_app/main.cpp
@@ -0,0 +1,157 @@
+#include "X11/Xlib.h"
+#include "X11/keysym.h"
+
+#include "SkApplication.h"
+#include "SkKey.h"
+#include "SkView.h"
+#include "SkWindow.h"
+#include "XkeysToSkKeys.h"
+#include "keysym2ucs.h"
+#include "SkTypes.h"
+//#include <signal.h>
+//#include <sys/time.h>
+
+// Globals for access to the window
+Display* dsp = 0;
+Window win;
+
+const int WIDTH = 1000;
+const int HEIGHT = 1000;
+
+// Put an event in the X queue to fire an SkEvent.
+static void post_linuxevent()
+{
+    if (!dsp) return;
+    long event_mask = NoEventMask;
+    XClientMessageEvent event;
+    event.type = ClientMessage;
+    Atom myAtom;
+    event.message_type = myAtom;
+    event.format = 32;
+    event.data.l[0] = 0;
+    XSendEvent(dsp, win, false, 0, (XEvent*) &event);
+}
+
+#if 0
+static void catch_alarm(int sig)
+{
+    SkDebugf("caught alarm; calling ServiceQueueTimer\n");
+    SkEvent::ServiceQueueTimer();
+}
+#endif
+
+int main(){
+    dsp = XOpenDisplay(NULL);
+    if(!dsp) {
+        return 1;
+    }
+
+//    signal(SIGALRM, catch_alarm);
+
+    win = XCreateSimpleWindow(dsp, DefaultRootWindow(dsp), 0, 0, WIDTH, HEIGHT, 0, 0, 0);
+    XMapWindow(dsp, win);
+
+    long eventMask = StructureNotifyMask;
+    XSelectInput(dsp, win, eventMask);
+
+    // Wait until screen is ready.
+    XEvent evt;
+    do {
+        XNextEvent(dsp, &evt);
+    } while(evt.type != MapNotify);
+
+    GC gc = XCreateGC(dsp, win, 0, NULL);
+    // Start normal Skia sequence
+    application_init();
+
+    SkOSWindow* window = create_sk_window(NULL);
+    window->setUnixWindow(dsp, win, DefaultScreen(dsp), gc);
+    window->resize(WIDTH, HEIGHT);
+
+
+    // Determine which events to listen for.
+    eventMask = StructureNotifyMask|ButtonPressMask|ButtonReleaseMask
+            |ExposureMask|Button1MotionMask|KeyPressMask|KeyReleaseMask;
+    XSelectInput(dsp, win, eventMask);
+ 
+    bool loop = true;
+    while (loop) {
+        XNextEvent(dsp, &evt);
+        switch (evt.type) {
+            case Expose:
+                if (evt.xexpose.count == 0)
+                    window->inval(NULL);
+                break;
+            case ConfigureNotify:
+                window->resize(evt.xconfigure.width, evt.xconfigure.height);
+                break;
+            case ButtonPress:
+                if (evt.xbutton.button == Button1)
+                    window->handleClick(evt.xbutton.x, evt.xbutton.y, SkView::Click::kDown_State);
+                break;
+            case ButtonRelease:
+                if (evt.xbutton.button == Button1)
+                    window->handleClick(evt.xbutton.x, evt.xbutton.y, SkView::Click::kUp_State);
+                break;
+            case MotionNotify:
+                // 'If' statement is unnecessary, since we are only masking for button 1
+                if (evt.xbutton.button == Button1)
+                    window->handleClick(evt.xmotion.x, evt.xmotion.y, SkView::Click::kMoved_State);
+                break;
+            case KeyPress:
+            {
+                KeySym keysym = XKeycodeToKeysym(dsp, evt.xkey.keycode, 0);
+                //SkDebugf("pressed key %i!\n\tKeySym:%i\n", evt.xkey.keycode, XKeycodeToKeysym(dsp, evt.xkey.keycode, 0));
+                if (keysym == XK_Escape) {
+                    loop = false;
+                    break;
+                }
+                window->handleKey(XKeyToSkKey(keysym));
+                long uni = keysym2ucs(keysym);
+                if (uni != -1) {
+                    window->handleChar((SkUnichar) uni);
+                }
+                break;
+            }
+            case KeyRelease:
+                //SkDebugf("released key %i\n", evt.xkey.keycode);
+                window->handleKeyUp(XKeyToSkKey(XKeycodeToKeysym(dsp, evt.xkey.keycode, 0)));
+                break;
+            case ClientMessage:
+                if (SkEvent::ProcessEvent()) {
+                    post_linuxevent();
+                }
+                break;
+            default:
+                // Do nothing for other events
+                break;
+        }
+    }
+
+    XFreeGC(dsp, gc);
+    XDestroyWindow(dsp, win);
+    XCloseDisplay(dsp);
+
+    application_term();
+    return 0;
+}
+
+// SkEvent handlers
+
+void SkEvent::SignalNonEmptyQueue()
+{
+    post_linuxevent();
+}
+
+void SkEvent::SignalQueueTimer(SkMSec delay)
+{
+#if 0
+    itimerval newTimer;
+    newTimer.it_interval.tv_sec = 0;
+    newTimer.it_interval.tv_usec = 0;
+    newTimer.it_value.tv_sec = 0;
+    newTimer.it_value.tv_usec = delay * 1000;
+    int success = setitimer(ITIMER_REAL, NULL, &newTimer);
+    SkDebugf("SignalQueueTimer(%i)\nreturnval = %i\n", delay, success);
+#endif
+}
diff --git a/unix_test_app/makefile b/unix_test_app/makefile
new file mode 100644
index 0000000..0690435
--- /dev/null
+++ b/unix_test_app/makefile
@@ -0,0 +1,36 @@
+# Build the unix test app
+
+C_INCLUDES := -I../include/core \
+              -I../include/config \
+              -I../include/effects \
+              -I../include/images \
+              -I../include/utils \
+              -I../include/views \
+              -I../include/xml \
+              -I../include/gpu \
+              -I../gpu/include \
+              -I../include/utils/unix \
+              -I../samplecode
+
+VPATH = libs:../src/ports:../samplecode:../src/core:../out:../src/utils/unix
+
+#generate debugging info
+CFLAGS = -g
+
+SRC_LIST := main.cpp SkOSWindow_Unix.cpp SkXMLParser_empty.cpp SkDebug.cpp keysym2ucs.c
+
+#views files
+include ../src/views/views_files.mk
+SRC_LIST += $(addprefix ../src/views/, $(SOURCE))
+
+#xml
+include ../src/xml/xml_files.mk
+SRC_LIST += $(addprefix ../src/xml/, $(SOURCE))
+
+#include the samples
+include ../samplecode/samplecode_files.mk
+SRC_LIST += $(addprefix ../samplecode/, $(SOURCE))
+
+output: $(SRC_LIST) -lX11 -lskia -lpthread -lz -lfreetype -lGL -lpng
+	g++ $(C_INCLUDES) $(CFLAGS) $^ -o $@
+