---
title: Code Overview
description: Code overview of CProof
sidebar:
  order: 2
---

This page gives an overview of the code base, the various modules and their responsibilities.

It was originally written in 2015 and might not be up to date, but can help you navigate the CProof codebase nevertheless.

## The main loop

```plaintext
profanity
```

The _main()_ function is called in:

```plaintext
src/main.c
```

At the end of _main()_, a call is made to _prof_run()_ which can be found in:

```plaintext
src/profanity.c
```

At time of writing, this function is as follows:

```c
void
prof_run(const int disable_tls, char *log_level, char *account_name)
{
    _init(disable_tls, log_level);
    _connect_default(account_name);
    ui_update();

    log_info("Starting main event loop");

    char *line = NULL;
    while(cont) {
        log_stderr_handler();
        _check_autoaway();

        line = ui_readline();
        if (line) {
            ProfWin *window = wins_get_current();
            cont = cmd_process_input(window, line);
            free(line);
            line = NULL;
        } else {
            cont = TRUE;
        }

#ifdef HAVE_LIBOTR
        otr_poll();
#endif
        notify_remind();
        jabber_process_events(10);
        ui_update();
    }
}
```

The important sequence of events in the main loop are:

- Check if the user entered a line (ui_readline() at src/ui/core.c).
- If they did, attempt to process the input (cmd_process_input() at src/command.c).
- Check for and handle any incoming XMPP events (jabber_process_events() at src/xmpp/connection.c).
- Refresh the UI (ui_update() at src/ui/core.c).
- Loop

## Modules

### Commands

All code related to running user entered commands, for example _/who_.

Location: `src/command`

`src/command/cmd_defs.c` - Command definitions  
`src/command/cmd_ac.c` - Command autocompletion rules  
`src/command/cmd_funcs.c` - Command implementation functions

### Configuration

Code related to looking up and storing information in configuration files.

Location: `src/config`

`src/config/account.c` - Data structure representing an account  
`src/config/accounts.c` - Access to the accounts config file  
`src/config/preferences.c` - Access to the profrc config file  
`src/config/theme.c` - Access to themes

### Events

Work in progress. The intention is to move all events that could involve a plugin hook into this directory. Currently only a small number of functions have been moved here.

Location: `src/event`

`src/event/client_events.c` - Events initiated by CProof, e.g. connecting, or sending a message  
`src/event/server_events.c` - Events received from the XMPP server, e.g. an incoming message  
`src/event/common.c` - Common functions used in both client and server events

### Off The Record Encryption

Code to deal with OTR encryption using the libotr library. Hides the different library version APIs from the core CProof code.

Location: `src/otr`

### OpenPGP Encryption

Code to handle PGP encryption.

Location: `src/pgp`

### OMEMO Encryption

Code to handle OMEMO encryption.

Location: `src/omemo`

### Common Tools

Basic utility functions and common code such as autocomplete implementation.

Location: `src/tools`

### User Interface

All User Interface code, input handling, window rendering etc.

Location: `src/ui`

`src/ui/buffer.c` - Buffer of all output, used for redrawing the UI on resize  
`src/ui/console.c` - Display functions for the console window  
`src/ui/core.c` - Display functions for most other operations involving the main window area  
`src/ui/inputwin.c` - Functions to handle the input window (where the user types)  
`src/ui/notifier.c` - Desktop notification functions  
`src/ui/occupantswin.c` - Functions for rendering the Occupants panel in chat rooms  
`src/ui/rosterwin.c` - Functions for rendering the Roster panel in the console window  
`src/ui/statusbar.c` - Drawing the status bar (above the input line)  
`src/ui/titlebar.c` - Drawing the title bar (the top line)  
`src/ui/window.c` - Data structures representing different window types and functions to manipulate them
