/** Process a task list button event. */ void ProcessTaskButtonEvent(TrayComponentType *cp, int x, int y, int mask) { TaskBarType *bar = (TaskBarType*)cp->object; TaskEntry *entry = GetEntry(bar, x, y); if(entry) { ClientEntry *cp; ClientNode *focused = NULL; char onTop = 0; char hasActive = 0; switch(mask) { case Button1: /* Raise or minimize items in this group. */ for(cp = entry->clients; cp; cp = cp->next) { int layer; char foundTop = 0; if(cp->client->state.status & STAT_MINIMIZED) { continue; } else if(!ShouldFocus(cp->client, 0)) { continue; } for(layer = LAST_LAYER; layer >= FIRST_LAYER; layer--) { ClientNode *np; for(np = nodes[layer]; np; np = np->next) { if(np->state.status & STAT_MINIMIZED) { continue; } else if(!ShouldFocus(np, 0)) { continue; } if(np == cp->client) { const char isActive = (np->state.status & STAT_ACTIVE) && IsClientOnCurrentDesktop(np); onTop = onTop || !foundTop; if(isActive) { focused = np; } if(!(cp->client->state.status & (STAT_CANFOCUS | STAT_TAKEFOCUS)) || isActive) { hasActive = 1; } } if(hasActive && onTop) { goto FoundActiveAndTop; } foundTop = 1; } } } FoundActiveAndTop: if(hasActive && onTop) { ClientNode *nextClient = NULL; int i; /* Try to find a client on a different desktop. */ for(i = 0; i < settings.desktopCount - 1; i++) { const int target = (currentDesktop + i + 1) % settings.desktopCount; for(cp = entry->clients; cp; cp = cp->next) { ClientNode *np = cp->client; if(!ShouldFocus(np, 0)) { continue; } else if(np->state.status & STAT_STICKY) { continue; } else if(np->state.desktop == target) { if(!nextClient || np->state.status & STAT_ACTIVE) { nextClient = np; } } } if(nextClient) { break; } } /* Focus the next client or minimize the current group. */ if(nextClient) { ChangeDesktop(nextClient->state.desktop); RestoreClient(nextClient, 1); } else { MinimizeGroup(entry); } } else { FocusGroup(entry); if(focused) { FocusClient(focused); } } break; case Button3: ShowClientList(bar, entry); break; case Button4: FocusPrevious(); break; case Button5: FocusNext(); break; default: break; } } }
/** Process a key press event. */ void HandleKeyPress(const XKeyEvent *event) { ClientNode *np; KeyType key; SetMousePosition(event->x_root, event->y_root, event->window); key = GetKey(event); np = GetActiveClient(); switch(key & 0xFF) { case KEY_EXEC: RunKeyCommand(event); break; case KEY_DESKTOP: ChangeDesktop((key >> 8) - 1); break; case KEY_RDESKTOP: RightDesktop(); break; case KEY_LDESKTOP: LeftDesktop(); break; case KEY_UDESKTOP: AboveDesktop(); break; case KEY_DDESKTOP: BelowDesktop(); break; case KEY_SHOWDESK: ShowDesktop(); break; case KEY_SHOWTRAY: ShowAllTrays(); break; case KEY_NEXT: StartWindowWalk(); FocusNext(); break; case KEY_NEXTSTACK: StartWindowStackWalk(); WalkWindowStack(1); break; case KEY_PREV: StartWindowWalk(); FocusPrevious(); break; case KEY_PREVSTACK: StartWindowStackWalk(); WalkWindowStack(0); break; case KEY_CLOSE: if(np) { DeleteClient(np); } break; case KEY_SHADE: if(np) { if(np->state.status & STAT_SHADED) { UnshadeClient(np); } else { ShadeClient(np); } } break; case KEY_STICK: if(np) { if(np->state.status & STAT_STICKY) { SetClientSticky(np, 0); } else { SetClientSticky(np, 1); } } break; case KEY_MOVE: if(np) { MoveClientKeyboard(np); } break; case KEY_RESIZE: if(np) { ResizeClientKeyboard(np); } break; case KEY_MIN: if(np) { MinimizeClient(np, 1); } break; case KEY_MAX: if(np) { if(np->state.maxFlags) { MaximizeClient(np, MAX_NONE); } else { MaximizeClient(np, MAX_HORIZ | MAX_VERT); } } break; case KEY_MAXTOP: ToggleMaximized(np, MAX_TOP | MAX_HORIZ); break; case KEY_MAXBOTTOM: ToggleMaximized(np, MAX_BOTTOM | MAX_HORIZ); break; case KEY_MAXLEFT: ToggleMaximized(np, MAX_LEFT | MAX_VERT); break; case KEY_MAXRIGHT: ToggleMaximized(np, MAX_RIGHT | MAX_VERT); break; case KEY_MAXV: ToggleMaximized(np, MAX_VERT); break; case KEY_MAXH: ToggleMaximized(np, MAX_HORIZ); break; case KEY_ROOT: ShowKeyMenu(event); break; case KEY_WIN: if(np) { RaiseClient(np); ShowWindowMenu(np, np->x, np->y, 1); } break; case KEY_RESTART: Restart(); break; case KEY_EXIT: Exit(); break; case KEY_FULLSCREEN: if(np) { if(np->state.status & STAT_FULLSCREEN) { SetClientFullScreen(np, 0); } else { SetClientFullScreen(np, 1); } } break; case KEY_SENDR: if(np) { SetClientDesktop(np, GetRightDesktop(np->state.desktop)); } break; case KEY_SENDL: if(np) { SetClientDesktop(np, GetLeftDesktop(np->state.desktop)); } break; case KEY_SENDU: if(np) { SetClientDesktop(np, GetAboveDesktop(np->state.desktop)); } break; case KEY_SENDD: if(np) { SetClientDesktop(np, GetBelowDesktop(np->state.desktop)); } break; default: break; } DiscardEnterEvents(); }
/** Process a key press event. */ void HandleKeyPress(const XKeyEvent *event) { ClientNode *np; KeyType key; key = GetKey(event); np = GetActiveClient(); switch(key & 0xFF) { case KEY_EXEC: RunKeyCommand(event); break; case KEY_DESKTOP: ChangeDesktop((key >> 8) - 1); break; case KEY_RDESKTOP: RightDesktop(); break; case KEY_LDESKTOP: LeftDesktop(); break; case KEY_UDESKTOP: AboveDesktop(); break; case KEY_DDESKTOP: BelowDesktop(); break; case KEY_SHOWDESK: ShowDesktop(); break; case KEY_SHOWTRAY: ShowAllTrays(); break; case KEY_NEXT: StartWindowWalk(); FocusNext(); break; case KEY_NEXTSTACK: StartWindowStackWalk(); WalkWindowStack(1); break; case KEY_PREV: StartWindowWalk(); FocusPrevious(); break; case KEY_PREVSTACK: StartWindowStackWalk(); WalkWindowStack(0); break; case KEY_CLOSE: if(np) { DeleteClient(np); } break; case KEY_SHADE: if(np) { if(np->state.status & STAT_SHADED) { UnshadeClient(np); } else { ShadeClient(np); } } break; case KEY_STICK: if(np) { if(np->state.status & STAT_STICKY) { SetClientSticky(np, 0); } else { SetClientSticky(np, 1); } } break; case KEY_MOVE: if(np) { MoveClientKeyboard(np); } break; case KEY_RESIZE: if(np) { ResizeClientKeyboard(np); } break; case KEY_MIN: if(np) { MinimizeClient(np, 1); } break; case KEY_MAX: if(np) { MaximizeClient(np, 1, 1); } break; case KEY_ROOT: ShowKeyMenu(event); break; case KEY_WIN: if(np) { ShowWindowMenu(np, np->x, np->y); } break; case KEY_RESTART: Restart(); break; case KEY_EXIT: Exit(); break; case KEY_FULLSCREEN: if(np) { if(np->state.status & STAT_FULLSCREEN) { SetClientFullScreen(np, 0); } else { SetClientFullScreen(np, 1); } } break; case KEY_SENDR: if(np) { SetClientDesktop(np, GetRightDesktop(np->state.desktop)); } break; case KEY_SENDL: if(np) { SetClientDesktop(np, GetLeftDesktop(np->state.desktop)); } break; case KEY_SENDU: if(np) { SetClientDesktop(np, GetAboveDesktop(np->state.desktop)); } break; case KEY_SENDD: if(np) { SetClientDesktop(np, GetBelowDesktop(np->state.desktop)); } break; default: break; } }
void PropertyTree::OnKeyDown(UINT nChar, UINT, UINT) { PropertyTreeItem* pItem; switch (nChar) { case VK_RETURN: if ((pItem = GetFocusedItem())!=NULL && !pItem->IsRootLevel()) { pItem->Activate(); } break; case VK_LEFT: if ((pItem = GetFocusedItem())!=NULL) { if (!SendNotify(PTN_ITEMEXPANDING, pItem)) { if (pItem->GetChild() && pItem->IsExpanded()) { pItem->Expand(FALSE); UpdateScrollbar(); Invalidate(); UpdateWindow(); CheckVisibleFocus(); break; } } } else break; // pass thru to next case VK_UP case VK_UP: if (FocusPrev()) Invalidate(); break; case VK_RIGHT: if ((pItem = GetFocusedItem())!=NULL) { if (!SendNotify(PTN_ITEMEXPANDING, pItem)) { if (pItem->GetChild() && !pItem->IsExpanded()) { pItem->Expand(); UpdateScrollbar(); Invalidate(); UpdateWindow(); CheckVisibleFocus(); break; } } } else break; // pass thru to next case VK_DOWN case VK_DOWN: if (FocusNext()) Invalidate(); break; } }
int CMenu::Run() { if ( m_oItems[m_iCurrentItem]->GetEnabled() ) { m_oItems[m_iCurrentItem]->SetActive(true); } else { FocusNext(); } Draw(); while ( !m_bDone ) { if ( g_oState.m_bQuitFlag ) { m_bDone = true; m_iReturnCode = -1; break; } SDLKey enKey = GetKey( true ); if ( g_oState.m_bQuitFlag || SDLK_ESCAPE == enKey ) { m_bDone = true; m_iReturnCode = -1; break; } switch ( enKey ) { case SDLK_UP: { FocusPrev(); break; } // end of SDLK_UP case SDLK_DOWN: { FocusNext(); break; } // end of SDLK_DOWN case SDLK_LEFT: { CMenuItem* poItem = m_oItems[m_iCurrentItem]; poItem->Decrement(); break; } case SDLK_RIGHT: { CMenuItem* poItem = m_oItems[m_iCurrentItem]; poItem->Increment(); break; } case SDLK_RETURN: { CMenuItem* poItem = m_oItems[m_iCurrentItem]; if ( poItem->GetEnabled() ) { poItem->Activate(); } } default: break; } // end of switch } Clear(); return m_iReturnCode; }