aboutsummaryrefslogtreecommitdiffstats
path: root/channels/console_gui.c
diff options
context:
space:
mode:
authorrizzo <rizzo@f38db490-d61c-443f-a65b-d21fe96a405b>2008-01-07 15:06:54 +0000
committerrizzo <rizzo@f38db490-d61c-443f-a65b-d21fe96a405b>2008-01-07 15:06:54 +0000
commit74ec4f4279138f5806df6fdb3cc2d58cd7e1560c (patch)
treed9587365c3d6707112a9beca1b223056546a4bd5 /channels/console_gui.c
parentfc37acff50345072d23e7d003285e56acf4d8367 (diff)
update comments to reflect reality (or at least planned behaviour).
minor code cleanups git-svn-id: http://svn.digium.com/svn/asterisk/trunk@96836 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/console_gui.c')
-rw-r--r--channels/console_gui.c165
1 files changed, 84 insertions, 81 deletions
diff --git a/channels/console_gui.c b/channels/console_gui.c
index c9cfa6ed0..3785339ec 100644
--- a/channels/console_gui.c
+++ b/channels/console_gui.c
@@ -4,6 +4,37 @@
* $Revision$
*/
+/*
+ * GUI layout, structure and management
+
+For the GUI we use SDL to create a large surface (gui->screen)
+containing tree sections: remote video on the left, local video
+on the right, and the keypad with all controls and text windows
+in the center.
+The central section is built using an image for the skin, fonts and
+other GUI elements. Comments embedded in the image to indicate to
+what function each area is mapped to.
+
+Mouse and keyboard events are detected on the whole surface, and
+handled differently according to their location:
+
+- drag on the local video window are used to move the captured
+ area (in the case of X11 grabber) or the picture-in-picture
+ location (in case of camera included on the X11 grab).
+- click on the keypad are mapped to the corresponding key;
+- drag on some keypad areas (sliders etc.) are mapped to the
+ corresponding functions;
+- keystrokes are used as keypad functions, or as text input
+ if we are in text-input mode.
+
+Configuration options control the appeareance of the gui:
+
+ keypad = /tmp/phone.jpg ; the skin
+ keypad_font = /tmp/font.ttf ; the font to use for output (XXX deprecated)
+
+ *
+ */
+
#include "asterisk.h"
#include "console_video.h"
#include "asterisk/lock.h"
@@ -11,11 +42,10 @@
#include "asterisk/utils.h" /* ast_calloc and ast_realloc */
#include <math.h> /* sqrt */
-/* we support 3 regions in the GUI */
+/* We use 3 'windows' in the GUI */
enum { WIN_LOCAL, WIN_REMOTE, WIN_KEYPAD, WIN_MAX };
-#ifndef HAVE_SDL
-/* stubs if we don't have any sdl */
+#ifndef HAVE_SDL /* stubs if we don't have any sdl */
static void show_frame(struct video_desc *env, int out) {}
static void sdl_setup(struct video_desc *env) {}
static struct gui_info *cleanup_sdl(struct gui_info *gui) { return NULL; }
@@ -48,7 +78,21 @@ struct display_window {
};
#define GUI_BUFFER_LEN 256 /* buffer lenght used for input buffers */
-struct keypad_entry; /* defined in console_gui.c */
+/* Where do we send the keyboard/keypad output */
+enum kb_output {
+ KO_NONE,
+ KO_INPUT, /* the local input window */
+ KO_DIALED, /* the 'dialed number' window */
+};
+
+enum drag_window { /* which window are we dragging */
+ DRAG_NONE,
+ DRAG_LOCAL, /* local video */
+ DRAG_REMOTE, /* remote video */
+ DRAG_DIALED, /* dialed number */
+ DRAG_INPUT, /* input window */
+ DRAG_MESSAGE, /* message window */
+};
/*! \brief info related to the gui: button status, mouse coords, etc. */
struct gui_info {
@@ -56,8 +100,8 @@ struct gui_info {
int inbuf_pos; /* next free position in inbuf */
char msgbuf[GUI_BUFFER_LEN]; /* buffer for text-message buffer */
int msgbuf_pos; /* next free position in msgbuf */
- int text_mode; /* switch to-dial and text-message mode */
- int drag_mode; /* switch phone and drag-source mode */
+ enum kb_output kb_output; /* where the keyboard output goes */
+ enum drag_window drag_window; /* which window are we dragging */
int x_drag; /* x coordinate where the drag starts */
int y_drag; /* y coordinate where the drag starts */
#ifdef HAVE_SDL_TTF
@@ -67,7 +111,9 @@ struct gui_info {
SDL_Surface *screen; /* the main window */
int outfd; /* fd for output */
- SDL_Surface *keypad; /* the pixmap for the keypad */
+ SDL_Surface *keypad; /* the skin for the keypad */
+
+ /* variable-size array mapping keypad regions to functions */
int kp_size, kp_used;
struct keypad_entry *kp;
@@ -171,51 +217,16 @@ static void show_frame(struct video_desc *env, int out)
}
/*
- * GUI layout, structure and management
- *
-
-For the GUI we use SDL to create a large surface (gui->screen)
-containing tree sections: remote video on the left, local video
-on the right, and the keypad with all controls and text windows
-in the center.
-The central section is built using two images: one is the skin,
-the other one is a mask where the sensitive areas of the skin
-are colored in different grayscale levels according to their
-functions. The mapping between colors and function is defined
-in the 'enum pixel_value' below.
-
-Mouse and keyboard events are detected on the whole surface, and
-handled differently according to their location, as follows:
-
-- drag on the local video window are used to move the captured
- area (in the case of X11 grabber) or the picture-in-picture
- location (in case of camera included on the X11 grab).
-- click on the keypad are mapped to the corresponding key;
-- drag on some keypad areas (sliders etc.) are mapped to the
- corresponding functions;
-- keystrokes are used as keypad functions, or as text input
- if we are in text-input mode.
-
-To manage these behavior we use two status variables,
-that defines if keyboard events should be redirect to dialing functions
-or to write message functions, and if mouse events should be used
-to implement keypad functionalities or to drag the capture device.
-
-Configuration options control the appeareance of the gui:
-
- keypad = /tmp/phone.jpg ; the keypad on the screen
- keypad_font = /tmp/font.ttf ; the font to use for output
-
- *
+ * Identifier for each region of the main window.
+ * Values between 0 and 127 correspond to ASCII characters.
+ * The corresponding strings to be used in the skin comment section
+ * are defined in gui_key_map.
*/
-
-/* enumerate for the pixel value. 0..127 correspond to ascii chars */
enum pixel_value {
/* answer/close functions */
KEY_PICK_UP = 128,
KEY_HANG_UP = 129,
- /* other functions */
KEY_MUTE = 130,
KEY_AUTOANSWER = 131,
KEY_SENDVIDEO = 132,
@@ -224,20 +235,18 @@ enum pixel_value {
KEY_WRITEMESSAGE = 135,
KEY_GUI_CLOSE = 136, /* close gui */
- /* other areas within the keypad */
- KEY_DIGIT_BACKGROUND = 255,
-
/* areas outside the keypad - simulated */
KEY_OUT_OF_KEYPAD = 251,
KEY_REM_DPY = 252,
KEY_LOC_DPY = 253,
+ KEY_DIGIT_BACKGROUND = 255, /* other areas within the keypad */
};
/*
* Handlers for the various keypad functions
*/
-/*! \brief append a character, or reset if '\0' */
+/*! \brief append a character, or reset if c = '\0' */
static void append_char(char *str, int *str_pos, const char c)
{
int i = *str_pos;
@@ -251,6 +260,7 @@ static void append_char(char *str, int *str_pos, const char c)
*str_pos = i;
}
+/*! \brief append string to a buffer */
static void append_string(char *str, int *str_pos, const char *s)
{
while (*s)
@@ -270,15 +280,6 @@ static void keypad_digit(struct video_desc *env, int digit)
}
}
-/* this is a wrapper for actions that are available through the cli */
-/* TODO append arg to command and send the resulting string as cli command */
-static void keypad_send_command(struct video_desc *env, char *command)
-{
- ast_log(LOG_WARNING, "keypad_send_command(%s) called\n", command);
- ast_cli_command(env->gui->outfd, command);
- return;
-}
-
/* function used to toggle on/off the status of some variables */
static char *keypad_toggle(struct video_desc *env, int index)
{
@@ -388,7 +389,7 @@ static int kp_match_area(const struct keypad_entry *e, int x, int y);
*
* x, y are referred to the upper left corner of the main SDL window.
*/
-static void handle_button_event(struct video_desc *env, SDL_MouseButtonEvent button)
+static void handle_mousedown(struct video_desc *env, SDL_MouseButtonEvent button)
{
uint8_t index = KEY_OUT_OF_KEYPAD; /* the key or region of the display we clicked on */
struct gui_info *gui = env->gui;
@@ -397,8 +398,8 @@ static void handle_button_event(struct video_desc *env, SDL_MouseButtonEvent but
ast_log(LOG_WARNING, "event %d %d have %d/%d regions at %p\n",
button.x, button.y, gui->kp_used, gui->kp_size, gui->kp);
#endif
- /* for each click we come back in normal mode */
- gui->text_mode = 0;
+ /* for each mousedown we end previous drag */
+ gui->drag_window = DRAG_NONE;
/* define keypad boundary */
if (button.x < env->rem_dpy.w)
@@ -442,11 +443,6 @@ static void handle_button_event(struct video_desc *env, SDL_MouseButtonEvent but
break;
case KEY_REMOTEVIDEO:
break;
- case KEY_WRITEMESSAGE:
- /* goes in text-mode */
- env->gui->text_mode = 1;
- break;
-
/* press outside the keypad. right increases size, center decreases, left drags */
case KEY_LOC_DPY:
@@ -457,7 +453,7 @@ static void handle_button_event(struct video_desc *env, SDL_MouseButtonEvent but
* and switch in drag mode */
env->gui->x_drag = button.x;
env->gui->y_drag = button.y;
- env->gui->drag_mode = 1;
+ env->gui->drag_window = DRAG_LOCAL;
}
break;
} else {
@@ -485,24 +481,31 @@ static void handle_button_event(struct video_desc *env, SDL_MouseButtonEvent but
* depending on the text_mode variable value.
*
* key is the SDLKey structure corresponding to the key pressed.
+ * XXX needs to be cleaned up when handling returns etc.
*/
static void handle_keyboard_input(struct video_desc *env, SDLKey key)
{
struct gui_info *gui = env->gui;
- if (gui->text_mode) {
+ switch (gui->kb_output) {
+ default:
+ break;
+ case KO_INPUT:
/* append in the text-message buffer */
if (key == SDLK_RETURN) {
/* send the text message and return in normal mode */
- gui->text_mode = 0;
- keypad_send_command(env, "send text");
+ gui->kb_output = KO_NONE;
+ ast_cli_command(gui->outfd, gui->msgbuf);
+ append_char(gui->msgbuf, &gui->msgbuf_pos, '\0');
} else {
/* accumulate the key in the message buffer */
append_char(gui->msgbuf, &gui->msgbuf_pos, key);
}
- }
- else {
+ break;
+ case KO_DIALED:
+ /* XXX actually, enter should be a 'console dial ' */
/* append in the dial buffer */
append_char(gui->inbuf, &gui->inbuf_pos, key);
+ break;
}
return;
@@ -571,16 +574,16 @@ static void eventhandler(struct video_desc *env, const char *caption)
handle_keyboard_input(env, ev[i].key.keysym.sym);
break;
case SDL_MOUSEMOTION:
- if (gui->drag_mode != 0)
+ if (gui->drag_window == DRAG_LOCAL)
move_capture_source(env, ev[i].motion.x, ev[i].motion.y);
break;
case SDL_MOUSEBUTTONDOWN:
- handle_button_event(env, ev[i].button);
+ handle_mousedown(env, ev[i].button);
break;
case SDL_MOUSEBUTTONUP:
- if (gui->drag_mode != 0) {
+ if (gui->drag_window == DRAG_LOCAL) {
move_capture_source(env, ev[i].button.x, ev[i].button.y);
- gui->drag_mode = 0;
+ gui->drag_window = DRAG_NONE;
}
break;
}
@@ -600,7 +603,7 @@ static void eventhandler(struct video_desc *env, const char *caption)
}
}
-static SDL_Surface *get_keypad(const char *file)
+static SDL_Surface *load_image(const char *file)
{
SDL_Surface *temp;
@@ -626,8 +629,8 @@ static struct gui_info *gui_init(const char *keypad_file)
if (gui == NULL)
return NULL;
/* initialize keypad status */
- gui->text_mode = 0;
- gui->drag_mode = 0;
+ gui->kb_output = KO_DIALED;
+ gui->drag_window = DRAG_NONE;
gui->outfd = -1;
/* initialize keyboard buffer */
@@ -692,7 +695,7 @@ static void keypad_setup(struct gui_info *gui, const char *kp_file)
if (gui->keypad)
return;
- gui->keypad = get_keypad(kp_file);
+ gui->keypad = load_image(kp_file);
if (!gui->keypad)
return;
/* now try to read the keymap from the file. */