summaryrefslogtreecommitdiffstats
path: root/afb-client/bower_components/foundation-icon-fonts/svgs/fi-like.svg
blob: 5639e629c782475a8ce7b62d66d944e013d06128 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
	 width="100px" height="100px" viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve">
<g>
	<path d="M82.488,74.334c0-0.12-0.019-0.234-0.035-0.35V47.06h-0.001c0-0.003,0.001-0.006,0.001-0.009
		c0-1.401-1.136-2.536-2.537-2.536c-0.047,0-0.09,0.011-0.136,0.014l-4.799,0v0.018c-1.361,0.04-2.452,1.145-2.461,2.513h-0.008
		v27.502h0.043c0.12,1.257,1.147,2.243,2.426,2.287v0.022l4.971,0l0,0l0,0h0l0,0C81.352,76.871,82.488,75.735,82.488,74.334z"/>
	<path d="M67.49,78.554v-8.341h0V42.061H67.49c0-0.003,0.001-0.006,0.001-0.009c0-1.401-1.136-2.536-2.537-2.536
		c-0.046,0-0.09,0.011-0.136,0.014h-9.932c-0.15-0.244-0.334-0.453-0.536-0.637L44.47,21.778l-0.025,0.015
		c-0.99-1.753-2.848-2.936-4.98-2.936c-3.171,0-5.742,2.608-5.742,5.825c0,0,0,0,0,0h-0.058v3.257v0.105v11.485H19.981v0.018
		c-1.361,0.04-2.452,1.145-2.461,2.513h-0.008v28.152h0.006c0,0.323,0.124,0.646,0.368,0.894l-0.003,0.003l9.764,9.764l0.024-0.024
		c0.281,0.231,0.626,0.318,0.967,0.272h36.103c0.073,0.006,0.143,0.022,0.217,0.022c1.355,0,2.454-1.066,2.523-2.405h0.008V78.66
		c0-0.018,0.005-0.035,0.005-0.053S67.491,78.572,67.49,78.554z M20.505,70.212l0.042,0.047l-0.047-0.047H20.505z"/>
</g>
</svg>
ht: bold } /* Literal.Number.Integer.Long */ }
/*
 * Copyright (C) 2017 Mentor Graphics Development (Deutschland) GmbH
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "app.hpp"
#include "json_helper.hpp"
#include "util.hpp"
#include "wayland.hpp"

#include <algorithm>
#include <mutex>

#include <json.h>

extern "C" {
#include <afb/afb-binding.h>
#include <systemd/sd-event.h>
}

namespace {

struct afb_instance {
   std::unique_ptr<wl::display> display;
   wm::App app;

   afb_instance() : display{new wl::display}, app{this->display.get()} {}

   int init();
};

struct afb_instance *g_afb_instance;

int afb_instance::init() {
   if (!this->display->ok()) {
      return -1;
   }

   return this->app.init();
}

int display_event_callback(sd_event_source *evs, int fd, uint32_t events,
                           void * /*data*/) {
   ST();

   if ((events & EPOLLHUP) != 0) {
      logerror("The compositor hung up, dying now.");
      delete g_afb_instance;
      g_afb_instance = nullptr;
      goto error;
   }

   if ((events & EPOLLIN) != 0u) {
      {
         STN(display_read_events);
         g_afb_instance->app.display->read_events();
         g_afb_instance->app.set_pending_events();
      }
      {
         // We want do dispatch pending wayland events from within
         // the API context
         STN(winman_ping_api_call);
         afb_service_call("winman", "ping", json_object_new_object(),
                          [](void *c, int st, json_object *j) {
                             STN(winman_ping_api_call_return);
                          },
                          nullptr);
      }
   }

   return 0;

error:
   sd_event_source_unref(evs);
   if (getenv("WINMAN_EXIT_ON_HANGUP") != nullptr)
      exit(1);
   return -1;
}

//  _     _           _ _                 _       _ _    ____
// | |__ (_)_ __   __| (_)_ __   __ _    (_)_ __ (_) |_ / /\ \
// | '_ \| | '_ \ / _` | | '_ \ / _` |   | | '_ \| | __| |  | |
// | |_) | | | | | (_| | | | | | (_| |   | | | | | | |_| |  | |
// |_.__/|_|_| |_|\__,_|_|_| |_|\__, |___|_|_| |_|_|\__| |  | |
//                              |___/_____|             \_\/_/
int binding_init_() {
   lognotice("WinMan ver. %s", WINMAN_VERSION_STRING);

   if (g_afb_instance != nullptr) {
      logerror("Wayland context already initialized?");
      return 0;
   }

   if (getenv("XDG_RUNTIME_DIR") == nullptr) {
      logerror("Environment variable XDG_RUNTIME_DIR not set");
      goto error;
   }

   g_afb_instance = new afb_instance;
   if (g_afb_instance->init() == -1) {
      logerror("Could not connect to compositor");
      goto error;
   }

   {
      int ret = sd_event_add_io(afb_daemon_get_event_loop(), nullptr,
                                g_afb_instance->display->get_fd(), EPOLLIN,
                                display_event_callback, g_afb_instance);
      if (ret < 0) {
         logerror("Could not initialize afb_instance event handler: %d", -ret);
         goto error;
      }
   }

   atexit([] { delete g_afb_instance; });

   return 0;

error:
   delete g_afb_instance;
   g_afb_instance = nullptr;
   return -1;
}

int binding_init() noexcept {
   try {
      return binding_init_();
   } catch (std::exception &e) {
      logerror("Uncaught exception in binding_init(): %s", e.what());
   }
   return -1;
}

}  // namespace

#include "afb_binding_glue.inl"

// XXX implement send_event right here...
namespace wm {
void binding_api::send_event(char const *evname, char const *label) {
   logdebug("%s: %s(%s)", __func__, evname, label);
   int ret = afb_daemon_broadcast_event(evname, json_object_new_string(label));
   if (ret != 0) {
      logdebug("afb_event_broadcast failed: %m");
   }
}
}

extern "C" const struct afb_binding_v2 afbBindingV2 = {
   "winman", nullptr, nullptr, winman_verbs, nullptr, binding_init, nullptr, 0};