Beispiel #1
0
void FskGtkWindowSetMenuItemCallback(FskGtkWindow win, GtkWidget* menuItem, int id)
{
	FskEvent fskEvent;
	menuItems entry = NULL;

	if(kFskErrNone == FskMemPtrNewClear(sizeof(menuItemsRecord), (FskMemPtr*)&entry)) {
		menuBars entryBar = NULL;
		entry->win = win;
		entry->id  = id;
		entry->item= menuItem;
		
		entryBar = win->menu;
		while(entryBar) {
			if(entryBar->id == (id & 0xFF00)) {
				break;
			}
			entryBar = entryBar->next;
		}
		FskListAppend(&entryBar->menulist, entry);
		
		// Update menuItem immediately (enabled? checked?)
		if(kFskErrNone == FskEventNew(&fskEvent, kFskEventMenuStatus, NULL, kFskEventModifierNotSet)) {
			FskEventParameterAdd(fskEvent, kFskEventParameterCommand, sizeof(id), &id);
			FskWindowEventSend(win->owner, fskEvent);
		}
		g_signal_connect(menuItem, "activate", G_CALLBACK(menu_select_cb), (gpointer)entry);
	}
}
Beispiel #2
0
static gboolean window_state_cb(GtkWidget* widget, GdkEvent* event, gpointer data)
{
	FskWindow fskWindow = (FskWindow)data;
	GdkEventWindowState* eventWindowState = (GdkEventWindowState*)event;
	FskEvent fskEvent;

	if (fskWindow == NULL) return FALSE;
	if (FskEventNew(&fskEvent, (eventWindowState->new_window_state & GDK_WINDOW_STATE_FOCUSED) ? kFskEventWindowActivated : kFskEventWindowDeactivated, NULL, kFskEventModifierNotSet) == kFskErrNone)
		FskWindowEventSend(fskWindow, fskEvent);
		FskWindowCheckEvents();
	return TRUE;
}
Beispiel #3
0
void update_menu(FskGtkWindow win, menuBars menu)
{
	FskEvent fskEvent;
	menuItems items = NULL;
	for (items = (menuItems)menu->menulist; items != NULL; items = items->next) {
		int id = items->id;
		if (kFskErrNone == FskEventNew(&fskEvent, kFskEventMenuStatus, NULL, kFskEventModifierNotSet)) {
			FskEventParameterAdd(fskEvent, kFskEventParameterCommand, sizeof(id), &id);
			FskWindowEventSend(win->owner, fskEvent);
			FskWindowCheckEvents();
		}
	}
}
Beispiel #4
0
static void menu_select_cb(GtkWidget *widget, gpointer data)
{
	FskEvent fskEvent;
	menuItems selected = (menuItems)data;
	menuBars entryBar;
	menuItems items = NULL;
	int groupID;

	//Have to check firstly since radio item will emit two signals
	if(GTK_IS_CHECK_MENU_ITEM(selected->item) && !gtk_check_menu_item_get_active((GtkCheckMenuItem*)selected->item))
		return;

	if(kFskErrNone == FskEventNew(&fskEvent, kFskEventMenuCommand, NULL, kFskEventModifierNotSet)) {
		SInt32 command = selected->id;
		FskEventParameterAdd(fskEvent, kFskEventParameterCommand, sizeof(command), &command);
		FskWindowEventQueue(selected->win->owner, fskEvent);
	}

	// FIXME: actually, we should do this operations in event like menubar popup, but I do not find suitable event till now
	// So just put them here!!!
	FskGtkWindow win = selected->win;
	groupID = selected->id & 0xFF00;
	entryBar = win->menu;

	while(entryBar) {
		if(entryBar->id == groupID) {
			break;
		}
		
		entryBar = entryBar->next;
	}
	if(entryBar) {
		for(items = (menuItems)entryBar->menulist; items != NULL; items = items->next) {
			int id = items->id;
			if(kFskErrNone == FskEventNew(&fskEvent, kFskEventMenuStatus, NULL, kFskEventModifierNotSet)) {
				FskEventParameterAdd(fskEvent, kFskEventParameterCommand, sizeof(id), &id);
				FskWindowEventSend(win->owner, fskEvent);
			}
		}
	}
}
Beispiel #5
0
static FskErr DragDropTargetProc(UInt32 message, UInt32 mouseX, UInt32 mouseY, void *dropData, void *refCon)
{
	FskErr err = kFskErrNone;
	FskWindow window = (FskWindow)refCon;
	FskDragDropFile fileList;
	UInt32 fileListSize;
	FskEvent event;
	FskPointAndTicksRecord pos;
	FskTimeRecord now;
	FskTimeGetNow(&now);

	pos.pt.x = mouseX;
	pos.pt.y = mouseY;
	pos.ticks = (((double)now.seconds) * 1000.0) + (((double)now.useconds) / 1000.0);
	
	switch(message) {
		case kFskDragDropTargetEnterWindow:
			// Calculate the size of the packed file list
			fileList = (FskDragDropFile)dropData;
			fileListSize = 0;
			while (NULL != fileList) {
				fileListSize += FskStrLen(fileList->fullPathName) + 1;
				fileList = fileList->next;
			}

			// Pack the file list into a null separated list
			// Post a "drop target enter window" event
			if (0 != fileListSize) {
				char *packedFileList = 0;
				char *packedFileListWalker;

				++fileListSize;
				FskMemPtrNewClear(fileListSize, &packedFileList);
				*packedFileList = 0;
				packedFileListWalker = packedFileList;
				fileList = (FskDragDropFile)dropData;
				while (NULL != fileList) {
					FskStrCopy(packedFileListWalker, fileList->fullPathName);
					if (NULL != fileList->next) {
						packedFileListWalker += FskStrLen(fileList->fullPathName) + 1;
					}
					fileList = fileList->next;
				}
				if ((err = FskEventNew(&event, kFskEventWindowDragEnter, NULL, kFskEventModifierNotSet)) != kFskErrNone)
					goto bail;
				FskEventParameterAdd(event, kFskEventParameterMouseLocation, sizeof(pos), &pos);
				FskEventParameterAdd(event, kFskEventParameterFileList, fileListSize, packedFileList);
				FskWindowEventSend(window, event);
				FskMemPtrDispose(packedFileList);
			}
			break;

		case kFskDragDropTargetOverWindow:
			// Windows doesn't send WM_MOUSEMOVE events when dragging over a window!!
#if TARGET_OS_WIN32 || TARGET_OS_MAC
			if ((err = FskEventNew(&event, kFskEventMouseMoved, NULL, kFskEventModifierNotSet)) != kFskErrNone)
				goto bail;
			FskEventParameterAdd(event, kFskEventParameterMouseLocation, sizeof(pos), &pos);
			FskWindowEventSend(window, event);
#endif
			break;

		case kFskDragDropTargetLeaveWindow:
			if ((err = FskEventNew(&event, kFskEventWindowDragLeave, NULL, kFskEventModifierNotSet)) != kFskErrNone)
				goto bail;
			FskWindowEventSend(window, event);
			break;

		case kFskDragDropTargetDropInWindow:
			if ((err = FskEventNew(&event, kFskEventMouseUp, NULL, kFskEventModifierNotSet)) != kFskErrNone)
				goto bail;
			FskEventParameterAdd(event, kFskEventParameterMouseLocation, sizeof(pos), &pos);
			FskWindowEventSend(window, event);
			break;
	}

bail:
	return err;
}