Created creation screen & fixing major bugs
This commit is contained in:
parent
b8e9067a8c
commit
89e49adf5a
6 changed files with 255 additions and 55 deletions
1
build/data.bin
Normal file
1
build/data.bin
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Data: Q|A|S|0
|
|
@ -35,10 +35,33 @@ char** split_string(const char* str, char delimiter, int* count) {
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
void string_append(char* first, const char* second) {
|
||||||
|
// Get to the end of string 1
|
||||||
|
while (*first) {
|
||||||
|
++first;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copying Strings
|
||||||
|
while (*second) {
|
||||||
|
*first++ = *second++;
|
||||||
|
}
|
||||||
|
}
|
||||||
void manager_loadnames(Manager* manager){
|
void manager_loadnames(Manager* manager){
|
||||||
// Loading the names of all passwords
|
// Loading the names of all passwords
|
||||||
char* data = store_load("Data");
|
char* data = store_load("Data");
|
||||||
|
|
||||||
|
// Do we not have any passwords?
|
||||||
|
if (!data) {
|
||||||
|
// DEBUG
|
||||||
|
FURI_LOG_D(TAG, "No passwords found.");
|
||||||
|
|
||||||
|
// Creating names
|
||||||
|
manager->names = malloc(sizeof(char*));
|
||||||
|
|
||||||
|
// Returning
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Splitting string
|
// Splitting string
|
||||||
int count = 0;
|
int count = 0;
|
||||||
char** split = split_string(data, '|', &count);
|
char** split = split_string(data, '|', &count);
|
||||||
|
@ -88,6 +111,63 @@ Manager* manager_init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Functions
|
// Functions
|
||||||
|
void manager_savepass(Manager* manager, Password* pass) {
|
||||||
|
// Not using Manager Right Now
|
||||||
|
UNUSED(manager);
|
||||||
|
|
||||||
|
// DEBUG
|
||||||
|
FURI_LOG_D(TAG, "Saving:\nN:%s\nU:%s\nP:%s",
|
||||||
|
pass->name,
|
||||||
|
pass->user,
|
||||||
|
pass->phrase);
|
||||||
|
|
||||||
|
// Our resulting string
|
||||||
|
char* result = store_load("Data");
|
||||||
|
|
||||||
|
// Is the result empty?
|
||||||
|
if(!result) {
|
||||||
|
// Allocating result
|
||||||
|
result = malloc(sizeof(char*));
|
||||||
|
|
||||||
|
// Setting stuff
|
||||||
|
string_append(result, pass->name);
|
||||||
|
string_append(result, "|");
|
||||||
|
string_append(result, pass->user);
|
||||||
|
string_append(result, "|");
|
||||||
|
string_append(result, pass->phrase);
|
||||||
|
string_append(result, "|0");
|
||||||
|
|
||||||
|
// Saving the data
|
||||||
|
store_save("Data", result);
|
||||||
|
|
||||||
|
// Cleanup
|
||||||
|
free(result);
|
||||||
|
free(pass);
|
||||||
|
} else {
|
||||||
|
// Our new stuff
|
||||||
|
char* new_addon = malloc(sizeof(char*));
|
||||||
|
|
||||||
|
// Adding the Name
|
||||||
|
string_append(new_addon, "|");
|
||||||
|
string_append(new_addon, pass->name);
|
||||||
|
string_append(new_addon, "|");
|
||||||
|
string_append(new_addon, pass->user);
|
||||||
|
string_append(new_addon, "|");
|
||||||
|
string_append(new_addon, pass->phrase);
|
||||||
|
string_append(new_addon, "|0");
|
||||||
|
|
||||||
|
// Appending addon to result
|
||||||
|
string_append(result, new_addon);
|
||||||
|
|
||||||
|
// Saving the data
|
||||||
|
store_save("Data", result);
|
||||||
|
|
||||||
|
// Cleanup
|
||||||
|
free(new_addon);
|
||||||
|
free(result);
|
||||||
|
free(pass);
|
||||||
|
}
|
||||||
|
}
|
||||||
void manager_loadpass(Manager* manager, char* name) {
|
void manager_loadpass(Manager* manager, char* name) {
|
||||||
// Freeing previous password
|
// Freeing previous password
|
||||||
if (manager->current != NULL) {
|
if (manager->current != NULL) {
|
||||||
|
|
|
@ -21,6 +21,7 @@ typedef struct {
|
||||||
Manager* manager_init();
|
Manager* manager_init();
|
||||||
|
|
||||||
// Functions
|
// Functions
|
||||||
|
void manager_savepass(Manager* manager, Password* pass);
|
||||||
void manager_loadpass(Manager* manager, char* name);
|
void manager_loadpass(Manager* manager, char* name);
|
||||||
void manager_free(Manager* manager);
|
void manager_free(Manager* manager);
|
||||||
|
|
||||||
|
|
|
@ -13,13 +13,14 @@ typedef enum {
|
||||||
FP_Scene_Cred,
|
FP_Scene_Cred,
|
||||||
FP_Scene_Send,
|
FP_Scene_Send,
|
||||||
FP_Scene_Create,
|
FP_Scene_Create,
|
||||||
|
FP_Scene_Type,
|
||||||
FP_Scene_Archive,
|
FP_Scene_Archive,
|
||||||
FP_Scene_About,
|
FP_Scene_About,
|
||||||
FP_Scene_Count // Last Index, says how many scenes there are
|
FP_Scene_Count // Last Index, says how many scenes there are
|
||||||
} FP_Scene;
|
} FP_Scene;
|
||||||
|
|
||||||
/* Types of Views */
|
/* Types of Views */
|
||||||
typedef enum { FP_View_VariableItemList, FP_View_Submenu, FP_View_TextBox, FP_View_Dialog, FP_View_Popup } FP_View;
|
typedef enum { FP_View_VariableItemList, FP_View_Submenu, FP_View_TextBox, FP_View_TextInput, FP_View_Dialog, FP_View_Popup } FP_View;
|
||||||
|
|
||||||
/* Scene events */
|
/* Scene events */
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -33,21 +34,12 @@ typedef enum {
|
||||||
FP_Scene_View_Event_Password,
|
FP_Scene_View_Event_Password,
|
||||||
FP_Scene_View_Event_BadUSB
|
FP_Scene_View_Event_BadUSB
|
||||||
} FP_Scene_View_Event;
|
} FP_Scene_View_Event;
|
||||||
|
typedef enum {
|
||||||
/* Extras */
|
FP_Scene_Create_Event_Name,
|
||||||
typedef struct {
|
FP_Scene_Create_Event_Username,
|
||||||
const char* title;
|
FP_Scene_Create_Event_Password,
|
||||||
const char* options[MAX_OPTIONS];
|
FP_Scene_Create_Event_Done
|
||||||
int selection;
|
} FP_Scene_Create_Event;
|
||||||
} FP_Variable_Item;
|
|
||||||
|
|
||||||
/* Variable Item Lists */
|
|
||||||
const FP_Variable_Item fp_scene_create_options[4] = {
|
|
||||||
{"Name", {""}, 0},
|
|
||||||
{"Username", {""}, 0},
|
|
||||||
{"Password", {""}, 0},
|
|
||||||
{"Create", {""}, 0}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Page functions
|
// Page functions
|
||||||
void FP_Scene_Callback_Default(void* context, uint32_t index) {
|
void FP_Scene_Callback_Default(void* context, uint32_t index) {
|
||||||
|
@ -64,7 +56,16 @@ void FP_Scene_Callback_Dialog(DialogExResult result, void* context) {
|
||||||
// Sending it to the scene manager
|
// Sending it to the scene manager
|
||||||
scene_manager_handle_custom_event(app->scene_manager, result);
|
scene_manager_handle_custom_event(app->scene_manager, result);
|
||||||
}
|
}
|
||||||
|
void FP_Scene_Callback_Type(void* context) {
|
||||||
|
// Setting context
|
||||||
|
FP_App* app = context;
|
||||||
|
|
||||||
|
// DEBUG
|
||||||
|
FURI_LOG_D(TAG, "Typed: %s", app->temp);
|
||||||
|
|
||||||
|
// Going back a page
|
||||||
|
scene_manager_previous_scene(app->scene_manager);
|
||||||
|
}
|
||||||
|
|
||||||
void FP_Scene_Enter_MainMenu(void* context) {
|
void FP_Scene_Enter_MainMenu(void* context) {
|
||||||
// Setting context
|
// Setting context
|
||||||
|
@ -226,47 +227,109 @@ void FP_Scene_Enter_Create(void* context) {
|
||||||
FP_App* app = context;
|
FP_App* app = context;
|
||||||
|
|
||||||
// Reset page
|
// Reset page
|
||||||
variable_item_list_reset(app->varitemlist);
|
submenu_reset(app->submenu);
|
||||||
|
|
||||||
// Drawing
|
// Did we already start a password?
|
||||||
variable_item_list_add(
|
if (!app->manager->current) {
|
||||||
app->varitemlist,
|
app->manager->current = malloc(sizeof(Password));
|
||||||
"Name",
|
}
|
||||||
1,
|
|
||||||
NULL,
|
|
||||||
app
|
|
||||||
);
|
|
||||||
variable_item_list_add(
|
|
||||||
app->varitemlist,
|
|
||||||
"Username",
|
|
||||||
1,
|
|
||||||
NULL,
|
|
||||||
app
|
|
||||||
);
|
|
||||||
variable_item_list_add(
|
|
||||||
app->varitemlist,
|
|
||||||
"Password",
|
|
||||||
1,
|
|
||||||
NULL,
|
|
||||||
app
|
|
||||||
);
|
|
||||||
variable_item_list_add(
|
|
||||||
app->varitemlist,
|
|
||||||
"Create",
|
|
||||||
1,
|
|
||||||
NULL,
|
|
||||||
app
|
|
||||||
);
|
|
||||||
|
|
||||||
// Callbacks
|
// Checking if we typed something before
|
||||||
variable_item_list_set_enter_callback(
|
if (app->temp) {
|
||||||
app->varitemlist,
|
// Checking what we selected
|
||||||
|
switch (app->selection) {
|
||||||
|
case 0: // Name
|
||||||
|
// Does name already exist?
|
||||||
|
if (app->manager->current->name) {
|
||||||
|
free(app->manager->current->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copying it
|
||||||
|
app->manager->current->name = malloc(sizeof(char*));
|
||||||
|
strcpy(app->manager->current->name, app->temp);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 1: // Username
|
||||||
|
// Does user already exist?
|
||||||
|
if (app->manager->current->user) {
|
||||||
|
free(app->manager->current->user);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copying it
|
||||||
|
app->manager->current->user = malloc(sizeof(char*));
|
||||||
|
strcpy(app->manager->current->user, app->temp);
|
||||||
|
break;
|
||||||
|
case 2: // Password
|
||||||
|
// Does phrase already exist?
|
||||||
|
if (app->manager->current->phrase) {
|
||||||
|
free(app->manager->current->phrase);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copying it
|
||||||
|
app->manager->current->phrase = malloc(sizeof(char*));
|
||||||
|
strcpy(app->manager->current->phrase, app->temp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Freeing temp
|
||||||
|
free(app->temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Options
|
||||||
|
submenu_add_item(
|
||||||
|
app->submenu,
|
||||||
|
"Set Name",
|
||||||
|
FP_Scene_Create_Event_Name,
|
||||||
|
FP_Scene_Callback_Default,
|
||||||
|
app
|
||||||
|
);
|
||||||
|
submenu_add_item(
|
||||||
|
app->submenu,
|
||||||
|
"Set Username",
|
||||||
|
FP_Scene_Create_Event_Username,
|
||||||
|
FP_Scene_Callback_Default,
|
||||||
|
app
|
||||||
|
);
|
||||||
|
submenu_add_item(
|
||||||
|
app->submenu,
|
||||||
|
"Set Password",
|
||||||
|
FP_Scene_Create_Event_Password,
|
||||||
|
FP_Scene_Callback_Default,
|
||||||
|
app
|
||||||
|
);
|
||||||
|
submenu_add_item(
|
||||||
|
app->submenu,
|
||||||
|
"Finish",
|
||||||
|
FP_Scene_Create_Event_Done,
|
||||||
FP_Scene_Callback_Default,
|
FP_Scene_Callback_Default,
|
||||||
app
|
app
|
||||||
);
|
);
|
||||||
|
|
||||||
// Send view to Flipper
|
// Send view to Flipper
|
||||||
view_dispatcher_switch_to_view(app->view_dispatcher, FP_View_VariableItemList);
|
view_dispatcher_switch_to_view(app->view_dispatcher, FP_View_Submenu);
|
||||||
|
}
|
||||||
|
void FP_Scene_Enter_Type(void* context) {
|
||||||
|
// Set Context
|
||||||
|
FP_App* app = context;
|
||||||
|
|
||||||
|
// Reset view
|
||||||
|
text_input_reset(app->textinput);
|
||||||
|
|
||||||
|
// Creating temp string
|
||||||
|
app->temp = malloc(sizeof(char*));
|
||||||
|
|
||||||
|
// Setting stuff
|
||||||
|
text_input_set_result_callback(
|
||||||
|
app->textinput,
|
||||||
|
FP_Scene_Callback_Type,
|
||||||
|
app,
|
||||||
|
app->temp,
|
||||||
|
255,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
|
||||||
|
// Send view to Flipper
|
||||||
|
view_dispatcher_switch_to_view(app->view_dispatcher, FP_View_TextInput);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FP_Scene_Exit_Default(void* context) {
|
void FP_Scene_Exit_Default(void* context) {
|
||||||
|
@ -442,8 +505,52 @@ bool FP_Scene_Event_Create(void* context, SceneManagerEvent event) {
|
||||||
// We consumed it
|
// We consumed it
|
||||||
consumed = true;
|
consumed = true;
|
||||||
|
|
||||||
// Debug log about what we pressed
|
// What to do?
|
||||||
FURI_LOG_D(TAG, "Pressed %li", event.event);
|
switch (event.event) {
|
||||||
|
case FP_Scene_Create_Event_Name:
|
||||||
|
case FP_Scene_Create_Event_Username:
|
||||||
|
case FP_Scene_Create_Event_Password:
|
||||||
|
// Set selection
|
||||||
|
app->selection = event.event;
|
||||||
|
|
||||||
|
// Switch to keyboard scene
|
||||||
|
scene_manager_next_scene(app->scene_manager, FP_Scene_Type);
|
||||||
|
break;
|
||||||
|
case FP_Scene_Create_Event_Done:
|
||||||
|
// Save the password
|
||||||
|
manager_savepass(app->manager, app->manager->current);
|
||||||
|
|
||||||
|
// Freeing temp string
|
||||||
|
if (app->temp) {
|
||||||
|
free(app->temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reload manager
|
||||||
|
manager_free(app->manager);
|
||||||
|
app->manager = manager_init();
|
||||||
|
|
||||||
|
// Switching scenes
|
||||||
|
scene_manager_previous_scene(app->scene_manager);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
consumed = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return result
|
||||||
|
return consumed;
|
||||||
|
}
|
||||||
|
bool FP_Scene_Event_Type(void* context, SceneManagerEvent event) {
|
||||||
|
// Setting context
|
||||||
|
FP_App* app = context;
|
||||||
|
bool consumed = false;
|
||||||
|
|
||||||
|
// Switching based on event
|
||||||
|
if (event.type == SceneManagerEventTypeCustom) {
|
||||||
|
// We consumed it
|
||||||
|
consumed = true;
|
||||||
|
|
||||||
UNUSED(app);
|
UNUSED(app);
|
||||||
|
|
||||||
|
@ -467,7 +574,8 @@ void (*const FP_Scene_Enter_Handlers[])(void*) = {
|
||||||
FP_Scene_Enter_View,
|
FP_Scene_Enter_View,
|
||||||
FP_Scene_Enter_Cred,
|
FP_Scene_Enter_Cred,
|
||||||
FP_Scene_Enter_Send,
|
FP_Scene_Enter_Send,
|
||||||
FP_Scene_Enter_Create
|
FP_Scene_Enter_Create,
|
||||||
|
FP_Scene_Enter_Type
|
||||||
};
|
};
|
||||||
bool (*const FP_Scene_Event_Handlers[])(void*, SceneManagerEvent) = {
|
bool (*const FP_Scene_Event_Handlers[])(void*, SceneManagerEvent) = {
|
||||||
FP_Scene_Event_MainMenu,
|
FP_Scene_Event_MainMenu,
|
||||||
|
@ -475,7 +583,8 @@ bool (*const FP_Scene_Event_Handlers[])(void*, SceneManagerEvent) = {
|
||||||
FP_Scene_Event_View,
|
FP_Scene_Event_View,
|
||||||
FP_Scene_Event_Cred,
|
FP_Scene_Event_Cred,
|
||||||
FP_Scene_Event_Send,
|
FP_Scene_Event_Send,
|
||||||
FP_Scene_Event_Create
|
FP_Scene_Event_Create,
|
||||||
|
FP_Scene_Event_Type
|
||||||
};
|
};
|
||||||
void (*const FP_Scene_Exit_Handlers[])(void*) = {
|
void (*const FP_Scene_Exit_Handlers[])(void*) = {
|
||||||
FP_Scene_Exit_Default,
|
FP_Scene_Exit_Default,
|
||||||
|
@ -483,6 +592,7 @@ void (*const FP_Scene_Exit_Handlers[])(void*) = {
|
||||||
FP_Scene_Exit_Default,
|
FP_Scene_Exit_Default,
|
||||||
FP_Scene_Exit_Cred,
|
FP_Scene_Exit_Cred,
|
||||||
FP_Scene_Exit_Default,
|
FP_Scene_Exit_Default,
|
||||||
|
FP_Scene_Exit_Default,
|
||||||
FP_Scene_Exit_Default
|
FP_Scene_Exit_Default
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -532,6 +642,7 @@ FP_App* fp_app_init() {
|
||||||
|
|
||||||
// Allocating all types of views
|
// Allocating all types of views
|
||||||
result->varitemlist = variable_item_list_alloc();
|
result->varitemlist = variable_item_list_alloc();
|
||||||
|
result->textinput = text_input_alloc();
|
||||||
result->dialog = dialog_ex_alloc();
|
result->dialog = dialog_ex_alloc();
|
||||||
result->submenu = submenu_alloc();
|
result->submenu = submenu_alloc();
|
||||||
result->textbox = text_box_alloc();
|
result->textbox = text_box_alloc();
|
||||||
|
@ -544,6 +655,7 @@ FP_App* fp_app_init() {
|
||||||
|
|
||||||
// Adding views to dispatcher
|
// Adding views to dispatcher
|
||||||
view_dispatcher_add_view(result->view_dispatcher, FP_View_VariableItemList, variable_item_list_get_view(result->varitemlist));
|
view_dispatcher_add_view(result->view_dispatcher, FP_View_VariableItemList, variable_item_list_get_view(result->varitemlist));
|
||||||
|
view_dispatcher_add_view(result->view_dispatcher, FP_View_TextInput, text_input_get_view(result->textinput));
|
||||||
view_dispatcher_add_view(result->view_dispatcher, FP_View_TextBox, text_box_get_view(result->textbox));
|
view_dispatcher_add_view(result->view_dispatcher, FP_View_TextBox, text_box_get_view(result->textbox));
|
||||||
view_dispatcher_add_view(result->view_dispatcher, FP_View_Dialog, dialog_ex_get_view(result->dialog));
|
view_dispatcher_add_view(result->view_dispatcher, FP_View_Dialog, dialog_ex_get_view(result->dialog));
|
||||||
view_dispatcher_add_view(result->view_dispatcher, FP_View_Submenu, submenu_get_view(result->submenu));
|
view_dispatcher_add_view(result->view_dispatcher, FP_View_Submenu, submenu_get_view(result->submenu));
|
||||||
|
@ -575,15 +687,18 @@ void fp_app_free(FP_App* app) {
|
||||||
manager_free(app->manager);
|
manager_free(app->manager);
|
||||||
scene_manager_free(app->scene_manager);
|
scene_manager_free(app->scene_manager);
|
||||||
view_dispatcher_remove_view(app->view_dispatcher, FP_View_VariableItemList);
|
view_dispatcher_remove_view(app->view_dispatcher, FP_View_VariableItemList);
|
||||||
|
view_dispatcher_remove_view(app->view_dispatcher, FP_View_TextInput);
|
||||||
view_dispatcher_remove_view(app->view_dispatcher, FP_View_Submenu);
|
view_dispatcher_remove_view(app->view_dispatcher, FP_View_Submenu);
|
||||||
view_dispatcher_remove_view(app->view_dispatcher, FP_View_TextBox);
|
view_dispatcher_remove_view(app->view_dispatcher, FP_View_TextBox);
|
||||||
view_dispatcher_remove_view(app->view_dispatcher, FP_View_Dialog);
|
view_dispatcher_remove_view(app->view_dispatcher, FP_View_Dialog);
|
||||||
view_dispatcher_remove_view(app->view_dispatcher, FP_View_Popup);
|
view_dispatcher_remove_view(app->view_dispatcher, FP_View_Popup);
|
||||||
view_dispatcher_free(app->view_dispatcher);
|
view_dispatcher_free(app->view_dispatcher);
|
||||||
variable_item_list_free(app->varitemlist);
|
variable_item_list_free(app->varitemlist);
|
||||||
|
text_input_free(app->textinput);
|
||||||
dialog_ex_free(app->dialog);
|
dialog_ex_free(app->dialog);
|
||||||
text_box_free(app->textbox);
|
text_box_free(app->textbox);
|
||||||
submenu_free(app->submenu);
|
submenu_free(app->submenu);
|
||||||
popup_free(app->popup);
|
popup_free(app->popup);
|
||||||
|
free(app->temp);
|
||||||
free(app);
|
free(app);
|
||||||
}
|
}
|
|
@ -15,6 +15,7 @@
|
||||||
#include <gui/modules/popup.h>
|
#include <gui/modules/popup.h>
|
||||||
#include <gui/modules/variable_item_list.h>
|
#include <gui/modules/variable_item_list.h>
|
||||||
#include <gui/modules/text_box.h>
|
#include <gui/modules/text_box.h>
|
||||||
|
#include <gui/modules/text_input.h>
|
||||||
|
|
||||||
#include "app.h"
|
#include "app.h"
|
||||||
#include "manager.h"
|
#include "manager.h"
|
||||||
|
@ -24,12 +25,14 @@ typedef struct {
|
||||||
SceneManager* scene_manager;
|
SceneManager* scene_manager;
|
||||||
ViewDispatcher* view_dispatcher;
|
ViewDispatcher* view_dispatcher;
|
||||||
VariableItemList* varitemlist;
|
VariableItemList* varitemlist;
|
||||||
|
TextInput* textinput;
|
||||||
DialogEx* dialog;
|
DialogEx* dialog;
|
||||||
Submenu* submenu;
|
Submenu* submenu;
|
||||||
TextBox* textbox;
|
TextBox* textbox;
|
||||||
Popup* popup;
|
Popup* popup;
|
||||||
|
|
||||||
Manager* manager;
|
Manager* manager;
|
||||||
|
int selection;
|
||||||
char* temp;
|
char* temp;
|
||||||
} FP_App;
|
} FP_App;
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ int32_t flippypass_app(void* p) {
|
||||||
UNUSED(p);
|
UNUSED(p);
|
||||||
|
|
||||||
// Saving to a default file:
|
// Saving to a default file:
|
||||||
debug_template();
|
//debug_template();
|
||||||
|
|
||||||
// Creating App
|
// Creating App
|
||||||
FP_App* app = fp_app_init();
|
FP_App* app = fp_app_init();
|
||||||
|
|
Loading…
Reference in a new issue