diff --git a/sflphone-gtk/src/actions.c b/sflphone-gtk/src/actions.c index 62f492631f423db60ccd12a4414679e03526cfed..c1587beb633d1a90f2822ced52c0787b4bd2245f 100644 --- a/sflphone-gtk/src/actions.c +++ b/sflphone-gtk/src/actions.c @@ -16,10 +16,12 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - + +#include <gtk/gtk.h> +#include <string.h> + #include <actions.h> #include <accountlist.h> -#include <gtk/gtk.h> /** * Terminate the gtk program @@ -52,10 +54,19 @@ void sflphone_hold(call_t * c ) { c->state = CALL_STATE_HOLD; - update_call_tree(); + update_call_tree(c); screen_clear(); } +/** + * Put the call in Ringing state + */ +void +sflphone_ringing(call_t * c ) +{ + c->state = CALL_STATE_RINGING; + update_call_tree(c); +} /* Fill account list */ @@ -121,7 +132,7 @@ void sflphone_unhold(call_t * c ) { c->state = CALL_STATE_CURRENT; - update_call_tree(); + update_call_tree(c); screen_set_call(c); } @@ -132,7 +143,7 @@ void sflphone_hang_up( call_t * c ) { call_list_remove(c->callID); - update_call_tree(); + update_call_tree_remove(c); screen_clear(); } @@ -143,7 +154,7 @@ void sflphone_current( call_t * c ) { c->state = CALL_STATE_CURRENT; - update_call_tree(); + update_call_tree(c); screen_set_call(c); } @@ -154,7 +165,7 @@ void sflphone_transfert( call_t * c, gchar * to ) { screen_clear(); - update_call_tree(); + update_call_tree_remove(c); } /** @@ -164,7 +175,7 @@ void sflphone_incoming_call (call_t * c) { call_list_add ( c ); - update_call_tree(); + update_call_tree_add(c); } /** * Signal Hung up @@ -173,7 +184,7 @@ void sflphone_hung_up (call_t * c ) { call_list_remove(c->callID); - update_call_tree(); + update_call_tree_remove(c); screen_clear(); } @@ -186,12 +197,32 @@ sflphone_keypad( guint keyval, gchar * key) switch (keyval) { case 65293: /* ENTER */ + case 65421: /* ENTER numpad */ sflphone_place_call(c); break; case 65307: /* ESCAPE */ sflphone_hang_up(c); break; case 65288: /* BACKSPACE */ + { /* Brackets mandatory because of local vars */ + gchar * before = c->to; + if(strlen(c->to) > 1){ + c->to = g_strndup(c->to, strlen(c->to) -1); + g_free(before); + g_print("TO: %s\n", c->to); + + g_free(c->from); + c->from = g_strconcat("\"\" <", c->to, ">", NULL); + screen_set_call(c); + update_call_tree(); + } + else if(strlen(c->to) == 1) + { + sflphone_hang_up(c); + } + + } + break; case 65289: /* TAB */ case 65513: /* ALT */ case 65507: /* CTRL */ diff --git a/sflphone-gtk/src/actions.h b/sflphone-gtk/src/actions.h index 618817d0bf5aa9d5640d87d560f1121e390ea8ec..9d0bec94426807bc8ca4eaf094dd8e5a937524b0 100644 --- a/sflphone-gtk/src/actions.h +++ b/sflphone-gtk/src/actions.h @@ -40,6 +40,8 @@ void sflphone_transfert ( call_t * c, gchar * to ); void sflphone_hold ( call_t * c); +void sflphone_ringing(call_t * c ); + void sflphone_unhold ( call_t * c); /* signals */ diff --git a/sflphone-gtk/src/calllist.h b/sflphone-gtk/src/calllist.h index 2b5bb5085f34fc7a15fb23faaa368d19e6d5b0fd..a878c0206d632a95e4832cecc79c97fed519ccdd 100644 --- a/sflphone-gtk/src/calllist.h +++ b/sflphone-gtk/src/calllist.h @@ -25,7 +25,8 @@ typedef enum { CALL_STATE_INVALID = 0, - CALL_STATE_INCOMING, + CALL_STATE_INCOMING, /* Ringing incoming call */ + CALL_STATE_RINGING, /* Ringing outgoing call */ CALL_STATE_CURRENT, CALL_STATE_DIALING, CALL_STATE_HOLD diff --git a/sflphone-gtk/src/calltree.c b/sflphone-gtk/src/calltree.c index 8191e21d0d903864af74a79195c7949a44638707..3afe9fc3ccc3295496cd261d28751f3d76ac9d06 100644 --- a/sflphone-gtk/src/calltree.c +++ b/sflphone-gtk/src/calltree.c @@ -22,59 +22,75 @@ #include <calllist.h> GtkListStore * store; -GtkWidget * acceptButton; -GtkWidget * refuseButton; -GtkWidget * unholdButton; -GtkWidget * holdButton; +GtkWidget *view; + GtkWidget * callButton; GtkWidget * hangupButton; +GtkWidget * holdButton; GtkWidget * transfertButton; +GtkWidget * unholdButton; call_t * selectedCall; - /** - * Hold the line + * Make a call */ static void -hold( GtkWidget *widget, gpointer data ) +call_button( GtkWidget *widget, gpointer data ) { - call_t * c = (call_t*) call_list_get_by_state (CALL_STATE_CURRENT); - if(c) + if(selectedCall) { - dbus_hold (c); + switch(selectedCall->state) + { + case CALL_STATE_DIALING: + dbus_place_call (selectedCall); + break; + case CALL_STATE_INCOMING: + dbus_accept (selectedCall); + break; + } } - - } /** - * Make a call + * Hang up the line */ static void -place_call( GtkWidget *widget, gpointer data ) +hang_up( GtkWidget *widget, gpointer data ) { - call_t * c = (call_t*) call_list_get_by_state (CALL_STATE_DIALING); - if(c) + if(selectedCall) { - sflphone_place_call(c); + switch(selectedCall->state) + { + case CALL_STATE_CURRENT: + case CALL_STATE_HOLD: + case CALL_STATE_DIALING: + dbus_hang_up (selectedCall); + break; + case CALL_STATE_INCOMING: + dbus_refuse (selectedCall); + break; + } } } /** - * Hang up the line + * Hold the line */ static void -hang_up( GtkWidget *widget, gpointer data ) +hold( GtkWidget *widget, gpointer data ) { - call_t * c = (call_t*) call_list_get_by_state (CALL_STATE_CURRENT); - if(c) + if(selectedCall) { - dbus_hang_up(c); + switch(selectedCall->state) + { + case CALL_STATE_CURRENT: + dbus_hold (selectedCall); + break; + } } } - /** * Transfert the line */ @@ -88,45 +104,63 @@ transfert( GtkWidget *widget, gpointer data ) } } -/* Call back when the user click on a call in the list */ +/** + * Refuse incoming call + */ static void -selected(GtkTreeSelection *sel, GtkTreeModel *model) +refuse( GtkWidget *widget, gpointer data ) { - GtkTreeIter iter; - GValue val; - - if (! gtk_tree_selection_get_selected (sel, &model, &iter)) - return; - - val.g_type = G_TYPE_POINTER; - gtk_tree_model_get_value (model, &iter, 2, &val); - - selectedCall = (call_t*) g_value_get_pointer(&val); - g_value_unset(&val); + if(selectedCall) + { + dbus_refuse(selectedCall); + } +} + +/** + * Unhold call + */ +static void +unhold( GtkWidget *widget, gpointer data ) +{ + if(selectedCall) + { + switch(selectedCall->state) + { + case CALL_STATE_HOLD: + dbus_unhold (selectedCall); + break; + } + } +} +void +update_buttons () +{ + gtk_widget_set_sensitive( GTK_WIDGET(callButton), FALSE); + gtk_widget_set_sensitive( GTK_WIDGET(hangupButton), FALSE); + gtk_widget_set_sensitive( GTK_WIDGET(holdButton), FALSE); + gtk_widget_set_sensitive( GTK_WIDGET(transfertButton), FALSE); + gtk_widget_set_sensitive( GTK_WIDGET(unholdButton), FALSE); if(selectedCall) { if( selectedCall->state == CALL_STATE_INCOMING) { - gtk_widget_set_sensitive( GTK_WIDGET(acceptButton), TRUE); - gtk_widget_set_sensitive( GTK_WIDGET(refuseButton), TRUE); - gtk_widget_set_sensitive( GTK_WIDGET(unholdButton), FALSE); - + gtk_widget_set_sensitive( GTK_WIDGET(callButton), TRUE); + gtk_widget_set_sensitive( GTK_WIDGET(hangupButton), TRUE); } else if( selectedCall->state == CALL_STATE_HOLD) { - gtk_widget_set_sensitive( GTK_WIDGET(acceptButton), FALSE); - gtk_widget_set_sensitive( GTK_WIDGET(refuseButton), FALSE); - gtk_widget_set_sensitive( GTK_WIDGET(unholdButton), TRUE); + gtk_widget_set_sensitive( GTK_WIDGET(hangupButton), TRUE); + gtk_widget_set_sensitive( GTK_WIDGET(unholdButton), TRUE); + } + else if( selectedCall->state == CALL_STATE_RINGING) + { + gtk_widget_set_sensitive( GTK_WIDGET(hangupButton), TRUE); } else if(selectedCall->state == CALL_STATE_DIALING) { - /*gtk_widget_hide( hangupButton ); - gtk_widget_show( callButton ); gtk_widget_set_sensitive( GTK_WIDGET(callButton), TRUE); - gtk_widget_set_sensitive( GTK_WIDGET(hangupButton), FALSE); - gtk_widget_set_sensitive( GTK_WIDGET(holdButton), FALSE); - gtk_widget_set_sensitive( GTK_WIDGET(transfertButton), FALSE);*/ + gtk_widget_set_sensitive( GTK_WIDGET(hangupButton), TRUE); } else if (selectedCall->state == CALL_STATE_CURRENT) { @@ -136,14 +170,30 @@ selected(GtkTreeSelection *sel, GtkTreeModel *model) //gtk_box_pack_start (GTK_BOX (hbox), hangupButton, TRUE /*expand*/, TRUE /*fill*/, 10 /*padding*/); //gtk_box_reorder_child(GTK_BOX (hbox), hangupButton, 0); gtk_widget_show( hangupButton ); - gtk_widget_set_sensitive( GTK_WIDGET(callButton), FALSE); gtk_widget_set_sensitive( GTK_WIDGET(hangupButton), TRUE); gtk_widget_set_sensitive( GTK_WIDGET(holdButton), TRUE); gtk_widget_set_sensitive( GTK_WIDGET(transfertButton), TRUE); } } +} +/* Call back when the user click on a call in the list */ +static void +selected(GtkTreeSelection *sel, GtkTreeModel *model) +{ + GtkTreeIter iter; + GValue val; + + if (! gtk_tree_selection_get_selected (sel, &model, &iter)) + return; + + val.g_type = G_TYPE_POINTER; + gtk_tree_model_get_value (model, &iter, 2, &val); + + selectedCall = (call_t*) g_value_get_pointer(&val); + g_value_unset(&val); + update_buttons(); } /** @@ -158,36 +208,13 @@ accept( GtkWidget *widget, gpointer data ) } } -/** - * Refuse incoming call - */ -static void -refuse( GtkWidget *widget, gpointer data ) -{ - if(selectedCall) - { - dbus_refuse(selectedCall); - } -} -/** - * Unhold call - */ -static void -unhold( GtkWidget *widget, gpointer data ) -{ - if(selectedCall) - { - dbus_unhold(selectedCall); - } -} GtkWidget * create_call_tree (){ GtkWidget *ret; GtkWidget *sw; GtkWidget *hbox; - GtkWidget *view; GtkWidget *image; GtkWidget *bbox; GtkCellRenderer *rend; @@ -199,10 +226,9 @@ create_call_tree (){ gtk_container_set_border_width (GTK_CONTAINER (ret), 0); sw = gtk_scrolled_window_new( NULL, NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); - gtk_box_pack_start(GTK_BOX(ret), sw, TRUE, TRUE, 0); store = gtk_list_store_new (3, GDK_TYPE_PIXBUF,// Icon G_TYPE_STRING, // Description @@ -213,9 +239,6 @@ create_call_tree (){ view = gtk_tree_view_new_with_model (GTK_TREE_MODEL(store)); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(view), FALSE); - /*g_signal_connect(G_OBJECT(rend), "toggled", - G_CALLBACK(module_toggled), module_store);*/ - rend = gtk_cell_renderer_pixbuf_new(); col = gtk_tree_view_column_new_with_attributes ("Icon", rend, @@ -238,163 +261,224 @@ create_call_tree (){ store); /* Action button */ - hbox = gtk_hbutton_box_new (); - gtk_button_box_set_spacing ( hbox, 10); + hbox = gtk_hbox_new (FALSE, 5); + gtk_button_box_set_spacing ( hbox, 5); gtk_button_box_set_layout ( GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_START); - acceptButton = gtk_button_new_with_label ("Accept"); - image = gtk_image_new_from_file( PIXMAPS_DIR "/accept.svg"); - gtk_image_set_pixel_size(GTK_IMAGE(image), 16); - gtk_button_set_image(GTK_BUTTON(acceptButton), image); - gtk_widget_set_state( GTK_WIDGET(acceptButton), GTK_STATE_INSENSITIVE); - gtk_box_pack_start (GTK_BOX (hbox), acceptButton, TRUE /*expand*/, TRUE /*fill*/, 10 /*padding*/); - g_signal_connect (G_OBJECT (acceptButton), "clicked", - G_CALLBACK (accept), NULL); - - refuseButton = gtk_button_new_with_label ("Refuse"); - image = gtk_image_new_from_file( PIXMAPS_DIR "/refuse.svg"); - gtk_button_set_image(GTK_BUTTON(refuseButton), image); - gtk_widget_set_state( GTK_WIDGET(refuseButton), GTK_STATE_INSENSITIVE); - gtk_box_pack_start (GTK_BOX (hbox), refuseButton, TRUE /*expand*/, TRUE /*fill*/, 10 /*padding*/); - g_signal_connect (G_OBJECT (refuseButton), "clicked", - G_CALLBACK (refuse), NULL); - - unholdButton = gtk_button_new_with_label ("Unhold"); - image = gtk_image_new_from_file( PIXMAPS_DIR "/unhold.svg"); - gtk_button_set_image(GTK_BUTTON(unholdButton), image); - gtk_widget_set_state( GTK_WIDGET(unholdButton), GTK_STATE_INSENSITIVE); - gtk_box_pack_start (GTK_BOX (hbox), unholdButton, TRUE /*expand*/, TRUE /*fill*/, 10 /*padding*/); - g_signal_connect (G_OBJECT (unholdButton), "clicked", - G_CALLBACK (unhold), NULL); - - gtk_box_pack_start (GTK_BOX (ret), hbox, FALSE /*expand*/, TRUE /*fill*/, 0 /*padding*/); - - /* 2nd row */ - hbox = gtk_hbutton_box_new (); - gtk_button_box_set_spacing ( GTK_BUTTON_BOX(hbox), 10); - gtk_button_box_set_layout ( GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_START); - - callButton = gtk_button_new_with_label ("Call"); + callButton = gtk_button_new (); gtk_widget_set_state( GTK_WIDGET(callButton), GTK_STATE_INSENSITIVE); image = gtk_image_new_from_file( PIXMAPS_DIR "/call.svg"); gtk_button_set_image(GTK_BUTTON(callButton), image); //gtk_button_set_image_position( button, GTK_POS_TOP); - gtk_box_pack_start (GTK_BOX (hbox), callButton, TRUE /*expand*/, TRUE /*fill*/, 10 /*padding*/); + gtk_box_pack_start (GTK_BOX (hbox), callButton, FALSE /*expand*/, FALSE /*fill*/, 0 /*padding*/); g_signal_connect (G_OBJECT (callButton), "clicked", - G_CALLBACK (place_call), NULL); + G_CALLBACK (call_button), NULL); - hangupButton = gtk_button_new_with_label ("Hang up"); + hangupButton = gtk_button_new (); gtk_widget_hide( hangupButton ); gtk_widget_set_state( GTK_WIDGET(hangupButton), GTK_STATE_INSENSITIVE); - gtk_box_pack_end (GTK_BOX (hbox), hangupButton, TRUE /*expand*/, TRUE /*fill*/, 10 /*padding*/); + gtk_box_pack_start (GTK_BOX (hbox), hangupButton, FALSE /*expand*/, FALSE /*fill*/, 0 /*padding*/); image = gtk_image_new_from_file( PIXMAPS_DIR "/hang_up.svg"); gtk_button_set_image(GTK_BUTTON(hangupButton), image); //gtk_button_set_image_position( button, GTK_POS_TOP); g_signal_connect (G_OBJECT (hangupButton), "clicked", G_CALLBACK (hang_up), NULL); - - holdButton = gtk_button_new_with_label ("Hold"); - gtk_widget_set_state( GTK_WIDGET(holdButton), GTK_STATE_INSENSITIVE); + + unholdButton = gtk_button_new (); + image = gtk_image_new_from_file( PIXMAPS_DIR "/unhold.svg"); + gtk_button_set_image(GTK_BUTTON(unholdButton), image); + gtk_widget_set_state( GTK_WIDGET(unholdButton), GTK_STATE_INSENSITIVE); + gtk_box_pack_end (GTK_BOX (hbox), unholdButton, FALSE /*expand*/, FALSE /*fill*/, 0 /*padding*/); + g_signal_connect (G_OBJECT (unholdButton), "clicked", + G_CALLBACK (unhold), NULL); + + holdButton = gtk_button_new (); image = gtk_image_new_from_file( PIXMAPS_DIR "/hold.svg"); - gtk_box_pack_end (GTK_BOX (hbox), holdButton, TRUE /*expand*/, TRUE /*fill*/, 10 /*padding*/); gtk_button_set_image(GTK_BUTTON(holdButton), image); + gtk_widget_set_state( GTK_WIDGET(holdButton), GTK_STATE_INSENSITIVE); + gtk_box_pack_end (GTK_BOX (hbox), holdButton, FALSE /*expand*/, FALSE /*fill*/, 0 /*padding*/); g_signal_connect (G_OBJECT (holdButton), "clicked", G_CALLBACK (hold), NULL); - transfertButton = gtk_button_new_with_label ("Transfert"); - gtk_widget_set_state( GTK_WIDGET(transfertButton), GTK_STATE_INSENSITIVE); + transfertButton = gtk_button_new (); image = gtk_image_new_from_file( PIXMAPS_DIR "/transfert.svg"); gtk_button_set_image(GTK_BUTTON(transfertButton), image); - gtk_box_pack_end (GTK_BOX (hbox), transfertButton, TRUE /*expand*/, TRUE /*fill*/, 10 /*padding*/); + gtk_widget_set_state( GTK_WIDGET(transfertButton), GTK_STATE_INSENSITIVE); + gtk_box_pack_end (GTK_BOX (hbox), transfertButton, FALSE /*expand*/, FALSE /*fill*/, 0 /*padding*/); g_signal_connect (G_OBJECT (transfertButton), "clicked", G_CALLBACK (transfert), NULL); - - - - gtk_box_pack_start (GTK_BOX (ret), hbox, FALSE /*expand*/, TRUE /*fill*/, 0 /*padding*/); - + + gtk_box_pack_start (GTK_BOX (ret), hbox, FALSE /*expand*/, FALSE /*fill*/, 0 /*padding*/); + gtk_box_pack_start(GTK_BOX(ret), sw, TRUE, TRUE, 0); + gtk_widget_show(ret); return ret; } - void -update_call_tree () +update_call_tree_remove (call_t * c) { - GdkPixbuf *pixbuf; + GtkTreeIter iter; + GValue val; + call_t * iterCall; + + val.g_type = G_TYPE_POINTER; + gtk_tree_model_get_value (GTK_TREE_MODEL(store), &iter, 2, &val); + + iterCall = (call_t*) g_value_get_pointer(&val); + g_value_unset(&val); + + int nbChild = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store), NULL); + int i; + for( i = 0; i < nbChild; i++) + { + if(gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store), &iter, NULL, i)) + { + val.g_type = G_TYPE_POINTER; + gtk_tree_model_get_value (GTK_TREE_MODEL(store), &iter, 2, &val); + + iterCall = (call_t*) g_value_get_pointer(&val); + g_value_unset(&val); + + if(iterCall == c) + { + gtk_list_store_remove(store, &iter); + } + } + } + if(selectedCall == c) + selectedCall = NULL; + update_buttons(); +} - gtk_list_store_clear(store); +void +update_call_tree (call_t * c) +{ + GdkPixbuf *pixbuf; + GtkTreeIter iter; + GValue val; + call_t * iterCall; + + val.g_type = G_TYPE_POINTER; + gtk_tree_model_get_value (GTK_TREE_MODEL(store), &iter, 2, &val); + + iterCall = (call_t*) g_value_get_pointer(&val); + g_value_unset(&val); + + int nbChild = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store), NULL); int i; - for( i = 0; i < call_list_get_size(); i++) + for( i = 0; i < nbChild; i++) { - call_t * c = call_list_get_nth (i); - if (c) - { - gchar * markup; - if (c->state == CALL_STATE_CURRENT) - { - markup = g_markup_printf_escaped("<big><b>%s</b></big>\n" - "%s", - call_get_name(c), - call_get_number(c)); - } - else - { - markup = g_markup_printf_escaped("<b>%s</b>\n" - "%s", - call_get_name(c), - call_get_number(c)); - } - - gtk_list_store_append (store, &iter); - - if (c->state == CALL_STATE_HOLD) - { - pixbuf = gdk_pixbuf_new_from_file(PIXMAPS_DIR "/hold.svg", NULL); - } - else if (c->state == CALL_STATE_INCOMING) - { - pixbuf = gdk_pixbuf_new_from_file(PIXMAPS_DIR "/ring.svg", NULL); - } - else if (c->state == CALL_STATE_CURRENT) - { - pixbuf = gdk_pixbuf_new_from_file(PIXMAPS_DIR "/current.svg", NULL); - } - else if (c->state == CALL_STATE_DIALING) - { - pixbuf = gdk_pixbuf_new_from_file(PIXMAPS_DIR "/dial.svg", NULL); - } - //Resize it - if(pixbuf) + if(gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store), &iter, NULL, i)) + { + val.g_type = G_TYPE_POINTER; + gtk_tree_model_get_value (GTK_TREE_MODEL(store), &iter, 2, &val); + + iterCall = (call_t*) g_value_get_pointer(&val); + g_value_unset(&val); + + if(iterCall == c) { - if(gdk_pixbuf_get_width(pixbuf) > 32 || gdk_pixbuf_get_height(pixbuf) > 32) + // Existing call in the list + gchar * markup; + if (c->state == CALL_STATE_CURRENT) + { + markup = g_markup_printf_escaped("<big><b>%s</b></big>\n" + "%s", + call_get_name(c), + call_get_number(c)); + } + else + { + markup = g_markup_printf_escaped("<b>%s</b>\n" + "%s", + call_get_name(c), + call_get_number(c)); + } + + gtk_list_store_set (store, &iter); + + if (c->state == CALL_STATE_HOLD) + { + pixbuf = gdk_pixbuf_new_from_file(PIXMAPS_DIR "/hold.svg", NULL); + } + else if (c->state == CALL_STATE_RINGING) + { + pixbuf = gdk_pixbuf_new_from_file(PIXMAPS_DIR "/ring.svg", NULL); + } + else if (c->state == CALL_STATE_CURRENT) + { + pixbuf = gdk_pixbuf_new_from_file(PIXMAPS_DIR "/current.svg", NULL); + } + //Resize it + if(pixbuf) { - pixbuf = gdk_pixbuf_scale_simple(pixbuf, 32, 32, GDK_INTERP_BILINEAR); + if(gdk_pixbuf_get_width(pixbuf) > 32 || gdk_pixbuf_get_height(pixbuf) > 32) + { + pixbuf = gdk_pixbuf_scale_simple(pixbuf, 32, 32, GDK_INTERP_BILINEAR); + } } - } - gtk_list_store_set(store, &iter, - 0, pixbuf, // Icon - 1, markup, // Description - 2, c, // Pointer - -1); - - if (pixbuf != NULL) - g_object_unref(G_OBJECT(pixbuf)); - - //g_free(markup); - - } + gtk_list_store_set(store, &iter, + 0, pixbuf, // Icon + 1, markup, // Description + 2, c, // Pointer + -1); + + if (pixbuf != NULL) + g_object_unref(G_OBJECT(pixbuf)); + + } + } } - - gtk_widget_set_sensitive( GTK_WIDGET(acceptButton), FALSE); - gtk_widget_set_sensitive( GTK_WIDGET(refuseButton), FALSE); - gtk_widget_set_sensitive( GTK_WIDGET(unholdButton), FALSE); - gtk_widget_set_sensitive( GTK_WIDGET(callButton), FALSE); - gtk_widget_set_sensitive( GTK_WIDGET(hangupButton), FALSE); - gtk_widget_set_sensitive( GTK_WIDGET(holdButton), FALSE); - //gtk_widget_set_sensitive( GTK_WIDGET(transfertButton), FALSE); + update_buttons(); //return row_ref; + +} + +void +update_call_tree_add (call_t * c) +{ + GdkPixbuf *pixbuf; + GtkTreeIter iter; + + // New call in the list + gchar * markup; + markup = g_markup_printf_escaped("<b>%s</b>\n" + "%s", + call_get_name(c), + call_get_number(c)); + + gtk_list_store_append (store, &iter); + + if (c->state == CALL_STATE_INCOMING) + { + pixbuf = gdk_pixbuf_new_from_file(PIXMAPS_DIR "/ring.svg", NULL); + } + else if (c->state == CALL_STATE_DIALING) + { + pixbuf = gdk_pixbuf_new_from_file(PIXMAPS_DIR "/dial.svg", NULL); + } + //Resize it + if(pixbuf) + { + if(gdk_pixbuf_get_width(pixbuf) > 32 || gdk_pixbuf_get_height(pixbuf) > 32) + { + pixbuf = gdk_pixbuf_scale_simple(pixbuf, 32, 32, GDK_INTERP_BILINEAR); + } + } + gtk_list_store_set(store, &iter, + 0, pixbuf, // Icon + 1, markup, // Description + 2, c, // Pointer + -1); + + if (pixbuf != NULL) + g_object_unref(G_OBJECT(pixbuf)); + + //g_free(markup); + + update_buttons(); } diff --git a/sflphone-gtk/src/dbus.c b/sflphone-gtk/src/dbus.c index db378da4ed717afd3f55182814bfa48179c1b191..a47121bb2fb1d469b63cc8c0f03ac48801788067 100644 --- a/sflphone-gtk/src/dbus.c +++ b/sflphone-gtk/src/dbus.c @@ -91,7 +91,7 @@ call_state_cb (DBusGProxy *proxy, } else if ( strcmp(state, "RINGING") == 0 ) { - //sflphone_hung_up (c); + sflphone_ringing (c); } else if ( strcmp(state, "CURRENT") == 0 ) { diff --git a/sflphone-gtk/src/mainwindow.c b/sflphone-gtk/src/mainwindow.c index bc29f38928912b35e5d08412c3312c4cfc2e1c37..4626e2dca2f1704dca25a35bcf1bd5a238439afd 100644 --- a/sflphone-gtk/src/mainwindow.c +++ b/sflphone-gtk/src/mainwindow.c @@ -106,7 +106,7 @@ create_main_window () window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_container_set_border_width (GTK_CONTAINER (window), 0); gtk_window_set_title (GTK_WINDOW (window), PACKAGE); - gtk_window_set_default_size (GTK_WINDOW (window), 200, 50); + gtk_window_set_default_size (GTK_WINDOW (window), 250, 250); gtk_window_set_default_icon_from_file (PIXMAPS_DIR "/sflphone.png", NULL); @@ -128,8 +128,8 @@ create_main_window () * and spacing settings */ vbox = gtk_vbox_new ( FALSE /*homogeneous*/, 0 /*spacing*/); - subvbox = gtk_vbox_new ( FALSE /*homogeneous*/, 10 /*spacing*/); - gtk_container_set_border_width (GTK_CONTAINER(subvbox), 10); + subvbox = gtk_vbox_new ( FALSE /*homogeneous*/, 5 /*spacing*/); + gtk_container_set_border_width (GTK_CONTAINER(subvbox), 5); button = create_menus(); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE /*expand*/, TRUE /*fill*/, 0 /*padding*/); @@ -138,9 +138,12 @@ create_main_window () button = create_screen(); gtk_box_pack_start (GTK_BOX (subvbox), button, FALSE /*expand*/, TRUE /*fill*/, 0 /*padding*/); - gtk_box_pack_start (GTK_BOX (subvbox), create_dialpad(), FALSE /*expand*/, TRUE /*fill*/, 0 /*padding*/); + //gtk_box_pack_start (GTK_BOX (subvbox), create_dialpad(), FALSE /*expand*/, TRUE /*fill*/, 0 /*padding*/); gtk_box_pack_start (GTK_BOX (subvbox), create_call_tree(), TRUE /*expand*/, TRUE /*fill*/, 0 /*padding*/); + /* Status bar */ + gtk_box_pack_start (GTK_BOX (vbox), gtk_statusbar_new(), FALSE /*expand*/, TRUE /*fill*/, 0 /*padding*/); + gtk_container_add (GTK_CONTAINER (window), vbox); /* make sure that everything, window and label, are visible */ diff --git a/sflphone-gtk/src/menus.c b/sflphone-gtk/src/menus.c index a04d1e620ccbef93bb881bb62f513da4b68f9c12..59883ed2cae59a00c466a2af4a3a6fe4ae637cd8 100644 --- a/sflphone-gtk/src/menus.c +++ b/sflphone-gtk/src/menus.c @@ -167,6 +167,35 @@ create_debug_menu() } /* ----------------------------------------------------------------- */ GtkWidget * +create_view_menu() +{ + GtkWidget * menu; + GtkWidget * root_menu; + GtkWidget * menu_items; + + menu = gtk_menu_new (); + + menu_items = gtk_menu_item_new_with_label ("Show Dialpad"); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items); + g_signal_connect_swapped (G_OBJECT (menu_items), "activate", + G_CALLBACK (debug_hang_up), + NULL); + gtk_widget_show (menu_items); + + /*menu_items = gtk_menu_item_new_with_label ("Transfert current call"); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items); + g_signal_connect_swapped (G_OBJECT (menu_items), "activate", + G_CALLBACK (debug_transfert), + NULL); + gtk_widget_show (menu_items);*/ + + root_menu = gtk_menu_item_new_with_mnemonic ("_View"); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (root_menu), menu); + + return root_menu; +} +/* ----------------------------------------------------------------- */ +GtkWidget * create_menus ( ) { @@ -178,6 +207,9 @@ create_menus ( ) root_menu = create_call_menu(); gtk_menu_shell_append (GTK_MENU_SHELL (menu_bar), root_menu); + + root_menu = create_view_menu(); + gtk_menu_shell_append (GTK_MENU_SHELL (menu_bar), root_menu); #ifdef DEBUG root_menu = create_debug_menu();