From 9ce74862a2688f366d2e6d5aef9aa20429ef0051 Mon Sep 17 00:00:00 2001 From: chenhuan Date: Mon, 18 Nov 2019 14:56:11 +0100 Subject: [PATCH] 1.code cleanup 2.mouse and keybroad interrupt --- CMakeLists.txt | 2 +- main/main.cpp | 5 +- src/{init.cpp => GUI.cpp} | 47 ++++++++++------- src/GUI.hpp | 57 +++++++++++++++----- src/GUI_Window.cpp | 108 ++++++++++++++++++-------------------- src/Image.cpp | 69 +++++++----------------- src/Statusbar.cpp | 58 ++++++++++---------- 7 files changed, 171 insertions(+), 175 deletions(-) rename src/{init.cpp => GUI.cpp} (57%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 245df11..aee843d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,7 +22,7 @@ file(GLOB_RECURSE TESTS test/*.cpp) set(LIB_PATH "${CMAKE_SOURCE_DIR}/../library") include_directories(${LIB_PATH}/include) -add_executable(GUI ${SOURCES} ${HEADERS} main/main.cpp src/Statusbar.cpp src/GUI_Window.cpp src/Image.cpp src/GUI.hpp src/init.cpp) +add_executable(GUI ${SOURCES} ${HEADERS} main/main.cpp src/Statusbar.cpp src/GUI_Window.cpp src/Image.cpp src/GUI.hpp src/GUI.cpp) target_link_libraries(GUI ${LIB_PATH}/lib/liblibrary.a) diff --git a/main/main.cpp b/main/main.cpp index 5eac64c..e71e8be 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -1,10 +1,9 @@ -#include "GUI.hpp" +#include "../src/GUI.hpp" /** main * The main function executes the functions of the GUI. */ int main(int argc, char **argv) { - GUI_init(); - GUI_run(); + GUI_run(argc,argv); } \ No newline at end of file diff --git a/src/init.cpp b/src/GUI.cpp similarity index 57% rename from src/init.cpp rename to src/GUI.cpp index d42a800..1ea82d5 100644 --- a/src/init.cpp +++ b/src/GUI.cpp @@ -1,35 +1,42 @@ #include "GUI.hpp" + #define window_height 600 #define window_width 800 -/** GUI_init - * The GUI_init-function initializes all needed classes for the GUI. - */ -void GUI_init() { - vkvm::initialize(0); - My_Window *window = new My_Window(window_width, window_height, "example"); - Statusbar *status[5]; - Image *image = new Image(0, 30, window_width, window_height - 30); - - //Dummy-Values TBD - status[0] = new Statusbar(0, 0, 60, 30, "status0"); - status[1] = new Statusbar(60, 0, 60, 30, "status1"); - status[2] = new Statusbar(120, 0, 60, 30, "status2"); - status[3] = new Statusbar(180, 0, 60, 30, "status3"); - status[4] = new Statusbar(240, 0, 60, 30, "status4"); - -} /** GUI_run * The GUI_run-function starts all functions needed for the GUI. */ -void GUI_run() { +auto GUI_run(int argc, char **argv) -> int { + vkvm::initialize(0); + GUI_Window *window = new GUI_Window(window_width, window_height, "example"); + Statusbar *status[5]; + //Dummy-Values TBD window->begin(); + Image *image = new Image(0, 30, window_width, window_height - 30); + status[0] = new Statusbar(0, 0, 60, 30, "0"); + status[1] = new Statusbar(60, 0, 60, 30, "status1"); + status[2] = new Statusbar(120, 0, 60, 30, "status2"); + status[3] = new Statusbar(180, 0, 60, 30, "status3"); + status[4] = new Statusbar(240, 0, 60, 30, "status4"); Fl::repeat_timeout(0.5, refresh_image, image); - Fl::repeat_timeout(1, change_color, image); Fl::repeat_timeout(0.5, refresh_statusbar, status); - Fl::repeat_timeout(1, change_status, status); window->end(); window->show(argc, argv); return Fl::run(); } + + +void refresh_image(void *pointer) { + ((Image *) pointer)->getPixels(); + ((Image *) pointer)->redraw(); + Fl::repeat_timeout(0.5, refresh_image, pointer); +} + + +void refresh_statusbar(void *pointer) { + ((Statusbar **) pointer)[0]->change_text(); + ((Statusbar **) pointer)[0]->refresh_label(); + Fl::repeat_timeout(0.5, refresh_statusbar, pointer); +} + diff --git a/src/GUI.hpp b/src/GUI.hpp index 74b9fd9..e8ab6c7 100644 --- a/src/GUI.hpp +++ b/src/GUI.hpp @@ -4,36 +4,65 @@ #include #include #include "vkvm.hpp" +#include "internal.hpp" #ifndef GUI_GUI_HPP #define GUI_GUI_HPP + +/** GUI_Window + * The GUI_Window-class generates a window, within the window it recognizes the curretn mouse-position. + * It also recognizes if a button is pushed on the keyboard or the mouse. Furthermore the class depict the + * content of the Image-class and provides functions to refresh it. + * @param x The mouse-position on the x-axis. + * @param y The mouse-position on the y-axis. + * @param button The button that was pushed last. + */ class GUI_Window : public Fl_Window { int x, y, button; + int handle(int e); + public: - GUI_Window(int x, int y, const char *l) : Fl_Window(x, y, l) -} + GUI_Window(int x, int y, const char *l); +}; + +/** The constructor of the image class, get additional + * @param x: The mouse-position on the x-axis. + * @param y: The mouse-position on the y-axis: + * @param w: The width of a single pixel, + * @param h: The height of a single pixel. + */ class Image : public Fl_Widget { uchar *buf; public: Image(int x, int y, int w, int h); - void refresh_image(void *pointer); - void change_color(void *pointer); - void refresh_statusbar(void *pointer); - void change_status(void *pointer); -} + void draw(); + + void getPixels(); +}; + +/** Statusbar + * The class inherits a char *text from the Fl_Box. It also shows the window-resolution and the mouse-position. + * @param text: A pointer to a char-array, that can contain a text like a status or whatever you want. + */ class Statusbar : public Fl_Box { char *text; public: - Statusbar (int x, int y, int w, int h, char *text); - void set_text(char *text); - void change_text(); - void refresh_label(); -} + Statusbar(int x, int y, int w, int h, char *text); -void GUI_init(); -void GUI_run(); + void set_text(char *text); + + void change_text(); + + void refresh_label(); +}; + +void refresh_image(void *pointer); + +void refresh_statusbar(void *pointer); + +int GUI_run(int argc, char **argv); #endif //GUI_GUI_HPP diff --git a/src/GUI_Window.cpp b/src/GUI_Window.cpp index 73fb96e..5e9b128 100644 --- a/src/GUI_Window.cpp +++ b/src/GUI_Window.cpp @@ -1,63 +1,57 @@ #include "GUI.hpp" -/** GUI_Window - * The GUI_Window-class generates a window, within the window it recognizes the curretn mouse-position. - * It also recognizes if a button is pushed on the keyboard or the mouse. Furthermore the class depict the - * content of the Image-class and provides functions to refresh it. - * @param x The mouse-position on the x-axis. - * @param y The mouse-position on the y-axis. - * @param button The button that was pushed last. - */ - -class GUI_Window : public Fl_Window { - int x, y, button; - - /*Function to handle the input*/ - int handle(int e) { - switch (e) { - /*Mousebutton*/ - case FL_PUSH: - if (Fl::event_button() == FL_LEFT_MOUSE) { - std::cout << "Mouse:left" << std::endl; - } else if (Fl::event_button() == FL_RIGHT_MOUSE) { - std::cout << "Mouse:right" << std::endl; - } else { - std::cout << "Mouse:middle" << std::endl; - } - return 1; - /*Mousebutton and movement*/ - case FL_DRAG: - x = Fl::event_x(); - y = Fl::event_y(); - std::cout << "Postion X:" << x << " Postion Y:" << y << std::endl; - if (Fl::event_button() == FL_LEFT_MOUSE) { - std::cout << "Mouse:left" << std::endl; - } else if (Fl::event_button() == FL_RIGHT_MOUSE) { - std::cout << "Mouse:right" << std::endl; - } else { - std::cout << "Mouse:middle" << std::endl; - } - return 1; - /*Mousemovement*/ - case FL_MOVE: - x = Fl::event_x(); - y = Fl::event_y(); - std::cout << "Postion X:" << x << " Postion Y:" << y << std::endl; - return 1; - /*keyboardbutton*/ - case FL_KEYBOARD: - button = Fl::event_button(); - std::cout << "Keyboard:" << (unsigned short) button << " down"< int { + switch (e) { + /*Mousebutton*/ + case FL_PUSH: + vkvm::callEvent(vkvm::EventType::MouseButton); + if (Fl::event_button() == FL_LEFT_MOUSE) { + std::cout << "Mouse:left" << std::endl; + } else if (Fl::event_button() == FL_RIGHT_MOUSE) { + std::cout << "Mouse:right" << std::endl; + } else { + std::cout << "Mouse:middle" << std::endl; + } + return 1; + /*Mousebutton and movement*/ + case FL_DRAG: + vkvm::callEvent(vkvm::EventType::MouseButton); + vkvm::callEvent(vkvm::EventType::MouseMove); + x = Fl::event_x(); + y = Fl::event_y(); + vkvm::setMousePosition(x,y); + if (Fl::event_button() == FL_LEFT_MOUSE) { + std::cout << "Mouse:left" << std::endl; + } else if (Fl::event_button() == FL_RIGHT_MOUSE) { + std::cout << "Mouse:right" << std::endl; + } else { + std::cout << "Mouse:middle" << std::endl; + } + return 1; + /*Mousemovement*/ + case FL_MOVE: + vkvm::callEvent(vkvm::EventType::MouseMove); + x = Fl::event_x(); + y = Fl::event_y(); + vkvm::setMousePosition(x,y); + return 1; + /*keyboardbutton*/ + case FL_KEYBOARD: + vkvm::callEvent(vkvm::EventType::KeyDown); + button = Fl::event_button(); + std::cout << "Keyboard:" << (unsigned short) button << " down" << std::endl; + return 1; + case FL_KEYUP: + vkvm::callEvent(vkvm::EventType::KeyUp); + button = Fl::event_button(); + std::cout << "Keyboard:" << (unsigned short) button << " up" << std::endl; + return 1; } -public: - GUI_Window(int x, int y, const char *l) : Fl_Window(x, y, l) {} -}; +} + +GUI_Window::GUI_Window(int x, int y, const char *l) : Fl_Window(x, y, l) {} + diff --git a/src/Image.cpp b/src/Image.cpp index 44e995f..c4284df 100644 --- a/src/Image.cpp +++ b/src/Image.cpp @@ -5,62 +5,33 @@ * @param *buf: A pointer to the bitmap, that the image-class has to draw. Three chars are needed to get the RGB-value of a pixel, so the size equals window_height * window_width * 3. */ -class Image : public Fl_Widget { - uchar *buf; - //Function to draw a bitmap - void draw() { - fl_draw_image(buf, x(), y(), w(), h()); - } +//Function to draw a bitmap +auto Image::draw() -> void { + fl_draw_image(buf, x(), y(), w(), h()); +} - /** The constructor of the image class, get additional - * @param x: The mouse-position on the x-axis. - * @param y: The mouse-position on the y-axis: - * @param w: The width of a single pixel, - * @param h: The height of a single pixel. - */ -public: - - Image(int x, int y, int w, int h) : - Fl_Widget(x, y, w, h, 0) { - buf = new uchar[w * h * 3]; - /*Just an example.*/ - for (int i = 0; i < h; i++) { - for (int j = 0; j < w; j++) { - buf[(j + (i * w)) * 3 + 1] = 0xff; - } +Image::Image(int x, int y, int w, int h) : + Fl_Widget(x, y, w, h, 0) { + buf = new uchar[w * h * 3]; + /*Just an example.*/ + for (int i = 0; i < h; i++) { + for (int j = 0; j < w; j++) { + buf[(j + (i * w)) * 3 + 1] = 0xff; } } +} - /*A function to change the colors of the image-class. It reads the colors from the Shared Memory-Class*/ - void change_color() { - for (int i = 0; i < h(); i++) { - for (int j = 0; j < w(); j++) { - vkvm::Color c = vkvm::getPixel(j,i); - buf[(i * w() + j) * 3 + 0] = c.getRed(); - buf[(i * w() + j) * 3 + 1] = c.getGreen(); - buf[(i * w() + j) * 3 + 2] = c.getBlue(); - } +/*A function to change the colors of the image-class. It reads the colors from the Shared Memory-Class*/ +auto Image::getPixels() -> void { + for (int i = 0; i < h(); i++) { + for (int j = 0; j < w(); j++) { + vkvm::Color c = vkvm::getPixel(j, i); + buf[(i * w() + j) * 3 + 0] = c.getRed(); + buf[(i * w() + j) * 3 + 1] = c.getGreen(); + buf[(i * w() + j) * 3 + 2] = c.getBlue(); } } }; -/*Functions to refresh the image.*/ -void refresh_image(void *pointer) { - ((Image *) pointer)->redraw(); - Fl::repeat_timeout(0.5, refresh_image, pointer);//nach 0.5 sec refresh_image(pointer) anrufen. Here pointer ist wie ein Parameter -} -void change_color(void *pointer) { - ((Image *) pointer)->change_color(); - Fl::repeat_timeout(1, change_color, pointer); -} -void refresh_statusbar(void *pointer) { - ((Statusbar **) pointer)[0]->refresh_label(); - Fl::repeat_timeout(0.5, refresh_statusbar, pointer); -} - -void change_status(void *pointer) { - ((Statusbar **) pointer)[0]->change_text(); - Fl::repeat_timeout(1, change_status, pointer); -} diff --git a/src/Statusbar.cpp b/src/Statusbar.cpp index 4bdfc2b..8e2e4a4 100644 --- a/src/Statusbar.cpp +++ b/src/Statusbar.cpp @@ -1,35 +1,31 @@ #include "GUI.hpp" -/** Statusbar - * The class inherits a char *text from the Fl_Box. It also shows the window-resolution and the mouse-position. - * @param text: A pointer to a char-array, that can contain a text like a status or whatever you want. - */ -class Statusbar : public Fl_Box { - char *text; -public: - /** The constructor of Statusbar has to get additional parameters. - * @param x: The mouse-position on the x-axis. - * @param y: The mouse-position on the y-axis: - * @param w: The width of a single pixel, - * @param h: The height of a single pixel. - */ - Statusbar (int x, int y, int w, int h, char *text) : - Fl_Box(x, y, w, h,text) { - this->text = text; - }; - void set_text(char *text) { - this->text = text; - } - //An exampel to show, how the content of the text can be changed. - void change_text(){ - if(text=="status0") - set_text("status1"); - else - set_text("status0"); - } - //This function refreshes the statusbar. - void refresh_label(){ - this->label(text); - } +/** The constructor of Statusbar has to get additional parameters. + * @param x: The mouse-position on the x-axis. + * @param y: The mouse-position on the y-axis: + * @param w: The width of a single pixel, + * @param h: The height of a single pixel. + */ +Statusbar::Statusbar(int x, int y, int w, int h, char *text) : + Fl_Box(x, y, w, h, text) { + this->text = text; }; + +auto Statusbar::set_text(char *text) -> void { + this->text = text; +} + +//An exampel to show, how the content of the text can be changed. +auto Statusbar::change_text() -> void { + if (text == "status0") + set_text("status1"); + else + set_text("status0"); +} + +//This function refreshes the statusbar. +auto Statusbar::refresh_label() -> void { + this->label(text); +} +