nana/include/nana/gui/detail/window_manager.hpp

199 lines
5.8 KiB
C++

/*
* Window Manager Implementation
* Nana C++ Library(http://www.nanapro.org)
* Copyright(C) 2003-2014 Jinhao(cnjinhao@hotmail.com)
*
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
*
* @file: nana/gui/detail/window_manager.hpp
*
* <Knowledge: 1, 2007-8-17, "Difference between destroy and destroy_handle">
* destroy method destroys a window handle and the handles of its children, but it doesn't delete the handle which type is a root window or a frame
* destroy_handle method just destroys the handle which type is a root window or a frame
*
*/
#ifndef NANA_GUI_DETAIL_WINDOW_MANAGER_HPP
#define NANA_GUI_DETAIL_WINDOW_MANAGER_HPP
#include <vector>
#include "window_layout.hpp"
#include "event_code.hpp"
#include "inner_fwd.hpp"
#include <functional>
#if defined(STD_THREAD_NOT_SUPPORTED)
#include <nana/std_mutex.hpp>
#else
#include <mutex>
#endif
namespace nana
{
class widget; //forward declaration
namespace paint
{
class image;
}
}
namespace nana{
namespace detail
{
class widget_notifier_interface; //forward declaration
struct root_misc;
class window_manager
{
class revertible_mutex
: public std::recursive_mutex
{
struct thr_refcnt
{
unsigned tid;
std::size_t refcnt;
};
public:
revertible_mutex();
void lock();
bool try_lock();
void unlock();
void revert();
void forward();
private:
thr_refcnt thr_;
std::vector<thr_refcnt> stack_;
};
public:
using native_window = native_window_type;
using mutex_type = revertible_mutex;
using core_window_t = basic_window;
using window_layer = window_layout;
window_manager();
~window_manager();
static bool is_queue(core_window_t*);
std::size_t number_of_core_window() const;
mutex_type & internal_lock() const;
void all_handles(std::vector<core_window_t*>&) const;
void event_filter(core_window_t*, bool is_make, event_code);
bool available(core_window_t*);
bool available(core_window_t *, core_window_t*);
bool available(native_window_type);
core_window_t* create_root(core_window_t*, bool nested, rectangle, const appearance&, widget*);
core_window_t* create_widget(core_window_t*, const rectangle&, bool is_lite, widget*);
core_window_t* create_frame(core_window_t*, const rectangle&, widget*);
bool insert_frame(core_window_t* frame, native_window);
bool insert_frame(core_window_t* frame, core_window_t*);
void close(core_window_t*);
//destroy
//@brief: Delete the window handle
void destroy(core_window_t*);
//destroy_handle
//@brief: Delete window handle, the handle type must be a root and a frame.
void destroy_handle(core_window_t*);
void default_icon(const paint::image& _small_icon, const paint::image& big_icon);
void icon(core_window_t*, const paint::image& small_icon, const paint::image& big_icon);
//show
//@brief: show or hide a window
bool show(core_window_t* wd, bool visible);
core_window_t* find_window(native_window_type root, int x, int y);
//move the wnd and its all children window, x and y is a relatively coordinate for wnd's parent window
bool move(core_window_t*, int x, int y, bool passive);
bool move(core_window_t*, const rectangle&);
bool size(core_window_t*, nana::size, bool passive, bool ask_update);
core_window_t* root(native_window_type) const;
//Copy the root buffer that wnd specified into DeviceContext
void map(core_window_t*, bool forced, const rectangle* update_area = nullptr);
bool update(core_window_t*, bool redraw, bool force, const rectangle* update_area = nullptr);
void refresh_tree(core_window_t*);
bool do_lazy_refresh(core_window_t*, bool force_copy_to_screen);
bool get_graphics(core_window_t*, nana::paint::graphics&);
bool get_visual_rectangle(core_window_t*, nana::rectangle&);
std::vector<core_window_t*> get_children(core_window_t*) const;
bool set_parent(core_window_t* wd, core_window_t* new_parent);
core_window_t* set_focus(core_window_t*, bool root_has_been_focused);
core_window_t* capture_redirect(core_window_t*);
void capture_ignore_children(bool ignore);
bool capture_window_entered(int root_x, int root_y, bool& prev);
core_window_t * capture_window() const;
core_window_t* capture_window(core_window_t*, bool value);
void enable_tabstop(core_window_t*);
core_window_t* tabstop(core_window_t*, bool forward) const; //forward means move to next in logic.
void remove_trash_handle(unsigned tid);
bool enable_effects_bground(core_window_t*, bool);
bool calc_window_point(core_window_t*, nana::point&);
root_misc* root_runtime(native_window_type) const;
bool register_shortkey(core_window_t*, unsigned long key);
void unregister_shortkey(core_window_t*, bool with_children);
std::vector<std::pair<core_window_t*, unsigned long>> shortkeys(core_window_t*, bool with_children);
core_window_t* find_shortkey(native_window_type, unsigned long key);
void set_safe_place(core_window_t* wd, std::function<void()>&& fn);
void call_safe_place(unsigned thread_id);
private:
void _m_disengage(core_window_t*, core_window_t* for_new);
void _m_destroy(core_window_t*);
void _m_move_core(core_window_t*, const point& delta);
core_window_t* _m_find(core_window_t*, const point&);
static bool _m_effective(core_window_t*, const point& root_pos);
private:
mutable mutex_type mutex_;
struct wdm_private_impl;
wdm_private_impl * const impl_;
struct attribute
{
struct captured
{
core_window_t *window;
bool inside;
bool ignore_children;
std::vector<std::pair<core_window_t*, bool> > history;
}capture;
}attr_;
struct menu_tag
{
native_window_type window;
native_window_type owner;
bool has_keyboard;
}menu_;
};//end class window_manager
}//end namespace detail
}//end namespace nana
#endif