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); } }
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; }
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(); } } }
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); } } } }
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; }