#include #include #include #include #include #include #include #include #include "misc.h" #include "gsm-common.h" #include "gsm-api.h" #include "gsm-ringtones.h" #include "xgnokii_xring.h" #include "xgnokii_common.h" #include "xgnokii_lowlevel.h" #include "xgnokii.h" #include "xpm/Send.xpm" static GtkWidget *GUI_RingtonesWindow; GtkWidget * blacks[WHITE_COUNT - 1]; GtkWidget * whites[WHITE_COUNT]; int pressed; PixmapAndMask pam[KIE_COUNT]; GSM_Ringtone ringtone; char xwhi[] = { 6, 4, 2, 6, 4, 4, 2 }; /* Bitmaps for keyboard */ static char * blackparts[] = { ".+@@@@@@@@@@@@+.", "+.+@@@@@@@@@@+.+", "@+.+@@@@@@@@+.+@", "@@+.+@@@@@@+.+@@", "@@@+........+@@@", "@@@@........@@@@" }; static char * whitestarts[][3] = { { " ++++++++++++++++", " +..............+", "+++++++++..............+" }, { " ++++++++ ", " +......+ ", "+++++++++......+++++++++" }, { "++++++++++++++++ ", "+..............+ ", "+..............+++++++++" }}; static char * whiteend[] = { "+......................+", "+@....................@+", "+@@..................@@+", "++@@@..............@@@++", "++++++++++++++++++++++++" }; static inline void CloseRingtonesWindow (void) { gtk_widget_hide(GUI_RingtonesWindow); } static GtkItemFactoryEntry ringtonesMenuItems[] = { { NULL, NULL, NULL, 0, ""}, { NULL, "O", NULL, 0, NULL}, { NULL, "S", NULL, 0, NULL}, { NULL, NULL, NULL, 0, NULL}, { NULL, NULL, NULL, 0, ""}, { NULL, "T", NULL, 0, NULL}, { NULL, NULL, NULL, 0, ""}, { NULL, "C", CloseRingtonesWindow, 0, NULL}, { NULL, NULL, NULL, 0, ""}, { NULL, "S", NULL, 0, NULL}, { NULL, "H", NULL, 0, NULL}, }; static void InitRingtonesMenu (void) { ringtonesMenuItems[0].path = g_strdup(_("/_File")); ringtonesMenuItems[1].path = g_strdup(_("/File/_Open")); ringtonesMenuItems[2].path = g_strdup(_("/File/_Save")); ringtonesMenuItems[3].path = g_strdup(_("/File/Save _as ...")); ringtonesMenuItems[4].path = g_strdup(_("/File/Sep1")); ringtonesMenuItems[5].path = g_strdup(_("/File/Se_t ringtone")); ringtonesMenuItems[6].path = g_strdup(_("/File/Sep2")); ringtonesMenuItems[7].path = g_strdup(_("/File/_Close")); ringtonesMenuItems[8].path = g_strdup(_("/_Edit")); ringtonesMenuItems[9].path = g_strdup(_("/Edit/_Set ringtone name")); ringtonesMenuItems[10].path = g_strdup(_("/Edit/S_how in Composer")); } /* Add created pixmap to widget */ static int createpixmap(GtkWidget * widget, PixmapAndMask * pam, char ** a) { GtkStyle * style = gtk_widget_get_default_style(); pam->pixmap = gdk_pixmap_create_from_xpm_d(widget->window, &pam->mask, &style->bg[GTK_STATE_NORMAL], a); return (int)pam->pixmap; /* (to) NULL or not (to) NULL */ } static void writecolors(char * buf0, char * col0, char * buf1, char * col1, char * buf2, char * col2) { sprintf(buf0, ". c #%s", col0); sprintf(buf1, "+ c #%s", col1); sprintf(buf2, "@ c #%s", col2); } /* Creates white pixmap in the keyboard */ int KeyboardCreateWhitePixmap(GtkWidget * window, PixmapAndMask * pam, char * start[], char * color0, char * color1, char * color2) { int i = 0, j = 0; char * a[160 + 5]; char col0[20]; char col1[20]; char col2[20]; a[i++] = "24 160 4 1"; a[i++] = " c None"; writecolors(col0, color0, col1, color1, col2, color2); a[i++] = col0; a[i++] = col1; a[i++] = col2; a[i++] = start[0]; for (j = 0; j < 99; j++) a[i++] = start[1]; a[i++] = start[2]; for (j = 0; j < 54; j++) a[i++] = whiteend[0]; a[i++] = whiteend[1]; a[i++] = whiteend[1]; a[i++] = whiteend[2]; a[i++] = whiteend[3]; a[i++] = whiteend[4]; assert(i == 165); return createpixmap(window, pam, a); } /* Creates black pixmap in the keyboard */ int KeyboardCreateBlackPixmap(GtkWidget * window, PixmapAndMask * pam, char * color0, char * color1, char * color2) { int i = 0, j = 0; char * a[160 + 4]; char col0[20]; char col1[20]; char col2[20]; a[i++] = "16 100 3 1"; writecolors(col0, color0, col1, color1, col2, color2); a[i++] = col0; a[i++] = col1; a[i++] = col2; for (j = 0; j < 5; j++) a[i++] = blackparts[j]; for (j = 0; j < 90; j++) a[i++] = blackparts[5]; for (j = 4; j >= 0; j--) a[i++] = blackparts[j]; assert(i == 104); return createpixmap(window, pam, a); } static void KeyboardSetPixmap(int flag) { int i = pressed & ~(BLACK_PRESSED|WHITE_PRESSED); int j; if (pressed & BLACK_PRESSED) { j = flag? KIE_BLACKSEL: KIE_BLACK; gtk_pixmap_set(GTK_PIXMAP(blacks[i]),pam[j].pixmap, pam[j].mask); } else { j = xwhi[i % 7] + (flag? 1: 0); gtk_pixmap_set(GTK_PIXMAP(whites[i]),pam[j].pixmap, pam[j].mask); } } static void KeyboardSendTune() { /* frequencies generated with: perl -e 'print int(4400 * (2 **($_/12)) + .5)/10, "\n" for(3..14)' */ struct { float wf; float bf; } notefreq[7] = { { 523.3, 554.4 }, //C { 587.3, 622.3 }, //D { 659.3, 0 }, //E { 698.5, 740 }, //F { 784 , 830.6 }, //G { 880 , 932.3 }, //A { 987.8, 0 } //H }; int i=pressed; int j, r; float freq; if (i) { j = (i & BLACK_PRESSED)? 1: 0; i &= ~(BLACK_PRESSED|WHITE_PRESSED); freq = j? notefreq[i % 7].bf: notefreq[i % 7].wf; switch (i / 7) { case 0: r = (int)(freq / 2.0); break; case 2: r = (int)(freq * 2.0); break; default: r = (int)(freq); break; } GSM->PlayTone(r,100); } else { GSM->PlayTone(0,0); } } /* One drawn key was released */ static gint KeyboardButtonRelease(GtkWidget *widget, GdkEvent *event, gpointer data) { KeyboardSetPixmap(FALSE); pressed = 0; KeyboardSendTune(); return TRUE; } /* One drawn key was pressed */ static gint KeyboardButtonPress(GtkWidget *widget, GdkEvent *event, gpointer data) { GdkEventButton * e = (GdkEventButton *)event; int i; if (!pressed) { guint x = e->x; guint y = e->y; if (y < 100) /* possible black pressed... */ for ( i = 0; i < WHITE_COUNT - 1; i++) if (blacks[i] && x - 16 - 24 * i < 16) { pressed = i | BLACK_PRESSED; KeyboardSetPixmap(TRUE); KeyboardSendTune(); return TRUE; } for ( i = 0; i < WHITE_COUNT; i++) /* whites ? */ if (x - 24 * i < 24) { pressed = i | WHITE_PRESSED; KeyboardSetPixmap(TRUE); KeyboardSendTune(); return TRUE; } } return TRUE; } void GUI_CreateRingtonesWindow (void) { int nMenuItems = sizeof (ringtonesMenuItems) / sizeof (ringtonesMenuItems[0]); GtkAccelGroup *accelGroup; GtkItemFactory *itemFactory; GtkWidget *menuBar; GtkWidget *vbox; GtkWidget *hbox, *hbox2; GtkWidget *melody; GtkWidget *buttons, *buttons2; GtkWidget *separator; GtkWidget *toolBar; GtkWidget *label, *note1, *note2, *note3, *note4, *note5; GtkWidget *label2, *button, *button2, *button3, *button4, *button5, *button6, *button7, *button8, *button9, *button10, *button11, *button12; GtkWidget *keyboard; int i; InitRingtonesMenu(); /* realize top level window for logos */ GUI_RingtonesWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_policy(GTK_WINDOW(GUI_RingtonesWindow),1,1,1); gtk_window_set_title(GTK_WINDOW(GUI_RingtonesWindow),_("Ringtones")); gtk_signal_connect(GTK_OBJECT(GUI_RingtonesWindow),"delete_event", GTK_SIGNAL_FUNC(DeleteEvent),NULL); gtk_widget_set_usize(GUI_RingtonesWindow,630,320); gtk_widget_realize(GUI_RingtonesWindow); accelGroup = gtk_accel_group_new(); gtk_accel_group_attach(accelGroup,GTK_OBJECT(GUI_RingtonesWindow)); /* create main vbox */ vbox = gtk_vbox_new(FALSE,1); gtk_container_add(GTK_CONTAINER(GUI_RingtonesWindow),vbox); gtk_widget_show(vbox); itemFactory = gtk_item_factory_new(GTK_TYPE_MENU_BAR,"
",accelGroup); gtk_item_factory_create_items(itemFactory,nMenuItems,ringtonesMenuItems,NULL); menuBar = gtk_item_factory_get_widget(itemFactory,"
"); gtk_box_pack_start(GTK_BOX(vbox),menuBar,FALSE,FALSE,0); gtk_widget_show(menuBar); /* toolbar */ toolBar = gtk_toolbar_new(GTK_ORIENTATION_HORIZONTAL,GTK_TOOLBAR_ICONS); gtk_toolbar_set_button_relief(GTK_TOOLBAR(toolBar),GTK_RELIEF_NORMAL); gtk_toolbar_set_style(GTK_TOOLBAR(toolBar),GTK_TOOLBAR_ICONS); gtk_toolbar_append_item(GTK_TOOLBAR(toolBar),NULL,"Set ringtone",NULL, NewPixmap(Send_xpm,GUI_RingtonesWindow->window, &GUI_RingtonesWindow->style->bg[GTK_STATE_NORMAL]), (GtkSignalFunc)NULL,toolBar); gtk_box_pack_start(GTK_BOX(vbox),toolBar,FALSE,FALSE,0); gtk_widget_show(toolBar); /* vertical separator */ separator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vbox),GTK_WIDGET(separator),FALSE,FALSE,0); /* Melody drawing area */ melody = gtk_drawing_area_new(); gtk_drawing_area_size(GTK_DRAWING_AREA(melody), 20,100); gtk_box_pack_start(GTK_BOX(vbox),melody,FALSE,FALSE,0); gtk_widget_show(melody); /* create horizontal box for keyboard and buttons area */ hbox = gtk_hbox_new(FALSE,5); gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,0); gtk_widget_show(hbox); /* Box for buttons */ hbox2 = gtk_hbox_new(FALSE,5); gtk_box_pack_start(GTK_BOX(hbox),hbox2,FALSE,FALSE,0); gtk_widget_set_usize( hbox2, 120, 160 ); gtk_widget_show(hbox2); /* Buttons with notes length */ buttons = gtk_vbox_new(FALSE,3); gtk_box_pack_start(GTK_BOX(hbox2),buttons,FALSE,FALSE,0); label = gtk_label_new (_("Length")); gtk_box_pack_start (GTK_BOX(buttons), label, FALSE, FALSE, 3); note1 = gtk_radio_button_new_with_label (NULL, _("1")); gtk_box_pack_end (GTK_BOX (buttons), note1, TRUE, FALSE, 2); gtk_widget_show (note1); note2 = gtk_radio_button_new_with_label (NULL, _("1/2")); gtk_box_pack_end (GTK_BOX (buttons), note2, TRUE, FALSE, 2); gtk_widget_show (note2); note3 = gtk_radio_button_new_with_label (NULL, _("1/4")); gtk_box_pack_end (GTK_BOX (buttons), note3, TRUE, FALSE, 2); gtk_widget_show (note3); gtk_widget_show(buttons); note4 = gtk_radio_button_new_with_label (NULL, _("1/16")); gtk_box_pack_end (GTK_BOX (buttons), note4, TRUE, FALSE, 2); gtk_widget_show (note4); note5 = gtk_radio_button_new_with_label (NULL, _("1/32")); gtk_box_pack_end (GTK_BOX (buttons), note5, TRUE, FALSE, 2); gtk_widget_show (note5); gtk_widget_show (buttons); /* Buttons with notes length */ buttons2 = gtk_vbox_new(FALSE,3); gtk_box_pack_start(GTK_BOX(hbox2),buttons2,FALSE,FALSE,0); label2 = gtk_label_new (_("Note")); gtk_box_pack_start (GTK_BOX(buttons2), label2, FALSE, FALSE, 3); button = gtk_button_new_with_label (_("C")); gtk_box_pack_start (GTK_BOX (buttons2), button, TRUE, FALSE, 0); // gtk_signal_connect (GTK_OBJECT (button), "clicked", // GTK_SIGNAL_FUNC (HideCallDialog), (gpointer) inCallDialog.dialog); // GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); // gtk_widget_grab_default (button); gtk_widget_show (button); button3 = gtk_button_new_with_label (_("D")); gtk_box_pack_start (GTK_BOX (buttons2), button3, TRUE, FALSE, 0); // gtk_signal_connect (GTK_OBJECT (button), "clicked", // GTK_SIGNAL_FUNC (HideCallDialog), (gpointer) inCallDialog.dialog); // GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); // gtk_widget_grab_default (button3); gtk_widget_show (button); button5 = gtk_button_new_with_label (_("E")); gtk_box_pack_start (GTK_BOX (buttons2), button5, TRUE, FALSE, 0); // gtk_signal_connect (GTK_OBJECT (button), "clicked", // GTK_SIGNAL_FUNC (HideCallDialog), (gpointer) inCallDialog.dialog); // GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); // gtk_widget_grab_default (button); gtk_widget_show (button5); button6 = gtk_button_new_with_label (_("F")); gtk_box_pack_start (GTK_BOX (buttons2), button6, TRUE, FALSE, 0); // gtk_signal_connect (GTK_OBJECT (button), "clicked", // GTK_SIGNAL_FUNC (HideCallDialog), (gpointer) inCallDialog.dialog); // GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); // gtk_widget_grab_default (button); gtk_widget_show (button6); button8 = gtk_button_new_with_label (_("G")); gtk_box_pack_start (GTK_BOX (buttons2), button8, TRUE, FALSE, 0); // gtk_signal_connect (GTK_OBJECT (button), "clicked", // GTK_SIGNAL_FUNC (HideCallDialog), (gpointer) inCallDialog.dialog); // GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); // gtk_widget_grab_default (button); gtk_widget_show (button8); button10 = gtk_button_new_with_label (_("A")); gtk_box_pack_start (GTK_BOX (buttons2), button10, TRUE, FALSE, 0); // gtk_signal_connect (GTK_OBJECT (button), "clicked", // GTK_SIGNAL_FUNC (HideCallDialog), (gpointer) inCallDialog.dialog); // GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); // gtk_widget_grab_default (button); gtk_widget_show (button10); button12 = gtk_button_new_with_label (_("H")); gtk_box_pack_start (GTK_BOX (buttons2), button12, TRUE, FALSE, 0); // gtk_signal_connect (GTK_OBJECT (button), "clicked", // GTK_SIGNAL_FUNC (HideCallDialog), (gpointer) inCallDialog.dialog); // GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); // gtk_widget_grab_default (button); gtk_widget_show (button12); gtk_widget_show (label2); button2 = gtk_button_new_with_label (_("Cis")); gtk_box_pack_start (GTK_BOX (buttons2), button2, TRUE, FALSE, 0); // gtk_signal_connect (GTK_OBJECT (button), "clicked", // GTK_SIGNAL_FUNC (HideCallDialog), (gpointer) inCallDialog.dialog); // GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); // gtk_widget_grab_default (button); gtk_widget_show (button2); button4 = gtk_button_new_with_label (_("Dis")); gtk_box_pack_start (GTK_BOX (buttons2), button4, TRUE, FALSE, 0); // gtk_signal_connect (GTK_OBJECT (button), "clicked", // GTK_SIGNAL_FUNC (HideCallDialog), (gpointer) inCallDialog.dialog); // GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); // gtk_widget_grab_default (button); gtk_widget_show (button4); button7 = gtk_button_new_with_label (_("Fis")); gtk_box_pack_start (GTK_BOX (buttons2), button7, TRUE, FALSE, 0); // gtk_signal_connect (GTK_OBJECT (button), "clicked", // GTK_SIGNAL_FUNC (HideCallDialog), (gpointer) inCallDialog.dialog); // GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); // gtk_widget_grab_default (button); gtk_widget_show (button7); button9 = gtk_button_new_with_label (_("Gis")); gtk_box_pack_start (GTK_BOX (buttons2), button9, TRUE, FALSE, 0); // gtk_signal_connect (GTK_OBJECT (button), "clicked", // GTK_SIGNAL_FUNC (HideCallDialog), (gpointer) inCallDialog.dialog); // GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); // gtk_widget_grab_default (button); gtk_widget_show (button9); button11 = gtk_button_new_with_label (_("Ais")); gtk_box_pack_start (GTK_BOX (buttons2), button11, TRUE, FALSE, 0); // gtk_signal_connect (GTK_OBJECT (button), "clicked", // GTK_SIGNAL_FUNC (HideCallDialog), (gpointer) inCallDialog.dialog); // GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); // gtk_widget_grab_default (button); gtk_widget_show (button11); gtk_widget_show (buttons2); /* Keyboard */ keyboard = gtk_fixed_new(); gtk_widget_set_usize( keyboard, 504, 160 ); gtk_box_pack_start(GTK_BOX(hbox),keyboard,FALSE,FALSE,0); gtk_signal_connect(GTK_OBJECT (keyboard), "button_press_event", GTK_SIGNAL_FUNC (KeyboardButtonPress), &hbox); gtk_signal_connect(GTK_OBJECT (keyboard), "button_release_event", GTK_SIGNAL_FUNC (KeyboardButtonRelease), &hbox); gtk_widget_add_events(keyboard, GDK_FOCUS_CHANGE_MASK| GDK_BUTTON_PRESS_MASK|GDK_BUTTON_RELEASE_MASK); KeyboardCreateBlackPixmap(hbox, &pam[KIE_BLACK], "333333", "666666", "999999"); KeyboardCreateBlackPixmap(hbox, &pam[KIE_BLACKSEL], "000000", "333333", "666666"); for (i = 0; i < 6; i += 2) { KeyboardCreateWhitePixmap(hbox, &pam[KIE_WHITEL + i], whitestarts[i / 2], "FFFFFF", "999999", "CCCCCC"); KeyboardCreateWhitePixmap(hbox, &pam[KIE_WHITELSEL + i], whitestarts[i / 2], "CCCCCC", "666666", "999999"); } for (i = 0; i < WHITE_COUNT - 1; i++) { PixmapAndMask * b = &pam[KIE_BLACK]; if (xwhi[i % 7] == 2) continue; blacks[i] = gtk_pixmap_new( b->pixmap, b->mask ); gtk_fixed_put( GTK_FIXED(keyboard), blacks[i], 16 + 24 * i, 0 ); } for (i = 0; i < WHITE_COUNT; i++) { int j = xwhi[i % 7]; whites[i] = gtk_pixmap_new( pam[j].pixmap, pam[j].mask ); gtk_fixed_put( GTK_FIXED(keyboard), whites[i], 24 * i, 0 ); } gtk_widget_show(keyboard); } void GUI_ShowRingtonesWindow (void) { gtk_widget_show_all(GUI_RingtonesWindow); }