summaryrefslogtreecommitdiff
path: root/ted.h
diff options
context:
space:
mode:
Diffstat (limited to 'ted.h')
-rw-r--r--ted.h809
1 files changed, 12 insertions, 797 deletions
diff --git a/ted.h b/ted.h
index 2e07c18..53a2cb4 100644
--- a/ted.h
+++ b/ted.h
@@ -11,44 +11,23 @@
#ifndef TED_H_
#define TED_H_
-#ifdef TED_PLUGIN
-#undef TED_PLUGIN
-#define TED_PLUGIN 1
-#endif
-
#ifdef __cplusplus
extern "C" {
#endif
#include "base.h"
#include "util.h"
-#include "os.h"
-#include "unicode.h"
-#include "ds.h"
-#include "lsp.h"
#include "text.h"
#include "colors.h"
#include "command.h"
-#include "lib/glcorearb.h"
-#include "sdl-inc.h"
/// Version number
#define TED_VERSION "2.4.3"
-/// Version string
-#define TED_VERSION_FULL "ted v. " TED_VERSION
/// Maximum path size ted handles.
#define TED_PATH_MAX 1024
/// Config filename
#define TED_CFG "ted.cfg"
-/// Minimum text size
-#define TEXT_SIZE_MIN 6
-/// Maximum text size
-#define TEXT_SIZE_MAX 70
-/// max number of LSPs running at once
-#define TED_LSP_MAX 200
-/// max number of macros
-#define TED_MACRO_MAX 256
// If you are adding new languages, DO NOT change the constant values
// of the previous languages. It will mess up config files which use :set-language!
@@ -284,568 +263,6 @@ typedef enum {
MENU_RENAME_SYMBOL,
} Menu;
-
-
-#if !TED_PLUGIN
-
-typedef struct {
- const char *string;
- i64 number;
-} CommandArgument;
-
-typedef struct {
- // did this command come from executing a macro?
- bool running_macro;
-} CommandContext;
-
-/// Thing to do when a key combo is pressed.
-typedef struct {
- KeyCombo key_combo;
- Command command;
- CommandArgument argument;
-} KeyAction;
-
-
-/// A SettingsContext is a context where a specific set of settings are applied.
-/// this corresponds to `[PATH//LANGUAGE.(section)]` in config files.
-typedef struct {
- /// The settings apply to this language.
- Language language;
- /// The settings apply to all paths which start with this string, or all paths if path=NULL
- char *path;
-} SettingsContext;
-
-/// Need to use reference counting for textures because of Settings:
-/// We copy parent settings to children
-/// e.g.
-/// ```
-/// [core]
-/// bg-texture = "blablabla.png"
-/// [Javascript.core]
-/// some random shit
-/// ```
-/// the main Settings' bg_texture will get copied to javascript's Settings,
-/// so we need to be extra careful about when we delete textures.
-typedef struct {
- u32 ref_count;
- GLuint texture;
-} GlRcTexture;
-
-/// Reference-counted shader-array-buffer combo.
-typedef struct {
- u32 ref_count;
- GLuint shader;
- GLuint array;
- GLuint buffer;
-} GlRcSAB;
-
-typedef struct {
- Language language;
- char extension[16];
-} LanguageExtension;
-
-/// All of ted's settings
-///
-/// NOTE: to add more options to ted, add fields here,
-/// and change the settings_<type> global constant near the top of config.c
-struct Settings {
- SettingsContext context;
- u32 colors[COLOR_COUNT];
- float cursor_blink_time_on, cursor_blink_time_off;
- float hover_time;
- float ctrl_scroll_adjust_text_size;
- u32 max_file_size;
- u32 max_file_size_view_only;
- u16 framerate_cap;
- u16 text_size_no_dpi;
- u16 text_size;
- u16 max_menu_width;
- u16 error_display_time;
- bool auto_indent;
- bool auto_add_newline;
- bool syntax_highlighting;
- bool line_numbers;
- bool auto_reload;
- bool auto_reload_config;
- bool restore_session;
- bool regenerate_tags_if_not_found;
- bool indent_with_spaces;
- bool phantom_completions;
- bool trigger_characters;
- bool identifier_trigger_characters;
- bool signature_help_enabled;
- bool lsp_enabled;
- bool lsp_log;
- bool hover_enabled;
- bool highlight_enabled;
- bool highlight_auto;
- bool document_links;
- bool vsync;
- bool save_backup;
- bool crlf_windows;
- bool jump_to_build_error;
- bool force_monospace;
- KeyCombo hover_key;
- KeyCombo highlight_key;
- u8 tab_width;
- u8 cursor_width;
- u8 undo_save_time;
- u8 border_thickness;
- u8 padding;
- u8 scrolloff;
- u8 tags_max_depth;
- GlRcSAB *bg_shader;
- GlRcTexture *bg_texture;
- /// string used to start comments
- char comment_start[16];
- /// string used to end comments
- char comment_end[16];
- /// Comma-separated list of file names which identify the project root
- char root_identifiers[4096];
- /// LSP server command
- char lsp[512];
- /// LSP "configuration" JSON
- char lsp_configuration[4096];
- /// Build command. If non-empty, this overrides running `cargo build` if `Cargo.toml` exists, etc.
- char build_command[1024];
- /// Default build command for if `Cargo.toml`, `Makefile`, etc. do not exist.
- char build_default_command[1024];
- /// Comma separated list of paths to font files.
- char font[4096];
- /// Comma separated list of paths to bold font files.
- char font_bold[4096];
- LanguageExtension *language_extensions;
- /// dynamic array, sorted by KEY_COMBO(modifier, key)
- KeyAction *key_actions;
-};
-
-/// A single line in a buffer
-typedef struct Line Line;
-
-/// This structure is used temporarily when loading settings
-/// It's needed because we want more specific contexts to be dealt with last.
-typedef struct ConfigPart ConfigPart;
-
-/// A single undoable edit to a buffer
-typedef struct BufferEdit BufferEdit;
-
-struct TextBuffer {
- /// NULL if this buffer is untitled or doesn't correspond to a file (e.g. line buffers)
- char *path;
- /// we keep a back-pointer to the ted instance so we don't have to pass it in to every buffer function
- struct Ted *ted;
- /// number of characters scrolled in the x direction (multiply by space width to get pixels)
- double scroll_x;
- /// number of characters scrolled in the y direction
- double scroll_y;
- /// last write time to \ref path
- double last_write_time;
- /// the language the buffer has been manually set to, or \ref LANG_NONE if it hasn't been set to anything
- i64 manual_language;
- /// position of cursor
- BufferPos cursor_pos;
- /// if \ref selection is true, the text between \ref selection_pos and \ref cursor_pos is selected.
- BufferPos selection_pos;
- /// "previous" position of cursor, for \ref CMD_PREVIOUS_POSITION
- BufferPos prev_cursor_pos;
- /// "line buffers" are buffers which can only have one line of text (used for inputs)
- bool is_line_buffer;
- /// is anything selected?
- bool selection;
- /// set to false to disable undo events
- bool store_undo_events;
- /// This is set to true whenever a change is made to the buffer, and never set to false by buffer_ functions.
- /// (Distinct from \ref buffer_unsaved_changes)
- bool modified;
- /// will the next undo event be chained with the ones after?
- bool will_chain_edits;
- /// will the next undo event be chained with the previous one?
- bool chaining_edits;
- /// view-only mode
- bool view_only;
- /// (line buffers only) set to true when submitted. you have to reset it to false.
- bool line_buffer_submitted;
- /// If set to true, buffer will be scrolled to the cursor position next frame.
- /// This is to fix the problem that \ref x1, \ref y1, \ref x2, \ref y2 are not updated until the buffer is rendered.
- bool center_cursor_next_frame;
- /// x coordinate of left side of buffer
- float x1;
- /// y coordinate of top side of buffer
- float y1;
- /// x coordinate of right side of buffer
- float x2;
- /// y coordinate of bottom side of buffer
- float y2;
- /// number of lines in buffer
- u32 nlines;
- /// capacity of \ref lines
- u32 lines_capacity;
-
- /// cached settings index (into ted->all_settings), or -1 if has not been computed yet
- i32 settings_idx;
-
- /// which LSP this document is open in
- LSPID lsp_opened_in;
- /// determining which LSP to use for a buffer takes some work,
- /// so we don't want to do it every single frame.
- /// this keeps track of the last time we actually checked what the correct LSP is.
- double last_lsp_check;
-
- /// where in the undo history was the last write? used by \ref buffer_unsaved_changes
- u32 undo_history_write_pos;
- /// which lines are on screen? updated when \ref buffer_render is called.
- u32 first_line_on_screen, last_line_on_screen;
-
- /// to cache syntax highlighting properly, it is important to keep track of the
- /// first and last line modified since last frame.
- u32 frame_earliest_line_modified;
- /// see \ref frame_earliest_line_modified.
- u32 frame_latest_line_modified;
-
- /// lines
- Line *lines;
- /// last error
- char error[256];
- /// dynamic array of undo history
- BufferEdit *undo_history;
- /// dynamic array of redo history
- BufferEdit *redo_history;
-};
-
-/// an entry in a selector menu (e.g. the "open" menu)
-typedef struct {
- /// label
- const char *name;
- /// if not NULL, this will show on the right side of the entry.
- const char *detail;
- /// color to draw text in
- u32 color;
- /// use this for whatever you want
- u64 userdata;
-} SelectorEntry;
-
-struct Selector {
- SelectorEntry *entries;
- u32 n_entries;
- Rect bounds;
- /// index where the selector thing is
- u32 cursor;
- float scroll;
- /// whether or not we should let the user select entries using a cursor.
- bool enable_cursor;
-};
-
-/// file entries for file selectors
-typedef struct {
- /// just the file name
- char *name;
- /// full path
- char *path;
- FsType type;
-} FileEntry;
-
-struct FileSelector {
- Selector sel;
- Rect bounds;
- u32 n_entries;
- FileEntry *entries;
- char cwd[TED_PATH_MAX];
- /// indicates that this is for creating files, not opening files
- bool create_menu;
-};
-
-// A node is a collection of tabs OR a split of two node
-struct Node {
- /// dynamic array of indices into ted->buffers, or `NULL` if this is a split
- u16 *tabs;
- /// number from 0 to 1 indicating where the split is.
- float split_pos;
- /// index of active tab in `tabs`.
- u16 active_tab;
- /// is the split vertical? if false, this split looks like a|b
- bool split_vertical;
- /// split left/upper half; index into `ted->nodes`
- u16 split_a;
- /// split right/lower half
- u16 split_b;
-};
-
-/// max number of buffers open at one time
-#define TED_MAX_BUFFERS 256
-/// max number of nodes open at one time
-#define TED_MAX_NODES 256
-/// max tabs per node
-#define TED_MAX_TABS 100
-/// max strings in all config files
-#define TED_MAX_STRINGS 1000
-
-/// "find" menu result
-typedef struct FindResult FindResult;
-
-typedef struct {
- char *path;
- u32 line;
- u32 column;
- /// if this is 1, then column == UTF-32 index.
- /// if this is 4, for example, then column 4 in a line starting with a tab would
- /// be the character right after the tab.
- u8 columns_per_tab;
- /// which line in the build output corresponds to this error
- u32 build_output_line;
-} BuildError;
-
-/// `LSPSymbolKind`s are translated to these. this is a much coarser categorization
-typedef enum {
- SYMBOL_OTHER,
- SYMBOL_FUNCTION,
- SYMBOL_FIELD,
- SYMBOL_TYPE,
- SYMBOL_VARIABLE,
- SYMBOL_CONSTANT,
- SYMBOL_KEYWORD
-} SymbolKind;
-
-/// data needed for autocompletion
-typedef struct Autocomplete Autocomplete;
-
-/// data needed for finding usages
-typedef struct Usages Usages;
-
-/// max number of signatures to display at a time.
-#define SIGNATURE_HELP_MAX 5
-
-/// "signature help" (LSP) is thing that shows the current parameter, etc.
-typedef struct SignatureHelp SignatureHelp;
-
-
-/// "document link" information (LSP)
-typedef struct DocumentLinks DocumentLinks;
-
-/// information for symbol rename (LSP)
-typedef struct RenameSymbol RenameSymbol;
-
-/// "hover" information from LSP server
-typedef struct Hover Hover;
-
-/// symbol information for the definitions menu
-typedef struct {
- char *name;
- char *detail;
- u32 color;
- /// is this from a LSP server (as opposed to ctags)?
- bool from_lsp;
- /// only set if `from_lsp = true`
- LSPDocumentPosition position;
-} SymbolInfo;
-
-typedef struct {
- LSPServerRequestID last_request;
- double last_request_time;
- /// last query string which we sent a request for
- char *last_request_query;
- /// for "go to definition of..." menu
- Selector selector;
- /// an array of all definitions (gotten from workspace/symbols) for "go to definition" menu
- SymbolInfo *all_definitions;
-} Definitions;
-
-/// "highlight" information from LSP server
-typedef struct Highlights Highlights;
-
-typedef struct {
- Command command;
- CommandArgument argument;
-} Action;
-
-typedef struct {
- // dynamic array
- Action *actions;
-} Macro;
-
-typedef struct {
- char *path;
- Font *font;
-} LoadedFont;
-
-typedef struct {
- vec2 pos;
- u8 times;
-} MouseClick;
-
-typedef struct {
- vec2 pos;
-} MouseRelease;
-
-struct Ted {
- /// all running LSP servers
- LSP *lsps[TED_LSP_MAX + 1];
- /// current time (see time_get_seconds), as of the start of this frame
- double frame_time;
-
- Macro macros[TED_MACRO_MAX];
- Macro *recording_macro;
- bool executing_macro;
-
- SDL_Window *window;
- LoadedFont *all_fonts;
- Font *font_bold;
- Font *font;
- TextBuffer *active_buffer;
- /// buffer we are currently drag-to-selecting in, if any
- TextBuffer *drag_buffer;
- /// while a menu or something is open, there is no active buffer. when the menu is closed,
- /// the old active buffer needs to be restored. that's what this stores.
- TextBuffer *prev_active_buffer;
- Node *active_node;
- /// dynamic array of Settings. use Settings.context to figure out which one to use.
- Settings *all_settings;
- /// settings to use when no buffer is open
- Settings *default_settings;
- float window_width, window_height;
- vec2 mouse_pos;
- u32 mouse_state;
- /// `mouse_clicks[SDL_BUTTON_RIGHT]`, for example, is all the right mouse-clicks that have happened this frame
- MouseClick *mouse_clicks[4];
- MouseRelease *mouse_releases[4];
- /// total amount scrolled this frame
- int scroll_total_x, scroll_total_y;
- /// currently open menu, or \ref MENU_NONE if no menu is open.
- Menu menu;
- FileSelector file_selector;
- Selector command_selector;
- /// general-purpose line buffer for inputs -- used for menus
- TextBuffer line_buffer;
- /// use for "find" term in find/find+replace
- TextBuffer find_buffer;
- /// "replace" for find+replace
- TextBuffer replace_buffer;
- /// buffer for build output (view only)
- TextBuffer build_buffer;
- /// used for command selector
- TextBuffer argument_buffer;
- /// time which the cursor error animation started (cursor turns red, e.g. when there's no autocomplete suggestion)
- double cursor_error_time;
- /// should start_cwd be searched for files? set to true if the executable isn't "installed"
- bool search_start_cwd;
- /// CWD `ted` was started in
- char start_cwd[TED_PATH_MAX];
- /// if set to true, the window will close next frame. NOTE: this doesn't check for unsaved changes!!
- bool quit;
- /// is the find or find+replace menu open?
- bool find;
- /// is the find+replace menu open?
- bool replace;
- /// find options
- bool find_regex, find_case_sensitive;
- /// flags used last time search term was compiled
- u32 find_flags;
- struct pcre2_real_code_32 *find_code;
- struct pcre2_real_match_data_32 *find_match_data;
- FindResult *find_results;
- /// invalid regex?
- bool find_invalid_pattern;
- /// if non-zero, the user is trying to execute this command, but there are unsaved changes
- Command warn_unsaved;
- /// are we showing the build output?
- bool build_shown;
- /// is the build process running?
- bool building;
- Autocomplete *autocomplete;
- SignatureHelp *signature_help;
- DocumentLinks *document_links;
- Hover *hover;
- Definitions definitions;
- Highlights *highlights;
- Usages *usages;
- RenameSymbol *rename_symbol;
-
- FILE *log;
-
- /// dynamic array of build errors
- BuildError *build_errors;
- /// build error we are currently "on"
- u32 build_error;
-
- /// used by menus to keep track of the scroll position so we can return to it.
- vec2d prev_active_buffer_scroll;
-
- SDL_Cursor *cursor_arrow, *cursor_ibeam, *cursor_wait,
- *cursor_resize_h, *cursor_resize_v, *cursor_hand, *cursor_move;
- /// which cursor to use this frame
- /// this should be set to one of the cursor_* members above, or NULL for no cursor
- SDL_Cursor *cursor;
-
- /// node containing tab user is dragging around, NULL if user is not dragging a tab
- Node *dragging_tab_node;
- /// index in dragging_tab_node->tabs
- u16 dragging_tab_idx;
- /// where the tab is being dragged from (i.e. mouse pos at start of drag action)
- vec2 dragging_tab_origin;
-
- /// if not `NULL`, points to the node whose split the user is currently resizing.
- Node *resizing_split;
-
- /// dynamic array of history of commands run with :shell (UTF-8)
- char **shell_history;
- /// for keeping track of where we are in the shell history.
- u32 shell_history_pos;
-
- // points to a selector if any is open, otherwise NULL.
- Selector *selector_open;
-
- /// what % of the screen the build output takes up
- float build_output_height;
- bool resizing_build_output;
-
- /// last time a save command was executed. used for bg-shaders.
- double last_save_time;
-
- Process *build_process;
- /// When we read the stdout from the build process, the tail end of the read could be an
- /// incomplete UTF-8 code point. This is where we store that "tail end" until more
- /// data is available. (This is up to 3 bytes, null terminated)
- char build_incomplete_codepoint[4];
- /// allows execution of multiple commands -- needed for tags generation
- char **build_queue;
- /// comma-separated list of files with unsaved changes (only applicable if warn_unsaved != 0)
- char warn_unsaved_names[TED_PATH_MAX];
- /// file name user is trying to overwrite
- char warn_overwrite[TED_PATH_MAX];
- /// file name which we want to reload
- char ask_reload[TED_PATH_MAX];
- char local_data_dir[TED_PATH_MAX];
- char global_data_dir[TED_PATH_MAX];
- /// home directory
- char home[TED_PATH_MAX];
- /// current working directory
- char cwd[TED_PATH_MAX];
- /// directory where we run the build command
- char build_dir[TED_PATH_MAX];
- /// where we are reading tags from
- char tags_dir[TED_PATH_MAX];
- bool nodes_used[TED_MAX_NODES];
- /// `nodes[0]` is always the "root node", if any buffers are open.
- Node nodes[TED_MAX_NODES];
- /// NOTE: the buffer at index 0 is reserved as a "null buffer" and should not be used.
- bool buffers_used[TED_MAX_BUFFERS];
- TextBuffer buffers[TED_MAX_BUFFERS];
- /// number of config file strings
- u32 nstrings;
- /// config file strings
- char *strings[TED_MAX_STRINGS];
- char window_title[256];
-
- /// little box used to display errors and info.
- char message[512];
- /// time message box was opened
- double message_time;
- MessageType message_type;
- MessageType message_shown_type;
- char message_shown[512];
-};
-
-#endif // !TED_PLUGIN
-
// === buffer.c ===
/// Returns `true` if the buffer is in view-only mode.
bool buffer_is_view_only(TextBuffer *buffer);
@@ -903,7 +320,7 @@ bool buffer_clip_rect(TextBuffer *buffer, Rect *r);
/// Get the font used for this buffer.
Font *buffer_font(TextBuffer *buffer);
/// get LSP server which deals with this buffer
-LSP *buffer_lsp(TextBuffer *buffer);
+struct LSP *buffer_lsp(TextBuffer *buffer);
/// Get the settings used for this buffer.
Settings *buffer_settings(TextBuffer *buffer);
/// Get tab width for this buffer
@@ -1043,19 +460,6 @@ void buffer_cursor_move_to_end_of_line(TextBuffer *buffer);
void buffer_cursor_move_to_start_of_file(TextBuffer *buffer);
/// Move cursor to the end of the file, like Ctrl+End does.
void buffer_cursor_move_to_end_of_file(TextBuffer *buffer);
-/// Get the LSPDocumentID corresponding to the file this buffer contains.
-/// The return value is only useful if `buffer_lsp(buffer) != NULL`.
-LSPDocumentID buffer_lsp_document_id(TextBuffer *buffer);
-/// Get LSPPosition corresponding to position in buffer.
-LSPPosition buffer_pos_to_lsp_position(TextBuffer *buffer, BufferPos pos);
-/// Get LSPDocumentPosition corresponding to position in buffer.
-LSPDocumentPosition buffer_pos_to_lsp_document_position(TextBuffer *buffer, BufferPos pos);
-/// Convert LSPPosition to BufferPos.
-BufferPos buffer_pos_from_lsp(TextBuffer *buffer, LSPPosition lsp_pos);
-/// Get the cursor position as an LSPPosition.
-LSPPosition buffer_cursor_pos_as_lsp_position(TextBuffer *buffer);
-/// Get the cursor position as an LSPDocumentPosition.
-LSPDocumentPosition buffer_cursor_pos_as_lsp_document_position(TextBuffer *buffer);
/// Put text at a position. All text insertion should eventually go through this function.
BufferPos buffer_insert_text_at_pos(TextBuffer *buffer, BufferPos pos, String32 str);
/// Insert a single character at a position.
@@ -1204,10 +608,6 @@ void buffer_uncomment_lines(TextBuffer *buffer, u32 first_line, u32 last_line);
void buffer_toggle_comment_lines(TextBuffer *buffer, u32 first_line, u32 last_line);
/// comment the selected lines, or uncomment them if they're all commented
void buffer_toggle_comment_selection(TextBuffer *buffer);
-/// highlight an \ref LSPRange in this buffer.
-///
-/// make sure to call \ref gl_geometry_draw after this
-void buffer_highlight_lsp_range(TextBuffer *buffer, LSPRange range, ColorSetting color);
/// returns true if `p1` and `p2` are equal
bool buffer_pos_eq(BufferPos p1, BufferPos p2);
/// returns `-1` if `p1` comes before `p2`
@@ -1247,12 +647,6 @@ void build_check_for_errors(Ted *ted);
void build_frame(Ted *ted, float x1, float y1, float x2, float y2);
// === colors.c ===
-#if !TED_PLUGIN
-void color_init(void);
-/// which color setting should be used for the given symbol kind.
-/// this is the color used in the autocomplete selector, for example.
-ColorSetting color_for_symbol_kind(SymbolKind kind);
-#endif
ColorSetting color_setting_from_str(const char *str);
const char *color_setting_to_str(ColorSetting s);
Status color_from_str(const char *str, u32 *color);
@@ -1262,41 +656,12 @@ u32 color_blend(u32 bg, u32 fg);
u32 color_apply_opacity(u32 color, float opacity);
// === command.c ===
-#if !TED_PLUGIN
-void command_init(void);
-void command_execute_ex(Ted *ted, Command c, const CommandArgument *argument, const CommandContext *context);
-#endif
Command command_from_str(const char *str);
const char *command_to_str(Command c);
void command_execute(Ted *ted, Command c, i64 argument);
void command_execute_string_argument(Ted *ted, Command c, const char *string);
// === config.c ===
-#if !TED_PLUGIN
-/// first, we read all config files, then we parse them.
-/// this is because we want less specific settings (e.g. settings applied
-/// to all languages instead of one particular language) to be applied first,
-/// then more specific settings are based off of those.
-///
-/// EXAMPLE:
-/// ```
-/// ---config file 1---
-/// [Javascript.core]
-/// syntax-highlighting = off
-/// (inherits tab-width = 4)
-/// [CSS.core]
-/// tab-width = 2 (overrides tab-width = 4)
-/// ---config file 2---
-/// [core]
-/// tab-width = 4
-/// ```
-void config_read(Ted *ted, ConfigPart **pparts, const char *filename);
-void config_parse(Ted *ted, ConfigPart **pparts);
-void config_free(Ted *ted);
-/// how well does this settings context fit the given path and language?
-/// the context with the highest score will be chosen.
-long context_score(const char *path, Language lang, const SettingsContext *context);
-#endif // !TED_PLUGIN
/// returns the best guess for the root directory of the project containing `path`
/// (which should be an absolute path).
/// the return value should be freed.
@@ -1325,100 +690,16 @@ void find_open(Ted *ted, bool replace);
void find_close(Ted *ted);
// === gl.c ===
-/// set by main()
-extern float gl_window_width, gl_window_height;
-/// set by main()
-extern int gl_version_major, gl_version_minor;
-
-/// macro trickery to avoid having to write every GL function multiple times
-#define gl_for_each_proc(do)\
- do(DRAWARRAYS, DrawArrays)\
- do(GENTEXTURES, GenTextures)\
- do(DELETETEXTURES, DeleteTextures)\
- do(GENERATEMIPMAP, GenerateMipmap)\
- do(TEXIMAGE2D, TexImage2D)\
- do(BINDTEXTURE, BindTexture)\
- do(TEXPARAMETERI, TexParameteri)\
- do(GETERROR, GetError)\
- do(GETINTEGERV, GetIntegerv)\
- do(ENABLE, Enable)\
- do(DISABLE, Disable)\
- do(BLENDFUNC, BlendFunc)\
- do(VIEWPORT, Viewport)\
- do(CLEARCOLOR, ClearColor)\
- do(CLEAR, Clear)\
- do(FINISH, Finish)\
- do(CREATESHADER, CreateShader)\
- do(DELETESHADER, DeleteShader)\
- do(CREATEPROGRAM, CreateProgram)\
- do(SHADERSOURCE, ShaderSource)\
- do(GETSHADERIV, GetShaderiv)\
- do(GETSHADERINFOLOG, GetShaderInfoLog)\
- do(COMPILESHADER, CompileShader)\
- do(CREATEPROGRAM, CreateProgram)\
- do(DELETEPROGRAM, DeleteProgram)\
- do(ATTACHSHADER, AttachShader)\
- do(LINKPROGRAM, LinkProgram)\
- do(GETPROGRAMIV, GetProgramiv)\
- do(GETPROGRAMINFOLOG, GetProgramInfoLog)\
- do(USEPROGRAM, UseProgram)\
- do(GETATTRIBLOCATION, GetAttribLocation)\
- do(GETUNIFORMLOCATION, GetUniformLocation)\
- do(GENBUFFERS, GenBuffers)\
- do(DELETEBUFFERS, DeleteBuffers)\
- do(BINDBUFFER, BindBuffer)\
- do(BUFFERDATA, BufferData)\
- do(VERTEXATTRIBPOINTER, VertexAttribPointer)\
- do(ENABLEVERTEXATTRIBARRAY, EnableVertexAttribArray)\
- do(DISABLEVERTEXATTRIBARRAY, DisableVertexAttribArray)\
- do(GENVERTEXARRAYS, GenVertexArrays)\
- do(DELETEVERTEXARRAYS, DeleteVertexArrays)\
- do(BINDVERTEXARRAY, BindVertexArray)\
- do(ACTIVETEXTURE, ActiveTexture)\
- do(UNIFORM1F, Uniform1f)\
- do(UNIFORM2F, Uniform2f)\
- do(UNIFORM3F, Uniform3f)\
- do(UNIFORM4F, Uniform4f)\
- do(UNIFORM1I, Uniform1i)\
- do(UNIFORM2I, Uniform2i)\
- do(UNIFORM3I, Uniform3i)\
- do(UNIFORM4I, Uniform4i)\
- do(UNIFORMMATRIX4FV, UniformMatrix4fv)\
- do(DEBUGMESSAGECALLBACK, DebugMessageCallback)\
- do(DEBUGMESSAGECONTROL, DebugMessageControl)\
-
-#define gl_declare_proc(upper, lower) extern PFNGL##upper##PROC gl##lower;
-gl_for_each_proc(gl_declare_proc)
-#undef gl_declare_proc
-
-#if !TED_PLUGIN
-/// get addresses of GL functions
-void gl_get_procs(void);
-/// create a new reference-counted shader-array-buffer object.
-GlRcSAB *gl_rc_sab_new(GLuint shader, GLuint array, GLuint buffer);
-/// increase reference count on `s`.
-void gl_rc_sab_incref(GlRcSAB *s);
-/// decrease reference count on `*ps`, and set `*ps` to NULL if the reference count is 0.
-void gl_rc_sab_decref(GlRcSAB **ps);
-/// create a new reference-counted texture.
-GlRcTexture *gl_rc_texture_new(GLuint texture);
-/// increase reference count on `t`.
-void gl_rc_texture_incref(GlRcTexture *t);
-/// decrease reference count on `*t`, and set `*t` to NULL if the reference count is 0.
-void gl_rc_texture_decref(GlRcTexture **pt);
-/// initialize geometry stuff
-void gl_geometry_init(void);
-#endif // !TED_PLUGIN
/// create and compile a shader
-GLuint gl_compile_shader(char error_buf[256], const char *code, GLenum shader_type);
+u32 gl_compile_shader(char error_buf[256], const char *code, u32 shader_type);
/// create new shader program from shaders
-GLuint gl_link_program(char error_buf[256], GLuint *shaders, size_t count);
+u32 gl_link_program(char error_buf[256], u32 *shaders, size_t count);
/// create a shader program from vertex shader and fragment shader source
-GLuint gl_compile_and_link_shaders(char error_buf[256], const char *vshader_code, const char *fshader_code);
+u32 gl_compile_and_link_shaders(char error_buf[256], const char *vshader_code, const char *fshader_code);
/// prints a debug message if `attrib` is not found
-GLuint gl_attrib_location(GLuint program, const char *attrib);
+u32 gl_attrib_location(u32 program, const char *attrib);
/// prints a debug message if `uniform` is not found
-GLint gl_uniform_location(GLuint program, const char *uniform);
+i32 gl_uniform_location(u32 program, const char *uniform);
/// queue a filled rectangle with the given color.
void gl_geometry_rect(Rect r, u32 color_rgba);
/// queue the border of a rectangle with the given color.
@@ -1426,14 +707,9 @@ void gl_geometry_rect_border(Rect r, float border_thickness, u32 color);
/// draw all queued geometry
void gl_geometry_draw(void);
/// create an OpenGL texture object from an image file.
-GLuint gl_load_texture_from_image(const char *path);
+u32 gl_load_texture_from_image(const char *path);
// === ide-autocomplete.c ===
-#if !TED_PLUGIN
-void autocomplete_init(Ted *ted);
-void autocomplete_quit(Ted *ted);
-void autocomplete_process_lsp_response(Ted *ted, const LSPResponse *response);
-#endif
/// is the autocomplete box open?
bool autocomplete_is_open(Ted *ted);
/// is there a phantom completion being displayed?
@@ -1457,14 +733,8 @@ void autocomplete_close(Ted *ted);
void autocomplete_frame(Ted *ted);
// === ide-definitions.c ===
-/// go to the definition of `name`.
-/// if `lsp` is NULL, tags will be used.
-/// Note: the document position is required for LSP requests because of overloading (where the name
-/// alone isn't sufficient)
-void definition_goto(Ted *ted, LSP *lsp, const char *name, LSPDocumentPosition pos, GotoType type);
/// cancel the last go-to-definition / find symbols request.
void definition_cancel_lookup(Ted *ted);
-void definitions_process_lsp_response(Ted *ted, LSP *lsp, const LSPResponse *response);
/// open the definitions menu
void definitions_selector_open(Ted *ted);
/// update the definitions menu
@@ -1475,12 +745,6 @@ void definitions_selector_close(Ted *ted);
void definitions_frame(Ted *ted);
// === ide-document-link.c ===
-#if !TED_PLUGIN
-void document_link_init(Ted *ted);
-void document_link_quit(Ted *ted);
-void document_link_frame(Ted *ted);
-void document_link_process_lsp_response(Ted *ted, const LSPResponse *response);
-#endif
/// get document link at this position in the active buffer.
///
/// the returned pointer won't be freed immediately, but could be on the next frame,
@@ -1489,44 +753,20 @@ const char *document_link_at_buffer_pos(Ted *ted, BufferPos pos);
void document_link_clear(Ted *ted);
// === ide-highlights.c ===
-#if !TED_PLUGIN
-void highlights_init(Ted *ted);
-void highlights_quit(Ted *ted);
-void highlights_frame(Ted *ted);
-void highlights_process_lsp_response(Ted *ted, const LSPResponse *response);
-#endif
void highlights_close(Ted *ted);
// === ide-hover.c ===
-#if !TED_PLUGIN
-void hover_init(Ted *ted);
-void hover_frame(Ted *ted, double dt);
-void hover_quit(Ted *ted);
-#endif
/// called for example whenever the mouse moves to reset the timer before hover info is displayed
void hover_reset_timer(Ted *ted);
void hover_close(Ted *ted);
-void hover_process_lsp_response(Ted *ted, const LSPResponse *response);
// === ide-rename-symbol.c ===
-#if !TED_PLUGIN
-void rename_symbol_init(Ted *ted);
-void rename_symbol_quit(Ted *ted);
-void rename_symbol_frame(Ted *ted);
-void rename_symbol_process_lsp_response(Ted *ted, const LSPResponse *response);
-#endif
void rename_symbol_at_cursor(Ted *ted, TextBuffer *buffer, const char *new_name);
/// returns true if we are currently waiting for the LSP to send us a response
bool rename_symbol_is_loading(Ted *ted);
void rename_symbol_clear(Ted *ted);
// === ide-signature-help.c ===
-#if !TED_PLUGIN
-void signature_help_init(Ted *ted);
-void signature_help_quit(Ted *ted);
-void signature_help_frame(Ted *ted);
-void signature_help_process_lsp_response(Ted *ted, const LSPResponse *response);
-#endif
/// figure out new signature help
void signature_help_retrigger(Ted *ted);
/// open signature help. `trigger` should either be the trigger character (e.g. ',')
@@ -1536,21 +776,12 @@ bool signature_help_is_open(Ted *ted);
void signature_help_close(Ted *ted);
// === ide-usages.c ===
-#if !TED_PLUGIN
-void usages_init(Ted *ted);
-void usages_process_lsp_response(Ted *ted, const LSPResponse *response);
-void usages_frame(Ted *ted);
-void usages_quit(Ted *ted);
-#endif
/// cancel the last "find usages" request
void usages_cancel_lookup(Ted *ted);
/// find usages for word under the cursor in the active buffer.
void usages_find(Ted *ted);
// === macro.c ===
-#if !TED_PLUGIN
-void macro_add(Ted *ted, Command command, const CommandArgument *argument);
-#endif
void macro_start_recording(Ted *ted, u32 index);
void macro_stop_recording(Ted *ted);
void macro_execute(Ted *ted, u32 index);
@@ -1644,10 +875,6 @@ void tags_generate(Ted *ted, bool run_in_build_window);
size_t tags_beginning_with(Ted *ted, const char *prefix, char **out, size_t out_size, bool error_if_tags_does_not_exist);
/// go to the definition of the given tag
bool tag_goto(Ted *ted, const char *tag);
-#if !TED_PLUGIN
-/// get all tags in the tags file as SymbolInfos.
-SymbolInfo *tags_get_symbols(Ted *ted);
-#endif
// === ted.c ===
/// for fatal errors
@@ -1656,8 +883,8 @@ void die(PRINTF_FORMAT_STRING const char *fmt, ...) ATTRIBUTE_PRINTF(1, 2);
TextBuffer *ted_get_active_buffer(Ted *ted);
/// set title of ted window
void ted_set_window_title(Ted *ted, const char *title);
-/// returns `true` if the given key is down
-bool ted_is_key_down(Ted *ted, SDL_Keycode key);
+/// returns `true` if the given SDL key code is down
+bool ted_is_key_down(Ted *ted, i32 key);
/// returns `true` if the given \ref KeyCombo is down
bool ted_is_key_combo_down(Ted *ted, KeyCombo key_combo);
/// returns `true` if either ctrl key is down
@@ -1721,17 +948,15 @@ char *ted_get_root_dir(Ted *ted);
Settings *ted_active_settings(Ted *ted);
/// Get the settings for a file at the given path in the given language.
Settings *ted_get_settings(Ted *ted, const char *path, Language language);
-/// Get LSP by ID. Returns NULL if there is no LSP with that ID.
-LSP *ted_get_lsp_by_id(Ted *ted, LSPID id);
/// Get LSP which should be used for the given path and language.
/// If no running LSP server would cover the path and language, a new one is
/// started if possible.
/// Returns NULL on failure (e.g. there is no LSP server
/// specified for the given path and language).
-LSP *ted_get_lsp(Ted *ted, const char *path, Language language);
+struct LSP *ted_get_lsp(Ted *ted, const char *path, Language language);
/// Get the LSP of the active buffer/ted->cwd.
/// Returns NULL if there is no such server.
-LSP *ted_active_lsp(Ted *ted);
+struct LSP *ted_active_lsp(Ted *ted);
/// get the value of the given color setting, according to `ted_active_settings(ted)`.
u32 ted_active_color(Ted *ted, ColorSetting color);
/// open the given file, or switch to it if it's already open.
@@ -1758,26 +983,16 @@ void ted_node_switch(Ted *ted, Node *node);
/// load ted.cfg files
void ted_load_configs(Ted *ted, bool reloading);
/// handle a key press
-void ted_press_key(Ted *ted, SDL_Keycode keycode, SDL_Keymod modifier);
+void ted_press_key(Ted *ted, i32 keycode, u32 modifier);
/// get the buffer and buffer position where the mouse is.
/// returns false if the mouse is not in a buffer.
Status ted_get_mouse_buffer_pos(Ted *ted, TextBuffer **pbuffer, BufferPos *ppos);
/// make the cursor red for a bit to indicate an error (e.g. no autocompletions)
void ted_flash_error_cursor(Ted *ted);
-/// go to `path` at line `line` and index `index`, opening a new buffer if necessary.
-/// if `is_lsp` is set to true, `index` is interpreted as a UTF-16 offset rather than a UTF-32 offset.
-void ted_go_to_position(Ted *ted, const char *path, u32 line, u32 index, bool is_lsp);
-/// go to this LSP document position, opening a new buffer containing the file if necessary.
-void ted_go_to_lsp_document_position(Ted *ted, LSP *lsp, LSPDocumentPosition position);
-/// cancel this LSP request. also zeroes *request
-/// if *request is zeroed, this does nothing.
-void ted_cancel_lsp_request(Ted *ted, LSPServerRequestID *request);
/// how tall is a line buffer?
float ted_line_buffer_height(Ted *ted);
/// check for orphaned nodes and node cycles
void ted_check_for_node_problems(Ted *ted);
-/// convert LSPWindowMessageType to MessageType
-MessageType ted_message_type_from_lsp(LSPWindowMessageType type);
/// get colors to use for message box
void ted_color_settings_for_message_type(MessageType type, ColorSetting *bg_color, ColorSetting *border_color);