Esempio n. 1
0
/******************************************************************************\
 When a widget is hidden, propagates up to the widget's parent and then to its
 parent and so on until mouse focus is claimed. Does nothing if the mouse is
 not within widget bounds.
\******************************************************************************/
static void focus_parent(i_widget_t *widget)
{
        i_widget_t *p;

        /* Propagate key focus up */
        if (I_widget_child_of(widget, key_focus)) {
                p = widget->parent;
                while (p) {
                        if (p->entry) {
                                key_focus = p;
                                break;
                        }
                        p = p->parent;
                }
        }

        /* Propagate mouse out events */
        if (!I_widget_child_of(widget, mouse_focus))
                return;
        p = mouse_focus;
        while (p != widget) {
                I_widget_event(p, I_EV_MOUSE_OUT);
                p = p->parent;
        }
        I_widget_event(p, I_EV_MOUSE_OUT);

        /* Propagate focus up */
        for (p = widget->parent; p; p = p->parent)
                if (check_mouse_focus(p))
                        return;
        mouse_focus = NULL;
}
Esempio n. 2
0
/******************************************************************************\
 Window widget event function.
\******************************************************************************/
int I_window_event(i_window_t *window, i_event_t event)
{
        switch (event) {
        case I_EV_CONFIGURE:
                R_window_cleanup(&window->window);
                I_widget_pack(&window->widget, window->pack_children,
                              window->fit);
                if (window->decorated) {
                        r_texture_t *decor;

                        decor = decor_window;
                        if (window->popup)
                                decor = decor_popup;
                        R_window_init(&window->window, decor);
                        window->window.sprite.origin = window->widget.origin;
                        window->window.sprite.size = window->widget.size;
                        R_sprite_cleanup(&window->hanger);
                        R_sprite_init(&window->hanger, hanger);
                        window->hanger.origin.y = window->widget.origin.y +
                                                  window->widget.size.y;
                        window->hanger.size.y = (float)i_border.value.n;
                }
                return FALSE;
        case I_EV_KEY_DOWN:
                if (i_key == SDLK_ESCAPE && window->auto_hide)
                        I_widget_event(&window->widget, I_EV_HIDE);
                break;
        case I_EV_MOUSE_IN:
                if (I_widget_child_of(&window->widget, i_key_focus))
                        break;
                i_key_focus = NULL;
                I_widget_propagate(&window->widget, I_EV_GRAB_FOCUS);
                break;
        case I_EV_MOVED:
                window->window.sprite.origin = window->widget.origin;
                window->hanger.origin.y = window->widget.origin.y +
                                          window->widget.size.y;
                break;
        case I_EV_MOUSE_DOWN:
                if (i_mouse_button == SDL_BUTTON_RIGHT && window->auto_hide)
                        I_widget_event(&window->widget, I_EV_HIDE);
                break;
        case I_EV_CLEANUP:
                R_window_cleanup(&window->window);
                R_sprite_cleanup(&window->hanger);
                break;
        case I_EV_RENDER:
                if (!window->decorated)
                        break;
                window->window.sprite.modulate.a = window->widget.fade;
                R_window_render(&window->window);
                if (!window->hanger_align)
                        break;
                window->hanger.origin.x = window->hanger_align->origin.x +
                                          window->hanger_align->size.x / 2 -
                                          window->hanger.size.x / 2;
                window->hanger.modulate.a = window->widget.fade;
                R_sprite_render(&window->hanger);
                break;
        default:
                break;
        }
        return TRUE;
}