// File: utkukaratas[P]xkeylayers/xkeylayers.cpp
// Function: handle_modifier(TModifierKey*, bool, int)
void handle_modifier(TModifierKey* mod, bool mouse_pressed, int key_event)
{
    if (key_event == KeyPress)
    {
        debug("Key pressed!\n");
        mod->is_down = True;

        if (app.timeout_valid)
            gettimeofday(&mod->down_at, NULL);

        if (mouse_pressed)
        {
            mod->used = True;
        }

        // testing heuristic 1
        if (heuristic_test1(mod)) {
            // if heuristic func returns true this means user probably wants
            // the key itself (space) not the modifier.
            app.trigger_key(mod);
            mod->used = true;
        }
    }
    else
    {
        debug("Key released!\n");
        if (!mod->used)
        {
            timeval down_time = app.timeout;
            if (app.timeout_valid)
            {
                gettimeofday(&down_time, NULL);
                timersub(&down_time, &mod->down_at, &down_time);
            }

            if (!app.timeout_valid ||
                timercmp(&down_time, &app.timeout, <))
            {
                // so a modifier key was pressed shortly.
                // generate fake keys (actually... press and release events).
                app.trigger_key(mod);
            }
        }
        mod->used = False;
        mod->is_down = False;
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x20, %rsp
movb %sil, %al
movq %rdi, -0x8(%rbp)
andb $0x1, %al
movb %al, -0x9(%rbp)
movl %edx, -0x10(%rbp)
cmpl $0x2, -0x10(%rbp)
jne 0x2e07
leaq 0x43c8(%rip), %rdi      # 0x716c
movb $0x0, %al
callq 0x26d0
movq -0x8(%rbp), %rax
movb $0x1, 0x29(%rax)
testb $0x1, 0x8546(%rip)      # 0xb300
je 0x2dcd
movq -0x8(%rbp), %rdi
addq $0x30, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x22e0
testb $0x1, -0x9(%rbp)
je 0x2ddb
movq -0x8(%rbp), %rax
movb $0x1, 0x28(%rax)
movq -0x8(%rbp), %rdi
callq 0x2f80
testb $0x1, %al
jne 0x2dea
jmp 0x2e02
movq -0x8(%rbp), %rsi
leaq 0x841b(%rip), %rdi      # 0xb210
callq 0x2780
movq -0x8(%rbp), %rax
movb $0x1, 0x28(%rax)
jmp 0x2ee8
leaq 0x436c(%rip), %rdi      # 0x717a
movb $0x0, %al
callq 0x26d0
movq -0x8(%rbp), %rax
testb $0x1, 0x28(%rax)
jne 0x2ed8
movq 0x84c6(%rip), %rax      # 0xb2f0
movq %rax, -0x20(%rbp)
movq 0x84c3(%rip), %rax      # 0xb2f8
movq %rax, -0x18(%rbp)
testb $0x1, 0x84c0(%rip)      # 0xb300
je 0x2e94
leaq -0x20(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x22e0
movq -0x20(%rbp), %rax
movq -0x8(%rbp), %rcx
subq 0x30(%rcx), %rax
movq %rax, -0x20(%rbp)
movq -0x18(%rbp), %rax
movq -0x8(%rbp), %rcx
subq 0x38(%rcx), %rax
movq %rax, -0x18(%rbp)
cmpq $0x0, -0x18(%rbp)
jge 0x2e90
movq -0x20(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x20(%rbp)
movq -0x18(%rbp), %rax
addq $0xf4240, %rax          # imm = 0xF4240
movq %rax, -0x18(%rbp)
jmp 0x2e92
jmp 0x2e94
testb $0x1, 0x8465(%rip)      # 0xb300
je 0x2ec6
movq -0x20(%rbp), %rax
cmpq 0x8448(%rip), %rax      # 0xb2f0
jne 0x2eb9
movq -0x18(%rbp), %rax
cmpq 0x8443(%rip), %rax      # 0xb2f8
jl 0x2ec6
jmp 0x2ed6
movq -0x20(%rbp), %rax
cmpq 0x842c(%rip), %rax      # 0xb2f0
jge 0x2ed6
movq -0x8(%rbp), %rsi
leaq 0x833f(%rip), %rdi      # 0xb210
callq 0x2780
jmp 0x2ed8
movq -0x8(%rbp), %rax
movb $0x0, 0x28(%rax)
movq -0x8(%rbp), %rax
movb $0x0, 0x29(%rax)
addq $0x20, %rsp
popq %rbp
retq
nop