main.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include "lumacs/editor_core.hpp"
  2. #include "lumacs/tui_editor.hpp"
  3. #include "lumacs/gtk_editor.hpp"
  4. #include <iostream>
  5. #include <string>
  6. #include <vector>
  7. #include <filesystem>
  8. using namespace lumacs;
  9. void print_help() {
  10. std::cout << "Usage: lumacs [options] [file]\n"
  11. << "Options:\n"
  12. << " -nw, --no-window Run in terminal mode (TUI)\n"
  13. << " --help Show this help message\n";
  14. }
  15. int main(int argc, char* argv[]) {
  16. bool force_tui = false;
  17. std::string filename;
  18. // Parse arguments
  19. for (int i = 1; i < argc; ++i) {
  20. std::string arg = argv[i];
  21. if (arg == "-nw" || arg == "--no-window") {
  22. force_tui = true;
  23. } else if (arg == "--help") {
  24. print_help();
  25. return 0;
  26. } else {
  27. // Assume it's a filename
  28. if (filename.empty()) {
  29. filename = arg;
  30. }
  31. }
  32. }
  33. try {
  34. // Initialize Core
  35. EditorCore core;
  36. // Select Frontend
  37. std::unique_ptr<IEditorView> view;
  38. #ifdef LUMACS_WITH_GTK
  39. if (!force_tui) {
  40. view = create_gtk_editor();
  41. }
  42. #endif
  43. // Fallback to TUI if GTK not available or TUI forced
  44. if (!view) {
  45. if (!force_tui && !view) {
  46. // If we tried to load GTK and failed (e.g. create_gtk_editor returned null), warn user?
  47. // For now, create_gtk_editor prints to stderr if built without GTK.
  48. }
  49. view = create_tui_editor();
  50. }
  51. if (!view) {
  52. std::cerr << "Failed to create editor interface." << std::endl;
  53. return 1;
  54. }
  55. // Link Core and View
  56. view->set_core(&core);
  57. core.on_event([&view](EditorEvent event) {
  58. view->handle_editor_event(event);
  59. });
  60. // Initialize View
  61. view->init();
  62. // Load initial file if provided
  63. if (!filename.empty()) {
  64. core.load_file(filename);
  65. }
  66. // Run main loop
  67. view->run();
  68. // Clear event callbacks before view is destroyed to prevent use-after-free
  69. core.clear_event_callbacks();
  70. } catch (const std::exception& e) {
  71. std::cerr << "Fatal Error: " << e.what() << std::endl;
  72. return 1;
  73. }
  74. return 0;
  75. }