--- a/src/protocols/yahoo/yahoo_doodle.c Wed Jul 13 22:02:56 2005 -0400
+++ b/src/protocols/yahoo/yahoo_doodle.c Tue Jul 19 23:14:35 2005 -0400
@@ -49,23 +49,12 @@
#include "yahoo_filexfer.h"
#include "yahoo_picture.h"
#include "yahoo_doodle.h"
// GLOBALS =============================================================================================
-gboolean auto_accept = TRUE;
-GList *buttonList = NULL;
-int LastX; // Tracks last position of the mouse when drawing
-int MotionCount; // Tracks how many brush motions made
-int BrushState = BRUSH_STATE_UP;
const int DefaultColorRGB24[] =
@@ -202,8 +191,6 @@
if( ( gtkconv = GAIM_GTK_CONVERSATION( conv ) ) == NULL )
- //type = gaim_conversation_get_type( conv );
// Create this button (via Gaim API)
button = gaim_gtkconv_button_new( NULL,
"Goodle", "Start a Doodle session with this user",
@@ -248,122 +235,6 @@
-// ------------------------------------------------------------------------------------------------------
-void goodle_button_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 ) );
- // Get the doodle session
- doodle_session *ds = yahoo_doodle_session_get( dsList,
- ( char* )( gaim_account_get_username( gc->account ) ),
- // 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 ) );
- goodle_send_command_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.
- ds = g_new0( doodle_session, 1 );
- ds->state = DOODLE_STATE_REQUESTING;
- dsList = g_list_append( dsList, ( gpointer )( ds ) );
-// ------------------------------------------------------------------------------------------------------
-// Configuration dialog for plugin (uses GTK)
-GtkWidget *get_config_frame( GaimPlugin *plugin )
- GtkWidget *vbox, *frame;
- vbox = gtk_vbox_new( FALSE, 6 );
- gtk_container_set_border_width( GTK_CONTAINER( vbox ), 12 );
- frame = gaim_gtk_make_frame( vbox, "Settings" );
- gaim_gtk_prefs_checkbox( "Automatically accept Doodle requests",
- "/plugins/gtk/goodle/auto_accept",
- gtk_widget_show_all( vbox );
-// ------------------------------------------------------------------------------------------------------
-void goodle_set_goodle_functions( gboolean useGoodle )
- GList *accountList = NULL;
- // Obtain all the Gaim accounts (no other way to get to the GaimConnections?)
- accountList = gaim_accounts_get_all();
- // Traverse through the accounts to determine which ones are Yahoo
- for( l = accountList; l != NULL; l = l_next )
- account = ( GaimAccount* )( l->data );
- // Check if this particular account is Yahoo
- if( !strcmp( gaim_account_get_protocol_id( account ), "prpl-yahoo" ) )
- // See if this Yahoo account is active
- if( gaim_account_is_connected( account ) )
- gc = gaim_account_get_connection( account );
- GaimPlugin *gp = gaim_find_prpl( "prpl-yahoo" );
- GaimPluginInfo *gpi = gp->info;
- GaimPluginProtocolInfo *gppi = gpi->extra_info;
- // Replace the packet handler function with a modified one
- // to check for packets concerning 'Doodle'
- gaim_input_remove( gc->inpa );
- gc->inpa = gaim_input_add( yd->fd, GAIM_INPUT_READ, goodle_pending, gc );
- // Replace the 'send_im' function with a modified one
- // to check to see if we are chatting with a person we are doodling with
- gppi->send_im = goodle_send_im;
- // Replace the modified packet handler function with original
- gaim_input_remove( gc->inpa );
- gc->inpa = gaim_input_add( yd->fd, GAIM_INPUT_READ, yahoo_pending, gc );
- // Replace the modified 'send_im' with the original
- gppi->send_im = yahoo_send_im;
- // Clear our list of accounts?
// ------------------------------------------------------------------------------------------------------
@@ -413,16 +284,16 @@
void yahoo_doodle_command_got_request( GaimConnection *gc, char *from )
- char *me = ( char* )( gaim_account_get_username( gc->account ) );
+ GaimAccount *account = gaim_connection_get_account( gc ); // Only handle this if local client requested Doodle session (else local client would have sent one)
- doodle_session *ds = yahoo_doodle_session_get( dsList, me, from );
+ GaimWhiteboard *wb = gaim_whiteboard_get( account, from ); g_print( "-----------------------------------------------\n" );
g_print( "Got REQUEST (%s)\n", from );
// If a session with the remote user doesn't exist
// Ask user if he/she wishes to accept the request for a doodle session
// TODO Ask local user to start Doodle session with remote user
@@ -435,14 +306,7 @@
dialog_message, NULL, NULL, NULL );
- ds = g_new0( doodle_session, 1 );
- strcpy( ds->who, from );
- ds->state = DOODLE_STATE_REQUESTED;
- dsList = g_list_append( dsList, ( gpointer )( ds ) );
+ wb = gaim_whiteboard_create( account, from, DOODLE_STATE_REQUESTED ); yahoo_doodle_command_send_request( gc, from );
@@ -454,28 +318,28 @@
void yahoo_doodle_command_got_ready( GaimConnection *gc, char *from )
+ GaimAccount *account = gaim_connection_get_account( gc ); // Only handle this if local client requested Doodle session (else local client would have sent one)
- doodle_session *ds = yahoo_doodle_session_get( dsList,
- ( char* )( gaim_account_get_username( gc->account ) ),
+ GaimWhiteboard *wb = gaim_whiteboard_get( account, from ); g_print( "-----------------------------------------------\n" );
g_print( "Got READY (%s)\n", from );
- if( ds->state == DOODLE_STATE_REQUESTING )
+ if( wb->state == DOODLE_STATE_REQUESTING ) // TODO Check for active pixmap?
//goodle_doodle_session_start( ds );
- ds->state = DOODLE_STATE_ESTABLISHED;
+ wb->state = DOODLE_STATE_ESTABLISHED; yahoo_doodle_command_send_confirm( gc, from );
- if( ds->state == DOODLE_STATE_ESTABLISHED )
+ if( wb->state == DOODLE_STATE_ESTABLISHED ) // TODO Call clear function (requires function to clear canvas (but not send clear command packet)
// Ask whether to save picture too
@@ -490,12 +354,12 @@
void yahoo_doodle_command_got_draw( GaimConnection *gc, char *from, char *message )
+ GaimAccount *account = gaim_connection_get_account( gc ); // Only handle this if local client requested Doodle session (else local client would have sent one)
- doodle_session *ds = yahoo_doodle_session_get( dsList,
- ( char* )( gaim_account_get_username( gc->account ) ),
+ GaimWhiteboard *wb = gaim_whiteboard_get( account, from );
g_print( "-----------------------------------------------\n" );
@@ -558,18 +422,18 @@
void yahoo_doodle_command_got_clear( GaimConnection *gc, char *from )
+ GaimAccount *account = gaim_connection_get_account( gc ); // Only handle this if local client requested Doodle session (else local client would have sent one)
- doodle_session *ds = yahoo_doodle_session_get( dsList,
- ( char* )( gaim_account_get_username( gc->account ) ),
+ GaimWhiteboard *wb = gaim_whiteboard_get( account, from ); g_print( "-----------------------------------------------\n" );
g_print( "Got CLEAR (%s)\n", from );
- if( ds->state == DOODLE_STATE_ESTABLISHED )
+ if( wb->state == DOODLE_STATE_ESTABLISHED ) // TODO Ask user whether to save the image before clearing it
@@ -597,22 +461,23 @@
void yahoo_doodle_command_got_confirm( GaimConnection *gc, char *from )
// Get the doodle session
- doodle_session *ds = yahoo_doodle_session_get( dsList,
- ( char* )( gaim_account_get_username( gc->account ) ),
+ GaimAccount *account = gaim_connection_get_account( gc ); + // Only handle this if local client requested Doodle session (else local client would have sent one) + GaimWhiteboard *wb = gaim_whiteboard_get( account, from ); g_print( "-----------------------------------------------\n" );
g_print( "Got CONFIRM (%s)\n", from );
// TODO Combine the following IF's?
// Check if we requested a doodle session
- if( ds->state == DOODLE_STATE_REQUESTING )
+ if( wb->state == DOODLE_STATE_REQUESTING ) - ds->state = DOODLE_STATE_ESTABLISHED;
+ wb->state = DOODLE_STATE_ESTABLISHED; // Check if this session wasn't already started before we start it (again?)
//if( ds->pixmap == NULL )
@@ -622,9 +487,9 @@
// Check if we accepted a request for a doodle session
- if( ds->state == DOODLE_STATE_REQUESTED )
+ if( wb->state == DOODLE_STATE_REQUESTED ) - ds->state = DOODLE_STATE_ESTABLISHED;
+ wb->state = DOODLE_STATE_ESTABLISHED; // Check if this session wasn't already started before we start it (again?)
//if( ds->pixmap == NULL )
@@ -636,10 +501,10 @@
void yahoo_doodle_command_got_shutdown( GaimConnection *gc, char *from )
- // Get the doodle session
- doodle_session *ds = yahoo_doodle_session_get( dsList,
- ( char* )( gaim_account_get_username( gc->account ) ),
+ GaimAccount *account = gaim_connection_get_account( gc ); + // Only handle this if local client requested Doodle session (else local client would have sent one) + GaimWhiteboard *wb = gaim_whiteboard_get( account, from ); g_print( "-----------------------------------------------\n" );
g_print( "Got SHUTDOWN (%s)\n", from );
@@ -647,7 +512,7 @@
// TODO Ask if user wants to save picture before the session is closed
// If this session doesn't exist, don't try and kill it
;//gtk_widget_destroy( ds->window );
@@ -667,17 +532,16 @@
// Make and send an acknowledge (ready) Doodle packet
pkt = yahoo_packet_new( YAHOO_SERVICE_P2PFILEXFER, YAHOO_STATUS_AVAILABLE, 0 );
- yahoo_packet_hash( pkt, 49, "IMVIRONMENT" );
- yahoo_packet_hash( pkt, 1, gaim_account_get_username( gc->account ) );
- yahoo_packet_hash( pkt, 14, "1" );
- yahoo_packet_hash( pkt, 13, "1" );
- yahoo_packet_hash( pkt, 5, to );
- yahoo_packet_hash( pkt, 63, "doodle;11" );
- yahoo_packet_hash( pkt, 64, "1" );
- yahoo_packet_hash( pkt, 1002, "1" );
- yahoo_packet_send( yd, pkt );
+ yahoo_packet_hash_str( pkt, 49, "IMVIRONMENT" ); + yahoo_packet_hash_str( pkt, 1, gaim_account_get_username( gc->account ) ); + yahoo_packet_hash_str( pkt, 14, "1" ); + yahoo_packet_hash_str( pkt, 13, "1" ); + yahoo_packet_hash_str( pkt, 5, to ); + yahoo_packet_hash_str( pkt, 63, "doodle;11" ); + yahoo_packet_hash_str( pkt, 64, "1" ); + yahoo_packet_hash_str( pkt, 1002, "1" ); - yahoo_packet_free( pkt );
+ yahoo_packet_send_and_free( pkt, yd ); @@ -696,17 +560,16 @@
// Make and send a request to start a Doodle session
pkt = yahoo_packet_new( YAHOO_SERVICE_P2PFILEXFER, YAHOO_STATUS_AVAILABLE, 0 );
- yahoo_packet_hash( pkt, 49, "IMVIRONMENT" );
- yahoo_packet_hash( pkt, 1, gaim_account_get_username( gc->account ) );
- yahoo_packet_hash( pkt, 14, "" );
- yahoo_packet_hash( pkt, 13, "0" );
- yahoo_packet_hash( pkt, 5, to );
- yahoo_packet_hash( pkt, 63, "doodle;11" );
- yahoo_packet_hash( pkt, 64, "0" );
- yahoo_packet_hash( pkt, 1002, "1" );
- yahoo_packet_send( yd, pkt );
+ yahoo_packet_hash_str( pkt, 49, "IMVIRONMENT" ); + yahoo_packet_hash_str( pkt, 1, gaim_account_get_username( gc->account ) ); + yahoo_packet_hash_str( pkt, 14, "" ); + yahoo_packet_hash_str( pkt, 13, "0" ); + yahoo_packet_hash_str( pkt, 5, to ); + yahoo_packet_hash_str( pkt, 63, "doodle;11" ); + yahoo_packet_hash_str( pkt, 64, "0" ); + yahoo_packet_hash_str( pkt, 1002, "1" ); - yahoo_packet_free( pkt );
+ yahoo_packet_send_and_free( pkt, yd ); @@ -725,17 +588,16 @@
// Make and send a drawing packet
pkt = yahoo_packet_new( YAHOO_SERVICE_P2PFILEXFER, YAHOO_STATUS_AVAILABLE, 0 );
- yahoo_packet_hash( pkt, 49, "IMVIRONMENT" );
- yahoo_packet_hash( pkt, 1, gaim_account_get_username( gc->account ) );
- yahoo_packet_hash( pkt, 14, message );
- yahoo_packet_hash( pkt, 13, "3" );
- yahoo_packet_hash( pkt, 5, to );
- yahoo_packet_hash( pkt, 63, "doodle;11" );
- yahoo_packet_hash( pkt, 64, "1" );
- yahoo_packet_hash( pkt, 1002, "1" );
- yahoo_packet_send( yd, pkt );
+ yahoo_packet_hash_str( pkt, 49, "IMVIRONMENT" ); + yahoo_packet_hash_str( pkt, 1, gaim_account_get_username( gc->account ) ); + yahoo_packet_hash_str( pkt, 14, message ); + yahoo_packet_hash_str( pkt, 13, "3" ); + yahoo_packet_hash_str( pkt, 5, to ); + yahoo_packet_hash_str( pkt, 63, "doodle;11" ); + yahoo_packet_hash_str( pkt, 64, "1" ); + yahoo_packet_hash_str( pkt, 1002, "1" ); - yahoo_packet_free( pkt );
+ yahoo_packet_send_and_free( pkt, yd ); // ------------------------------------------------------------------------------------------------------
@@ -752,17 +614,16 @@
// Make and send a request to clear packet
pkt = yahoo_packet_new( YAHOO_SERVICE_P2PFILEXFER, YAHOO_STATUS_AVAILABLE, 0 );
- yahoo_packet_hash( pkt, 49, "IMVIRONMENT" );
- yahoo_packet_hash( pkt, 1, gaim_account_get_username( gc->account ) );
- yahoo_packet_hash( pkt, 14, " " );
- yahoo_packet_hash( pkt, 13, "2" );
- yahoo_packet_hash( pkt, 5, to );
- yahoo_packet_hash( pkt, 63, "doodle;11" );
- yahoo_packet_hash( pkt, 64, "1" );
- yahoo_packet_hash( pkt, 1002, "1" );
- yahoo_packet_send( yd, pkt );
+ yahoo_packet_hash_str( pkt, 49, "IMVIRONMENT" ); + yahoo_packet_hash_str( pkt, 1, gaim_account_get_username( gc->account ) ); + yahoo_packet_hash_str( pkt, 14, " " ); + yahoo_packet_hash_str( pkt, 13, "2" ); + yahoo_packet_hash_str( pkt, 5, to ); + yahoo_packet_hash_str( pkt, 63, "doodle;11" ); + yahoo_packet_hash_str( pkt, 64, "1" ); + yahoo_packet_hash_str( pkt, 1002, "1" ); - yahoo_packet_free( pkt );
+ yahoo_packet_send_and_free( pkt, yd ); // ------------------------------------------------------------------------------------------------------
@@ -779,17 +640,16 @@
// Send out a request to use a specified 'extra' feature (message)
pkt = yahoo_packet_new( YAHOO_SERVICE_P2PFILEXFER, YAHOO_STATUS_AVAILABLE, 0 );
- yahoo_packet_hash( pkt, 49, "IMVIRONMENT" );
- yahoo_packet_hash( pkt, 1, gaim_account_get_username( gc->account ) );
- yahoo_packet_hash( pkt, 14, message );
- yahoo_packet_hash( pkt, 13, "4" );
- yahoo_packet_hash( pkt, 5, to );
- yahoo_packet_hash( pkt, 63, "doodle;11" );
- yahoo_packet_hash( pkt, 64, "1" );
- yahoo_packet_hash( pkt, 1002, "1" );
- yahoo_packet_send( yd, pkt );
- yahoo_packet_free( pkt );
+ yahoo_packet_hash_str( pkt, 49, "IMVIRONMENT" ); + yahoo_packet_hash_str( pkt, 1, gaim_account_get_username( gc->account ) ); + yahoo_packet_hash_str( pkt, 14, message ); + yahoo_packet_hash_str( pkt, 13, "4" ); + yahoo_packet_hash_str( pkt, 5, to ); + yahoo_packet_hash_str( pkt, 63, "doodle;11" ); + yahoo_packet_hash_str( pkt, 64, "1" ); + yahoo_packet_hash_str( pkt, 1002, "1" ); + yahoo_packet_send_and_free( pkt, yd ); // ------------------------------------------------------------------------------------------------------
@@ -806,17 +666,16 @@
// Send ready packet (that local client accepted and is ready)
pkt = yahoo_packet_new( YAHOO_SERVICE_P2PFILEXFER, YAHOO_STATUS_AVAILABLE, 0 );
- yahoo_packet_hash( pkt, 49, "IMVIRONMENT" );
- yahoo_packet_hash( pkt, 1, ( char* )( gaim_account_get_username( gc->account ) ) );
- yahoo_packet_hash( pkt, 14, "1" );
- yahoo_packet_hash( pkt, 13, "5" );
- yahoo_packet_hash( pkt, 5, to );
- yahoo_packet_hash( pkt, 63, "doodle;11" );
- yahoo_packet_hash( pkt, 64, "1" );
- yahoo_packet_hash( pkt, 1002, "1" );
- yahoo_packet_send( yd, pkt );
+ yahoo_packet_hash_str( pkt, 49, "IMVIRONMENT" ); + yahoo_packet_hash_str( pkt, 1, ( char* )( gaim_account_get_username( gc->account ) ) ); + yahoo_packet_hash_str( pkt, 14, "1" ); + yahoo_packet_hash_str( pkt, 13, "5" ); + yahoo_packet_hash_str( pkt, 5, to ); + yahoo_packet_hash_str( pkt, 63, "doodle;11" ); + yahoo_packet_hash_str( pkt, 64, "1" ); + yahoo_packet_hash_str( pkt, 1002, "1" ); - yahoo_packet_free( pkt );
+ yahoo_packet_send_and_free( pkt, yd ); // ------------------------------------------------------------------------------------------------------
@@ -833,41 +692,16 @@
// Declare that you are ending the Doodle session
pkt = yahoo_packet_new( YAHOO_SERVICE_P2PFILEXFER, YAHOO_STATUS_AVAILABLE, 0 );
- yahoo_packet_hash( pkt, 49, "IMVIRONMENT" );
- yahoo_packet_hash( pkt, 1, gaim_account_get_username( gc->account ) );
- yahoo_packet_hash( pkt, 14, "" );
- yahoo_packet_hash( pkt, 13, "0" );
- yahoo_packet_hash( pkt, 5, to );
- yahoo_packet_hash( pkt, 63, ";0" );
- yahoo_packet_hash( pkt, 64, "0" );
- yahoo_packet_hash( pkt, 1002, "1" );
- yahoo_packet_send( yd, pkt );
+ yahoo_packet_hash_str( pkt, 49, "IMVIRONMENT" ); + yahoo_packet_hash_str( pkt, 1, gaim_account_get_username( gc->account ) ); + yahoo_packet_hash_str( pkt, 14, "" ); + yahoo_packet_hash_str( pkt, 13, "0" ); + yahoo_packet_hash_str( pkt, 5, to ); + yahoo_packet_hash_str( pkt, 63, ";0" ); + yahoo_packet_hash_str( pkt, 64, "0" ); + yahoo_packet_hash_str( pkt, 1002, "1" ); - yahoo_packet_free( pkt );
-// ------------------------------------------------------------------------------------------------------
-// Looks through a specified list of Doodle sessions for one that is between usernames 'me' and 'who'
-// Returns a pointer to a matching doodle_session; if none match, it returns NULL
-doodle_session *yahoo_doodle_session_get( GList *ds_list, char *me, char *who )
- doodle_session *ds = NULL;
- // Look for a Doodle session between the local user and the remote user
- if( !strcmp( gaim_account_get_username( ds->gc->account ), me ) && !strcmp( ds->who, who ) )
+ yahoo_packet_send_and_free( pkt, yd ); // ------------------------------------------------------------------------------------------------------
@@ -924,12 +758,12 @@
gtk_widget_show( hbox_canvas_and_controls );
for( i = 0; i < PALETTE_NUM_OF_COLORS; i++ )
color_box[i] = gtk_label_new( NULL );
gtk_widget_set_size_request( color_box[i], DOODLE_CANVAS_WIDTH / PALETTE_NUM_OF_COLORS ,32 );
gtk_container_add( GTK_CONTAINER( hbox_palette ), color_box[i] );
gtk_widget_show( color_box[i] );
// Create the drawing area
drawing_area = gtk_drawing_area_new();
@@ -992,407 +826,6 @@
ds->brush_size = DOODLE_BRUSH_MEDIUM;
ds->brush_color = 0; // black
-// ------------------------------------------------------------------------------------------------------
-void goodle_doodle_session_end( GtkWidget *widget, gpointer data )
- doodle_session *ds = ( doodle_session* )( data );
- GaimConnection *gc = ds->gc;
- GdkPixmap *pixmap = ds->pixmap;
- //g_print( "goodle_doodle_session_end | %s\n", ds->who );
- // TODO Ask if user wants to save picture before the session is closed
- if( ds == NULL ) // Fixes sessions with yourself?
- yahoo_doodle_command_send_shutdown( gc, ds->who );
- // Clear pixmap memory before we remove this session from the Doodle session list
- g_object_unref( pixmap );
- dsList = g_list_remove( dsList, ds );
-// ------------------------------------------------------------------------------------------------------
-gboolean goodle_doodle_session_configure_event( GtkWidget *widget, GdkEventConfigure *event, gpointer data )
- doodle_session *ds = ( doodle_session* )( data );
- GdkPixmap *pixmap = ds->pixmap;
- //g_print( "goodle_doodle_session_configure_event | %s\n", ds->who );
- g_object_unref( pixmap );
- pixmap = gdk_pixmap_new( widget->window,
- widget->allocation.width,
- widget->allocation.height,
- gdk_draw_rectangle( pixmap,
- widget->style->white_gc,
- widget->allocation.width,
- widget->allocation.height );
-// ------------------------------------------------------------------------------------------------------
-gboolean goodle_doodle_session_expose_event( GtkWidget *widget, GdkEventExpose *event, gpointer data )
- doodle_session *ds = ( doodle_session* )( data );
- GdkPixmap *pixmap = ds->pixmap;
- //g_print( "goodle_doodle_session_expose_event | %s\n", ds->who );
- gdk_draw_drawable( widget->window,
- widget->style->fg_gc[GTK_WIDGET_STATE( widget )],
- event->area.x, event->area.y,
- event->area.x, event->area.y,
- event->area.width, event->area.height );
-// ------------------------------------------------------------------------------------------------------
-gboolean goodle_doodle_session_brush_down( GtkWidget *widget, GdkEventButton *event, gpointer data )
- doodle_session *ds = ( doodle_session* )( data );
- GdkPixmap *pixmap = ds->pixmap;
- int *brush_color = NULL;
- int *brush_size = NULL;
- if( BrushState != BRUSH_STATE_UP )
- // Potential double-click DOWN to DOWN?
- g_print( "***Bad brush state transition %d to DOWN\n", BrushState );
- BrushState = BRUSH_STATE_DOWN;
- BrushState = BRUSH_STATE_DOWN;
- //g_print( "BRUSH_DOWN | %s\n", ds->who );
- if( event->button == 1 && pixmap != NULL )
- // Check if drawList has contents; if so, clear it
- goodle_doodle_session_destroy_draw_list( drawList );
- brush_color = g_new0( int, 1 );
- brush_size = g_new0( int, 1 );
- *brush_color = ds->brush_color;
- *brush_size = ds->brush_size;
- // Set tracking variables
- drawList = g_list_append( drawList, ( gpointer )( brush_color ) );
- drawList = g_list_append( drawList, ( gpointer )( brush_size ) );
- drawList = g_list_append( drawList, ( gpointer )( x0 ) );
- drawList = g_list_append( drawList, ( gpointer )( y0 ) );
- goodle_doodle_session_draw_brush_point( widget, ds,
- ds->brush_color, ds->brush_size );
-// ------------------------------------------------------------------------------------------------------
-gboolean goodle_doodle_session_brush_motion( GtkWidget *widget, GdkEventMotion *event, gpointer data )
- doodle_session *ds = ( doodle_session* )( data );
- GdkPixmap *pixmap = ds->pixmap;
- //g_print( "BRUSH_MOTION | %s\n", ds->who );
- gdk_window_get_pointer( event->window, &x, &y, &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;
- BrushState = BRUSH_STATE_MOTION;
- if( MotionCount == DOODLE_MAX_BRUSH_MOTIONS )
- drawList = g_list_append( drawList, ( gpointer )( dx ) );
- drawList = g_list_append( drawList, ( gpointer )( dy ) );
- char* message = goodle_doodle_session_build_draw_string( drawList );
- yahoo_doodle_command_send_draw( ds->gc, ds->who, message );
- // The brush stroke is finished, clear the list for another one
- goodle_doodle_session_destroy_draw_list( drawList );
- int *brush_color = g_new0( int, 1 );
- int *brush_size = g_new0( int, 1 );
- int *x0 = g_new0( int, 1 );
- int *y0 = g_new0( int, 1 );
- *brush_color = ds->brush_color;
- *brush_size = ds->brush_size;
- // Reset motion tracking
- drawList = g_list_append( drawList, ( gpointer )( brush_color ) );
- drawList = g_list_append( drawList, ( gpointer )( brush_size ) );
- drawList = g_list_append( drawList, ( gpointer )( x0 ) );
- drawList = g_list_append( drawList, ( gpointer )( y0 ) );
- drawList = g_list_append( drawList, ( gpointer )( dx ) );
- drawList = g_list_append( drawList, ( gpointer )( dy ) );
- goodle_doodle_session_draw_brush_line( ds->drawing_area, ds,
- ds->brush_color, ds->brush_size );
- // Set tracking variables
-// ------------------------------------------------------------------------------------------------------
-gboolean goodle_doodle_session_brush_up( GtkWidget *widget, GdkEventButton *event, gpointer data )
- doodle_session *ds = ( doodle_session* )( data );
- GdkPixmap *pixmap = ds->pixmap;
- //g_print( "BRUSH_UP | %s\n", ds->who );
- if( ( BrushState != BRUSH_STATE_DOWN ) && ( BrushState != BRUSH_STATE_MOTION ) )
- g_print( "***Bad brush state transition %d to UP\n", BrushState );
- BrushState = BRUSH_STATE_UP;
- 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 ) )
- for( index = 0; index < 2; index++ )
- drawList = g_list_append( drawList, ( gpointer )( x0 ) );
- drawList = g_list_append( drawList, ( gpointer )( y0 ) );
- char* message = goodle_doodle_session_build_draw_string( drawList );
- yahoo_doodle_command_send_draw( ds->gc, ds->who, message );
- goodle_doodle_session_set_canvas_as_icon( ds );
- // The brush stroke is finished, clear the list for another one
- goodle_doodle_session_destroy_draw_list( drawList );
-// ------------------------------------------------------------------------------------------------------
-void goodle_doodle_session_draw_brush_point( GtkWidget *widget, doodle_session *ds,
- int x, int y, int color, int size )
- GdkPixmap *pixmap = ds->pixmap;
- //g_print( "goodle_doodle_session_draw_brush | %s\n", ds->who );
- GdkRectangle update_rect;
- update_rect.x = x - size / 2;
- update_rect.y = y - size / 2;
- update_rect.width = size;
- update_rect.height = size;
- // Interpret and convert color
- GdkGC *gfx_con = gdk_gc_new( pixmap );
- goodle_rgb24_to_rgb48( color, &col );
- gdk_gc_set_rgb_fg_color( gfx_con, &col );
- //gdk_gc_set_rgb_bg_color( gfx_con, &col );
- if( size < DOODLE_BRUSH_MEDIUM )
- // Draw a rectangle/square
- gdk_draw_rectangle( pixmap,
- gfx_con, // color element?
- update_rect.x, update_rect.y,
- update_rect.width, update_rect.height );
- update_rect.x, update_rect.y,
- 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 );
-// ------------------------------------------------------------------------------------------------------
-void goodle_doodle_session_draw_brush_line( GtkWidget *widget, doodle_session *ds,
- int x0, int y0, int x1, int y1, int color, int size )
- gboolean steep = abs( y1 - y0 ) > abs( x1 - x0 );
- temp = x0; x0 = y0; y0 = temp;
- temp = x1; x1 = y1; y1 = temp;
- int dx = abs( x1 - x0 );
- int dy = abs( y1 - y0 );
- goodle_doodle_session_draw_brush_point( widget, ds, y, x, color, size );
- goodle_doodle_session_draw_brush_point( widget, ds, x, y, color, size );
- error = error + derror;
- if( ( error * 2 ) >= dx )
- goodle_doodle_session_draw_brush_point( widget, ds, y, x, color, size );
- goodle_doodle_session_draw_brush_point( widget, ds, x, y, color, size );
// ------------------------------------------------------------------------------------------------------
@@ -1441,26 +874,6 @@
// ------------------------------------------------------------------------------------------------------
-void goodle_doodle_session_destroy_draw_list( GList *d_list )
- // Destroy the contents of this list
- g_list_free( drawList );
-// ------------------------------------------------------------------------------------------------------
char *goodle_doodle_session_build_draw_string( GList *d_list )
@@ -1499,24 +912,6 @@
// ------------------------------------------------------------------------------------------------------
-void goodle_doodle_session_clear_canvas( doodle_session *ds )
- GdkPixmap *pixmap = ds->pixmap;
- GtkWidget *drawing_area = ds->drawing_area;
- gdk_draw_rectangle( pixmap,
- drawing_area->style->white_gc,
- drawing_area->allocation.width, drawing_area->allocation.height );
- gtk_widget_queue_draw_area( drawing_area,
- drawing_area->allocation.width, drawing_area->allocation.height );
-// ------------------------------------------------------------------------------------------------------
void goodle_doodle_session_button_clear_press( GtkWidget *widget, gpointer data )
doodle_session *ds = ( doodle_session* )( data );
@@ -1530,29 +925,5 @@
// ------------------------------------------------------------------------------------------------------
-void goodle_doodle_session_set_canvas_as_icon( doodle_session *ds )
- // Makes an icon from the doodle image
- pixbuf = gdk_pixbuf_get_from_drawable( NULL,
- ( GdkDrawable* )( ds->pixmap ),
- gdk_drawable_get_colormap( ds->pixmap ),
- DOODLE_CANVAS_WIDTH, DOODLE_CANVAS_HEIGHT );
- gtk_window_set_icon( ( GtkWindow* )( ds->window ), pixbuf );
-// ------------------------------------------------------------------------------------------------------
-void goodle_rgb24_to_rgb48( int color_rgb, GdkColor *color )
- color->red = ( color_rgb >> 8 ) | 0xFF;
- color->green = ( color_rgb & 0xFF00 ) | 0xFF;
- color->blue = ( ( color_rgb & 0xFF ) << 8 ) | 0xFF;
-// ------------------------------------------------------------------------------------------------------
--- a/src/protocols/yahoo/yahoo_doodle.h Wed Jul 13 22:02:56 2005 -0400
+++ b/src/protocols/yahoo/yahoo_doodle.h Tue Jul 19 23:14:35 2005 -0400
@@ -22,10 +22,10 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-// DEFINES =============================================================================================
+#ifndef _YAHOO_DOODLE_H_ +#define _YAHOO_DOODLE_H_
+// DEFINES ============================================================================================= // Doodle communication commands
#define DOODLE_CMD_REQUEST 0
@@ -75,45 +75,27 @@
#define DOODLE_MAX_BRUSH_MOTIONS 100
-#define FULL_CIRCLE_DEGREES 23040
-#define BRUSH_STATE_UP 0
-#define BRUSH_STATE_DOWN 1
-#define BRUSH_STATE_MOTION 2
// DATATYPES ===========================================================================================
typedef struct _doodle_session
- int state; // State of Doodle session
- GaimConnection *gc; // Connection associated with this session
- char who[32]; // Name of the remote user
int brush_size; // Size of drawing brush
int brush_color; // Color of drawing brush
- //GtkWidget *window; // Window for the Doodle session
- //GtkWidget *drawing_area; // Drawing area
- //GdkPixmap *pixmap; // Memory for drawing area
// PROTOTYPES ==========================================================================================
void init_plugin( GaimPlugin *plugin );
gboolean goodle_load( GaimPlugin *plugin );
gboolean goodle_unload( GaimPlugin *plugin );
void goodle_destroy( GaimPlugin *plugin ); // void or gboolean?
-GtkWidget *get_config_frame( GaimPlugin *plugin );
void goodle_con_signed_on( GaimConnection *gc, gpointer data );
void goodle_con_signed_off( GaimConnection *gc, gpointer data );
void goodle_conv_created( GaimConversation *conv, gpointer data );
void goodle_conv_destroyed( GaimConversation *conv, gpointer data );
-void goodle_button_press( GtkButton *button, gpointer data );
void yahoo_doodle_process( GaimConnection *gc, char *me, char *from, char *command, char *message );
void yahoo_doodle_command_got_request( GaimConnection *gc, char *from );
@@ -132,31 +114,11 @@
void yahoo_doodle_command_send_confirm( GaimConnection *gc, char *to );
void yahoo_doodle_command_send_shutdown( GaimConnection *gc, char *to );
-doodle_session *yahoo_doodle_session_get( GList *ds_list, char *me, char *who );
-//void goodle_doodle_session_start( doodle_session *ds );
-//void goodle_doodle_session_end( GtkWidget *widget, gpointer data );
-gboolean goodle_doodle_session_configure_event( GtkWidget *widget, GdkEventConfigure *event, gpointer data );
-gboolean goodle_doodle_session_expose_event( GtkWidget *widget, GdkEventExpose *event, gpointer data );
-gboolean goodle_doodle_session_brush_down( GtkWidget *widget, GdkEventButton *event, gpointer data );
-gboolean goodle_doodle_session_brush_motion( GtkWidget *widget, GdkEventMotion *event, gpointer data );
-gboolean goodle_doodle_session_brush_up( GtkWidget *widget, GdkEventButton *event, gpointer data );
+void goodle_doodle_session_start( doodle_session *ds ); -void goodle_doodle_session_draw_brush_point( GtkWidget *widget, doodle_session *ds,
- int x, int y, int color, int size );
-void goodle_doodle_session_draw_brush_line( GtkWidget *widget, doodle_session *ds,
- int x0, int y0, int x1, int y1, int color, int size );
void goodle_doodle_draw_stroke( doodle_session *ds, GList *d_list );
-void goodle_doodle_session_destroy_draw_list( GList *d_list );
char *goodle_doodle_session_build_draw_string( GList *d_list );
-void goodle_doodle_session_clear_canvas( doodle_session *ds );
-void goodle_doodle_session_button_clear_press( GtkWidget *widget, gpointer data );
-void goodle_doodle_session_set_canvas_as_icon( doodle_session *ds );
-void goodle_rgb24_to_rgb48( int color_rgb, GdkColor *color );
-#endif // YAHOO_DOODLE_H
+#endif // _YAHOO_DOODLE_H_