Mercurial > pidgin.yaz
changeset 11802:2e3a6dcebaf3
[gaim-migrate @ 14093]
This should be it for the // -> /* */ for the doodle/whiteboard stuff. This could use a bit of cleaning yet....
committer: Tailor Script <tailor@pidgin.im>
author | Gary Kramlich <grim@reaperworld.com> |
---|---|
date | Mon, 24 Oct 2005 22:45:24 +0000 |
parents | 81806e9241be |
children | b4602ccb4e69 |
files | src/gtkwhiteboard.c src/gtkwhiteboard.h src/whiteboard.c src/whiteboard.h |
diffstat | 4 files changed, 473 insertions(+), 419 deletions(-) [+] |
line wrap: on
line diff
--- a/src/gtkwhiteboard.c Mon Oct 24 21:48:21 2005 +0000 +++ b/src/gtkwhiteboard.c Mon Oct 24 22:45:24 2005 +0000 @@ -21,19 +21,51 @@ * */ -// INCLUDES ============================================================================================ - #include <stdlib.h> #include "blist.h" #include "gtkwhiteboard.h" -// GLOBALS ============================================================================================= +/****************************************************************************** + * Prototypes + *****************************************************************************/ +static void gaim_gtk_whiteboard_create( GaimWhiteboard *wb ); + +static void gaim_gtk_whiteboard_destroy( GaimWhiteboard *wb ); +static void gaim_gtk_whiteboard_exit( GtkWidget *widget, gpointer data ); + +/*static void gaim_gtkwhiteboard_button_start_press( GtkButton *button, gpointer data ); */ + +static gboolean gaim_gtk_whiteboard_configure_event( GtkWidget *widget, GdkEventConfigure *event, gpointer data ); +static gboolean gaim_gtk_whiteboard_expose_event( GtkWidget *widget, GdkEventExpose *event, gpointer data ); + +static gboolean gaim_gtk_whiteboard_brush_down( GtkWidget *widget, GdkEventButton *event, gpointer data ); +static gboolean gaim_gtk_whiteboard_brush_motion( GtkWidget *widget, GdkEventMotion *event, gpointer data ); +static gboolean gaim_gtk_whiteboard_brush_up( GtkWidget *widget, GdkEventButton *event, gpointer data ); -//GList *buttonList = NULL; +static void gaim_gtk_whiteboard_draw_brush_point( GaimWhiteboard *wb, + int x, int y, int color, int size ); +static void gaim_gtk_whiteboard_draw_brush_line( GaimWhiteboard *wb, + int x0, int y0, int x1, int y1, int color, int size ); + +static void gaim_gtk_whiteboard_set_dimensions( GaimWhiteboard *wb, int width, int height ); +static void gaim_gtk_whiteboard_clear( GaimWhiteboard *wb ); + +static void gaim_gtk_whiteboard_button_clear_press( GtkWidget *widget, gpointer data ); +static void gaim_gtk_whiteboard_button_save_press( GtkWidget *widget, gpointer data ); -//GdkColor DefaultColor[PALETTE_NUM_COLORS]; +static void gaim_gtk_whiteboard_set_canvas_as_icon( GaimGtkWhiteboard *gtkwb ); + +static void gaim_gtk_whiteboard_rgb24_to_rgb48( int color_rgb, GdkColor *color ); + +/****************************************************************************** + * Globals + *****************************************************************************/ +/* +GList *buttonList = NULL; +GdkColor DefaultColor[PALETTE_NUM_COLORS]; +*/ static gboolean LocalShutdownRequest; @@ -52,264 +84,255 @@ gaim_gtk_whiteboard_clear }; -// FUNCTIONS ============================================================================================ - +/****************************************************************************** + * API + *****************************************************************************/ GaimWhiteboardUiOps *gaim_gtk_whiteboard_get_ui_ops( void ) { return( &ui_ops ); } -// ------------------------------------------------------------------------------------------------------ - void gaim_gtk_whiteboard_create( GaimWhiteboard *wb ) { - //g_print( "gaim_gtk_whiteboard_create()\n" ); - int i; - + GtkWidget *window; GtkWidget *drawing_area; - + GtkWidget *hbox_palette; GtkWidget *vbox_palette_above_canvas_and_controls; GtkWidget *hbox_canvas_and_controls; GtkWidget *vbox_controls; - - // -------------------------- - // |[][][][palette[][][][][]| - // |------------------------| - // | canvas | con | - // | | trol| - // | | s | - // | | | - // | | | - // -------------------------- - + + /* + -------------------------- + |[][][][palette[][][][][]| + |------------------------| + | canvas | con | + | | trol| + | | s | + | | | + | | | + -------------------------- + */ GtkWidget *clear_button; GtkWidget *save_button; - + GtkWidget *palette_color_box[PALETTE_NUM_COLORS]; /* GdkPixbuf *palette_color_area[PALETTE_NUM_COLORS]; */ - + GaimGtkWhiteboard *gtkwb = g_new0( GaimGtkWhiteboard, 1 ); const char *window_title; gtkwb->wb = wb; wb->ui_data = gtkwb; - - // Get dimensions (default?) for the whiteboard canvas + + /* Get dimensions (default?) for the whiteboard canvas */ if( wb->prpl_ops && wb->prpl_ops->get_dimensions ) wb->prpl_ops->get_dimensions( wb, >kwb->width, >kwb->height ); - + window = gtk_window_new( GTK_WINDOW_TOPLEVEL ); gtkwb->window = window; gtk_widget_set_name( window, wb->who ); - - // Try and set window title as the name of the buddy, else just use their username + + /* Try and set window title as the name of the buddy, else just use their + * username + */ window_title = gaim_contact_get_alias( gaim_buddy_get_contact( gaim_find_buddy( wb->account, wb->who ) ) ); if( window_title ) gtk_window_set_title( ( GtkWindow* )( window ), window_title ); else gtk_window_set_title( ( GtkWindow* )( window ), wb->who ); - + gtk_window_set_resizable( ( GtkWindow* )( window ), FALSE ); - + g_signal_connect( G_OBJECT( window ), "destroy", G_CALLBACK( gaim_gtk_whiteboard_exit ), ( gpointer )( gtkwb ) ); - - // Create vertical box to place palette above the canvas and controls + + /* Create vertical box to place palette above the canvas and controls */ vbox_palette_above_canvas_and_controls = gtk_vbox_new( FALSE, 0 ); gtk_container_add( GTK_CONTAINER( window ), vbox_palette_above_canvas_and_controls ); gtk_widget_show( vbox_palette_above_canvas_and_controls ); - - // Create horizontal box for the palette and all its entries + + /* Create horizontal box for the palette and all its entries */ hbox_palette = gtk_hbox_new( FALSE, 0 ); gtk_container_add( GTK_CONTAINER( vbox_palette_above_canvas_and_controls ), hbox_palette ); gtk_widget_show( hbox_palette ); - - // Create horizontal box to seperate the canvas from the controls + + /* Create horizontal box to seperate the canvas from the controls */ hbox_canvas_and_controls = gtk_hbox_new( FALSE, 0 ); gtk_container_add( GTK_CONTAINER( vbox_palette_above_canvas_and_controls ), hbox_canvas_and_controls ); gtk_widget_show( hbox_canvas_and_controls ); - + for( i = 0; i < PALETTE_NUM_COLORS; i++ ) { - //palette_color_area[i] = - + /* palette_color_area[i] = */ + palette_color_box[i] = gtk_image_new_from_pixbuf( NULL ); gtk_widget_set_size_request( palette_color_box[i], gtkwb->width / PALETTE_NUM_COLORS ,32 ); gtk_container_add( GTK_CONTAINER( hbox_palette ), palette_color_box[i] ); - - - + gtk_widget_show( palette_color_box[i] ); } - - // Create the drawing area + + /* Create the drawing area */ drawing_area = gtk_drawing_area_new(); gtkwb->drawing_area = drawing_area; gtk_widget_set_size_request( GTK_WIDGET( drawing_area ), gtkwb->width, gtkwb->height ); gtk_box_pack_start( GTK_BOX( hbox_canvas_and_controls ), drawing_area, TRUE, TRUE, 8 ); - + gtk_widget_show( drawing_area ); - - // Signals used to handle backing pixmap + + /* Signals used to handle backing pixmap */ g_signal_connect( G_OBJECT( drawing_area ), "expose_event", G_CALLBACK( gaim_gtk_whiteboard_expose_event ), ( gpointer )( gtkwb ) ); - + g_signal_connect( G_OBJECT( drawing_area ), "configure_event", G_CALLBACK( gaim_gtk_whiteboard_configure_event ), ( gpointer )( gtkwb ) ); - - // Event signals + + /* Event signals */ g_signal_connect( G_OBJECT( drawing_area ), "button_press_event", G_CALLBACK( gaim_gtk_whiteboard_brush_down ), ( gpointer )( gtkwb ) ); - + g_signal_connect( G_OBJECT( drawing_area ), "motion_notify_event", G_CALLBACK( gaim_gtk_whiteboard_brush_motion ), ( gpointer )( gtkwb ) ); - + g_signal_connect( G_OBJECT( drawing_area ), "button_release_event", G_CALLBACK( gaim_gtk_whiteboard_brush_up ), ( gpointer )( gtkwb ) ); - + gtk_widget_set_events( drawing_area, GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_HINT_MASK ); - - // Create vertical box to contain the controls + + /* Create vertical box to contain the controls */ vbox_controls = gtk_vbox_new( FALSE, 0 ); gtk_container_add( GTK_CONTAINER( hbox_canvas_and_controls ), vbox_controls ); gtk_widget_show( vbox_controls ); - - // Add a clear button + + /* Add a clear button */ clear_button = gtk_button_new_with_label( "Clear" ); gtk_widget_set_size_request( clear_button, 96 ,32 ); gtk_box_pack_start( GTK_BOX( vbox_controls ), clear_button, FALSE, FALSE, 0 ); gtk_widget_show( clear_button ); - + g_signal_connect( G_OBJECT( clear_button ), "clicked", G_CALLBACK( gaim_gtk_whiteboard_button_clear_press ), ( gpointer )( gtkwb ) ); - - // Add a save button + + /* Add a save button */ save_button = gtk_button_new_with_label( "Save" ); gtk_widget_set_size_request( save_button, 96 ,32 ); gtk_box_pack_start( GTK_BOX( vbox_controls ), save_button, FALSE, FALSE, 8 ); gtk_widget_show( save_button ); - + g_signal_connect( G_OBJECT( save_button ), "clicked", G_CALLBACK( gaim_gtk_whiteboard_button_save_press ), ( gpointer )( gtkwb ) ); - - // Make all this (window) visible + + /* Make all this (window) visible */ gtk_widget_show( window ); - + gaim_gtk_whiteboard_set_canvas_as_icon( gtkwb ); - - // TODO Specific protocol/whiteboard assignment here? Needs a UI Op? - // Set default brush size and color - //ds->brush_size = DOODLE_BRUSH_MEDIUM; - //ds->brush_color = 0; // black + + /* TODO Specific protocol/whiteboard assignment here? Needs a UI Op? */ + /* Set default brush size and color */ + /* + ds->brush_size = DOODLE_BRUSH_MEDIUM; + ds->brush_color = 0; + */ } -// ------------------------------------------------------------------------------------------------------ - void gaim_gtk_whiteboard_destroy( GaimWhiteboard *wb ) { - //g_print( "gaim_gtk_whiteboard_destroy()\n" ); - GaimGtkWhiteboard *gtkwb = wb->ui_data; - - // TODO Ask if user wants to save picture before the session is closed - - // Clear graphical memory + + /* TODO Ask if user wants to save picture before the session is closed */ + + /* Clear graphical memory */ if( gtkwb->pixmap ) { - //g_print( "---gtkwb->pixmap = %p\n", gtkwb->pixmap ); g_object_unref( gtkwb->pixmap ); gtkwb->pixmap = NULL; } - + if( gtkwb->window ) { - //g_print( "---gtkwb->window = %p\n", gtkwb->window ); gtk_widget_destroy( gtkwb->window ); gtkwb->window = NULL; } } -// ------------------------------------------------------------------------------------------------------ - void gaim_gtk_whiteboard_exit( GtkWidget *widget, gpointer data ) { - //g_print( "gaim_gtk_whiteboard_exit()\n" ); - GaimGtkWhiteboard *gtkwb = ( GaimGtkWhiteboard* )( data ); GaimWhiteboard *wb = gtkwb->wb; - + if( gtkwb->window && gtkwb->pixmap ) { LocalShutdownRequest = TRUE; - - //g_print( "---gtkwb->window = %p\n", gtkwb->window ); + gaim_gtk_whiteboard_destroy( wb ); } else LocalShutdownRequest = FALSE; - + if( gtkwb ) { - //g_print( "---gtkwb = %p\n", gtkwb ); g_free( gtkwb ); - + gtkwb = NULL; wb->ui_data = NULL; } - - // Destroy whiteboard core, if the local user exited the whiteboard window + + /* Destroy whiteboard core, if the local user exited the whiteboard window */ if( wb && LocalShutdownRequest ) { - //g_print( "---wb = %p\n", wb ); gaim_whiteboard_destroy( wb ); wb = NULL; } } -// ------------------------------------------------------------------------------------------------------ /* -// Whiteboard start button on conversation window (move this code to gtkconv? and use new prpl_info member?) + * Whiteboard start button on conversation window (move this code to gtkconv? + * and use new prpl_info member?) + */ +#if 0 void gaim_gtkwhiteboard_button_start_press( GtkButton *button, gpointer data ) { GaimConversation *conv = data; GaimAccount *account = gaim_conversation_get_account( conv ); GaimConnection *gc = gaim_account_get_connection( account ); char *to = ( char* )( gaim_conversation_get_name( conv ) ); - - // Only handle this if local client requested Doodle session (else local client would have sent one) + + /* Only handle this if local client requested Doodle session (else local + * client would have sent one) + */ GaimWhiteboard *wb = gaim_whiteboard_get( account, to ); - - // Write a local message to this conversation showing that - // a request for a Doodle session has been made + + /* Write a local message to this conversation showing that a request for a + * Doodle session has been made + */ gaim_conv_im_write( GAIM_CONV_IM( conv ), "", _("Sent Doodle request."), GAIM_MESSAGE_NICK | GAIM_MESSAGE_RECV, time( NULL ) ); - + yahoo_doodle_command_send_request( gc, to ); yahoo_doodle_command_send_ready( gc, to ); - - // Insert this 'session' in the list. At this point, it's only a requested session. + + /* Insert this 'session' in the list. At this point, it's only a requested + * session. + */ wb = gaim_whiteboard_create( account, to, DOODLE_STATE_REQUESTING ); } -*/ -// ------------------------------------------------------------------------------------------------------ +#endif gboolean gaim_gtk_whiteboard_configure_event( GtkWidget *widget, GdkEventConfigure *event, gpointer data ) { - //g_print( "gaim_gtk_whiteboard_configure_event | %s\n", ds->who ); - GaimGtkWhiteboard *gtkwb = ( GaimGtkWhiteboard* )( data ); - + GdkPixmap *pixmap = gtkwb->pixmap; - + if( pixmap ) g_object_unref( pixmap ); @@ -317,9 +340,9 @@ widget->allocation.width, widget->allocation.height, -1 ); - + gtkwb->pixmap = pixmap; - + gdk_draw_rectangle( pixmap, widget->style->white_gc, TRUE, @@ -330,98 +353,86 @@ return( TRUE ); } -// ------------------------------------------------------------------------------------------------------ - gboolean gaim_gtk_whiteboard_expose_event( GtkWidget *widget, GdkEventExpose *event, gpointer data ) { - //g_print( "gaim_gtk_whiteboard_expose_event | %s\n", ds->who ); - GaimGtkWhiteboard *gtkwb = ( GaimGtkWhiteboard* )( data ); GdkPixmap *pixmap = gtkwb->pixmap; - + gdk_draw_drawable( widget->window, widget->style->fg_gc[GTK_WIDGET_STATE( widget )], pixmap, event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height ); - + return( FALSE ); } -// ------------------------------------------------------------------------------------------------------ - gboolean gaim_gtk_whiteboard_brush_down( GtkWidget *widget, GdkEventButton *event, gpointer data ) -{ +{ GaimGtkWhiteboard *gtkwb = ( GaimGtkWhiteboard* )( data ); - //g_print( "gaim_gtk_whiteboard_brush_down | %s\n", gtkwb->wb->who ); GdkPixmap *pixmap = gtkwb->pixmap; GaimWhiteboard *wb = gtkwb->wb; GList *draw_list = wb->draw_list; - + int *x0 = NULL; int *y0 = NULL; - + if( BrushState != BRUSH_STATE_UP ) { - // Potential double-click DOWN to DOWN? - - g_print( "***Bad brush state transition %d to DOWN\n", BrushState ); - + /* Potential double-click DOWN to DOWN? */ BrushState = BRUSH_STATE_DOWN; - - //return( FALSE ); + + /* return( FALSE ); */ } - + BrushState = BRUSH_STATE_DOWN; - + if( event->button == 1 && pixmap != NULL ) { - // Check if draw_list has contents; if so, clear it + /* Check if draw_list has contents; if so, clear it */ if( draw_list ) draw_list = gaim_whiteboard_draw_list_destroy( draw_list ); - + x0 = g_new0( int, 1 ); y0 = g_new0( int, 1 ); - + *x0 = event->x; *y0 = event->y; - - // Set tracking variables + + /* Set tracking variables */ LastX = *x0; LastY = *y0; - + MotionCount = 0; - + draw_list = g_list_append( draw_list, ( gpointer )( x0 ) ); draw_list = g_list_append( draw_list, ( gpointer )( y0 ) ); - + gaim_gtk_whiteboard_draw_brush_point( gtkwb->wb, event->x, event->y, - 0,5 );//gtkwb->brush_color, gtkwb->brush_size ); NOTE temp const prot uiop + 0,5 ); + /* gtkwb->brush_color, gtkwb->brush_size ); NOTE temp const prot uiop */ } - + wb->draw_list = draw_list; - + return( TRUE ); } -// ------------------------------------------------------------------------------------------------------ - gboolean gaim_gtk_whiteboard_brush_motion( GtkWidget *widget, GdkEventMotion *event, gpointer data ) -{ +{ int x; int y; int *dx; int *dy; - + GdkModifierType state; - + GaimGtkWhiteboard *gtkwb = ( GaimGtkWhiteboard* )( data ); - //g_print( "gaim_gtk_whiteboard_brush_motion | %s\n", gtkwb->wb->who ); GdkPixmap *pixmap = gtkwb->pixmap; - + GaimWhiteboard *wb = gtkwb->wb; GList *draw_list = wb->draw_list; @@ -433,28 +444,30 @@ y = event->y; state = event->state; } - + if( state & GDK_BUTTON1_MASK && pixmap != NULL ) - { + { if( ( BrushState != BRUSH_STATE_DOWN ) && ( BrushState != BRUSH_STATE_MOTION ) ) { g_print( "***Bad brush state transition %d to MOTION\n", BrushState ); - + BrushState = BRUSH_STATE_MOTION; - + return( FALSE ); } BrushState = BRUSH_STATE_MOTION; - + dx = g_new0( int, 1 ); dy = g_new0( int, 1 ); - + *dx = x - LastX; *dy = y - LastY; - + MotionCount++; - - // NOTE 100 is a temporary constant for how many deltas/motions in a stroke (needs UI Ops?) + + /* NOTE 100 is a temporary constant for how many deltas/motions in a + * stroke (needs UI Ops?) + */ if( MotionCount == 100 ) { int *x0 = g_new0( int, 1 ); @@ -462,122 +475,120 @@ draw_list = g_list_append( draw_list, ( gpointer )( dx ) ); draw_list = g_list_append( draw_list, ( gpointer )( dy ) ); - - // Send draw list to prpl draw_list handler + + /* Send draw list to prpl draw_list handler */ if( gtkwb->wb->prpl_ops && gtkwb->wb->prpl_ops->send_draw_list ) gtkwb->wb->prpl_ops->send_draw_list( gtkwb->wb, draw_list ); - - // The brush stroke is finished, clear the list for another one + + /* The brush stroke is finished, clear the list for another one */ if( draw_list ) draw_list = gaim_whiteboard_draw_list_destroy( draw_list ); - + *x0 = LastX; *y0 = LastY; - - // Reset motion tracking + + /* Reset motion tracking */ MotionCount = 0; - + draw_list = g_list_append( draw_list, ( gpointer )( x0 ) ); draw_list = g_list_append( draw_list, ( gpointer )( y0 ) ); dx = g_new0( int, 1 ); dy = g_new0( int, 1 ); - + *dx = x - LastX; *dy = y - LastY; } - + draw_list = g_list_append( draw_list, ( gpointer )( dx ) ); draw_list = g_list_append( draw_list, ( gpointer )( dy ) ); - + gaim_gtk_whiteboard_draw_brush_line( gtkwb->wb, LastX, LastY, x, y, - 0, 5 );//gtkwb->brush_color, gtkwb->brush_size ); temp const proto ui ops? - - // Set tracking variables + 0, 5 ); + /*gtkwb->brush_color, gtkwb->brush_size ); temp const proto ui ops? */ + + /* Set tracking variables */ LastX = x; LastY = y; } - + wb->draw_list = draw_list; - + return( TRUE ); } -// ------------------------------------------------------------------------------------------------------ - gboolean gaim_gtk_whiteboard_brush_up( GtkWidget *widget, GdkEventButton *event, gpointer data ) { GaimGtkWhiteboard *gtkwb = ( GaimGtkWhiteboard* )( data ); - //g_print( "gaim_gtk_whiteboard_brush_up | %s\n", gtkwb->wb->who ); GdkPixmap *pixmap = gtkwb->pixmap; - + GaimWhiteboard *wb = gtkwb->wb; GList *draw_list = wb->draw_list; - + if( ( BrushState != BRUSH_STATE_DOWN ) && ( BrushState != BRUSH_STATE_MOTION ) ) { g_print( "***Bad brush state transition %d to UP\n", BrushState ); - + BrushState = BRUSH_STATE_UP; - + return( FALSE ); } BrushState = BRUSH_STATE_UP; - + if( event->button == 1 && pixmap != NULL ) { - // If the brush was never moved, express two sets of two deltas - // That's a 'point,' but not for Yahoo! - //if( ( event->x == LastX ) && ( event->y == LastY ) ) + /* If the brush was never moved, express two sets of two deltas That's a + * 'point,' but not for Yahoo! + */ + /* if( ( event->x == LastX ) && ( event->y == LastY ) ) */ if( MotionCount == 0 ) { int index; - - for( index = 0; index < 2; index++ ) // NOTE Yahoo Doodle specific! + + for( index = 0; index < 2; index++ )/* NOTE Yahoo Doodle specific! */ { int *x0 = NULL; int *y0 = NULL; - + x0 = g_new0( int, 1 ); y0 = g_new0( int, 1 ); - + draw_list = g_list_append( draw_list, ( gpointer )( x0 ) ); draw_list = g_list_append( draw_list, ( gpointer )( y0 ) ); } } - //else - // MotionCount = 0; - - // Send draw list to prpl draw_list handler + /* + else + MotionCount = 0; + */ + + /* Send draw list to prpl draw_list handler */ if( gtkwb->wb->prpl_ops && gtkwb->wb->prpl_ops->send_draw_list ) gtkwb->wb->prpl_ops->send_draw_list( gtkwb->wb, draw_list ); - + gaim_gtk_whiteboard_set_canvas_as_icon( gtkwb ); - - // The brush stroke is finished, clear the list for another one + + /* The brush stroke is finished, clear the list for another one */ if( draw_list ) draw_list = gaim_whiteboard_draw_list_destroy( draw_list ); - + wb->draw_list = draw_list; } - + return( TRUE ); } -// ------------------------------------------------------------------------------------------------------ - -// void gaim_gtk_whiteboard_draw_brush_point( GtkWidget *widget, GaimGtkWhiteboard *gtkwb, -// int x, int y, int color, int size ) +/* void gaim_gtk_whiteboard_draw_brush_point( GtkWidget *widget, GaimGtkWhiteboard *gtkwb, + int x, int y, int color, int size ) +*/ void gaim_gtk_whiteboard_draw_brush_point( GaimWhiteboard *wb, int x, int y, int color, int size ) { - //g_print( "goodle_doodle_session_draw_brush | %s\n", ds->who ); - GaimGtkWhiteboard *gtkwb = wb->ui_data; GtkWidget *widget = gtkwb->drawing_area; GdkPixmap *pixmap = gtkwb->pixmap; - + GdkRectangle update_rect; GdkGC *gfx_con = gdk_gc_new( pixmap ); @@ -587,17 +598,19 @@ update_rect.y = y - size / 2; update_rect.width = size; update_rect.height = size; - - // Interpret and convert color + + /* Interpret and convert color */ gaim_gtk_whiteboard_rgb24_to_rgb48( color, &col ); - + gdk_gc_set_rgb_fg_color( gfx_con, &col ); - //gdk_gc_set_rgb_bg_color( gfx_con, &col ); - - // NOTE 5 is a size constant for now... this is because of how poorly the gdk_draw_arc draws small circles + /* gdk_gc_set_rgb_bg_color( gfx_con, &col ); */ + + /* NOTE 5 is a size constant for now... this is because of how poorly the + * gdk_draw_arc draws small circles + */ if( size < 5 ) { - // Draw a rectangle/square + /* Draw a rectangle/square */ gdk_draw_rectangle( pixmap, gfx_con, TRUE, @@ -606,7 +619,7 @@ } else { - // Draw a circle + /* Draw a circle */ gdk_draw_arc( pixmap, gfx_con, TRUE, @@ -614,25 +627,25 @@ update_rect.width, update_rect.height, 0, FULL_CIRCLE_DEGREES ); } - + gtk_widget_queue_draw_area( widget, update_rect.x, update_rect.y, update_rect.width, update_rect.height ); - + gdk_gc_unref( gfx_con ); } -// ------------------------------------------------------------------------------------------------------ -// Uses Bresenham's algorithm (as provided by Wikipedia) -// void gaim_gtk_whiteboard_draw_brush_line( GtkWidget *widget, GaimGtkWhiteboard *gtkwb, -// int x0, int y0, int x1, int y1, int color, int size ) +/* Uses Bresenham's algorithm (as provided by Wikipedia) */ +/* void gaim_gtk_whiteboard_draw_brush_line( GtkWidget *widget, GaimGtkWhiteboard *gtkwb, + int x0, int y0, int x1, int y1, int color, int size ) +*/ void gaim_gtk_whiteboard_draw_brush_line( GaimWhiteboard *wb, int x0, int y0, int x1, int y1, int color, int size ) -{ +{ int temp; - + int xstep; int ystep; - + int dx; int dy; @@ -643,48 +656,48 @@ int y; gboolean steep = abs( y1 - y0 ) > abs( x1 - x0 ); - + if( steep ) { temp = x0; x0 = y0; y0 = temp; - temp = x1; x1 = y1; y1 = temp; + temp = x1; x1 = y1; y1 = temp; } - + dx = abs( x1 - x0 ); dy = abs( y1 - y0 ); - + error = 0; derror = dy; - + x = x0; y = y0; - + if( x0 < x1 ) xstep = 1; else xstep = -1; - + if( y0 < y1 ) ystep = 1; else ystep = -1; - + if( steep ) gaim_gtk_whiteboard_draw_brush_point( wb, y, x, color, size ); else gaim_gtk_whiteboard_draw_brush_point( wb, x, y, color, size ); - + while( x != x1 ) { x = x + xstep; error = error + derror; - + if( ( error * 2 ) >= dx ) { y = y + ystep; error = error - dx; } - + if( steep ) gaim_gtk_whiteboard_draw_brush_point( wb, y, x, color, size ); else @@ -692,61 +705,53 @@ } } -// ------------------------------------------------------------------------------------------------------ - void gaim_gtk_whiteboard_set_dimensions( GaimWhiteboard *wb, int width, int height ) { GaimGtkWhiteboard *gtkwb = wb->ui_data; - + gtkwb->width = width; gtkwb->height = height; } -// ------------------------------------------------------------------------------------------------------ - void gaim_gtk_whiteboard_clear( GaimWhiteboard *wb ) { GaimGtkWhiteboard *gtkwb = wb->ui_data; GdkPixmap *pixmap = gtkwb->pixmap; GtkWidget *drawing_area = gtkwb->drawing_area; - + gdk_draw_rectangle( pixmap, drawing_area->style->white_gc, TRUE, 0, 0, drawing_area->allocation.width, drawing_area->allocation.height ); - + gtk_widget_queue_draw_area( drawing_area, 0, 0, drawing_area->allocation.width, drawing_area->allocation.height ); } -// ------------------------------------------------------------------------------------------------------ - void gaim_gtk_whiteboard_button_clear_press( GtkWidget *widget, gpointer data ) { GaimGtkWhiteboard *gtkwb = ( GaimGtkWhiteboard* )( data ); - + gaim_gtk_whiteboard_clear( gtkwb->wb ); - + gaim_gtk_whiteboard_set_canvas_as_icon( gtkwb ); - - // Do protocol specific clearing procedures + + /* Do protocol specific clearing procedures */ if( gtkwb->wb->prpl_ops && gtkwb->wb->prpl_ops->clear ) gtkwb->wb->prpl_ops->clear( gtkwb->wb ); } -// ------------------------------------------------------------------------------------------------------ - void gaim_gtk_whiteboard_button_save_press( GtkWidget *widget, gpointer data ) { GaimGtkWhiteboard *gtkwb = ( GaimGtkWhiteboard* )( data ); GdkPixbuf *pixbuf; - + GtkWidget *dialog; int result; - + #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */ dialog = gtk_file_chooser_dialog_new ("Save File", GTK_WINDOW(gtkwb->window), @@ -754,16 +759,18 @@ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL ); - - //gtk_file_chooser_set_do_overwrite_confirmation( GTK_FILE_CHOOSER( dialog ), (gboolean)(TRUE) ); + + /* gtk_file_chooser_set_do_overwrite_confirmation( GTK_FILE_CHOOSER( dialog ), (gboolean)(TRUE) ); */ -// if( user_edited_a_new_document ) +/* if( user_edited_a_new_document ) */ { -// gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER( dialog ), default_folder_for_saving ); +/* gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER( dialog ), default_folder_for_saving ); */ gtk_file_chooser_set_current_name( GTK_FILE_CHOOSER( dialog ), "whiteboard.jpg" ); } -// else -// gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (dialog), filename_for_existing_document); +/* + else + gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (dialog), filename_for_existing_document); +*/ #else dialog = gtk_file_selection_new("Save File"); gtk_file_selection_set_filename(GTK_FILE_SELECTION(dialog), "whiteboard.jpg"); @@ -773,22 +780,22 @@ if( result == GTK_RESPONSE_ACCEPT ) { char *filename; - + #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */ filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER( dialog ) ); #else filename = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(dialog))); #endif gtk_widget_destroy( dialog ); - - // Makes an icon from the whiteboard's canvas 'image' + + /* Makes an icon from the whiteboard's canvas 'image' */ pixbuf = gdk_pixbuf_get_from_drawable( NULL, ( GdkDrawable* )( gtkwb->pixmap ), gdk_drawable_get_colormap( gtkwb->pixmap ), 0, 0, 0, 0, gtkwb->width, gtkwb->height ); - + if( gdk_pixbuf_save( pixbuf, filename, "jpeg", @@ -803,32 +810,28 @@ } else if( result == GTK_RESPONSE_CANCEL ) - { + { gtk_widget_destroy( dialog ); - + g_print( "File not Saved... Canceled\n" ); } } -// ------------------------------------------------------------------------------------------------------ - void gaim_gtk_whiteboard_set_canvas_as_icon( GaimGtkWhiteboard *gtkwb ) { GdkPixbuf *pixbuf; - - // Makes an icon from the whiteboard's canvas 'image' + + /* Makes an icon from the whiteboard's canvas 'image' */ pixbuf = gdk_pixbuf_get_from_drawable( NULL, ( GdkDrawable* )( gtkwb->pixmap ), gdk_drawable_get_colormap( gtkwb->pixmap ), 0, 0, 0, 0, gtkwb->width, gtkwb->height ); - + gtk_window_set_icon( ( GtkWindow* )( gtkwb->window ), pixbuf ); } -// ------------------------------------------------------------------------------------------------------ - void gaim_gtk_whiteboard_rgb24_to_rgb48( int color_rgb, GdkColor *color ) { color->red = ( color_rgb >> 8 ) | 0xFF; @@ -836,5 +839,3 @@ color->blue = ( ( color_rgb & 0xFF ) << 8 ) | 0xFF; } -// ------------------------------------------------------------------------------------------------------ -
--- a/src/gtkwhiteboard.h Mon Oct 24 21:48:21 2005 +0000 +++ b/src/gtkwhiteboard.h Mon Oct 24 22:45:24 2005 +0000 @@ -25,13 +25,10 @@ #ifndef _GAIM_GTKWHITEBOARD_H_ #define _GAIM_GTKWHITEBOARD_H_ -// INCLUDES ============================================================================================ #include "gtkgaim.h" #include "whiteboard.h" -// DEFINES ============================================================================================= - #define FULL_CIRCLE_DEGREES 23040 #define BRUSH_STATE_UP 0 @@ -40,50 +37,42 @@ #define PALETTE_NUM_COLORS 7 -// DATATYPES =========================================================================================== +/** + * A GaimGtkWhiteboard + */ typedef struct _GaimGtkWhiteboard { - GaimWhiteboard *wb; // backend data for this whiteboard - - GtkWidget *window; // Window for the Doodle session - GtkWidget *drawing_area; // Drawing area - - GdkPixmap *pixmap; // Memory for drawing area - - int width; // Canvas width - int height; // Canvas height + GaimWhiteboard *wb; /**< backend data for this whiteboard */ + + GtkWidget *window; /**< Window for the Doodle session */ + GtkWidget *drawing_area; /**< Drawing area */ + + GdkPixmap *pixmap; /**< Memory for drawing area */ + + int width; /**< Canvas width */ + int height; /**< Canvas height */ } GaimGtkWhiteboard; -// PROTOTYPES ========================================================================================== +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ +/*****************************************************************************/ +/** @name GaimGtkWhiteboard API */ +/*****************************************************************************/ +/*@{*/ + +/** + * Gets the GtkWhiteboard UI Operations. + * + * @return The GtkWhiteboard UI Operations. + */ GaimWhiteboardUiOps *gaim_gtk_whiteboard_get_ui_ops( void ); -void gaim_gtk_whiteboard_create( GaimWhiteboard *wb ); -void gaim_gtk_whiteboard_destroy( GaimWhiteboard *wb ); -void gaim_gtk_whiteboard_exit( GtkWidget *widget, gpointer data ); - -//void gaim_gtkwhiteboard_button_start_press( GtkButton *button, gpointer data ); - -gboolean gaim_gtk_whiteboard_configure_event( GtkWidget *widget, GdkEventConfigure *event, gpointer data ); -gboolean gaim_gtk_whiteboard_expose_event( GtkWidget *widget, GdkEventExpose *event, gpointer data ); - -gboolean gaim_gtk_whiteboard_brush_down( GtkWidget *widget, GdkEventButton *event, gpointer data ); -gboolean gaim_gtk_whiteboard_brush_motion( GtkWidget *widget, GdkEventMotion *event, gpointer data ); -gboolean gaim_gtk_whiteboard_brush_up( GtkWidget *widget, GdkEventButton *event, gpointer data ); +/*@}*/ -void gaim_gtk_whiteboard_draw_brush_point( GaimWhiteboard *wb, - int x, int y, int color, int size ); -void gaim_gtk_whiteboard_draw_brush_line( GaimWhiteboard *wb, - int x0, int y0, int x1, int y1, int color, int size ); - -void gaim_gtk_whiteboard_set_dimensions( GaimWhiteboard *wb, int width, int height ); -void gaim_gtk_whiteboard_clear( GaimWhiteboard *wb ); +#ifdef __cplusplus +} +#endif /* __cplusplus */ -void gaim_gtk_whiteboard_button_clear_press( GtkWidget *widget, gpointer data ); -void gaim_gtk_whiteboard_button_save_press( GtkWidget *widget, gpointer data ); - -void gaim_gtk_whiteboard_set_canvas_as_icon( GaimGtkWhiteboard *gtkwb ); - -void gaim_gtk_whiteboard_rgb24_to_rgb48( int color_rgb, GdkColor *color ); - -#endif // _GAIM_GTKWHITEBOARD_H_ +#endif /* _GAIM_GTKWHITEBOARD_H_ */
--- a/src/whiteboard.c Mon Oct 24 21:48:21 2005 +0000 +++ b/src/whiteboard.c Mon Oct 24 22:45:24 2005 +0000 @@ -21,197 +21,165 @@ * */ -// INCLUDES ============================================================================================= - #include <string.h> #include "whiteboard.h" #include "prpl.h" -// DATATYPES ============================================================================================ - -// GLOBALS ============================================================================================== - +/****************************************************************************** + * Globals + *****************************************************************************/ static GaimWhiteboardUiOps *whiteboard_ui_ops = NULL; -//static GaimWhiteboardPrplOps *whiteboard_prpl_ops = NULL; +/* static GaimWhiteboardPrplOps *whiteboard_prpl_ops = NULL; */ static GList *wbList = NULL; -//static gboolean auto_accept = TRUE; +/*static gboolean auto_accept = TRUE; */ -// FUNCTIONS ============================================================================================ - +/****************************************************************************** + * API + *****************************************************************************/ void gaim_whiteboard_set_ui_ops( GaimWhiteboardUiOps *ops ) { whiteboard_ui_ops = ops; } -// ------------------------------------------------------------------------------------------------------ - void gaim_whiteboard_set_prpl_ops( GaimWhiteboard *wb, GaimWhiteboardPrplOps *ops ) { wb->prpl_ops = ops; } -// ------------------------------------------------------------------------------------------------------ - GaimWhiteboard *gaim_whiteboard_create( GaimAccount *account, char *who, int state ) { - //g_print( "gaim_whiteboard_create()\n" ); - GaimPluginProtocolInfo *prpl_info; GaimWhiteboard *wb = g_new0( GaimWhiteboard, 1 ); wb->account = account; wb->state = state; wb->who = g_strdup( who ); - + prpl_info = GAIM_PLUGIN_PROTOCOL_INFO( account->gc->prpl ); gaim_whiteboard_set_prpl_ops( wb, prpl_info->whiteboard_prpl_ops ); - - // Start up protocol specifics + + /* Start up protocol specifics */ if( wb->prpl_ops && wb->prpl_ops->start ) wb->prpl_ops->start( wb ); - + wbList = g_list_append( wbList, ( gpointer )( wb ) ); - + return( wb ); } -// ------------------------------------------------------------------------------------------------------ - void gaim_whiteboard_destroy( GaimWhiteboard *wb ) { - //g_print( "gaim_whiteboard_destroy()\n" ); - if( wb->ui_data ) { - //g_print( "---wb->ui_data = %p\n", wb->ui_data ); - - // Destroy frontend + /* Destroy frontend */ if( whiteboard_ui_ops && whiteboard_ui_ops->destroy ) whiteboard_ui_ops->destroy( wb ); } - - // Do protocol specific session ending procedures + + /* Do protocol specific session ending procedures */ if( wb->prpl_ops && wb->prpl_ops->end ) wb->prpl_ops->end( wb ); - + if( wb ) { - //g_print( "---wb = %p\n", wb ); - wb->account = NULL; wb->state = 0; - + if( wb->who ) g_free( wb->who ); - + wbList = g_list_remove( wbList, wb ); - + g_free( wb ); wb = NULL; } } -// ------------------------------------------------------------------------------------------------------ - void gaim_whiteboard_start( GaimWhiteboard *wb ) { - //g_print( "gaim_whiteboard_start()\n" ); - - // Create frontend for whiteboard + /* Create frontend for whiteboard */ if( whiteboard_ui_ops && whiteboard_ui_ops->create ) whiteboard_ui_ops->create( wb ); } -// ------------------------------------------------------------------------------------------------------ - -// Looks through the list of whiteboard sessions for one that is between usernames 'me' and 'who' -// Returns a pointer to a matching whiteboard session; if none match, it returns NULL +/* Looks through the list of whiteboard sessions for one that is between + * usernames 'me' and 'who'. Returns a pointer to a matching whiteboard + * session; if none match, it returns NULL. + */ GaimWhiteboard *gaim_whiteboard_get_session( GaimAccount *account, char *who ) { - //g_print( "gaim_whiteboard_get_session()\n" ); - GaimWhiteboard *wb = NULL; - + GList *l = wbList; - - // Look for a whiteboard session between the local user and the remote user + + /* Look for a whiteboard session between the local user and the remote + * user + */ while( l ) { wb = l->data; - - if( !strcmp( gaim_account_get_username( wb->account ), gaim_account_get_username( account ) ) && + + if( !strcmp( gaim_account_get_username( wb->account ), + gaim_account_get_username( account ) ) && !strcmp( wb->who, who ) ) return( wb ); - - l = l->next; + + l = l->next; } - + return( NULL ); } -// ------------------------------------------------------------------------------------------------------ - GList *gaim_whiteboard_draw_list_destroy( GList *draw_list ) { - //g_print( "gaim_whiteboard_draw_list_destroy()\n" ); - if( draw_list == NULL ) - return( NULL ); + return( NULL ); else { - // Destroy the contents of this list + /* Destroy the contents of this list */ int *n = NULL; GList *l = draw_list; while( l ) { n = l->data; - + if( n ) g_free( n ); - + l = l->next; } - + g_list_free( draw_list ); draw_list = NULL; } - + return( draw_list ); } -// ------------------------------------------------------------------------------------------------------ - void gaim_whiteboard_set_dimensions( GaimWhiteboard *wb, int width, int height ) { if( whiteboard_ui_ops && whiteboard_ui_ops->set_dimensions ) whiteboard_ui_ops->set_dimensions( wb, width, height ); } -// ------------------------------------------------------------------------------------------------------ - void gaim_whiteboard_draw_point( GaimWhiteboard *wb, int x, int y, int color, int size ) { if( whiteboard_ui_ops && whiteboard_ui_ops->draw_point ) whiteboard_ui_ops->draw_point( wb, x, y, color, size ); } -// ------------------------------------------------------------------------------------------------------ - void gaim_whiteboard_draw_line( GaimWhiteboard *wb, int x1, int y1, int x2, int y2, int color, int size ) { if( whiteboard_ui_ops && whiteboard_ui_ops->draw_line ) whiteboard_ui_ops->draw_line( wb, x1, y1, x2, y2, color, size ); } -// ------------------------------------------------------------------------------------------------------ - void gaim_whiteboard_clear( GaimWhiteboard *wb ) { if( whiteboard_ui_ops && whiteboard_ui_ops->clear ) whiteboard_ui_ops->clear( wb ); } -// ------------------------------------------------------------------------------------------------------
--- a/src/whiteboard.h Mon Oct 24 21:48:21 2005 +0000 +++ b/src/whiteboard.h Mon Oct 24 22:45:24 2005 +0000 @@ -25,64 +25,160 @@ #ifndef _GAIM_WHITEBOARD_H_ #define _GAIM_WHITEBOARD_H_ -// DEFINES ============================================================================================= - -typedef struct _GaimWhiteboardPrplOps GaimWhiteboardPrplOps; // NOTE A nasty compiler dependency fix +/** + * Whiteboard PRPL Operations + */ +typedef struct _GaimWhiteboardPrplOps GaimWhiteboardPrplOps; #include "account.h" -// INCLUDES ============================================================================================ - -// DATATYPES =========================================================================================== +/** + * A GaimWhiteboard + */ typedef struct _GaimWhiteboard { - int state; // State of whiteboard session - - GaimAccount *account; // Account associated with this session - char *who; // Name of the remote user - - void *ui_data; // Graphical user-interface data - void *proto_data; // Protocol specific data - GaimWhiteboardPrplOps *prpl_ops; // Protocol-plugin operations - - GList *draw_list; // List of drawing elements/deltas to send + int state; /**< State of whiteboard session */ + + GaimAccount *account; /**< Account associated with this session */ + char *who; /**< Name of the remote user */ + + void *ui_data; /**< Graphical user-interface data */ + void *proto_data; /**< Protocol specific data */ + GaimWhiteboardPrplOps *prpl_ops; /**< Protocol-plugin operations */ + + GList *draw_list; /**< List of drawing elements/deltas to send */ } GaimWhiteboard; +/** + * The GaimWhiteboard UI Operations + */ typedef struct _GaimWhiteboardUiOps { - void ( *create )( GaimWhiteboard *wb ); - void ( *destroy )( GaimWhiteboard *wb ); - void ( *set_dimensions)( GaimWhiteboard *wb, int width, int height ); - void ( *draw_point )( GaimWhiteboard *wb, int x, int y, int color, int size ); - void ( *draw_line )( GaimWhiteboard *wb, int x1, int y1, int x2, int y2, int color, int size ); - void ( *clear )( GaimWhiteboard *wb ); + void ( *create )( GaimWhiteboard *wb ); /**< create function */ + void ( *destroy )( GaimWhiteboard *wb ); /**< destory function */ + void ( *set_dimensions)( GaimWhiteboard *wb, int width, int height ); /**< set_dimensions function */ + void ( *draw_point )( GaimWhiteboard *wb, int x, int y, int color, int size ); /**< draw_point function */ + void ( *draw_line )( GaimWhiteboard *wb, int x1, int y1, int x2, int y2, int color, int size ); /**< draw_line function */ + void ( *clear )( GaimWhiteboard *wb ); /**< clear function */ } GaimWhiteboardUiOps; +/** + * GaimWhiteboard PRPL Operations + */ struct _GaimWhiteboardPrplOps { - void ( *start )( GaimWhiteboard *wb ); - void ( *end )( GaimWhiteboard *wb ); - void ( *get_dimensions )( GaimWhiteboard *wb, int *width, int *height ); - void ( *set_dimensions )( GaimWhiteboard *wb, int width, int height ); - void ( *send_draw_list )( GaimWhiteboard *wb, GList *draw_list ); - void ( *clear )( GaimWhiteboard *wb ); + void ( *start )( GaimWhiteboard *wb ); /**< start function */ + void ( *end )( GaimWhiteboard *wb ); /**< end function */ + void ( *get_dimensions )( GaimWhiteboard *wb, int *width, int *height ); /**< get_dimensions function */ + void ( *set_dimensions )( GaimWhiteboard *wb, int width, int height ); /**< set_dimensions function */ + void ( *send_draw_list )( GaimWhiteboard *wb, GList *draw_list ); /**< send_draw_list function */ + void ( *clear )( GaimWhiteboard *wb ); /**< clear function */ }; -// PROTOTYPES ========================================================================================== +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ +/******************************************************************************/ +/** @name GaimWhiteboard API */ +/******************************************************************************/ +/*@{*/ + +/** + * Sets the UI Operations + * + * @param ops The UI Operations to set + */ void gaim_whiteboard_set_ui_ops( GaimWhiteboardUiOps *ops ); +/** + * Creates a whiteboard + * + * @param account The account. + * @param who Who you're drawing with. + * @param state The state. + * + * @return The new whiteboard + */ GaimWhiteboard *gaim_whiteboard_create( GaimAccount *account, char *who, int state ); + +/** + * Destroys a whiteboard + * + * @param wb The whiteboard. + */ void gaim_whiteboard_destroy( GaimWhiteboard *wb ); + +/** + * Starts a whiteboard + * + * @param wb The whiteboard. + */ void gaim_whiteboard_start( GaimWhiteboard *wb ); +/** + * Finds a whiteboard from an account and user. + * + * @param account The account. + * @param who The user. + * + * @return The whiteboard if found, otherwise @c NULL. + */ GaimWhiteboard *gaim_whiteboard_get_session( GaimAccount *account, char *who ); +/** + * Destorys a drawing list for a whiteboard + * + * @param draw_list The drawing list. + * + * @return The start of the new drawing list (?) + */ GList *gaim_whiteboard_draw_list_destroy( GList *draw_list ); +/** + * Sets the dimensions for a whiteboard. + * + * @param wb The whiteboard. + * @param width The width. + * @param height The height. + */ void gaim_whiteboard_set_dimensions( GaimWhiteboard *wb, int width, int height ); + +/** + * Draws a point on a whiteboard. + * + * @param wb The whiteboard. + * @param x The x coordinate. + * @param y The y coordinate. + * @param color The color to use. + * @param size The brush size. + */ void gaim_whiteboard_draw_point( GaimWhiteboard *wb, int x, int y, int color, int size ); + +/** + * Draws a line on a whiteboard + * + * @param wb The whiteboard. + * @param x1 The top-left x coordinate. + * @param y1 The top-left y coordinate. + * @param x2 The bottom-right x coordinate. + * @param y2 The bottom-right y coordinate. + * @param color The color to use. + * @param size The brush size. + */ void gaim_whiteboard_draw_line( GaimWhiteboard *wb, int x1, int y1, int x2, int y2, int color, int size ); + +/** + * Clears a whiteboard + * + * @param wb The whiteboard. + */ void gaim_whiteboard_clear( GaimWhiteboard *wb ); -#endif // _GAIM_WHITEBOARD_H_ +/*@}*/ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _GAIM_WHITEBOARD_H_ */