Esempio n. 1
0
void widgetBlurImpl(widget *self)
{
	widget *current;
	eventMisc evt;

	// Make sure we have focus
	if (!self->hasFocus)
	{
		// TODO: We should log this eventuality
		return;
	}

	// First blur any focused child widgets
	while ((current = widgetGetCurrentlyFocused(self)) != self)
	{
		widgetBlur(current);
	}

	// Blur ourself
	self->hasFocus = false;

	// Fire off the on-blur callbacks
	evt.event = widgetCreateEvent(EVT_BLUR);
	widgetFireCallbacks(self, (event *) &evt);
}
Esempio n. 2
0
void widgetRemoveEventHandlerImpl(widget *self, int id)
{
	int i;

	// Search for the handler with the id
	for (i = 0; i < vectorSize(self->eventVtbl); i++)
	{
		eventTableEntry *handler = vectorAt(self->eventVtbl, i);

		// If the handler matches, remove it
		if (handler->id == id)
		{
			// If there is a destructor; call it
			if (handler->destructor)
			{
				// Generate an EVT_DESTRUCT event
				eventMisc evtDestruct;
				evtDestruct.event = widgetCreateEvent(EVT_DESTRUCT);

				handler->destructor(self, (event *) &evtDestruct, handler->id,
				                    handler->userData);
			}

			// Release the handler
			free(handler);

			// Finally, remove the event handler from the table
			vectorRemoveAt(self->eventVtbl, i);
			break;
		}
	}
}
Esempio n. 3
0
void widgetDisableImpl(widget *self)
{
	int i;
	eventMisc evt;

	// If we are currently disabled, return
	if (!self->isEnabled)
	{
		return;
	}

	// Disable ourself
	self->isEnabled = false;

	// Fire any on-disable callbacks
	evt.event = widgetCreateEvent(EVT_DISABLE);
	widgetFireCallbacks(self, (event *) &evt);

	// Disable our children
	for (i = 0; i < vectorSize(self->children); i++)
	{
		widgetDisable(vectorAt(self->children, i));
	}

}
Esempio n. 4
0
void widgetFireTimers()
{
	// Create the generic timer event
	eventTimer evtTimer;
	evtTimer.event = widgetCreateEvent(EVT_TIMER);

	// Dispatch
	windowHandleEventForWindowVector((event *) &evtTimer);
}
Esempio n. 5
0
void widgetHideToolTip(widget *self)
{
	// Create the event
	eventToolTip evt;
	evt.event = widgetCreateEvent(EVT_TOOL_TIP_HIDE);
	evt.target = self;

	// Dispatch the event to the root widget
	widgetHandleEvent(widgetGetRoot(self), (event *) &evt);

	// Note that the tool-tip is now hidden
	self->toolTipVisible = false;
}
Esempio n. 6
0
void widgetShowToolTip(widget *self)
{
	// Create the event
	eventToolTip evt;
	evt.event = widgetCreateEvent(EVT_TOOL_TIP_SHOW);
	evt.target = self;

	// Dispatch the event to the root widget
	widgetHandleEvent(widgetGetRoot(self), (event *) &evt);

	// Note that the tool-tip is visible
	self->toolTipVisible = true;
}
Esempio n. 7
0
void widgetResizeImpl(widget *self, int w, int h)
{
	const size minSize = widgetGetMinSize(self);
	const size maxSize = widgetGetMaxSize(self);

	// Create an event
	eventResize evtResize;
	evtResize.event = widgetCreateEvent(EVT_RESIZE);

	// Save the current size in the event
	evtResize.oldSize = self->size;

	assert(minSize.x <= w);
	assert(minSize.y <= h);
	assert(w <= maxSize.x);
	assert(h <= maxSize.y);

	self->size.x = w;
	self->size.y = h;

	// Re-create the cairo context at this new size
	widgetCairoCreate(&self->cr, CAIRO_FORMAT_ARGB32, w, h);

	// If a mask is enabled; re-create it also
	if (self->maskEnabled)
	{
		widgetCairoCreate(&self->maskCr, CAIRO_FORMAT_A1, w, h);

		// Re-draw the mask (only done on resize)
		widgetDrawMask(self);
	}

	// If OpenGL is enabled disable and re-enable it
	if (self->openGLEnabled)
	{
		widgetDisableGL(self);
		widgetEnableGL(self);
	}

	// Set the needs redraw flag
	self->needsRedraw = true;

	// If we have any children, we need to redo their layout
	if (vectorSize(self->children))
	{
		widgetDoLayout(self);
	}

	// Fire any EVT_RESIZE callbacks
	widgetFireCallbacks(self, (event *) &evtResize);
}
Esempio n. 8
0
void widgetRepositionImpl(widget *self, int x, int y)
{
	// Generate a reposition event
	eventReposition evtReposition;
	evtReposition.event = widgetCreateEvent(EVT_REPOSITION);

	// Save the current position in the event
	evtReposition.oldPosition = self->offset;
	evtReposition.oldAbsolutePosition = widgetAbsolutePosition(self);

	// Update our position
	self->offset.x = x;
	self->offset.y = y;

	// Fire any callbacks for EVT_REPOSITION
	widgetFireCallbacks(self, (event *) &evtReposition);
}
Esempio n. 9
0
void widgetFocusImpl(widget *self)
{
	eventMisc evt;

	// Check that we are not currently focused
	if (self->hasFocus)
	{
		int i;

		// Blur any of our currently focused child widgets
		for (i = 0; i < vectorSize(self->children); i++)
		{
			widget *child = vectorAt(self->children, i);

			if (child->hasFocus)
			{
				widgetBlur(child);
			}
		}

		return;
	}

	// If we have a parent, focus it
	if (self->parent)
	{
		widgetFocus(self->parent);
	}

	// Focus ourself
	self->hasFocus = true;

	// Fire our on-focus callbacks
	evt.event = widgetCreateEvent(EVT_FOCUS);
	widgetFireCallbacks(self, (event *) &evt);
}
Esempio n. 10
0
void widgetEnableImpl(widget *self)
{
	int i;
	eventMisc evt;

	// First make sure our parent is enabled
	if (self->parent && !self->parent->isEnabled)
	{
		return;
	}

	// Enable ourself
	self->isEnabled = true;

	// Fire any on-enable callbacks
	evt.event = widgetCreateEvent(EVT_ENABLE);
	widgetFireCallbacks(self, (event *) &evt);

	// Enable all of our children
	for (i = 0; i < vectorSize(self->children); i++)
	{
		widgetEnable(vectorAt(self->children, i));
	}
}
Esempio n. 11
0
void widgetHandleSDLEvent(const SDL_Event *sdlEvt)
{
	// Last known location of the mouse
	static point previousMouseLoc = { -1, -1 };

	switch (sdlEvt->type)
	{
		case SDL_MOUSEMOTION:
		{
			eventMouse evtMouse;
			evtMouse.event = widgetCreateEvent(EVT_MOUSE_MOVE);

			// Location
			evtMouse.loc.x = sdlEvt->motion.x;
			evtMouse.loc.y = sdlEvt->motion.y;

			// Previous location
			evtMouse.previousLoc = previousMouseLoc;

			// Update the previous location
			previousMouseLoc = evtMouse.loc;

			windowHandleEventForWindowVector((event *) &evtMouse);
			break;
		}
		case SDL_MOUSEBUTTONDOWN:
		case SDL_MOUSEBUTTONUP:
		{
			eventMouseBtn evtMouseBtn;
			evtMouseBtn.event = widgetCreateEvent(sdlEvt->button.state == SDL_PRESSED ?
			                                      EVT_MOUSE_DOWN : EVT_MOUSE_UP);

			// Location
			evtMouseBtn.loc.x = sdlEvt->button.x;
			evtMouseBtn.loc.y = sdlEvt->button.y;

			// Update the previous location
			previousMouseLoc = evtMouseBtn.loc;

			// Button pressed/released
			evtMouseBtn.button = SDLButtonToMouseButton(sdlEvt->button.button);

			windowHandleEventForWindowVector((event *) &evtMouseBtn);
			break;
		}
		case SDL_KEYDOWN:
		case SDL_KEYUP:
		{
			eventKey evtKey;
			evtKey.event = widgetCreateEvent(sdlEvt->key.type == SDL_KEYDOWN ?
			                                 EVT_KEY_DOWN : EVT_KEY_UP);

			// Key pressed/released
			evtKey.keycode = SDLKeyToEventKeycode(sdlEvt->key.keysym.sym);

			// Modifier keys
			if (sdlEvt->key.keysym.mod & KMOD_CTRL)
			{
				evtKey.ctrl = true;
			}
			if (sdlEvt->key.keysym.mod & KMOD_ALT)
			{
				evtKey.alt = true;
			}
			if (sdlEvt->key.keysym.mod & KMOD_SHIFT)
			{
				evtKey.shift = true;
			}

			// Only needed/works on SDL 1.2!
			if (sdlEvt->key.keysym.unicode)
			{
				const uint16_t utf16[2] = { sdlEvt->key.keysym.unicode, 0 };
				char *utf8;

				// Create the text event
				eventText evtText;
				evtText.event = widgetCreateEvent(EVT_TEXT);

				// Convert the UTF-16 string to UTF-8
				utf8 = UTF16toUTF8(utf16, NULL);

				// Set the text of the event to UTF-8 string
				evtText.utf8 = utf8;

				// Dispatch the event
				windowHandleEventForWindowVector((event *) &evtText);

				// Free the memory allocated by UTF16toUTF8
				free(utf8);
			}

			windowHandleEventForWindowVector((event *) &evtKey);
			break;
		}
	}
}