diff --git a/sflphone-gtk/src/actions.c b/sflphone-gtk/src/actions.c index e29310cd159edddb3bbf9c30733bbebf18e42021..169f0729049337233d99d414dff5f3258e48c485 100644 --- a/sflphone-gtk/src/actions.c +++ b/sflphone-gtk/src/actions.c @@ -22,6 +22,7 @@ #include <calltree.h> #include <dbus.h> #include <mainwindow.h> +#include <menus.h> #include <screen.h> #include <statusicon.h> @@ -57,6 +58,7 @@ sflphone_hold(call_t * c ) { c->state = CALL_STATE_HOLD; update_call_tree(c); + update_menus(); screen_clear(); } @@ -65,6 +67,7 @@ sflphone_ringing(call_t * c ) { c->state = CALL_STATE_RINGING; update_call_tree(c); + update_menus(); } @@ -125,18 +128,99 @@ sflphone_init() } void -sflphone_hang_up( call_t * c ) +sflphone_hang_up() { - call_list_remove(c->callID); - update_call_tree_remove(c); - screen_clear(); + call_t * selectedCall = call_get_selected(); + if(selectedCall) + { + switch(selectedCall->state) + { + case CALL_STATE_CURRENT: + case CALL_STATE_HOLD: + case CALL_STATE_DIALING: + case CALL_STATE_RINGING: + case CALL_STATE_BUSY: + case CALL_STATE_FAILURE: + dbus_hang_up (selectedCall); + break; + case CALL_STATE_INCOMING: + dbus_refuse (selectedCall); + break; + default: + g_warning("Should not happen!"); + break; + } + } } + +void +sflphone_pick_up() +{ + call_t * selectedCall = call_get_selected(); + if(selectedCall) + { + switch(selectedCall->state) + { + case CALL_STATE_DIALING: + sflphone_place_call (selectedCall); + break; + case CALL_STATE_INCOMING: + dbus_accept (selectedCall); + break; + case CALL_STATE_HOLD: + dbus_unhold (selectedCall); + break; + default: + g_warning("Should not happen!"); + break; + } + } +} + +void +sflphone_on_hold () +{ + call_t * selectedCall = call_get_selected(); + if(selectedCall) + { + switch(selectedCall->state) + { + case CALL_STATE_CURRENT: + dbus_hold (selectedCall); + break; + default: + g_error("Should not happen!"); + break; + } + } +} + +void +sflphone_off_hold () +{ + call_t * selectedCall = call_get_selected(); + if(selectedCall) + { + switch(selectedCall->state) + { + case CALL_STATE_HOLD: + dbus_unhold (selectedCall); + break; + default: + g_error("Should not happen!"); + break; + } + } +} + + void sflphone_fail( call_t * c ) { c->state = CALL_STATE_FAILURE; update_call_tree(c); + update_menus(); screen_set_call(c); } @@ -145,6 +229,7 @@ sflphone_busy( call_t * c ) { c->state = CALL_STATE_BUSY; update_call_tree(c); + update_menus(); screen_set_call(c); } @@ -153,6 +238,7 @@ sflphone_current( call_t * c ) { c->state = CALL_STATE_CURRENT; update_call_tree(c); + update_menus(); screen_set_call(c); } @@ -161,6 +247,7 @@ sflphone_transfert( call_t * c, gchar * to ) { screen_clear(); update_call_tree_remove(c); + update_menus(); } void @@ -169,6 +256,7 @@ sflphone_incoming_call (call_t * c) call_list_add ( c ); status_icon_unminimize(); update_call_tree_add(c); + update_menus(); } void @@ -176,6 +264,7 @@ sflphone_hung_up (call_t * c ) { call_list_remove(c->callID); update_call_tree_remove(c); + update_menus(); screen_clear(); } diff --git a/sflphone-gtk/src/actions.h b/sflphone-gtk/src/actions.h index 97b3368f5d03160ebb552b77ba932f443c2778fe..a18959ca2a2cfe2f6fa9391ac67faee16c649767 100644 --- a/sflphone-gtk/src/actions.h +++ b/sflphone-gtk/src/actions.h @@ -43,9 +43,18 @@ gboolean sflphone_init ( ) ; gboolean sflphone_quit ( ) ; /** - * Hang up the call + * Hang up / refuse the current call */ -void sflphone_hang_up ( call_t * c); +void sflphone_hang_up (); + +void sflphone_on_hold (); +void sflphone_off_hold (); + + +/** + * Accept / dial the current call + */ +void sflphone_pick_up (); /** * Transfert the call @@ -53,7 +62,7 @@ void sflphone_hang_up ( call_t * c); void sflphone_transfert ( call_t * c, gchar * to ); /** - * Put the call on hold + * Put the call on hold state */ void sflphone_hold ( call_t * c); @@ -71,7 +80,7 @@ void sflphone_fail( call_t * c ); void sflphone_current ( call_t * c); /** - * The callee has hung up + * The callee has hung up */ void sflphone_hung_up( call_t * c); diff --git a/sflphone-gtk/src/calltree.c b/sflphone-gtk/src/calltree.c index 4b10bc5f3029013bef2fd69d47469b4d3d6798a2..21b6a028b8413681516db780287ffe89a02cf237 100644 --- a/sflphone-gtk/src/calltree.c +++ b/sflphone-gtk/src/calltree.c @@ -38,22 +38,7 @@ GtkWidget * unholdButton; static void call_button( GtkWidget *widget, gpointer data ) { - call_t * selectedCall = call_get_selected(); - if(selectedCall) - { - switch(selectedCall->state) - { - case CALL_STATE_DIALING: - sflphone_place_call (selectedCall); - break; - case CALL_STATE_INCOMING: - dbus_accept (selectedCall); - break; - default: - g_error("Should not happen!"); - break; - } - } + sflphone_pick_up(); } /** @@ -62,25 +47,7 @@ call_button( GtkWidget *widget, gpointer data ) static void hang_up( GtkWidget *widget, gpointer data ) { - call_t * selectedCall = call_get_selected(); - if(selectedCall) - { - switch(selectedCall->state) - { - case CALL_STATE_CURRENT: - case CALL_STATE_HOLD: - case CALL_STATE_DIALING: - case CALL_STATE_RINGING: - dbus_hang_up (selectedCall); - break; - case CALL_STATE_INCOMING: - dbus_refuse (selectedCall); - break; - default: - g_error("Should not happen!"); - break; - } - } + sflphone_hang_up(); } /** @@ -89,19 +56,7 @@ hang_up( GtkWidget *widget, gpointer data ) static void hold( GtkWidget *widget, gpointer data ) { - call_t * selectedCall = call_get_selected(); - if(selectedCall) - { - switch(selectedCall->state) - { - case CALL_STATE_CURRENT: - dbus_hold (selectedCall); - break; - default: - g_error("Should not happen!"); - break; - } - } + sflphone_on_hold(); } /** @@ -123,20 +78,9 @@ transfert( GtkWidget *widget, gpointer data ) static void unhold( GtkWidget *widget, gpointer data ) { - call_t * selectedCall = call_get_selected(); - if(selectedCall) - { - switch(selectedCall->state) - { - case CALL_STATE_HOLD: - dbus_unhold (selectedCall); - break; - default: - g_error("Should not happen!"); - break; - } - } + sflphone_off_hold(); } + void update_buttons () { diff --git a/sflphone-gtk/src/menus.c b/sflphone-gtk/src/menus.c index e812ed86081679b5741f150d3a020c0fba8f5541..1edd6e0ea5ff64b41a83ed783877153d4b10632c 100644 --- a/sflphone-gtk/src/menus.c +++ b/sflphone-gtk/src/menus.c @@ -23,6 +23,52 @@ #include <actions.h> #include <mainwindow.h> #include <configwindow.h> + +GtkWidget * pickUpMenu; +GtkWidget * hangUpMenu; +GtkWidget * holdMenu; + +void update_menus() +{ + gtk_widget_set_sensitive( GTK_WIDGET(pickUpMenu), FALSE); + gtk_widget_set_sensitive( GTK_WIDGET(hangUpMenu), FALSE); + gtk_widget_set_sensitive( GTK_WIDGET(holdMenu), FALSE); + + call_t * selectedCall = call_get_selected(); + if (selectedCall) + { + switch(selectedCall->state) + { + case CALL_STATE_INCOMING: + gtk_widget_set_sensitive( GTK_WIDGET(pickUpMenu), TRUE); + gtk_widget_set_sensitive( GTK_WIDGET(hangUpMenu), TRUE); + break; + case CALL_STATE_HOLD: + gtk_widget_set_sensitive( GTK_WIDGET(hangUpMenu), TRUE); + gtk_widget_set_sensitive( GTK_WIDGET(holdMenu), TRUE); + break; + case CALL_STATE_RINGING: + gtk_widget_set_sensitive( GTK_WIDGET(pickUpMenu), TRUE); + gtk_widget_set_sensitive( GTK_WIDGET(hangUpMenu), TRUE); + break; + case CALL_STATE_DIALING: + gtk_widget_set_sensitive( GTK_WIDGET(pickUpMenu), TRUE); + gtk_widget_set_sensitive( GTK_WIDGET(hangUpMenu), TRUE); + break; + case CALL_STATE_CURRENT: + gtk_widget_set_sensitive( GTK_WIDGET(hangUpMenu), TRUE); + gtk_widget_set_sensitive( GTK_WIDGET(holdMenu), TRUE); + break; + case CALL_STATE_BUSY: + case CALL_STATE_FAILURE: + gtk_widget_set_sensitive( GTK_WIDGET(hangUpMenu), TRUE); + break; + default: + g_error("Should not happen!"); + break; + } + } +} /* ----------------------------------------------------------------- */ void help_about ( void * foo) @@ -95,6 +141,31 @@ call_preferences ( void * foo) show_config_window(); } +void +call_hold (void* foo) +{ + if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(holdMenu))) + { + sflphone_on_hold(); + } + else + { + sflphone_off_hold(); + } +} + +void +call_pick_up ( void * foo) +{ + sflphone_pick_up(); +} + +void +call_hang_up ( void * foo) +{ + sflphone_hang_up(); +} + GtkWidget * create_call_menu() { @@ -104,13 +175,36 @@ create_call_menu() menu = gtk_menu_new (); - menu_items = gtk_image_menu_item_new_from_stock( GTK_STOCK_PREFERENCES, get_accel_group()); + pickUpMenu = gtk_image_menu_item_new_with_mnemonic("_Pick up"); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), pickUpMenu); + gtk_widget_set_sensitive( GTK_WIDGET(pickUpMenu), FALSE); + g_signal_connect_swapped (G_OBJECT (pickUpMenu), "activate", + G_CALLBACK (call_pick_up), + NULL); + gtk_widget_show (pickUpMenu); + + hangUpMenu = gtk_image_menu_item_new_with_mnemonic("_Hang up"); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), hangUpMenu); + gtk_widget_set_sensitive( GTK_WIDGET(hangUpMenu), FALSE); + g_signal_connect_swapped (G_OBJECT (hangUpMenu), "activate", + G_CALLBACK (call_hang_up), + NULL); + gtk_widget_show (hangUpMenu); + + menu_items = gtk_separator_menu_item_new (); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items); - g_signal_connect_swapped (G_OBJECT (menu_items), "activate", - G_CALLBACK (call_preferences), + + holdMenu = gtk_check_menu_item_new_with_mnemonic ("On _Hold"); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), holdMenu); + gtk_widget_set_sensitive( GTK_WIDGET(holdMenu), FALSE); + //Here we connect only to activate + //The toggled state is managed from update_menus() + g_signal_connect(G_OBJECT (holdMenu), "activate", + G_CALLBACK (call_hold), NULL); gtk_widget_show (menu_items); + menu_items = gtk_separator_menu_item_new (); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items); @@ -128,45 +222,6 @@ create_call_menu() return root_menu; } /* ----------------------------------------------------------------- */ -void -debug_hang_up( void* foo) -{ - call_t * c = (call_t*) call_list_get_by_state (CALL_STATE_CURRENT); - if(c) - { - sflphone_hang_up(c); - } -} - -GtkWidget * -create_debug_menu() -{ - GtkWidget * menu; - GtkWidget * root_menu; - GtkWidget * menu_items; - - menu = gtk_menu_new (); - - menu_items = gtk_menu_item_new_with_label ("Hang up current call"); - 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 ("_Debug"); - gtk_menu_item_set_submenu (GTK_MENU_ITEM (root_menu), menu); - - return root_menu; -} -/* ----------------------------------------------------------------- */ void view_dial_pad (GtkCheckMenuItem *checkmenuitem, @@ -191,6 +246,16 @@ create_view_menu() NULL); gtk_widget_show (menu_items); + menu_items = gtk_separator_menu_item_new (); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items); + + menu_items = gtk_image_menu_item_new_from_stock( GTK_STOCK_PREFERENCES, get_accel_group()); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items); + g_signal_connect_swapped (G_OBJECT (menu_items), "activate", + G_CALLBACK (call_preferences), + 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); @@ -213,11 +278,6 @@ create_menus ( ) root_menu = create_view_menu(); gtk_menu_shell_append (GTK_MENU_SHELL (menu_bar), root_menu); -#ifdef DEBUG - root_menu = create_debug_menu(); - gtk_menu_shell_append (GTK_MENU_SHELL (menu_bar), root_menu); -#endif - root_menu = create_help_menu(); gtk_menu_shell_append (GTK_MENU_SHELL (menu_bar), root_menu); diff --git a/sflphone-gtk/src/menus.h b/sflphone-gtk/src/menus.h index 6b5b785a18e2ee9369841d17f794e4eb91b66933..dd24cf2a548d064df8da7495e39fb42891b05d51 100644 --- a/sflphone-gtk/src/menus.h +++ b/sflphone-gtk/src/menus.h @@ -25,5 +25,6 @@ * @brief The menus of the main window. */ GtkWidget * create_menus(); +void update_menus(); #endif diff --git a/sflphone-gtk/src/statusicon.c b/sflphone-gtk/src/statusicon.c index 509dd2a8d04526aa8322b8c9a21e419dd47e1cf3..8848102723ccc188a454e8c919a15688b7a7e37a 100644 --- a/sflphone-gtk/src/statusicon.c +++ b/sflphone-gtk/src/statusicon.c @@ -35,15 +35,13 @@ status_quit ( void * foo) void status_icon_unminimize() { - gtk_widget_show(GTK_WIDGET(get_main_window())); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(show_menu_item), FALSE); - minimized = FALSE; + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(show_menu_item), TRUE); } void -show_hide (GtkStatusIcon *status_icon, void * foo) +show_hide (GtkWidget *menu, void * foo) { - if(minimized) + if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(show_menu_item))) { gtk_widget_show(GTK_WIDGET(get_main_window())); } @@ -51,7 +49,14 @@ show_hide (GtkStatusIcon *status_icon, void * foo) { gtk_widget_hide(GTK_WIDGET(get_main_window())); } - minimized = !minimized; +} + + +void +status_click (GtkStatusIcon *status_icon, void * foo) +{ + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(show_menu_item), + !gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(show_menu_item))); } void menu (GtkStatusIcon *status_icon, @@ -97,7 +102,7 @@ show_status_icon() { status = gtk_status_icon_new_from_file(ICON_DIR "/sflphone.png"); g_signal_connect (G_OBJECT (status), "activate", - G_CALLBACK (show_hide), + G_CALLBACK (status_click), NULL); g_signal_connect (G_OBJECT (status), "popup-menu", G_CALLBACK (menu),