Skip to content

Commit fe2e642

Browse files
committed
Updated menu callbacks to accept a state parameter so that callback
functions do not need to access globals
1 parent b57789c commit fe2e642

10 files changed

+81
-64
lines changed

ListProcesses.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -173,32 +173,37 @@ int list_processes_run(int maxItems, CHAR** linesToFill, BOOL sort, int (*sortFu
173173
return numberOfResults;
174174
}
175175

176-
int list_processes_run_no_sort(int maxItems, CHAR** linesToFill)
176+
int list_processes_run_no_sort(int maxItems, CHAR** linesToFill, void *state)
177177
{
178+
UNREFERENCED_PARAMETER(state);
178179
int numberOfResults = list_processes_run(maxItems, linesToFill, FALSE, NULL);
179180
return numberOfResults;
180181
}
181182

182-
int list_processes_run_sorted_by_cpu(int maxItems, CHAR **linesToFill)
183+
int list_processes_run_sorted_by_cpu(int maxItems, CHAR **linesToFill, void *state)
183184
{
185+
UNREFERENCED_PARAMETER(state);
184186
int numberOfResults = list_processes_run(maxItems, linesToFill, TRUE, CompareProcessCpu);
185187
return numberOfResults;
186188
}
187189

188-
int list_processes_run_sorted_by_private_bytes(int maxItems, CHAR **linesToFill)
190+
int list_processes_run_sorted_by_private_bytes(int maxItems, CHAR **linesToFill, void *state)
189191
{
192+
UNREFERENCED_PARAMETER(state);
190193
int numberOfResults = list_processes_run(maxItems, linesToFill, TRUE, CompareProcessPrivateBytes);
191194
return numberOfResults;
192195
}
193196

194-
int list_processes_run_sorted_by_working_set(int maxItems, CHAR **linesToFill)
197+
int list_processes_run_sorted_by_working_set(int maxItems, CHAR **linesToFill, void *state)
195198
{
199+
UNREFERENCED_PARAMETER(state);
196200
int numberOfResults = list_processes_run(maxItems, linesToFill, TRUE, CompareProcessWorkingSet);
197201
return numberOfResults;
198202
}
199203

200-
int list_processes_run_sorted_by_pid(int maxItems, CHAR **linesToFill)
204+
int list_processes_run_sorted_by_pid(int maxItems, CHAR **linesToFill, void *state)
201205
{
206+
UNREFERENCED_PARAMETER(state);
202207
int numberOfResults = list_processes_run(maxItems, linesToFill, TRUE, CompareProcessPid);
203208
return numberOfResults;
204209
}

ListProcesses.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
int list_processes_run_no_sort(int maxItems, CHAR** linesToFill);
2-
int list_processes_run_sorted_by_cpu(int maxItems, CHAR **linesToFill);
3-
int list_processes_run_sorted_by_private_bytes(int maxItems, CHAR **linesToFill);
4-
int list_processes_run_sorted_by_working_set(int maxItems, CHAR **linesToFill);
5-
int list_processes_run_sorted_by_pid(int maxItems, CHAR **linesToFill);
1+
int list_processes_run_no_sort(int maxItems, CHAR** linesToFill, void *state);
2+
int list_processes_run_sorted_by_cpu(int maxItems, CHAR **linesToFill, void *state);
3+
int list_processes_run_sorted_by_private_bytes(int maxItems, CHAR **linesToFill, void *state);
4+
int list_processes_run_sorted_by_working_set(int maxItems, CHAR **linesToFill, void *state);
5+
int list_processes_run_sorted_by_pid(int maxItems, CHAR **linesToFill, void *state);

ListServices.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,9 @@ int EnumerateAllServices(SC_HANDLE hSCM, CHAR **toFill, DWORD maxItems)
150150
}
151151
}
152152

153-
int list_services_run_no_sort(int maxItems, CHAR** linesToFill)
153+
int list_services_run_no_sort(int maxItems, CHAR** linesToFill, void *state)
154154
{
155+
UNREFERENCED_PARAMETER(state);
155156
SC_HANDLE scHandle = OpenSCManagerA(
156157
NULL,
157158
NULL,

ListServices.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
int list_services_run_no_sort(int maxItems, CHAR** linesToFill);
1+
int list_services_run_no_sort(int maxItems, CHAR** linesToFill, void *state);
22
void start_service(CHAR *szSvcName);

ListWindows.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,8 +259,9 @@ static BOOL CALLBACK enum_windows_callback(HWND hwnd, LPARAM lparam)
259259
return TRUE;
260260
}
261261

262-
int list_windows_run(int maxItems, CHAR** toFill)
262+
int list_windows_run(int maxItems, CHAR** toFill, void *state)
263263
{
264+
UNREFERENCED_PARAMETER(state);
264265
ListWindowsWorkspace *workspace = calloc(1, sizeof(ListWindowsWorkspace));
265266
assert(workspace);
266267
EnumWindows(enum_windows_callback, (LPARAM)workspace);

ListWindows.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
#include <Windows.h>
2-
int list_windows_run(int maxItems, CHAR** toFill);
2+
int list_windows_run(int maxItems, CHAR** toFill, void *state);
33
BOOL list_windows_is_root_window(HWND hwnd, LONG styles, LONG exStyles);

SMenu.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ void ItemsView_HandleSelection(ItemsView *self)
390390
ItemsView_Clear(self->searchView->itemsView);
391391
if(self->onSelection)
392392
{
393-
self->onSelection(result);
393+
self->onSelection(result, self->state);
394394
}
395395
}
396396

@@ -581,7 +581,7 @@ void ItemsView_StartLoadItems_FromCommand(ItemsView *self, NamedCommand *namedCo
581581
ProcessWithItemStreamOutput_Start(namedCommand->expression, job);
582582
}
583583

584-
void ItemsView_LoadFromAction(ItemsView *self, int (itemsAction)(int maxItems, CHAR **items))
584+
void ItemsView_LoadFromAction(ItemsView *self, int (itemsAction)(int maxItems, CHAR **items, void *state))
585585
{
586586
ItemsView_Clear(self);
587587

@@ -593,7 +593,7 @@ void ItemsView_LoadFromAction(ItemsView *self, int (itemsAction)(int maxItems, C
593593
self->numberOfChunks = 1;
594594

595595
static CHAR *itemsBuf[CHUNK_SIZE];
596-
int numberOfItems = itemsAction(CHUNK_SIZE, itemsBuf);
596+
int numberOfItems = itemsAction(CHUNK_SIZE, itemsBuf, self->state);
597597

598598
for(int i = 0; i < numberOfItems; i++)
599599
{
@@ -748,7 +748,7 @@ void CALLBACK BindProcessFinishCallback(void* lpParameter, BOOLEAN isTimeout)
748748

749749
if(asyncState->quitAfter)
750750
{
751-
asyncState->itemsView->searchView->onEscape();
751+
asyncState->itemsView->searchView->onEscape(asyncState->itemsView->state);
752752
ItemsView_Clear(asyncState->itemsView);
753753
}
754754

@@ -763,7 +763,7 @@ void ItemsView_HandleBinding(ItemsView *self, NamedCommand *command)
763763
{
764764
if(command->quitAfter)
765765
{
766-
self->searchView->onEscape();
766+
self->searchView->onEscape(self->state);
767767
}
768768

769769
LRESULT dwSel = SendMessageA(self->hwnd, LB_GETCURSEL, 0, 0);
@@ -976,7 +976,7 @@ void SearchView_HandleEscape(SearchView *self)
976976
}
977977
else
978978
{
979-
self->onEscape();
979+
self->onEscape(self->itemsView->state);
980980
ItemsView_Clear(self->itemsView);
981981
}
982982
}
@@ -1926,7 +1926,7 @@ void MenuDefinition_AddLoadActionKeyBinding(
19261926
MenuDefinition *self,
19271927
unsigned int modifier,
19281928
unsigned int key,
1929-
int (*loadAction)(int, CHAR**),
1929+
int (*loadAction)(int, CHAR**, void *state),
19301930
char *loadActionDescription)
19311931
{
19321932
MenuKeyBinding *binding = calloc(1, sizeof(MenuKeyBinding));
@@ -2306,7 +2306,7 @@ MenuDefinition* menu_definition_create(MenuView *menuView)
23062306
return result;
23072307
}
23082308

2309-
void menu_definition_set_load_action(MenuDefinition *self, int (*loadAction)(int maxItems, CHAR** items))
2309+
void menu_definition_set_load_action(MenuDefinition *self, int (*loadAction)(int maxItems, CHAR** items, void *state))
23102310
{
23112311
self->itemsAction = loadAction;
23122312
MenuDefinition_AddLoadActionKeyBinding(self, VK_CONTROL, VkKeyScanW('r'), self->itemsAction, "Reload");
@@ -2329,6 +2329,7 @@ void menu_run_definition(MenuView *self, MenuDefinition *menuDefinition)
23292329
self->itemsView->returnRangeStart = menuDefinition->returnRangeStart;
23302330
self->itemsView->returnRangeEnd = menuDefinition->returnRangeEnd;
23312331
self->itemsView->onSelection = menuDefinition->onSelection;
2332+
self->itemsView->state = menuDefinition->state;
23322333
self->searchView->onEscape = menuDefinition->onEscape;
23332334
self->searchView->keyBindings = menuDefinition->keyBindings;
23342335

SMenu.h

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@ typedef struct MenuDefinition
2424
int returnRangeStart;
2525
int returnRangeEnd;
2626
BOOL hasReturnRange;
27-
void (*onSelection)(char* stdOut);
28-
void (*onEscape)(void);
29-
int (*itemsAction)(int maxItems, CHAR** items);
27+
void (*onSelection)(char* stdOut, void *state);
28+
void (*onEscape)(void *state);
29+
int (*itemsAction)(int maxItems, CHAR** items, void *state);
30+
void *state;
3031
} MenuDefinition;
3132

3233
struct NamedCommand
@@ -56,7 +57,7 @@ struct MenuKeyBinding
5657
NamedCommand* command;
5758
MenuKeyBinding* next;
5859
BOOL isLoadCommand;
59-
int (*loadAction)(int maxItems, CHAR** items);
60+
int (*loadAction)(int maxItems, CHAR** items, void *state);
6061
char *loadActionDescription;
6162
};
6263

@@ -112,7 +113,7 @@ typedef struct SearchView
112113
ItemsView *itemsView;
113114
MenuKeyBinding *keyBindings;
114115
MenuKeyBinding *lastKeyBinding;
115-
void (*onEscape)(void);
116+
void (*onEscape)(void *state);
116117
BOOL isSearching;
117118
BOOL cancelSearch;
118119
HANDLE searchEvent;
@@ -144,7 +145,7 @@ struct ItemsView
144145
BOOL headerSet;
145146
BOOL hasLoadCommand;
146147
NamedCommand *loadCommand;
147-
int (*loadAction)(int maxItems, CHAR**);
148+
int (*loadAction)(int maxItems, CHAR**, void *state);
148149
int viewPortLines;
149150
int cmdViewPortLines;
150151
int numberOfItemsMatched;
@@ -161,14 +162,15 @@ struct ItemsView
161162
BOOL hasReturnRange;
162163
int returnRangeStart;
163164
int returnRangeEnd;
164-
void (*onSelection)(char* stdOut);
165+
void (*onSelection)(char* stdOut, void *state);
165166
BOOL isLoading;
166167
BOOL cancelLoad;
167168
HANDLE loadEvent;
168169
CRITICAL_SECTION loadCriticalSection;
169170
Item *displayItems[MAX_DISPLAY_BUF];
170171
int numberOfDisplayItems;
171172
BOOL isScrollable;
173+
void *state;
172174
};
173175

174176
typedef struct ProcessCmdOutputJob
@@ -200,7 +202,7 @@ void menu_set_border_pen(MenuView *self, HPEN pen);
200202
void menu_run_definition(MenuView *self, MenuDefinition *menuDefinition);
201203
void MenuDefinition_ParseAndAddLoadCommand(MenuDefinition *self, char *argText, BOOL isScrollable);
202204
void MenuDefinition_ParseAndSetRange(MenuDefinition *self, char *argText);
203-
void MenuDefinition_AddLoadActionKeyBinding(MenuDefinition *self, unsigned int modifier, unsigned int key, int (*loadAction)(int maxItems, CHAR**), char* loadActionDescription);
204-
void menu_definition_set_load_action(MenuDefinition *self, int (*loadAction)(int maxItems, CHAR** items));
205+
void MenuDefinition_AddLoadActionKeyBinding(MenuDefinition *self, unsigned int modifier, unsigned int key, int (*loadAction)(int maxItems, CHAR**, void *state), char* loadActionDescription);
206+
void menu_definition_set_load_action(MenuDefinition *self, int (*loadAction)(int maxItems, CHAR** items, void *state));
205207
void menu_definition_set_load_command(MenuDefinition *self, NamedCommand *loadCommand);
206208
MenuDefinition* menu_definition_create(MenuView *menuView);

SimpleWindowManager.c

Lines changed: 36 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -215,25 +215,27 @@ IWbemServices *services = NULL;
215215

216216
Configuration *configuration;
217217

218-
void run_command_from_menu(char *stdOut)
218+
void run_command_from_menu(char *stdOut, void *state)
219219
{
220+
WindowManagerState *windowManagerState = (WindowManagerState*)state;
220221
const char deli[] = " ";
221222
char *next_token = NULL;
222223
char* name = strtok_s(stdOut, deli, &next_token);
223224

224-
for(int i = 0; i < g_windowManagerState.numberOfCommands; i++)
225+
for(int i = 0; i < windowManagerState->numberOfCommands; i++)
225226
{
226-
if(strcmp(name, g_windowManagerState.commands[i]->name) == 0)
227+
if(strcmp(name, windowManagerState->commands[i]->name) == 0)
227228
{
228-
g_windowManagerState.commands[i]->execute(g_windowManagerState.commands[i]);
229+
windowManagerState->commands[i]->execute(windowManagerState->commands[i]);
229230
return;
230231
}
231232
}
232233
}
233234

234-
int commands_list(int maxItems, CHAR **lines)
235+
int commands_list(int maxItems, CHAR **lines, void *state)
235236
{
236-
size_t nameWidth = g_windowManagerState.longestCommandName;
237+
WindowManagerState *windowManagerState = (WindowManagerState*)state;
238+
size_t nameWidth = windowManagerState->longestCommandName;
237239
const int typeWidth = 25;
238240
const int keyBindingWidth = 30;
239241
CHAR header[1024];
@@ -253,9 +255,9 @@ int commands_list(int maxItems, CHAR **lines)
253255

254256
int numberOfBindings = 1;
255257

256-
for(int i = 0; i < g_windowManagerState.numberOfCommands && g_windowManagerState.numberOfCommands < maxItems; i++)
258+
for(int i = 0; i < windowManagerState->numberOfCommands && windowManagerState->numberOfCommands < maxItems; i++)
257259
{
258-
Command *command = g_windowManagerState.commands[i];
260+
Command *command = windowManagerState->commands[i];
259261
CHAR keyBindingStr[MAX_PATH];
260262
keyBindingStr[0] = '\0';
261263

@@ -3738,6 +3740,7 @@ void scratch_windows_add_to_end(ScratchWindow *scratchWindow)
37383740
MenuDefinition* menu_create_and_register(void)
37393741
{
37403742
MenuDefinition *result = menu_definition_create(g_windowManagerState.menuView);
3743+
result->state = &g_windowManagerState;
37413744
return result;
37423745
}
37433746

@@ -3749,13 +3752,14 @@ void menu_hide(WindowManagerState *windowManagerState)
37493752
border_window_update(windowManagerState);
37503753
}
37513754

3752-
void menu_on_escape(void)
3755+
void menu_on_escape(void *state)
37533756
{
3754-
menu_hide(&g_windowManagerState);
3757+
WindowManagerState *windowManagerState = (WindowManagerState*)state;
3758+
menu_hide(windowManagerState);
37553759
HWND foregroundHwnd = GetForegroundWindow();
3756-
if((foregroundHwnd == g_windowManagerState.menuView->hwnd || foregroundHwnd == g_windowManagerState.borderWindowHwnd) && g_windowManagerState.selectedMonitor->workspace)
3760+
if((foregroundHwnd == windowManagerState->menuView->hwnd || foregroundHwnd == windowManagerState->borderWindowHwnd) && windowManagerState->selectedMonitor->workspace)
37573761
{
3758-
workspace_focus_selected_window(&g_windowManagerState, g_windowManagerState.selectedMonitor->workspace);
3762+
workspace_focus_selected_window(windowManagerState, windowManagerState->selectedMonitor->workspace);
37593763
}
37603764
}
37613765

@@ -5792,19 +5796,21 @@ void process_with_stdout_start(CHAR *cmdArgs, void (*onSuccess) (CHAR *))
57925796
CloseHandle(hChildStd_OUT_Wr);
57935797
}
57945798

5795-
void open_program_scratch_callback(char *stdOut)
5799+
void open_program_scratch_callback(char *stdOut, void *state)
57965800
{
5797-
menu_hide(&g_windowManagerState);
5801+
WindowManagerState *windowManagerState = (WindowManagerState*)state;
5802+
menu_hide(windowManagerState);
57985803
/* border_window_hide(g_windowManagerState.borderWindowHwnd); */
57995804
char str[1024];
58005805

58015806
sprintf_s(str, 1024, "/c start \"\" \"%s\"", stdOut);
58025807
start_launcher(str);
58035808
}
58045809

5805-
void open_program_scratch_callback_not_elevated(char *stdOut)
5810+
void open_program_scratch_callback_not_elevated(char *stdOut, void *state)
58065811
{
5807-
menu_hide(&g_windowManagerState);
5812+
WindowManagerState *windowManagerState = (WindowManagerState*)state;
5813+
menu_hide(windowManagerState);
58085814
/* border_window_hide(g_windowManagerState.borderWindowHwnd); */
58095815
char str[1024];
58105816

@@ -5817,35 +5823,36 @@ void open_process_list_scratch_callback(char *stdOut)
58175823
UNREFERENCED_PARAMETER(stdOut);
58185824
}
58195825

5820-
void open_windows_scratch_exit_callback(char *stdOut)
5826+
void open_windows_scratch_exit_callback(char *stdOut, void *state)
58215827
{
5822-
menu_hide(&g_windowManagerState);
5828+
WindowManagerState *windowManagerState = (WindowManagerState*)state;
5829+
menu_hide(windowManagerState);
58235830
char* lastCharRead;
58245831
HWND hwnd = (HWND)strtoll(stdOut, &lastCharRead, 16);
58255832

5826-
Client *client = windowManager_find_client_in_workspaces_by_hwnd(&g_windowManagerState, hwnd);
5833+
Client *client = windowManager_find_client_in_workspaces_by_hwnd(windowManagerState, hwnd);
58275834
if(client)
58285835
{
58295836
if(client->data->isMinimized)
58305837
{
58315838
ShowWindow(hwnd, SW_RESTORE);
5832-
client_move_from_minimized_to_unminimized(&g_windowManagerState, client);
5839+
client_move_from_minimized_to_unminimized(windowManagerState, client);
58335840
client->workspace->selected = client;
58345841
}
58355842

58365843
client->workspace->layout->move_client_to_main(client);
58375844
client->workspace->selected = client->workspace->clients;
58385845

5839-
if(g_windowManagerState.selectedMonitor->workspace != client->workspace)
5846+
if(windowManagerState->selectedMonitor->workspace != client->workspace)
58405847
{
5841-
windowManager_move_workspace_to_monitor(&g_windowManagerState, g_windowManagerState.selectedMonitor, client->workspace);
5842-
workspace_arrange_windows(client->workspace, &g_windowManagerState);
5843-
workspace_focus_selected_window(&g_windowManagerState, client->workspace);
5848+
windowManager_move_workspace_to_monitor(windowManagerState, windowManagerState->selectedMonitor, client->workspace);
5849+
workspace_arrange_windows(client->workspace, windowManagerState);
5850+
workspace_focus_selected_window(windowManagerState, client->workspace);
58445851
}
58455852
else
58465853
{
5847-
workspace_arrange_windows(client->workspace, &g_windowManagerState);
5848-
workspace_focus_selected_window(&g_windowManagerState, client->workspace);
5854+
workspace_arrange_windows(client->workspace, windowManagerState);
5855+
workspace_focus_selected_window(windowManagerState, client->workspace);
58495856
}
58505857
}
58515858
else
@@ -5856,12 +5863,12 @@ void open_windows_scratch_exit_callback(char *stdOut)
58565863
RECT focusedRect;
58575864
GetWindowRect(hwnd, &focusedRect);
58585865

5859-
if(focusedRect.left > g_windowManagerState.selectedMonitor->xOffset + g_windowManagerState.selectedMonitor->w ||
5860-
focusedRect.left < g_windowManagerState.selectedMonitor->xOffset)
5866+
if(focusedRect.left > windowManagerState->selectedMonitor->xOffset + windowManagerState->selectedMonitor->w ||
5867+
focusedRect.left < windowManagerState->selectedMonitor->xOffset)
58615868
{
58625869
MoveWindow(
58635870
hwnd,
5864-
g_windowManagerState.selectedMonitor->xOffset + (g_windowManagerState.selectedMonitor->workspaceStyle->gapWidth * 2),
5871+
windowManagerState->selectedMonitor->xOffset + (windowManagerState->selectedMonitor->workspaceStyle->gapWidth * 2),
58655872
focusedRect.top,
58665873
focusedRect.right - focusedRect.left,
58675874
focusedRect.bottom - focusedRect.top,

0 commit comments

Comments
 (0)