You can now do all of the control things you'd do in the control window via the bezos_cli/ctl command line tool.

master
Zed A. Shaw 3 weeks ago
parent a5214f942e
commit 85423d9ac9
  1. 42
      src/bezos_ctl.cpp
  2. 75
      src/control_ui.cpp
  3. 9
      src/control_ui.hpp
  4. 17
      src/main.cpp

@ -11,31 +11,48 @@ const int DEFAULT_PORT=9898;
struct Options {
bool help{false};
bool focus{false};
CtrlCommand cmd{CtrlCommand::NONE};
bool error{false};
unsigned short port=DEFAULT_PORT;
};
void request_focus(Options& options) {
fmt::println("Moving control window front: port={}", options.port);
void send_request(Options& options) {
sf::UdpSocket sock;
uint32_t cmd = uint32_t(CtrlCommand::FOCUS);
uint32_t cmd = uint32_t(options.cmd);
auto localhost = sf::IpAddress::getLocalAddress();
dbc::check(localhost != std::nullopt, "Failed to get local addres?!");
auto result = sock.send(&cmd, sizeof cmd, *localhost, options.port);
}
void print_usage() {
fmt::println("USAGE: bezos [-p {}] [-hf] -d deck.md", DEFAULT_PORT);
fmt::println("USAGE: bezos [-p {}] [-h] [-fLRNPq]", DEFAULT_PORT);
}
Options parse_options(int argc, char* argv[]) {
int opt = 0;
Options result;
while((opt = getopt(argc, argv, "fhp:")) != -1) {
while((opt = getopt(argc, argv, "fLRNPqhp:")) != -1) {
using enum CtrlCommand;
switch(opt) {
case 'L':
result.cmd = MOVE_LEFT;
break;
case 'R':
result.cmd = MOVE_RIGHT;
break;
case 'N':
result.cmd = NEXT_SLIDE;
break;
case 'P':
result.cmd = PREV_SLIDE;
break;
case 'q':
result.cmd = QUIT;
break;
case 'f':
result.focus=true;
result.cmd = FOCUS;
break;
case 'h':
print_usage();
@ -50,23 +67,22 @@ Options parse_options(int argc, char* argv[]) {
}
}
if(!result.focus) {
if(result.cmd == CtrlCommand::NONE) {
print_usage();
}
return result;
}
int main(int argc, char *argv[]) {
auto options = parse_options(argc, argv);
if(options.focus) {
request_focus(options);
return 0;
} else if(options.help) {
if(options.help) {
return 0;
} else if(options.error) {
return 1;
} else {
send_request(options);
return 0;
}
}

@ -11,11 +11,13 @@
#include <iostream>
#include "constants.hpp"
#include "control_ui.hpp"
#include <optional>
ControlUI::ControlUI(sf::RenderWindow& presenter, sf::RenderWindow& controller) :
$presenter(presenter),
$controller(controller),
$window_size($presenter.getSize())
ControlUI::ControlUI(sf::RenderWindow& presenter, sf::RenderWindow& controller, unsigned short port) :
$presenter{presenter},
$controller{controller},
$window_size{$presenter.getSize()},
$ctrl_sock{port}
{
$gui.position(0, 0, CONTROL_WIDTH, CONTROL_HEIGHT);
$gui.layout(
@ -31,6 +33,8 @@ ControlUI::ControlUI(sf::RenderWindow& presenter, sf::RenderWindow& controller)
}
void ControlUI::init() {
$ctrl_sock.listen();
auto status_id = $gui.entity("status");
$gui.set<guecs::Text>(status_id, {L""});
@ -98,27 +102,63 @@ void ControlUI::full_screen(bool do_it) {
$full_screen = do_it;
}
void ControlUI::handle_events(std::shared_ptr<SlidesUI> slides, const sf::Event& event) {
void ControlUI::process_commands(std::shared_ptr<SlidesUI> slides) {
using enum CtrlCommand;
switch($ctrl_sock.receive()) {
case FOCUS:
sf::Mouse::setPosition({WINDOW_WIDTH - 100, WINDOW_HEIGHT - 100}, $presenter);
break;
case FULL_SCREEN:
full_screen(!$full_screen);
break;
case MOVE_LEFT:
move(1);
break;
case MOVE_RIGHT:
move(-1);
break;
case NEXT_SLIDE:
slides->next_slide();
break;
case PREV_SLIDE:
slides->prev_slide();
break;
case QUIT:
$controller.close();
break;
default:
break;
}
}
void ControlUI::move(int dir) {
auto pos = $presenter.getPosition();
pos.x += dir * $window_size.x;
$presenter.setPosition(pos);
}
void ControlUI::update(std::shared_ptr<SlidesUI> slides) {
dbc::check($status != nullptr, "handle_events called before init?!");
if(event.is<sf::Event::Closed>()) {
process_commands(slides);
while (const auto event = $controller.pollEvent()) {
if(event->is<sf::Event::Closed>()) {
$controller.close();
return;
}
if(const auto* key = event.getIf<sf::Event::KeyPressed>()) {
auto pos = $presenter.getPosition();
if(const auto* key = event->getIf<sf::Event::KeyPressed>()) {
using KEY = sf::Keyboard::Scan;
switch(key->scancode) {
case KEY::A: {
pos.x -= $window_size.x;
$presenter.setPosition(pos);
} break;
case KEY::D: {
pos.x += int($window_size.x);
$presenter.setPosition(pos);
} break;
case KEY::A:
move(1);
break;
case KEY::D:
move(-1);
break;
case KEY::Q:
$controller.close();
break;
@ -126,7 +166,8 @@ void ControlUI::handle_events(std::shared_ptr<SlidesUI> slides, const sf::Event&
full_screen(!$full_screen);
break;
default:
slides->handle_events($controller, event);
slides->handle_events($controller, *event);
}
}
}
}

@ -3,6 +3,7 @@
#include "guecs/sfml/components.hpp"
#include "guecs/ui.hpp"
#include "slides_ui.hpp"
#include "control.hpp"
struct ControlUI {
bool $full_screen = true;
@ -11,11 +12,15 @@ struct ControlUI {
sf::RenderWindow& $presenter;
sf::RenderWindow& $controller;
sf::Vector2u $window_size;
CtrlSocket $ctrl_sock;
ControlUI(sf::RenderWindow& presenter, sf::RenderWindow& controller, unsigned short port);
ControlUI(sf::RenderWindow& presenter, sf::RenderWindow& controller);
void init();
void render(sf::RenderWindow& window, SlideDeck& deck);
void handle_events(std::shared_ptr<SlidesUI> slides, const sf::Event& event);
void update(std::shared_ptr<SlidesUI> slides);
void render_slide(const std::string& name, Slide& slide);
void full_screen(bool do_it);
void process_commands(std::shared_ptr<SlidesUI> slides);
void move(int dir);
};

@ -11,7 +11,6 @@
#include <SFML/System/Clock.hpp>
#include <memory>
#include <unistd.h>
#include "control.hpp"
using namespace std::chrono_literals;
@ -70,7 +69,7 @@ struct ChangeDetector {
};
void print_usage() {
fmt::println("USAGE: bezos [-p PORT] [-hf] -d deck.md");
fmt::println("USAGE: bezos [-p PORT] [-h] -d deck.md");
}
Options parse_options(int argc, char* argv[]) {
@ -137,30 +136,20 @@ int main(int argc, char *argv[]) {
return 1;
}
ControlUI control_ui(presenter, controller);
ControlUI control_ui{presenter, controller, options.port};
control_ui.init();
control_ui.full_screen(false);
CtrlSocket ctrl_sock{options.port};
ctrl_sock.listen();
ChangeDetector slides_reloader{options.deck_file};
ChangeDetector layout_reloader{slides->$deck->config["layouts"]};
while(controller.isOpen()) {
auto command = ctrl_sock.receive();
if(command == CtrlCommand::FOCUS) {
sf::Mouse::setPosition({WINDOW_WIDTH - 100, WINDOW_HEIGHT - 100}, presenter);
}
while(const auto event = presenter.pollEvent()) {
if(event) slides->handle_events(presenter, *event);
}
while (const auto event = controller.pollEvent()) {
if(event) control_ui.handle_events(slides, *event);
}
control_ui.update(slides);
slides->render(presenter);
control_ui.render(controller, *slides->$deck);

Loading…
Cancel
Save