diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2014-03-14 11:33:45 +0100 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2014-03-14 11:33:45 +0100 |
commit | bdfa761c39218234d9ce7419b3b323e8f25a1476 (patch) | |
tree | 4d6ef181a483a6787bb86cc0e5fd15ac187a8584 /linux | |
parent | 4f03b43ab24cc91dea8028ea71b58d6e52f842ed (diff) | |
download | qtlocation-mapboxgl-bdfa761c39218234d9ce7419b3b323e8f25a1476.tar.gz |
remove code duplication between osx/glfw and linux/glfw programs
Diffstat (limited to 'linux')
-rw-r--r-- | linux/main.cpp | 333 | ||||
-rw-r--r-- | linux/settings.cpp | 10 | ||||
-rw-r--r-- | linux/settings.hpp | 8 |
3 files changed, 64 insertions, 287 deletions
diff --git a/linux/main.cpp b/linux/main.cpp index ade6c5e52f..9e2c240018 100644 --- a/linux/main.cpp +++ b/linux/main.cpp @@ -1,266 +1,95 @@ #include <llmr/llmr.hpp> -#include <GLFW/glfw3.h> #include <llmr/platform/platform.hpp> #include <signal.h> #include <getopt.h> +#include "../common/map_view.cpp" #include "settings.hpp" #include "request.hpp" -std::forward_list<llmr::platform::Request *> requests; - -static int fullscreen_flag = 0; - -class MapView { -public: - MapView() : - dirty(true), - tracking(false), - rotating(false), - last_click(-1), - settings(), - map(settings) { - } - - void init() { - if (!glfwInit()) { - fprintf(stderr, "Failed to initialize glfw\n"); - exit(1); - } - - GLFWmonitor *monitor = nullptr; - -#ifdef GL_ES_VERSION_2_0 - if (fullscreen_flag) { - monitor = glfwGetPrimaryMonitor(); - } - glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API); - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); -#endif - - glfwWindowHint(GLFW_RED_BITS, 8); - glfwWindowHint(GLFW_GREEN_BITS, 8); - glfwWindowHint(GLFW_BLUE_BITS, 8); - glfwWindowHint(GLFW_ALPHA_BITS, 8); - glfwWindowHint(GLFW_STENCIL_BITS, 8); - glfwWindowHint(GLFW_DEPTH_BITS, 16); - - window = glfwCreateWindow(1024, 768, "llmr", monitor, NULL); - if (!window) { - glfwTerminate(); - fprintf(stderr, "Failed to initialize window\n"); - exit(1); - } - - glfwSetWindowUserPointer(window, this); - glfwMakeContextCurrent(window); - - int width, height; - glfwGetWindowSize(window, &width, &height); - int fb_width, fb_height; - glfwGetFramebufferSize(window, &fb_width, &fb_height); - - settings.load(); - map.setup((double)fb_width / width); - - resize(window, 0, 0); - - map.loadSettings(); - - glfwSetCursorPosCallback(window, mousemove); - glfwSetMouseButtonCallback(window, mouseclick); - glfwSetWindowSizeCallback(window, resize); - glfwSetFramebufferSizeCallback(window, resize); - glfwSetScrollCallback(window, scroll); - glfwSetCharCallback(window, character); - glfwSetKeyCallback(window, key); - } - - static void character(GLFWwindow *window, unsigned int codepoint) { - - } - - - static void key(GLFWwindow *window, int key, int scancode, int action, int mods) { - MapView *mapView = (MapView *)glfwGetWindowUserPointer(window); - - if (action == GLFW_RELEASE) { - switch (key) { - case GLFW_KEY_ESCAPE: - glfwSetWindowShouldClose(window, true); - break; - case GLFW_KEY_TAB: - mapView->map.toggleDebug(); - break; - case GLFW_KEY_R: - if (!mods) mapView->map.resetPosition(); - break; - case GLFW_KEY_N: - if (!mods) mapView->map.resetNorth(); - break; - } - } - } - - - static void scroll(GLFWwindow *window, double xoffset, double yoffset) { - MapView *mapView = (MapView *)glfwGetWindowUserPointer(window); - double delta = yoffset * 40; +MapView *mapView = nullptr; +std::forward_list<llmr::platform::Request *> requests; - bool is_wheel = delta != 0 && fmod(delta, 4.000244140625) == 0; - double absdelta = delta < 0 ? -delta : delta; - double scale = 2.0 / (1.0 + exp(-absdelta / 100.0)); - // Make the scroll wheel a bit slower. - if (!is_wheel) { - scale = (scale - 1.0) / 2.0 + 1.0; - } - // Zooming out. - if (delta < 0 && scale != 0) { - scale = 1.0 / scale; - } - - mapView->map.startScaling(); - mapView->map.scaleBy(scale, mapView->last_x, mapView->last_y); +void quit_handler(int s) { + if (mapView) { + fprintf(stderr, "waiting for quit...\n"); + glfwSetWindowShouldClose(mapView->window, true); + llmr::platform::restart(); + } else { + exit(0); } +} - static void resize(GLFWwindow *window, int, int) { - MapView *mapView = (MapView *)glfwGetWindowUserPointer(window); - - int width, height; - glfwGetWindowSize(window, &width, &height); - int fb_width, fb_height; - glfwGetFramebufferSize(window, &fb_width, &fb_height); - fprintf(stderr, "window size: %d/%d\n", width, height); - mapView->map.resize(width, height, fb_width, fb_height); - } - static void mouseclick(GLFWwindow *window, int button, int action, int modifiers) { - MapView *mapView = (MapView *)glfwGetWindowUserPointer(window); - - if (button == GLFW_MOUSE_BUTTON_RIGHT || (button == GLFW_MOUSE_BUTTON_LEFT && modifiers & GLFW_MOD_CONTROL)) { - mapView->rotating = action == GLFW_PRESS; - if (mapView->rotating) { - mapView->start_x = mapView->last_x; - mapView->start_y = mapView->last_y; - } else { - mapView->map.stopRotating(); - } - } else if (button == GLFW_MOUSE_BUTTON_LEFT) { - mapView->tracking = action == GLFW_PRESS; - - if (action == GLFW_RELEASE) { - mapView->map.stopPanning(); - double now = glfwGetTime(); - if (now - mapView->last_click < 0.4) { - mapView->map.scaleBy(2.0, mapView->last_x, mapView->last_y); - } - mapView->last_click = now; - } - } - } - static void mousemove(GLFWwindow *window, double x, double y) { - MapView *mapView = (MapView *)glfwGetWindowUserPointer(window); - if (mapView->tracking) { - double dx = x - mapView->last_x; - double dy = y - mapView->last_y; - if (dx || dy) { - mapView->map.startPanning(); - mapView->map.moveBy(dx, dy); - } - } else if (mapView->rotating) { - mapView->map.startRotating(); - mapView->map.rotateBy(mapView->start_x, mapView->start_y, mapView->last_x, mapView->last_y, x, y); - } - mapView->last_x = x; - mapView->last_y = y; - } +int main(int argc, char *argv[]) { + int fullscreen_flag = 0; - int run() { - while (!glfwWindowShouldClose(window)) { - bool& dirty = this->dirty; - requests.remove_if([&dirty](llmr::platform::Request * req) { - if (req->done) { - req->foreground_callback(); - delete req; - dirty = true; - return true; - } else { - return false; - } - }); - - if (dirty) { - try { - dirty = render(); - } catch (std::exception& ex) { - fprintf(stderr, "exception: %s\n", ex.what()); - } - glfwSwapBuffers(window); - fps(); - } - - if (!requests.empty() || dirty) { - glfwPollEvents(); - } else { - glfwWaitEvents(); - } - } + const struct option long_options[] = { + {"fullscreen", no_argument, &fullscreen_flag, 1}, + {0, 0, 0, 0} + }; - return 0; - } - - bool render() { - return map.render(); + while (true) { + int option_index = 0; + int c = getopt_long(argc, argv, "f", long_options, &option_index); + if (c == -1) break; } - void fps() { - static int frames = 0; - static double time_elapsed = 0; + // sigint handling + struct sigaction sigIntHandler; + sigIntHandler.sa_handler = quit_handler; + sigemptyset(&sigIntHandler.sa_mask); + sigIntHandler.sa_flags = 0; + sigaction(SIGINT, &sigIntHandler, NULL); - frames++; - double current_time = glfwGetTime(); - if (current_time - time_elapsed >= 1) { - fprintf(stderr, "FPS: %4.2f\n", frames / (current_time - time_elapsed)); - time_elapsed = current_time; - frames = 0; - } - } + // curl init + curl_global_init(CURL_GLOBAL_ALL); - ~MapView() { - glfwTerminate(); - } + llmr::platform::Request::initialize(); -public: - bool dirty; - double last_x, last_y; - bool tracking; - double start_x, start_y; - bool rotating; + // main loop + llmr::Settings_JSON settings; + mapView = new MapView(settings, fullscreen_flag); + mapView->init(); + int ret = mapView->run(); + mapView->settings.sync(); + delete mapView; - double last_click; - GLFWwindow *window; - llmr::Settings_MacOSX settings; - llmr::Map map; -}; + llmr::platform::Request::finish(); -MapView *mapView = nullptr; + curl_global_cleanup(); + return ret; +} namespace llmr { namespace platform { +void cleanup() { + bool& dirty = mapView->dirty; + requests.remove_if([&dirty](llmr::platform::Request * req) { + if (req->done) { + req->foreground_callback(); + delete req; + dirty = true; + return true; + } else { + return false; + } + }); +} + void restart() { if (mapView) { mapView->dirty = true; @@ -287,55 +116,3 @@ double time() { } } - -void quit_handler(int s) { - if (mapView) { - fprintf(stderr, "waiting for quit...\n"); - glfwSetWindowShouldClose(mapView->window, true); - llmr::platform::restart(); - } else { - exit(0); - } -} - - - -static struct option long_options[] = { - {"fullscreen", no_argument, &fullscreen_flag, 1}, - {0, 0, 0, 0} -}; - -int main(int argc, char *argv[]) { - while (true) { - int option_index = 0; - int c = getopt_long(argc, argv, "f", long_options, &option_index); - if (c == -1) break; - } - - // sigint handling - struct sigaction sigIntHandler; - sigIntHandler.sa_handler = quit_handler; - sigemptyset(&sigIntHandler.sa_mask); - sigIntHandler.sa_flags = 0; - sigaction(SIGINT, &sigIntHandler, NULL); - - - // curl init - curl_global_init(CURL_GLOBAL_ALL); - - llmr::platform::Request::initialize(); - - - // main loop - mapView = new MapView(); - mapView->init(); - int ret = mapView->run(); - mapView->settings.sync(); - delete mapView; - - - llmr::platform::Request::finish(); - - curl_global_cleanup(); - return ret; -} diff --git a/linux/settings.cpp b/linux/settings.cpp index 1b4d8a7367..73df446f6a 100644 --- a/linux/settings.cpp +++ b/linux/settings.cpp @@ -6,11 +6,11 @@ using namespace llmr; -Settings_MacOSX::Settings_MacOSX() +Settings_JSON::Settings_JSON() { } -void Settings_MacOSX::load() +void Settings_JSON::load() { FILE *settingsFile = fopen("/tmp/llmr-native.json", "r"); if (settingsFile != NULL) { @@ -27,11 +27,11 @@ void Settings_MacOSX::load() } } -void Settings_MacOSX::persist() +void Settings_JSON::persist() { } -void Settings_MacOSX::sync() +void Settings_JSON::sync() { rapidjson::FileStream s(fopen("/tmp/llmr-native.json", "w")); @@ -45,7 +45,7 @@ void Settings_MacOSX::sync() writer.EndArray(); } -void Settings_MacOSX::clear() +void Settings_JSON::clear() { longitude = 0; latitude = 0; diff --git a/linux/settings.hpp b/linux/settings.hpp index e507c6bd17..a171e8ab8f 100644 --- a/linux/settings.hpp +++ b/linux/settings.hpp @@ -1,13 +1,13 @@ -#ifndef LLMR_MACOSX_SETTINGS -#define LLMR_MACOSX_SETTINGS +#ifndef LLMR_JSON_SETTINGS +#define LLMR_JSON_SETTINGS #include <llmr/map/settings.hpp> namespace llmr { -class Settings_MacOSX : public Settings { +class Settings_JSON : public Settings { public: - Settings_MacOSX(); + Settings_JSON(); virtual void load(); virtual void persist(); virtual void sync(); |