void GUI::on_draw() { GUI * parent = get_parent(); if(parent != nullptr) { // keep object within parent bounds (keep from moving outside parent) if(get_x() <= parent->get_x()) {set_position(parent->get_x(), get_y());} if(get_y() <= parent->get_y()) {set_position(get_x(), parent->get_y());} if(get_x() >= parent->get_x() + (parent->get_width() - get_width())) {set_position(parent->get_x() + (parent->get_width() - get_width()), get_y());} if(get_y() >= parent->get_y() + (parent->get_height() - get_height())) {set_position(get_x(), parent->get_y() + (parent->get_height() - get_height()));} // keep object from exceeding parent size (width and height) UPDATED: 9-7-2018 if(get_width () > parent->get_width ()) set_size(parent->get_width(), get_height()); // if object is wider than parent, make width equal to parent's width if(get_height() > parent->get_height()) set_size(get_width(), parent->get_height()); // if object is taller than parent, make height equal to parent's height } if(is_visible()) { for(int i = 0; i < Factory::get_gui_factory()->get_size(); i++) { GUI * gui = static_cast<GUI*>(Factory::get_gui_factory()->get_object(i)); // draw all children if visible (child ui can also have their own visibility) if(is_parent_of(*gui)) { gui->draw(); } // set focus to the gui that is pressed if(gui->is_pressed()) { gui->set_focused(true); } } } // if mouse is over ui and mouse is pressed, set as current focus }
static GdkWindow * get_event_window (GdkEventTranslator *translator, XEvent *xevent) { GdkDeviceManager *device_manager; GdkDisplay *display; GdkWindow *window; device_manager = GDK_DEVICE_MANAGER (translator); display = gdk_device_manager_get_display (device_manager); window = gdk_x11_window_lookup_for_display (display, xevent->xany.window); /* Apply keyboard grabs to non-native windows */ if (xevent->type == KeyPress || xevent->type == KeyRelease) { GdkDeviceGrabInfo *info; gulong serial; serial = _gdk_display_get_next_serial (display); info = _gdk_display_has_device_grab (display, GDK_X11_DEVICE_MANAGER_CORE (device_manager)->core_keyboard, serial); if (info && (!is_parent_of (info->window, window) || !info->owner_events)) { /* Report key event against grab window */ window = info->window; } } return window; }