summaryrefslogtreecommitdiff
path: root/bin/glfw.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'bin/glfw.cpp')
-rw-r--r--bin/glfw.cpp176
1 files changed, 176 insertions, 0 deletions
diff --git a/bin/glfw.cpp b/bin/glfw.cpp
new file mode 100644
index 0000000000..98fb32075e
--- /dev/null
+++ b/bin/glfw.cpp
@@ -0,0 +1,176 @@
+#include <mbgl/mbgl.hpp>
+#include <mbgl/util/default_styles.hpp>
+#include <mbgl/platform/log.hpp>
+#include <mbgl/platform/platform.hpp>
+#include <mbgl/platform/default/settings_json.hpp>
+#include <mbgl/platform/default/glfw_view.hpp>
+#include <mbgl/storage/default_file_source.hpp>
+
+#include <signal.h>
+#include <getopt.h>
+#include <fstream>
+#include <sstream>
+#include <cstdlib>
+#include <cstdio>
+
+namespace {
+
+std::unique_ptr<GLFWView> view;
+
+}
+
+void quit_handler(int) {
+ if (view) {
+ mbgl::Log::Info(mbgl::Event::Setup, "waiting for quit...");
+ view->setShouldClose();
+ } else {
+ exit(0);
+ }
+}
+
+int main(int argc, char *argv[]) {
+ bool fullscreen = false;
+ bool benchmark = false;
+ std::string style;
+ double latitude = 0, longitude = 0;
+ double bearing = 0, zoom = 1, pitch = 0;
+ bool skipConfig = false;
+
+ const struct option long_options[] = {
+ {"fullscreen", no_argument, 0, 'f'},
+ {"benchmark", no_argument, 0, 'b'},
+ {"style", required_argument, 0, 's'},
+ {"lon", required_argument, 0, 'x'},
+ {"lat", required_argument, 0, 'y'},
+ {"zoom", required_argument, 0, 'z'},
+ {"bearing", required_argument, 0, 'r'},
+ {"pitch", required_argument, 0, 'p'},
+ {0, 0, 0, 0}
+ };
+
+ while (true) {
+ int option_index = 0;
+ int opt = getopt_long(argc, argv, "fbs:", long_options, &option_index);
+ if (opt == -1) break;
+ switch (opt)
+ {
+ case 0:
+ if (long_options[option_index].flag != 0)
+ break;
+ case 'f':
+ fullscreen = true;
+ break;
+ case 'b':
+ benchmark = true;
+ break;
+ case 's':
+ style = std::string("asset://") + std::string(optarg);
+ break;
+ case 'x':
+ longitude = atof(optarg);
+ skipConfig = true;
+ break;
+ case 'y':
+ latitude = atof(optarg);
+ skipConfig = true;
+ break;
+ case 'z':
+ zoom = atof(optarg);
+ skipConfig = true;
+ break;
+ case 'r':
+ bearing = atof(optarg);
+ skipConfig = true;
+ break;
+ case 'p':
+ pitch = atof(optarg);
+ skipConfig = true;
+ break;
+ default:
+ break;
+ }
+
+ }
+
+ // sigint handling
+ struct sigaction sigIntHandler;
+ sigIntHandler.sa_handler = quit_handler;
+ sigemptyset(&sigIntHandler.sa_mask);
+ sigIntHandler.sa_flags = 0;
+ sigaction(SIGINT, &sigIntHandler, NULL);
+
+ if (benchmark) {
+ mbgl::Log::Info(mbgl::Event::General, "BENCHMARK MODE: Some optimizations are disabled.");
+ }
+
+ view = std::make_unique<GLFWView>(fullscreen, benchmark);
+
+ mbgl::DefaultFileSource fileSource("/tmp/mbgl-cache.db", ".");
+
+ // Set access token if present
+ const char *token = getenv("MAPBOX_ACCESS_TOKEN");
+ if (token == nullptr) {
+ mbgl::Log::Warning(mbgl::Event::Setup, "no access token set. mapbox.com tiles won't work.");
+ } else {
+ fileSource.setAccessToken(std::string(token));
+ }
+
+ mbgl::Map map(*view, fileSource);
+
+ // Load settings
+ mbgl::Settings_JSON settings;
+
+ if (skipConfig) {
+ map.setLatLngZoom(mbgl::LatLng(latitude, longitude), zoom);
+ map.setBearing(bearing);
+ map.setPitch(pitch);
+ mbgl::Log::Info(mbgl::Event::General, "Location: %f/%f (z%.2f, %.2f deg)", latitude, longitude, zoom, bearing);
+ } else {
+ map.setLatLngZoom(mbgl::LatLng(settings.latitude, settings.longitude), settings.zoom);
+ map.setBearing(settings.bearing);
+ map.setPitch(settings.pitch);
+ map.setDebug(mbgl::MapDebugOptions(settings.debug));
+ }
+
+ view->setChangeStyleCallback([&map] () {
+ static uint8_t currentStyleIndex;
+
+ if (++currentStyleIndex == mbgl::util::default_styles::numOrderedStyles) {
+ currentStyleIndex = 0;
+ }
+
+ mbgl::util::default_styles::DefaultStyle newStyle = mbgl::util::default_styles::orderedStyles[currentStyleIndex];
+ map.setStyleURL(newStyle.url);
+ view->setWindowTitle(newStyle.name);
+
+ mbgl::Log::Info(mbgl::Event::Setup, "Changed style to: %s", newStyle.name);
+ });
+
+ // Load style
+ if (style.empty()) {
+ mbgl::util::default_styles::DefaultStyle newStyle = mbgl::util::default_styles::orderedStyles[0];
+ style = newStyle.url;
+ view->setWindowTitle(newStyle.name);
+ }
+
+ map.setStyleURL(style);
+
+ view->run();
+
+ // Save settings
+ mbgl::LatLng latLng = map.getLatLng();
+ settings.latitude = latLng.latitude;
+ settings.longitude = latLng.longitude;
+ settings.zoom = map.getZoom();
+ settings.bearing = map.getBearing();
+ settings.pitch = map.getPitch();
+ settings.debug = mbgl::EnumType(map.getDebug());
+ if (!skipConfig) {
+ settings.save();
+ }
+ mbgl::Log::Info(mbgl::Event::General,
+ "Exit location: --lat=\"%f\" --lon=\"%f\" --zoom=\"%f\" --bearing \"%f\"",
+ settings.latitude, settings.longitude, settings.zoom, settings.bearing);
+
+ return 0;
+}