#include <FL/Fl.H>
#include <FL/Fl_Box.H>
#include <FL/Fl_Window.H>
#include "../../../std_lib_facilities.h"
#include "../../../Point.h"
#include "../../../Graph.h"
#include "../../../GUI.h"
#include "../../../Simple_window.h"
#include "../../../Window.h"
using namespace Graph_lib;
struct Coulomb_window :Window{
Coulomb_window(Point xy, int w, int h, const string& title );
private:
Circle circle;
Button start_button;
static void cb_start(Address,Address);
void start();
int handle(int);
friend void timeout_callback(void*);
};
Coulomb_window::Coulomb_window(Point xy, int w, int h, const string& title )
:Window(xy,w,h,title),
circle(Point(100,100),50),
start_button(Point(x_max()-150,5),40,20,"start",cb_start)
{
circle.set_fill_color(Color::red);
circle.set_color(Color::invisible);
attach(circle);
attach(start_button);
};
void Coulomb_window::cb_start(Address,Address pw)
{
reference_to<Coulomb_window>(pw).start();
};
void timeout_callback(void* ptr)
{
Coulomb_window* this_ = static_cast<Coulomb_window*>(ptr);
this_->circle.move(10,0); this_->redraw();
Fl::repeat_timeout(0.1, timeout_callback, static_cast<void*>(this_));
}
//円を動かす
void Coulomb_window::start()
{
Fl::add_timeout(0.1, timeout_callback, static_cast<void*>(this));
}
int Coulomb_window::handle(int e)
{
int ret = 0;
switch (e) {
case FL_FOCUS:
case FL_UNFOCUS:
ret = 1;
break;
case FL_KEYDOWN:
if ( Fl::event_key('A') ) { ret = 1; circle.move(10,0); redraw(); }
break;
}
return ret || Fl_Window::handle(e);
}
int main()
try{
Coulomb_window win(Point(100,100),600,400,"Coulomb's_law");
return gui_main();
}
catch(exception& e) {
cerr << "exception: " << e.what() << '\n';
return 1;
}
catch (...) {
cerr << "some exception\n";
return 2;
}
I2luY2x1ZGUgPEZML0ZsLkg+CiNpbmNsdWRlIDxGTC9GbF9Cb3guSD4KI2luY2x1ZGUgPEZML0ZsX1dpbmRvdy5IPgojaW5jbHVkZSAiLi4vLi4vLi4vc3RkX2xpYl9mYWNpbGl0aWVzLmgiCiNpbmNsdWRlICIuLi8uLi8uLi9Qb2ludC5oIgojaW5jbHVkZSAiLi4vLi4vLi4vR3JhcGguaCIKI2luY2x1ZGUgIi4uLy4uLy4uL0dVSS5oIgojaW5jbHVkZSAiLi4vLi4vLi4vU2ltcGxlX3dpbmRvdy5oIgojaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93LmgiCgp1c2luZyBuYW1lc3BhY2UgR3JhcGhfbGliOwoKc3RydWN0IENvdWxvbWJfd2luZG93IDpXaW5kb3d7CiAgICBDb3Vsb21iX3dpbmRvdyhQb2ludCB4eSwgaW50IHcsIGludCBoLCBjb25zdCBzdHJpbmcmIHRpdGxlICk7Cgpwcml2YXRlOgoJQ2lyY2xlIGNpcmNsZTsKCUJ1dHRvbiBzdGFydF9idXR0b247CglzdGF0aWMgdm9pZCBjYl9zdGFydChBZGRyZXNzLEFkZHJlc3MpOwoJdm9pZCBzdGFydCgpOwoJaW50IGhhbmRsZShpbnQpOwoJZnJpZW5kIHZvaWQgdGltZW91dF9jYWxsYmFjayh2b2lkKik7Cn07CgoKCgpDb3Vsb21iX3dpbmRvdzo6Q291bG9tYl93aW5kb3coUG9pbnQgeHksIGludCB3LCBpbnQgaCwgY29uc3Qgc3RyaW5nJiB0aXRsZSApCgk6V2luZG93KHh5LHcsaCx0aXRsZSksCgljaXJjbGUoUG9pbnQoMTAwLDEwMCksNTApLAoJc3RhcnRfYnV0dG9uKFBvaW50KHhfbWF4KCktMTUwLDUpLDQwLDIwLCJzdGFydCIsY2Jfc3RhcnQpCgkKewoJY2lyY2xlLnNldF9maWxsX2NvbG9yKENvbG9yOjpyZWQpOwoJY2lyY2xlLnNldF9jb2xvcihDb2xvcjo6aW52aXNpYmxlKTsKCWF0dGFjaChjaXJjbGUpOwoJYXR0YWNoKHN0YXJ0X2J1dHRvbik7Cn07CgoKCnZvaWQgQ291bG9tYl93aW5kb3c6OmNiX3N0YXJ0KEFkZHJlc3MsQWRkcmVzcyBwdykKewoJcmVmZXJlbmNlX3RvPENvdWxvbWJfd2luZG93Pihwdykuc3RhcnQoKTsKfTsKCnZvaWQgdGltZW91dF9jYWxsYmFjayh2b2lkKiBwdHIpCnsKCUNvdWxvbWJfd2luZG93KiB0aGlzXyA9IHN0YXRpY19jYXN0PENvdWxvbWJfd2luZG93Kj4ocHRyKTsKCXRoaXNfLT5jaXJjbGUubW92ZSgxMCwwKTsgdGhpc18tPnJlZHJhdygpOwoJRmw6OnJlcGVhdF90aW1lb3V0KDAuMSwgdGltZW91dF9jYWxsYmFjaywgc3RhdGljX2Nhc3Q8dm9pZCo+KHRoaXNfKSk7Cn0KCi8v5YaG44KS5YuV44GL44GZCnZvaWQgQ291bG9tYl93aW5kb3c6OnN0YXJ0KCkKewoJRmw6OmFkZF90aW1lb3V0KDAuMSwgdGltZW91dF9jYWxsYmFjaywgc3RhdGljX2Nhc3Q8dm9pZCo+KHRoaXMpKTsKfQoKaW50IENvdWxvbWJfd2luZG93OjpoYW5kbGUoaW50IGUpCnsKCWludCByZXQgPSAwOwoJc3dpdGNoIChlKSB7CgljYXNlIEZMX0ZPQ1VTOgoJY2FzZSBGTF9VTkZPQ1VTOgoJCXJldCA9IDE7CgkJYnJlYWs7CgljYXNlIEZMX0tFWURPV046CgkJaWYgKCBGbDo6ZXZlbnRfa2V5KCdBJykgKSB7IHJldCA9IDE7IGNpcmNsZS5tb3ZlKDEwLDApOyByZWRyYXcoKTsgfQoJCWJyZWFrOwoJfQoJcmV0dXJuIHJldCB8fCBGbF9XaW5kb3c6OmhhbmRsZShlKTsKfQoKaW50IG1haW4oKQp0cnl7CglDb3Vsb21iX3dpbmRvdyB3aW4oUG9pbnQoMTAwLDEwMCksNjAwLDQwMCwiQ291bG9tYidzX2xhdyIpOwoJcmV0dXJuIGd1aV9tYWluKCk7Cn0KCmNhdGNoKGV4Y2VwdGlvbiYgZSkgewoJY2VyciA8PCAiZXhjZXB0aW9uOiAiIDw8IGUud2hhdCgpIDw8ICdcbic7CglyZXR1cm4gMTsKfQpjYXRjaCAoLi4uKSB7CgljZXJyIDw8ICJzb21lIGV4Y2VwdGlvblxuIjsKCXJldHVybiAyOwp9Cg==