diff --git a/src/modem.c b/src/modem.c index e1a80cb..4496239 100644 --- a/src/modem.c +++ b/src/modem.c @@ -202,6 +202,9 @@ int modem_request_type(Modem * modem, ModemRequestType type, ...) case MODEM_REQUEST_CONTACT_DELETE: request.contact_delete.id = va_arg(ap, unsigned int); break; + case MODEM_REQUEST_DTMF_SEND: + request.dtmf_send.dtmf = va_arg(ap, unsigned int); + break; case MODEM_REQUEST_MESSAGE: case MODEM_REQUEST_MESSAGE_DELETE: request.message.id = va_arg(ap, unsigned int); diff --git a/src/modems/debug.c b/src/modems/debug.c index 1b22a40..23b4859 100644 --- a/src/modems/debug.c +++ b/src/modems/debug.c @@ -344,6 +344,7 @@ static int _debug_request(ModemPlugin * modem, ModemRequest * request) ModemPluginHelper * helper = debug->helper; ModemEvent event; unsigned int u; + char buf[32]; if(request == NULL) return -1; @@ -380,6 +381,13 @@ static int _debug_request(ModemPlugin * modem, ModemRequest * request) = request->contact_new.number; helper->event(helper->modem, &debug->event_contact); break; + case MODEM_REQUEST_DTMF_SEND: + u = request->dtmf_send.dtmf; + snprintf(buf, sizeof(buf), "Sending DTMF '%c'\n", u); + event.type = MODEM_EVENT_TYPE_NOTIFICATION; + event.notification.content = buf; + debug->helper->event(debug->helper->modem, &event); + break; case MODEM_REQUEST_MESSAGE_DELETE: event.type = MODEM_EVENT_TYPE_MESSAGE_DELETED; event.message_deleted.id = request->message_delete.id; diff --git a/src/phone.c b/src/phone.c index a8d47d0..54b3cfa 100644 --- a/src/phone.c +++ b/src/phone.c @@ -172,6 +172,7 @@ struct _Phone GtkWidget * ab_window; /* call */ + ModemCallStatus ca_status; GtkWidget * ca_window; GtkWidget * ca_name; GtkWidget * ca_number; @@ -445,6 +446,7 @@ Phone * phone_new(char const * plugin, int retry) phone->bold = pango_font_description_new(); pango_font_description_set_weight(phone->bold, PANGO_WEIGHT_BOLD); phone->en_method = MODEM_AUTHENTICATION_METHOD_NONE; + phone->ca_status = MODEM_CALL_STATUS_NONE; phone->co_store = gtk_list_store_new(PHONE_CONTACT_COLUMN_COUNT, G_TYPE_UINT, G_TYPE_UINT, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); @@ -877,7 +879,6 @@ int phone_dialer_append(Phone * phone, char character) if((character < '0' || character > '9') && character != '*' && character != '+' && character != '#') return -1; /* ignore the error */ - /* FIXME if in a call send DTMF instead */ text = gtk_entry_get_text(GTK_ENTRY(phone->di_entry)); len = strlen(text) + 2; if((p = malloc(len)) == NULL) @@ -885,6 +886,10 @@ int phone_dialer_append(Phone * phone, char character) snprintf(p, len, "%s%c", text, character); gtk_entry_set_text(GTK_ENTRY(phone->di_entry), p); free(p); + if(phone->ca_status == MODEM_CALL_STATUS_ACTIVE) + /* send a DTMF */ + modem_request_type(phone->modem, MODEM_REQUEST_DTMF_SEND, + character); return 0; } @@ -4065,6 +4070,7 @@ static void _modem_event_call(Phone * phone, ModemEvent * event) fprintf(stderr, "DEBUG: %s() %u %u\n", __func__, event->call.call_type, event->call.status); #endif + phone->ca_status = event->call.status; if(event->call.call_type != MODEM_CALL_TYPE_VOICE || event->call.number == NULL) return; /* XXX ignore these for now */