/*
- $Id$
-
X G N O K I I
A Linux/Unix GUI for Nokia mobile phones.
- Copyright (C) 1999 Pavel Janík ml., Hugh Blemings
- & Ján Derfiòák <ja@mail.upjs.sk>.
Released under the terms of the GNU GPL, see file COPYING for more details.
#include <gdk/gdkkeysyms.h>
#include "misc.h"
#include "gsm-api.h"
+#include "gsm-datetime.h"
+#include "gsm-sms.h"
#include "xgnokii_common.h"
#include "xgnokii.h"
#include "xgnokii_lowlevel.h"
GtkWidget *status;
GtkWidget *report;
GtkWidget *longSMS;
+ GtkWidget *class;
GtkWidget *smscOptionMenu;
GtkTooltips *addrTip;
gint center;
GSList *addressLine;
} SendSMSWidget;
+int prev_num_of_folders=0;
+
static GtkWidget *GUI_SMSWindow;
static SMSWidget SMS = {NULL, NULL, NULL};
-static SendSMSWidget sendSMS = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL};
+static SendSMSWidget sendSMS = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL};
static ErrorDialog errorDialog = {NULL, NULL};
static InfoDialog infoDialog = {NULL, NULL};
static QuestMark questMark;
-
+static GtkWidget *treeFolderItem[MAX_SMS_FOLDERS], *subTree;
static inline void Help1 (GtkWidget *w, gpointer data)
{
- gchar *indx = g_strdup_printf ("/help/%s/windows/sms/index.html", xgnokiiConfig.locale);
+ gchar *indx = g_strdup_printf ("/%s/gnokii/xgnokii/sms/index.htm", xgnokiiConfig.locale);
Help (w, indx);
g_free (indx);
}
}
-static void InsertInboxElement (gpointer d, gpointer userData)
+static void InsertFolderElement (gpointer d, gpointer userData)
{
GSM_SMSMessage *data = (GSM_SMSMessage *) d;
MessagePointers *msgPtrs;
- SMS_DateTime *dt;
+ GSM_DateTime *dt;
- if (data->Type == SMS_Deliver || data->Type == SMS_Delivery_Report)
+ if (data->folder == SMS.currentBox)
{
-/* if (data->Type == GST_MT && data->UDHType == GSM_ConcatenatedMessages)
+ gchar *row[4];
+
+ if (data->Type == GST_DR)
{
- //FIX ME
-
- msgPtrs = (MessagePointers *) g_malloc (sizeof (MessagePointers));
- msgPtrs->count = data->UDH[4];
- msgPtrs->number = data->UDH[5];
- msgPtrs->validity = data->Validity;
- msgPtrs->class = data->Class;
- strcpy (msgPtrs->sender, data->Sender);
- msgPtrs->msgPtr = (gint *) g_malloc (msgPtrs->count * sizeof (gint));
- *(msgPtrs->msgPtr + msgPtrs->number - 1) = data->MessageNumber;
+ row[0] = g_strdup (_("report"));
+ dt = &(data->SMSCTime);
}
- else */
+ else
{
- gchar *row[4];
-
- if (data->Type == SMS_Delivery_Report)
- {
- row[0] = g_strdup (_("report"));
- dt = &(data->SMSCTime);
- }
- else if (data->Status)
- {
- row[0] = g_strdup (_("read"));
dt = &(data->Time);
- }
- else
- {
- row[0] = g_strdup (_("unread"));
- dt = &(data->Time);
- }
+ switch (data->Status)
+ {
+ case GSS_SENTREAD:
+ if (data->folder==0) //GST_INBOX
+ row[0] = g_strdup (_("read"));
+ else
+ row[0] = g_strdup (_("sent"));
+ break;
+ case GSS_NOTSENTREAD:
+ if (data->folder==0) //GST_INBOX
+ row[0] = g_strdup (_("unread"));
+ else
+ row[0] = g_strdup (_("not sent"));
+ break;
+ case GSS_UNKNOWN:
+ row[0] = g_strdup (_("not known :-("));
+ break;
+ case GSS_TEMPLATE:
+ row[0] = g_strdup (_("template"));
+ break;
+ default:
+ row[0] = g_strdup (_("unknown"));
+ break;
+ }
+ }
+ if (data->SMSData) {
if (dt->Timezone)
- row[1] = g_strdup_printf ("%02d/%02d/%02d %02d:%02d:%02d %c%02d00",
+ row[1] = g_strdup_printf ("%s %02d/%02d/%02d %02d:%02d:%02d %c%02d00",
+ DayOfWeek(dt->Year, dt->Month, dt->Day),
dt->Day, dt->Month, dt->Year,
dt->Hour, dt->Minute, dt->Second,
dt->Timezone > 0 ? '+' : '-', abs (dt->Timezone));
else
- row[1] = g_strdup_printf ("%02d/%02d/%02d %02d:%02d:%02d",
+ row[1] = g_strdup_printf ("%s %02d/%02d/%02d %02d:%02d:%02d",
+ DayOfWeek(dt->Year, dt->Month, dt->Day),
dt->Day, dt->Month, dt->Year,
dt->Hour, dt->Minute, dt->Second);
+ } else {
+ row[1] = g_strdup_printf ("unknown");
+ }
+
+ row[2] = GUI_GetName (data->Sender);
+ if (row[2] == NULL || row[2][0]==0) row[2] = data->Sender;
- row[2] = GUI_GetName (data->RemoteNumber.number);
- if (row[2] == NULL)
- row[2] = data->RemoteNumber.number;
- row[3] = data->MessageText;
+ row[3] = data->MessageText;
- gtk_clist_append (GTK_CLIST (SMS.smsClist), row);
- msgPtrs = (MessagePointers *) g_malloc (sizeof (MessagePointers));
+ msgPtrs = (MessagePointers *) g_malloc (sizeof (MessagePointers));
+ msgPtrs->validity = data->Validity;
+ msgPtrs->class = data->Class;
+ strcpy (msgPtrs->sender, data->Sender);
+
+// if (data->UDHType == GSM_ConcatenatedMessages)
+// {
+// msgPtrs->count = data->UDH[5];
+// msgPtrs->number = data->UDH[4];
+// msgPtrs->msgPtr = (gint *) g_malloc (msgPtrs->count * sizeof (gint));
+// *(msgPtrs->msgPtr + msgPtrs->number - 1) = data->MessageNumber;
+// } else {
msgPtrs->count = msgPtrs->number = 1;
- msgPtrs->validity = data->Validity.u.Relative;
- // msgPtrs->class = data->Class;
- strcpy (msgPtrs->sender, data->RemoteNumber.number);
msgPtrs->msgPtr = (gint *) g_malloc (sizeof (gint));
- *(msgPtrs->msgPtr) = (int)data->Number;
+ *(msgPtrs->msgPtr) = data->MessageNumber;
+
+ gtk_clist_append (GTK_CLIST (SMS.smsClist), row);
gtk_clist_set_row_data_full (GTK_CLIST (SMS.smsClist), SMS.row_i++,
msgPtrs, DestroyMsgPtrs);
- g_free (row[0]);
- g_free (row[1]);
- }
- }
-}
-
-
-static inline void RefreshInbox (void)
-{
- gtk_clist_freeze (GTK_CLIST (SMS.smsClist));
-
- gtk_clist_clear (GTK_CLIST (SMS.smsClist));
-
- SMS.row_i = 0;
- g_slist_foreach (phoneMonitor.sms.messages, InsertInboxElement, (gpointer) NULL);
-
- gtk_clist_sort (GTK_CLIST (SMS.smsClist));
- gtk_clist_thaw (GTK_CLIST (SMS.smsClist));
-}
-
-
-static void InsertOutboxElement (gpointer d, gpointer userData)
-{
- GSM_SMSMessage *data = (GSM_SMSMessage *) d;
- MessagePointers *msgPtrs;
-
- if (data->Type == SMS_Submit)
- {
- gchar *row[4];
-
- if (data->Status)
- row[0] = g_strdup (_("sent"));
- else
- row[0] = g_strdup (_("unsent"));
-
- row[1] = row[2] = g_strdup ("");
- row[3] = data->MessageText;
+// }
- gtk_clist_append( GTK_CLIST (SMS.smsClist), row);
- msgPtrs = (MessagePointers *) g_malloc (sizeof (MessagePointers));
- msgPtrs->count = msgPtrs->number = 1;
- msgPtrs->validity = data->Validity.u.Relative;
- // msgPtrs->class = data->Class;
- strcpy (msgPtrs->sender, data->RemoteNumber.number);
- msgPtrs->msgPtr = (gint *) g_malloc (sizeof (gint));
- *(msgPtrs->msgPtr) = (int)data->Number;
- gtk_clist_set_row_data_full (GTK_CLIST (SMS.smsClist), SMS.row_i++,
- msgPtrs, DestroyMsgPtrs);
g_free (row[0]);
g_free (row[1]);
}
}
-
-static inline void RefreshOutbox (void)
+static inline void RefreshFolder (void)
{
gtk_clist_freeze (GTK_CLIST (SMS.smsClist));
+
gtk_clist_clear (GTK_CLIST (SMS.smsClist));
SMS.row_i = 0;
- g_slist_foreach (phoneMonitor.sms.messages, InsertOutboxElement, (gpointer) NULL);
+ g_slist_foreach (phoneMonitor.sms.messages, InsertFolderElement, (gpointer) NULL);
gtk_clist_sort (GTK_CLIST (SMS.smsClist));
gtk_clist_thaw (GTK_CLIST (SMS.smsClist));
if (!GTK_WIDGET_VISIBLE (GUI_SMSWindow))
return;
- if (SMS.currentBox)
- RefreshOutbox ();
- else
- RefreshInbox ();
+ RefreshFolder();
}
inline void GUI_ShowSMS (void)
{
+ int i,j;
+
+ GUI_InitSMSFoldersInf();
+
+ for (i=1;i<folders.number+1;i++) {
+ if (i>prev_num_of_folders) {
+ treeFolderItem[i-1] = gtk_tree_item_new_with_label (_(folders.Folder[i-1].Name));
+ gtk_tree_append (GTK_TREE (subTree), treeFolderItem[i-1]);
+ gtk_signal_connect (GTK_OBJECT (treeFolderItem[i-1]), "select",
+ GTK_SIGNAL_FUNC (SelectTreeItem), GINT_TO_POINTER (i-1));
+ gtk_widget_show (treeFolderItem[i-1]);
+ } else {
+ gtk_widget_set_name(treeFolderItem[i-1],_(folders.Folder[i-1].Name));
+ }
+ }
+
+ for (j=i+1;j<prev_num_of_folders;j++)
+ gtk_widget_hide (treeFolderItem[j-1]);
+
+ prev_num_of_folders=folders.number;
+
gtk_widget_show (GUI_SMSWindow);
GUI_RefreshMessageWindow ();
}
sel = sel->next;
for (count = 0; count < ((MessagePointers *) gtk_clist_get_row_data (GTK_CLIST (SMS.smsClist), row))->count; count++)
{
- int number;
message = (GSM_SMSMessage *) g_malloc (sizeof (GSM_SMSMessage));
- number = *(((MessagePointers *) gtk_clist_get_row_data (GTK_CLIST (SMS.smsClist), row))->msgPtr + count);
- if (number == -1)
+ message->Location = *(((MessagePointers *) gtk_clist_get_row_data (GTK_CLIST (SMS.smsClist), row))->msgPtr + count);
+ if (message->Location == -1)
{
g_free (message);
continue;
}
- message->Number = number;
message->MemoryType = GMT_SM;
e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
gtk_clist_thaw (GTK_CLIST (SMS.smsClist));
}
+static void ReadFromPhone (void)
+{
+ GSM_SMSStatus SMSStatus;
+
+ SMSStatus.UnRead = 0;
+ SMSStatus.Number = 0;
+
+ if (GSM->GetSMSStatus (&SMSStatus) == GE_NONE) {
+ if (phoneMonitor.sms.unRead != SMSStatus.UnRead ||
+ phoneMonitor.sms.number2 != SMSStatus.Number)
+ {
+ phoneMonitor.working = _("Refreshing SMSes...");
+#ifdef XDEBUG
+ printf("Refreshing %d SMSes...\n",SMSStatus.Number);
+#endif
+ RefreshSMS (SMSStatus.Number);
+ phoneMonitor.working = NULL;
+ }
+
+ phoneMonitor.sms.unRead = SMSStatus.UnRead;
+ }
+}
static void DeleteSMS (void)
{
#ifdef XDEBUG
g_print ("Address: %s\nText: %s\nDelivery report: %d\nSMS Center: %d\n",
- sms->RemoteNumber.number,
+ sms->Destination,
sms->MessageText,
GTK_TOGGLE_BUTTON (sendSMS.report)->active,
sendSMS.center);
if (error != GE_SMSSENDOK)
{
gchar *buf = g_strdup_printf (_("SMS send to %s failed\n(error=%d)"),
- sms->RemoteNumber.number, error);
+ sms->Destination, error);
gtk_label_set_text (GTK_LABEL(errorDialog.text), buf);
gtk_widget_show (errorDialog.dialog);
g_free (buf);
}
else
- g_print ("Message sent to: %s\n", sms->RemoteNumber.number);
+ g_print ("Message sent to: %s\n", sms->Destination);
return (error);
}
static void SendSMS (void)
{
- GSM_SMSMessage sms;
+ GSM_UDH UDHType;
+ GSM_MultiSMSMessage Multisms;
+ int chars_read;
AddressPar aps;
- char udh[256];
GSList *r;
gchar *text, *number;
gchar **addresses;
gchar *buf;
- gint offset, nr_msg, l;
+ gint l;
gint longSMS;
register gint i = 0, j;
else
number = addresses[i];
- sms.MessageCenter = xgnokiiConfig.smsSetting[sendSMS.center];
- sms.MessageCenter.No = 0;
+ chars_read=strlen(text);
+ UDHType = GSM_NoUDH;
+ if (l > GSM_MAX_SMS_LENGTH && longSMS) UDHType = GSM_ConcatenatedMessages;
+ if (UDHType == GSM_NoUDH && chars_read>160) chars_read=160;
- if (GTK_TOGGLE_BUTTON (sendSMS.report)->active)
- sms.Report = true;
- else
- sms.Report = false;
- sms.Type = SMS_Submit;
-
- sms.DCS.Type = SMS_GeneralDataCoding;
- sms.DCS.u.General.Compressed = false;
- sms.DCS.u.General.Alphabet = SMS_DefaultAlphabet;
- sms.DCS.u.General.Class = 0;
- sms.MessageCenter.No = 1;
- sms.Validity.VPF = SMS_RelativeFormat;
- sms.Validity.u.Relative = sms.MessageCenter.Validity; /* 4320 minutes == 72 hours */
- sms.UDH_No = 0;
-
- strncpy (sms.RemoteNumber.number, number, GSM_MAX_DESTINATION_LENGTH + 1);
- sms.RemoteNumber.number[GSM_MAX_DESTINATION_LENGTH] = '\0';
-
- if (l > GSM_MAX_SMS_LENGTH)
- {
- if (longSMS)
- {
- sms.UDH[0].Type = SMS_ConcatenatedMessages;
- nr_msg = ((l - 1) / 153) + 1;
- udh[0] = 0x05; // UDH length
- udh[1] = 0x00; // concatenated messages (IEI)
- udh[2] = 0x03; // IEI data length
- udh[3] = 0x01; // reference number
- udh[4] = nr_msg; // number of messages
- udh[5] = 0x00; // message reference number
- offset = 6;
-
- for (j = 0; j < nr_msg; j++)
- {
- udh[5] = j + 1;
-
- memcpy(sms.MessageText,udh,offset);
- strncpy (sms.MessageText+offset, text + (j * 153), 153);
- sms.MessageText[153] = '\0';
-
- buf = g_strdup_printf (_("Sending SMS to %s (%d/%d) ...\n"),
- sms.RemoteNumber.number, j + 1, nr_msg);
- gtk_label_set_text (GTK_LABEL (infoDialog.text), buf);
- gtk_widget_show_now (infoDialog.dialog);
- g_free (buf);
- GUI_Refresh ();
-
- if (SendSMSCore (&sms) != GE_SMSSENDOK)
- {
- gtk_widget_hide (infoDialog.dialog);
- GUI_Refresh ();
- break;
- }
-
- gtk_widget_hide (infoDialog.dialog);
- GUI_Refresh ();
-
- sleep (1);
- }
- }
- else
- {
- sms.UDH_Length = 0;
- nr_msg = ((l - 1) / 153) + 1;
- if (nr_msg > 99) // We have place only for 99 messages in header.
- nr_msg = 99;
- for (j = 0; j < nr_msg; j++)
- {
- gchar header[8];
+ GSM_MakeMultiPartSMS2(&Multisms,text,chars_read,UDHType,GSM_Coding_Default);
+
+ for (j=0;j<Multisms.number;j++) {
+ Multisms.SMS[j].MessageCenter = xgnokiiConfig.smsSetting[sendSMS.center];
+ Multisms.SMS[j].MessageCenter.No = 0;
- g_snprintf (header, 8, "%2d/%-2d: ", j + 1, nr_msg);
- header[7] = '\0';
+ if (GTK_TOGGLE_BUTTON (sendSMS.report)->active) Multisms.SMS[j].Type = GST_DR;
- strcpy (sms.MessageText, header);
- strncat (sms.MessageText, text + (j * 153), 153);
- sms.MessageText[160] = '\0';
+ if (GTK_TOGGLE_BUTTON (sendSMS.class)->active)\r Multisms.SMS[j].Class = 0;\r
- buf = g_strdup_printf (_("Sending SMS to %s (%d/%d) ...\n"),
- sms.RemoteNumber.number, j + 1, nr_msg);
- gtk_label_set_text (GTK_LABEL (infoDialog.text), buf);
- gtk_widget_show_now (infoDialog.dialog);
- g_free (buf);
- GUI_Refresh ();
+ Multisms.SMS[j].Validity = Multisms.SMS[j].MessageCenter.Validity;
- if (SendSMSCore (&sms) != GE_SMSSENDOK)
- {
- gtk_widget_hide (infoDialog.dialog);
- GUI_Refresh ();
- break;
- }
-
- gtk_widget_hide (infoDialog.dialog);
- GUI_Refresh ();
-
- sleep (1);
- }
- }
- }
- else
- {
- sms.UDH_Length = 0;
- strncpy (sms.MessageText, text, GSM_MAX_SMS_LENGTH + 1);
- sms.MessageText[GSM_MAX_SMS_LENGTH] = '\0';
+ strncpy (Multisms.SMS[j].Destination, number, GSM_MAX_DESTINATION_LENGTH + 1);
+ Multisms.SMS[j].Destination[GSM_MAX_DESTINATION_LENGTH] = '\0';
- buf = g_strdup_printf (_("Sending SMS to %s ...\n"), sms.RemoteNumber.number);
+ buf = g_strdup_printf (_("Sending SMS to %s (%d/%d) ...\n"),
+ Multisms.SMS[j].Destination, j + 1, Multisms.number);
gtk_label_set_text (GTK_LABEL (infoDialog.text), buf);
gtk_widget_show_now (infoDialog.dialog);
g_free (buf);
GUI_Refresh ();
- (void) SendSMSCore (&sms);
+ if (SendSMSCore (&Multisms.SMS[j]) != GE_SMSSENDOK)
+ {
+ gtk_widget_hide (infoDialog.dialog);
+ GUI_Refresh ();
+ break;
+ }
+
gtk_widget_hide (infoDialog.dialog);
GUI_Refresh ();
- }
+ sleep (1);
+ }
+
i++;
}
InitSendMenu ();
sendSMS.SMSSendWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_wmclass (GTK_WINDOW(sendSMS.SMSSendWindow), "SMSSendWindow", "Xgnokii");
//gtk_widget_set_usize (GTK_WIDGET (sendSMS.SMSSendWindow), 436, 220);
gtk_signal_connect (GTK_OBJECT (sendSMS.SMSSendWindow), "delete_event",
gtk_box_pack_start (GTK_BOX (vbox), sendSMS.longSMS, FALSE, FALSE, 3);
gtk_widget_show (sendSMS.longSMS);
+ sendSMS.class = gtk_check_button_new_with_label (_("Send as Flash SMS (Class 0)"));\r
+ gtk_box_pack_start (GTK_BOX (vbox), sendSMS.class, FALSE, FALSE, 3);\r
+ gtk_widget_show (sendSMS.class);\r
+
label = gtk_label_new (_("SMS Center:"));
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 1);
gtk_widget_show (label);
/*
static inline gint CompareSMSMessageLocation (gconstpointer a, gconstpointer b)
{
- return !(((GSM_SMSMessage *) a)->Number == ((GSM_SMSMessage *) b)->Number);
+ return !(((GSM_SMSMessage *) a)->Location == ((GSM_SMSMessage *) b)->Location);
}
*/
gtk_text_thaw (GTK_TEXT (sendSMS.smsSendText));
- //msg.Number = *(((MessagePointers *) gtk_clist_get_row_data(GTK_CLIST (SMS.smsClist),
+ //msg.Location = *(((MessagePointers *) gtk_clist_get_row_data(GTK_CLIST (SMS.smsClist),
// GPOINTER_TO_INT (GTK_CLIST (SMS.smsClist)->selection->data)))->msgPtr);
//r = g_slist_find_custom (SMS.messages, &msg, CompareSMSMessageLocation);
static GtkItemFactoryEntry menu_items[] = {
{ NULL, NULL, NULL, 0, "<Branch>"},
+ { NULL, NULL, ReadFromPhone, 0, NULL},
+ { NULL, NULL, NULL, 0, "<Separator>"},
{ NULL, "<control>S", NULL, 0, NULL},
{ NULL, "<control>M", SaveToMailbox, 0, NULL},
{ NULL, NULL, NULL, 0, "<Separator>"},
register gint i = 0;
menu_items[i++].path = g_strdup (_("/_File"));
+ menu_items[i++].path = g_strdup (_("/File/Read from phone"));
+ menu_items[i++].path = g_strdup (_("/File/Sep0"));
menu_items[i++].path = g_strdup (_("/File/_Save"));
menu_items[i++].path = g_strdup (_("/File/Save to mailbo_x"));
menu_items[i++].path = g_strdup (_("/File/Sep1"));
GtkWidget *toolbar;
GtkWidget *scrolledWindow;
GtkWidget *vpaned, *hpaned;
- GtkWidget *tree, *treeSMSItem, *treeInboxItem, *treeOutboxItem, *subTree;
+ GtkWidget *tree, *treeSMSItem;
SortColumn *sColumn;
GdkColormap *cmap;
register gint i;
gchar *titles[4] = { _("Status"), _("Date / Time"), _("Sender"), _("Message")};
-
InitMainMenu ();
GUI_SMSWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_wmclass (GTK_WINDOW (GUI_SMSWindow), "SMSWindow", "Xgnokii");
gtk_window_set_title (GTK_WINDOW (GUI_SMSWindow), _("Short Message Service"));
//gtk_widget_set_usize (GTK_WIDGET (GUI_SMSWindow), 436, 220);
gtk_signal_connect (GTK_OBJECT (GUI_SMSWindow), "delete_event",
gtk_tree_set_view_mode (GTK_TREE (subTree), GTK_TREE_VIEW_ITEM);
gtk_tree_item_set_subtree (GTK_TREE_ITEM (treeSMSItem), subTree);
- treeInboxItem = gtk_tree_item_new_with_label (_("Inbox"));
- gtk_tree_append (GTK_TREE (subTree), treeInboxItem);
- gtk_signal_connect (GTK_OBJECT (treeInboxItem), "select",
- GTK_SIGNAL_FUNC (SelectTreeItem), GINT_TO_POINTER (0));
- gtk_widget_show (treeInboxItem);
-
- treeOutboxItem = gtk_tree_item_new_with_label (_("Outbox"));
- gtk_tree_append (GTK_TREE (subTree), treeOutboxItem);
- gtk_signal_connect (GTK_OBJECT (treeOutboxItem), "select",
- GTK_SIGNAL_FUNC (SelectTreeItem), GINT_TO_POINTER (1));
- gtk_widget_show (treeOutboxItem);
-
scrolledWindow = gtk_scrolled_window_new (NULL, NULL);
gtk_widget_set_usize (scrolledWindow, 75, 80);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledWindow),
tree);
gtk_widget_show (scrolledWindow);
-
/* Message viewer */
SMS.smsText = gtk_text_new (NULL, NULL);
gtk_text_set_editable (GTK_TEXT (SMS.smsText), FALSE);