# Automatically generated by make_symbols; DO NOT EDIT!! 
#
# Perl definitions for header file wincon.h
#


package wincon;

use strict;

use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);

require Exporter;

@ISA = qw(Exporter);
@EXPORT = qw(
    BACKGROUND_BLUE
    BACKGROUND_GREEN
    BACKGROUND_INTENSITY
    BACKGROUND_RED
    CAPSLOCK_ON
    CONSOLE_TEXTMODE_BUFFER
    CTRL_BREAK_EVENT
    CTRL_CLOSE_EVENT
    CTRL_C_EVENT
    CTRL_LOGOFF_EVENT
    CTRL_SHUTDOWN_EVENT
    DOUBLE_CLICK
    ENABLE_ECHO_INPUT
    ENABLE_LINE_INPUT
    ENABLE_MOUSE_INPUT
    ENABLE_PROCESSED_INPUT
    ENABLE_PROCESSED_OUTPUT
    ENABLE_WINDOW_INPUT
    ENABLE_WRAP_AT_EOL_OUTPUT
    ENHANCED_KEY
    FOCUS_EVENT
    FOREGROUND_BLUE
    FOREGROUND_GREEN
    FOREGROUND_INTENSITY
    FOREGROUND_RED
    FROM_LEFT_1ST_BUTTON_PRESSED
    FROM_LEFT_2ND_BUTTON_PRESSED
    FROM_LEFT_3RD_BUTTON_PRESSED
    FROM_LEFT_4TH_BUTTON_PRESSED
    KEY_EVENT
    LEFT_ALT_PRESSED
    LEFT_CTRL_PRESSED
    MENU_EVENT
    MOUSE_EVENT
    MOUSE_MOVED
    MOUSE_WHEELED
    NUMLOCK_ON
    RIGHTMOST_BUTTON_PRESSED
    RIGHT_ALT_PRESSED
    RIGHT_CTRL_PRESSED
    SCROLLLOCK_ON
    SHIFT_PRESSED
    WINDOW_BUFFER_SIZE_EVENT
    WINE_ENABLE_LINE_INPUT_EMACS
);
@EXPORT_OK = qw();

use constant BACKGROUND_BLUE => 16;
use constant BACKGROUND_GREEN => 32;
use constant BACKGROUND_INTENSITY => 128;
use constant BACKGROUND_RED => 64;
use constant CAPSLOCK_ON => 128;
use constant CONSOLE_TEXTMODE_BUFFER => 1;
use constant CTRL_BREAK_EVENT => 1;
use constant CTRL_CLOSE_EVENT => 2;
use constant CTRL_C_EVENT => 0;
use constant CTRL_LOGOFF_EVENT => 5;
use constant CTRL_SHUTDOWN_EVENT => 6;
use constant DOUBLE_CLICK => 2;
use constant ENABLE_ECHO_INPUT => 4;
use constant ENABLE_LINE_INPUT => 2;
use constant ENABLE_MOUSE_INPUT => 16;
use constant ENABLE_PROCESSED_INPUT => 1;
use constant ENABLE_PROCESSED_OUTPUT => 1;
use constant ENABLE_WINDOW_INPUT => 8;
use constant ENABLE_WRAP_AT_EOL_OUTPUT => 2;
use constant ENHANCED_KEY => 256;
use constant FOCUS_EVENT => 16;
use constant FOREGROUND_BLUE => 1;
use constant FOREGROUND_GREEN => 2;
use constant FOREGROUND_INTENSITY => 8;
use constant FOREGROUND_RED => 4;
use constant FROM_LEFT_1ST_BUTTON_PRESSED => 1;
use constant FROM_LEFT_2ND_BUTTON_PRESSED => 4;
use constant FROM_LEFT_3RD_BUTTON_PRESSED => 8;
use constant FROM_LEFT_4TH_BUTTON_PRESSED => 16;
use constant KEY_EVENT => 1;
use constant LEFT_ALT_PRESSED => 2;
use constant LEFT_CTRL_PRESSED => 8;
use constant MENU_EVENT => 8;
use constant MOUSE_EVENT => 2;
use constant MOUSE_MOVED => 1;
use constant MOUSE_WHEELED => 4;
use constant NUMLOCK_ON => 32;
use constant RIGHTMOST_BUTTON_PRESSED => 2;
use constant RIGHT_ALT_PRESSED => 1;
use constant RIGHT_CTRL_PRESSED => 4;
use constant SCROLLLOCK_ON => 64;
use constant SHIFT_PRESSED => 16;
use constant WINDOW_BUFFER_SIZE_EVENT => 4;
use constant WINE_ENABLE_LINE_INPUT_EMACS => 128;

1;
