// Copyright 2009 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Package gui defines a basic graphical user interface programming model.
package gui

import (
	"image"
	"image/draw"
	"os"
)

// A Window represents a single graphics window.
type Window interface {
	// Screen returns an editable Image for the window.
	Screen() draw.Image
	// FlushImage flushes changes made to Screen() back to screen.
	FlushImage()
	// EventChan returns a channel carrying UI events such as key presses,
	// mouse movements and window resizes.
	EventChan() <-chan interface{}
	// Close closes the window.
	Close() os.Error
}

// A KeyEvent is sent for a key press or release.
type KeyEvent struct {
	// The value k represents key k being pressed.
	// The value -k represents key k being released.
	// The specific set of key values is not specified,
	// but ordinary characters represent themselves.
	Key int
}

// A MouseEvent is sent for a button press or release or for a mouse movement.
type MouseEvent struct {
	// Buttons is a bit mask of buttons: 1<<0 is left, 1<<1 middle, 1<<2 right.
	// It represents button state and not necessarily the state delta: bit 0
	// being on means that the left mouse button is down, but does not imply
	// that the same button was up in the previous MouseEvent.
	Buttons int
	// Loc is the location of the cursor.
	Loc image.Point
	// Nsec is the event's timestamp.
	Nsec int64
}

// A ConfigEvent is sent each time the window's color model or size changes.
// The client should respond by calling Window.Screen to obtain a new image.
type ConfigEvent struct {
	Config image.Config
}

// An ErrEvent is sent when an error occurs.
type ErrEvent struct {
	Err os.Error
}
