DFBResult IWindow_Real::Destroy() { D_DEBUG_AT( Core_Window, "IWindow_Real::%s( %p )\n", __FUNCTION__, obj ); D_MAGIC_ASSERT( obj, CoreWindow ); dfb_window_destroy( obj ); return DFB_OK; }
/* * Window destructor. */ static void window_destructor( FusionObject *object, bool zombie ) { CoreWindow *window = (CoreWindow*) object; DEBUGMSG("DirectFB/core/windows: destroying %p (%dx%d)%s\n", window, window->width, window->height, zombie ? " (ZOMBIE)" : ""); dfb_window_deinit( window ); dfb_window_destroy( window, false ); fusion_object_destroy( object ); }
static DFBResult IDirectFBWindow_Destroy( IDirectFBWindow *thiz ) { DIRECT_INTERFACE_GET_DATA(IDirectFBWindow) D_DEBUG_AT( IDirectFB_Window, "%s()\n", __FUNCTION__ ); if (data->destroyed) return DFB_DESTROYED; D_DEBUG_AT( IDirectFB_Window, "IDirectFBWindow_Destroy()\n" ); dfb_window_destroy( data->window ); return DFB_OK; }
static void IDirectFBSurface_Window_Destruct( IDirectFBSurface *thiz ) { IDirectFBSurface_Window_data *data = (IDirectFBSurface_Window_data*)thiz->priv; if (data->flip_thread != -1) { pthread_cancel( data->flip_thread ); pthread_join( data->flip_thread, NULL ); } if (data->base.surface) { if (!(data->base.caps & DSCAPS_SUBSURFACE) && data->base.caps & DSCAPS_PRIMARY) { dfb_window_deinit( data->window ); dfb_window_destroy( data->window, true ); } } IDirectFBSurface_Destruct( thiz ); }
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; }