static DFBResult IDirectFBWindow_RaiseToTop( IDirectFBWindow *thiz ) { DIRECT_INTERFACE_GET_DATA(IDirectFBWindow) D_DEBUG_AT( IDirectFB_Window, "%s()\n", __FUNCTION__ ); if (data->destroyed) return DFB_DESTROYED; return dfb_window_raisetotop( data->window ); }
static ReactionResult stack_inputdevice_react( const void *msg_data, void *ctx ) { const DFBInputEvent *evt = (DFBInputEvent*)msg_data; DFBWindowEvent we; CoreWindow *window = NULL; CoreWindowStack *stack = (CoreWindowStack*)ctx; DisplayLayer *layer = dfb_layer_at( stack->layer_id ); /* FIXME: this is a bad check for exclusive access */ if (dfb_layer_lease( layer ) ) return RS_OK; dfb_layer_release( layer, false ); if (stack->wm_hack) { switch (evt->type) { case DIET_KEYRELEASE: switch (evt->key_symbol) { case DIKS_CAPS_LOCK: stack->wm_hack = 0; stack_lock( stack ); handle_enter_leave_focus( stack ); stack_unlock( stack ); break; case DIKS_CONTROL: stack->wm_hack = 1; return RS_OK; default: ; } break; case DIET_KEYPRESS: switch (DFB_LOWER_CASE(evt->key_symbol)) { case DIKS_CONTROL: stack->wm_hack = 2; return RS_OK; case DIKS_SMALL_C: if (stack->entered_window) { DFBWindowEvent evt; evt.type = DWET_CLOSE; dfb_window_dispatch( stack->entered_window, &evt ); } return RS_OK; case DIKS_SMALL_D: { CoreWindow *window = stack->entered_window; if (window && !(window->options & DWOP_INDESTRUCTIBLE)) { dfb_window_deinit( window ); dfb_window_destroy( window, true ); } return RS_OK; } default: ; } break; case DIET_BUTTONRELEASE: return RS_OK; case DIET_BUTTONPRESS: if (stack->entered_window && !(stack->entered_window->options & DWOP_KEEP_STACKING)) dfb_window_raisetotop( stack->entered_window ); return RS_OK; default: ; } } switch (evt->type) { case DIET_KEYPRESS: if (evt->key_id == DIKI_CAPS_LOCK) stack->wm_hack = 1; /* fall through */ case DIET_KEYRELEASE: stack_lock( stack ); window = (stack->keyboard_window ? stack->keyboard_window : stack->focused_window); if (window) { we.type = (evt->type == DIET_KEYPRESS) ? DWET_KEYDOWN : DWET_KEYUP; we.key_code = evt->key_code; we.key_id = evt->key_id; we.key_symbol = evt->key_symbol; we.modifiers = evt->modifiers; /* FIXME: handle mult. devices */ we.locks = evt->locks; /* FIXME: handle mult. devices */ dfb_window_dispatch( window, &we ); } stack_unlock( stack ); break; case DIET_BUTTONPRESS: case DIET_BUTTONRELEASE: if (!stack->cursor.enabled) break; stack_lock( stack ); window = (stack->pointer_window ? stack->pointer_window : stack->entered_window); if (window) { we.type = (evt->type == DIET_BUTTONPRESS) ? DWET_BUTTONDOWN : DWET_BUTTONUP; we.button = evt->button; we.buttons = evt->buttons; /* FIXME: handle mult. devices */ we.cx = stack->cursor.x; we.cy = stack->cursor.y; we.x = we.cx - window->x; we.y = we.cy - window->y; dfb_window_dispatch( window, &we ); } stack_unlock( stack ); break; case DIET_AXISMOTION: if (evt->flags & DIEF_AXISREL) { int rel = evt->axisrel; /* handle cursor acceleration */ if (rel > stack->cursor.threshold) rel += (rel - stack->cursor.threshold) * stack->cursor.numerator / stack->cursor.denominator; else if (rel < -stack->cursor.threshold) rel += (rel + stack->cursor.threshold) * stack->cursor.numerator / stack->cursor.denominator; switch (evt->axis) { case DIAI_X: dfb_windowstack_handle_motion( stack, rel, 0 ); break; case DIAI_Y: dfb_windowstack_handle_motion( stack, 0, rel ); break; case DIAI_Z: handle_wheel( stack, - evt->axisrel ); break; default: return RS_OK; } } else if (evt->flags & DIEF_AXISABS) { switch (evt->axis) { case DIAI_X: dfb_windowstack_handle_motion( stack, evt->axisabs - stack->cursor.x, 0 ); break; case DIAI_Y: dfb_windowstack_handle_motion( stack, 0, evt->axisabs - stack->cursor.y); break; default: return RS_OK; } } break; default: break; } return RS_OK; }