#include <msp/gl/blend.h>
#include <msp/gl/extensions/arb_shader_objects.h>
#include <msp/gl/programbuilder.h>
+#include <msp/gl/tests.h>
#include <msp/gl/uniform.h>
#include <msp/input/keys.h>
-#include <msp/time/units.h>
#include <msp/time/utils.h>
#include "label.h"
#include "style.h"
#include "root.h"
+#include "systemkeyboardinput.h"
namespace Msp {
namespace GLtk {
-Root::Root(const Resources &r, Graphics::Window &window):
+Root::Root(Resources &r, Graphics::Window &window):
resources(r),
keyboard(new Input::Keyboard(window)),
+ input_method(0),
mouse(new Input::Mouse(window)),
touchscreen(0),
own_input(true)
init(&window);
}
-Root::Root(const Resources &r, Graphics::Window *window, Input::Keyboard *k, Input::Mouse *m, Input::Touchscreen *t):
+Root::Root(Resources &r, Graphics::Window *window, Input::Keyboard *k, Input::Mouse *m, Input::Touchscreen *t):
resources(r),
keyboard(k),
+ input_method(0),
mouse(m),
touchscreen(t),
own_input(false)
else
shprog = 0;
+ if(keyboard)
+ set_state(FOCUS);
+
update_style();
if(mouse)
mouse->signal_axis_motion.connect(sigc::mem_fun(this, &Root::axis_motion_event));
}
- if(keyboard)
- {
- keyboard->signal_button_press.connect(sigc::mem_fun(this, &Root::key_press_event));
- keyboard->signal_button_release.connect(sigc::mem_fun(this, &Root::key_release_event));
- keyboard->signal_character.connect(sigc::mem_fun(this, &Root::character_event));
- }
+ if(keyboard && !input_method)
+ input_method = new SystemKeyboardInput(*this, *keyboard);
if(touchscreen)
{
Root::~Root()
{
delete shprog;
+ delete input_method;
if(own_input)
{
delete keyboard;
void Root::tick()
{
+ Time::TimeStamp t = Time::now();
+ Time::TimeDelta dt = (last_tick ? t-last_tick : Time::zero);
+ last_tick = t;
+
+ animate(dt);
+
if(tooltip_timeout && Time::now()>tooltip_timeout)
{
std::string tip;
Widget::render(renderer);
}
+void Root::render(GL::Renderer &renderer, const GL::Tag &tag) const
+{
+ if(tag.id)
+ return;
+
+ GL::Renderer::Push push(renderer);
+ renderer.set_camera(camera);
+ renderer.set_shader_program(shprog);
+ GL::BindRestore bind_blend(GL::Blend::alpha());
+ GL::BindRestore unbind_dtest(static_cast<GL::DepthTest *>(0));
+ Widget::render(renderer);
+}
+
bool Root::button_press_event(unsigned btn)
{
if(visible)
return false;
}
-bool Root::key_press_event(unsigned key)
-{
- // XXX Modifiers
- if(visible)
- {
- Widget *old_focus = input_focus;
-
- key_press(key, 0);
-
- if(input_focus || old_focus)
- return true;
- }
-
- return false;
-}
-
-bool Root::key_release_event(unsigned key)
-{
- if(visible)
- {
- Widget *old_focus = input_focus;
-
- key_release(key, 0);
-
- if(input_focus || old_focus)
- return true;
- }
-
- return false;
-}
-
-bool Root::character_event(StringCodec::unichar ch)
-{
- if(visible)
- {
- Widget *old_focus = input_focus;
-
- character(ch);
-
- if(input_focus || old_focus)
- return true;
- }
-
- return false;
-}
-
bool Root::touch_press_event(unsigned finger)
{
if(visible)