aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStapleButter <thetotalworm@gmail.com>2017-09-09 03:23:02 +0200
committerStapleButter <thetotalworm@gmail.com>2017-09-09 03:23:02 +0200
commitdbcec7efb4eb395d60d9ad90fe9909ebc1e4db0c (patch)
tree570059347d7ffcf60b07cabd0890806a8732eff9
parent70e4841d311d68689724768157cc9cbfbde7a9fc (diff)
actually take it somewhere
-rw-r--r--src/libui_sdl/Platform.cpp261
-rw-r--r--src/libui_sdl/main.cpp130
2 files changed, 391 insertions, 0 deletions
diff --git a/src/libui_sdl/Platform.cpp b/src/libui_sdl/Platform.cpp
new file mode 100644
index 0000000..fbf0623
--- /dev/null
+++ b/src/libui_sdl/Platform.cpp
@@ -0,0 +1,261 @@
+/*
+ Copyright 2016-2017 StapleButter
+
+ This file is part of melonDS.
+
+ melonDS 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, either version 3 of the License, or (at your option)
+ any later version.
+
+ melonDS 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 melonDS. If not, see http://www.gnu.org/licenses/.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "../Platform.h"
+#include "../Config.h"
+
+/*#ifdef __WXMSW__
+ #include <winsock2.h>
+ #include <ws2tcpip.h>
+ #define socket_t SOCKET
+ #define sockaddr_t SOCKADDR
+ #define pcap_dev_name description
+#else
+ #include <unistd.h>
+ #include <arpa/inet.h>
+ #include <sys/socket.h>
+ #define socket_t int
+ #define sockaddr_t struct sockaddr
+ #define closesocket close
+ #define pcap_dev_name name
+#endif*/
+
+#ifndef INVALID_SOCKET
+#define INVALID_SOCKET (socket_t)-1
+#endif
+
+
+namespace Platform
+{
+
+
+/*class Thread : public wxThread
+{
+public:
+ Thread(void (*func)())
+ : wxThread(wxTHREAD_JOINABLE)
+ {
+ this->Func = func;
+ }
+
+ ~Thread() {}
+
+protected:
+ virtual ExitCode Entry()
+ {
+ Func();
+ return (ExitCode)0;
+ }
+
+private:
+ void (*Func)();
+};*/
+
+
+/*socket_t MPSocket;
+sockaddr_t MPSendAddr;
+u8 PacketBuffer[2048];
+
+#define NIFI_VER 1*/
+
+
+void* Thread_Create(void (*func)())
+{
+ /*Thread* ret = new Thread(func);
+ ret->Run();
+ return (void*)ret;*/
+ return NULL;
+}
+
+void Thread_Free(void* thread)
+{
+ //delete (Thread*)thread;
+}
+
+void Thread_Wait(void* thread)
+{
+ //((Thread*)thread)->Wait();
+}
+
+
+void* Semaphore_Create()
+{
+ //return (void*)new wxSemaphore();
+ return NULL;
+}
+
+void Semaphore_Free(void* sema)
+{
+ //delete (wxSemaphore*)sema;
+}
+
+void Semaphore_Reset(void* sema)
+{
+ //while (((wxSemaphore*)sema)->TryWait() == wxSEMA_NO_ERROR);
+}
+
+void Semaphore_Wait(void* sema)
+{
+ //((wxSemaphore*)sema)->Wait();
+}
+
+void Semaphore_Post(void* sema)
+{
+ //((wxSemaphore*)sema)->Post();
+}
+
+
+bool MP_Init()
+{
+ /*int opt_true = 1;
+ int res;
+
+#ifdef __WXMSW__
+ WSADATA wsadata;
+ if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0)
+ {
+ return false;
+ }
+#endif // __WXMSW__
+
+ MPSocket = socket(AF_INET, SOCK_DGRAM, 0);
+ if (MPSocket < 0)
+ {
+ return false;
+ }
+
+ res = setsockopt(MPSocket, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt_true, sizeof(int));
+ if (res < 0)
+ {
+ closesocket(MPSocket);
+ MPSocket = INVALID_SOCKET;
+ return false;
+ }
+
+ sockaddr_t saddr;
+ saddr.sa_family = AF_INET;
+ *(u32*)&saddr.sa_data[2] = htonl(Config::SocketBindAnyAddr ? INADDR_ANY : INADDR_LOOPBACK);
+ *(u16*)&saddr.sa_data[0] = htons(7064);
+ res = bind(MPSocket, &saddr, sizeof(sockaddr_t));
+ if (res < 0)
+ {
+ closesocket(MPSocket);
+ MPSocket = INVALID_SOCKET;
+ return false;
+ }
+
+ res = setsockopt(MPSocket, SOL_SOCKET, SO_BROADCAST, (const char*)&opt_true, sizeof(int));
+ if (res < 0)
+ {
+ closesocket(MPSocket);
+ MPSocket = INVALID_SOCKET;
+ return false;
+ }
+
+ MPSendAddr.sa_family = AF_INET;
+ *(u32*)&MPSendAddr.sa_data[2] = htonl(INADDR_BROADCAST);
+ *(u16*)&MPSendAddr.sa_data[0] = htons(7064);*/
+
+ return true;
+}
+
+void MP_DeInit()
+{
+ /*if (MPSocket >= 0)
+ closesocket(MPSocket);
+
+#ifdef __WXMSW__
+ WSACleanup();
+#endif // __WXMSW__*/
+}
+
+int MP_SendPacket(u8* data, int len)
+{
+ /*if (MPSocket < 0)
+ return 0;
+
+ if (len > 2048-8)
+ {
+ printf("MP_SendPacket: error: packet too long (%d)\n", len);
+ return 0;
+ }
+
+ *(u32*)&PacketBuffer[0] = htonl(0x4946494E); // NIFI
+ PacketBuffer[4] = NIFI_VER;
+ PacketBuffer[5] = 0;
+ *(u16*)&PacketBuffer[6] = htons(len);
+ memcpy(&PacketBuffer[8], data, len);
+
+ int slen = sendto(MPSocket, (const char*)PacketBuffer, len+8, 0, &MPSendAddr, sizeof(sockaddr_t));
+ if (slen < 8) return 0;
+ return slen - 8;*/
+ return 0;
+}
+
+int MP_RecvPacket(u8* data, bool block)
+{
+ /*if (MPSocket < 0)
+ return 0;
+
+ fd_set fd;
+ struct timeval tv;
+
+ FD_ZERO(&fd);
+ FD_SET(MPSocket, &fd);
+ tv.tv_sec = 0;
+ tv.tv_usec = block ? 5000 : 0;
+
+ if (!select(MPSocket+1, &fd, 0, 0, &tv))
+ {
+ return 0;
+ }
+
+ sockaddr_t fromAddr;
+ socklen_t fromLen = sizeof(sockaddr_t);
+ int rlen = recvfrom(MPSocket, (char*)PacketBuffer, 2048, 0, &fromAddr, &fromLen);
+ if (rlen < 8+24)
+ {
+ return 0;
+ }
+ rlen -= 8;
+
+ if (ntohl(*(u32*)&PacketBuffer[0]) != 0x4946494E)
+ {
+ return 0;
+ }
+
+ if (PacketBuffer[4] != NIFI_VER)
+ {
+ return 0;
+ }
+
+ if (ntohs(*(u16*)&PacketBuffer[6]) != rlen)
+ {
+ return 0;
+ }
+
+ memcpy(data, &PacketBuffer[8], rlen);
+ return rlen;*/
+ return 0;
+}
+
+
+}
diff --git a/src/libui_sdl/main.cpp b/src/libui_sdl/main.cpp
new file mode 100644
index 0000000..c0992ef
--- /dev/null
+++ b/src/libui_sdl/main.cpp
@@ -0,0 +1,130 @@
+/*
+ Copyright 2016-2017 StapleButter
+
+ This file is part of melonDS.
+
+ melonDS 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, either version 3 of the License, or (at your option)
+ any later version.
+
+ melonDS 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 melonDS. If not, see http://www.gnu.org/licenses/.
+*/
+
+#include <stdlib.h>
+#include <time.h>
+#include <stdio.h>
+
+#include <SDL2/SDL.h>
+#include <GL/gl.h>
+#include <GL/glext.h>
+
+#include "../types.h"
+#include "../version.h"
+
+
+SDL_Window* MainWindow;
+SDL_GLContext MainGL;
+
+void RunMainWindow();
+
+
+int main(int argc, char** argv)
+{
+ srand(time(NULL));
+
+ // http://stackoverflow.com/questions/14543333/joystick-wont-work-using-sdl
+ SDL_SetHint(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS, "1");
+
+ if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
+ {
+ printf("SDL shat itself :(\n");
+ return 1;
+ }
+
+ RunMainWindow();
+
+ SDL_Quit();
+ return 0;
+}
+
+#ifdef __WIN32__
+
+#include <windows.h>
+
+int CALLBACK WinMain(HINSTANCE hinst, HINSTANCE hprev, LPSTR cmdline, int cmdshow)
+{
+ char cmdargs[16][256];
+ int arg = 0;
+ int j = 0;
+ bool inquote = false;
+ int len = strlen(cmdline);
+ for (int i = 0; i < len; i++)
+ {
+ char c = cmdline[i];
+ if (c == '\0') break;
+ if (c == '"') inquote = !inquote;
+ if (!inquote && c==' ')
+ {
+ if (j > 255) j = 255;
+ if (arg < 16) cmdargs[arg][j] = '\0';
+ arg++;
+ j = 0;
+ }
+ else
+ {
+ if (arg < 16 && j < 255) cmdargs[arg][j] = c;
+ j++;
+ }
+ }
+ if (j > 255) j = 255;
+ if (arg < 16) cmdargs[arg][j] = '\0';
+
+ return main(arg, (char**)cmdargs);
+}
+
+#endif
+
+
+void RunMainWindow()
+{
+ MainWindow = SDL_CreateWindow("melonDS " MELONDS_VERSION,
+ SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
+ 640, 480,
+ SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
+ //MainGL= SDL_GL_CreateContext(MainWindow);
+
+ // event loop
+ bool run = true;
+ while (run)
+ {
+ SDL_Event evt;
+ while (SDL_PollEvent(&evt))
+ {
+ switch (evt.type)
+ {
+ case SDL_WINDOWEVENT:
+ if (evt.window.event == SDL_WINDOWEVENT_CLOSE)
+ {
+ run = false;
+ break;
+ }
+ break;
+ }
+ }
+
+ // do extra shit here
+ /*glClearColor(1, 0, 1, 1);
+ glClear(GL_COLOR_BUFFER_BIT);
+ SDL_GL_SwapWindow(MainWindow);
+ SDL_Delay(50);*/
+ }
+
+ //SDL_GL_DeleteContext(MainGL);
+ SDL_DestroyWindow(MainWindow);
+}