comparison src/statusicon/si_ui.c @ 962:9f0ac3bb82f4 trunk

[svn] - statusicon: added support for quit button in smallmenu; also, the field is being prepared for customizable smallmenu entries
author giacomo
date Mon, 16 Apr 2007 01:35:24 -0700
parents c84c20155e00
children 149fc284aa86
comparison
equal deleted inserted replaced
961:25bc2010e9f0 962:9f0ac3bb82f4
36 36
37 37
38 static void si_ui_statusicon_popup_timer_start ( GtkWidget * ); 38 static void si_ui_statusicon_popup_timer_start ( GtkWidget * );
39 static void si_ui_statusicon_popup_timer_stop ( GtkWidget * ); 39 static void si_ui_statusicon_popup_timer_stop ( GtkWidget * );
40 static void si_ui_statusicon_smallmenu_show ( gint x, gint y, guint button, guint32 time , gpointer ); 40 static void si_ui_statusicon_smallmenu_show ( gint x, gint y, guint button, guint32 time , gpointer );
41 static void si_ui_statusicon_smallmenu_recreate ( GtkWidget * );
41 42
42 extern si_cfg_t si_cfg; 43 extern si_cfg_t si_cfg;
44 static gboolean recreate_smallmenu = FALSE;
43 45
44 46
45 /* this stuff required to make titlechange hook work properly */ 47 /* this stuff required to make titlechange hook work properly */
46 typedef struct 48 typedef struct
47 { 49 {
78 80
79 case 3: 81 case 3:
80 { 82 {
81 switch ( si_cfg.rclick_menu ) 83 switch ( si_cfg.rclick_menu )
82 { 84 {
83 case SI_CFG_RCLICK_MENU_SMALL: 85 case SI_CFG_RCLICK_MENU_SMALL1:
86 case SI_CFG_RCLICK_MENU_SMALL2:
87 if ( recreate_smallmenu == TRUE )
88 si_ui_statusicon_smallmenu_recreate( evbox );
84 si_ui_statusicon_smallmenu_show( event->x_root , event->y_root , 3 , event->time , evbox ); 89 si_ui_statusicon_smallmenu_show( event->x_root , event->y_root , 3 , event->time , evbox );
85 break; 90 break;
86 case SI_CFG_RCLICK_MENU_AUD: 91 case SI_CFG_RCLICK_MENU_AUD:
87 default: 92 default:
88 audacious_menu_main_show( event->x_root , event->y_root , 3 , event->time ); 93 audacious_menu_main_show( event->x_root , event->y_root , 3 , event->time );
379 si_ui_statusicon_smallmenu_create ( void ) 384 si_ui_statusicon_smallmenu_create ( void )
380 { 385 {
381 GtkWidget *si_smenu = gtk_menu_new(); 386 GtkWidget *si_smenu = gtk_menu_new();
382 GtkWidget *si_smenu_prev_item, *si_smenu_play_item, *si_smenu_pause_item; 387 GtkWidget *si_smenu_prev_item, *si_smenu_play_item, *si_smenu_pause_item;
383 GtkWidget *si_smenu_stop_item, *si_smenu_next_item, *si_smenu_sep_item, *si_smenu_eject_item; 388 GtkWidget *si_smenu_stop_item, *si_smenu_next_item, *si_smenu_sep_item, *si_smenu_eject_item;
384 389 GtkWidget *si_smenu_quit_item;
390
391 si_smenu_eject_item = gtk_image_menu_item_new_from_stock(
392 GTK_STOCK_OPEN , NULL );
393 g_signal_connect_swapped( si_smenu_eject_item , "activate" ,
394 G_CALLBACK(si_audacious_playback_ctrl) ,
395 GINT_TO_POINTER(SI_AUDACIOUS_PLAYBACK_CTRL_EJECT) );
396 gtk_menu_shell_append( GTK_MENU_SHELL(si_smenu) , si_smenu_eject_item );
397 gtk_widget_show(si_smenu_eject_item);
398 si_smenu_sep_item = gtk_separator_menu_item_new();
399 gtk_menu_shell_append( GTK_MENU_SHELL(si_smenu) , si_smenu_sep_item );
400 gtk_widget_show(si_smenu_sep_item);
385 si_smenu_prev_item = gtk_image_menu_item_new_from_stock( 401 si_smenu_prev_item = gtk_image_menu_item_new_from_stock(
386 GTK_STOCK_MEDIA_PREVIOUS , NULL ); 402 GTK_STOCK_MEDIA_PREVIOUS , NULL );
387 g_signal_connect_swapped( si_smenu_prev_item , "activate" , 403 g_signal_connect_swapped( si_smenu_prev_item , "activate" ,
388 G_CALLBACK(si_audacious_playback_ctrl) , 404 G_CALLBACK(si_audacious_playback_ctrl) ,
389 GINT_TO_POINTER(SI_AUDACIOUS_PLAYBACK_CTRL_PREV) ); 405 GINT_TO_POINTER(SI_AUDACIOUS_PLAYBACK_CTRL_PREV) );
415 g_signal_connect_swapped( si_smenu_next_item , "activate" , 431 g_signal_connect_swapped( si_smenu_next_item , "activate" ,
416 G_CALLBACK(si_audacious_playback_ctrl) , 432 G_CALLBACK(si_audacious_playback_ctrl) ,
417 GINT_TO_POINTER(SI_AUDACIOUS_PLAYBACK_CTRL_NEXT) ); 433 GINT_TO_POINTER(SI_AUDACIOUS_PLAYBACK_CTRL_NEXT) );
418 gtk_menu_shell_append( GTK_MENU_SHELL(si_smenu) , si_smenu_next_item ); 434 gtk_menu_shell_append( GTK_MENU_SHELL(si_smenu) , si_smenu_next_item );
419 gtk_widget_show(si_smenu_next_item); 435 gtk_widget_show(si_smenu_next_item);
420 si_smenu_sep_item = gtk_separator_menu_item_new(); 436
421 gtk_menu_shell_append( GTK_MENU_SHELL(si_smenu) , si_smenu_sep_item ); 437 if ( si_cfg.rclick_menu == SI_CFG_RCLICK_MENU_SMALL2 )
422 gtk_widget_show(si_smenu_sep_item); 438 {
423 si_smenu_eject_item = gtk_image_menu_item_new_from_stock( 439 si_smenu_sep_item = gtk_separator_menu_item_new();
424 GTK_STOCK_OPEN , NULL ); 440 gtk_menu_shell_append( GTK_MENU_SHELL(si_smenu) , si_smenu_sep_item );
425 g_signal_connect_swapped( si_smenu_eject_item , "activate" , 441 gtk_widget_show(si_smenu_sep_item);
426 G_CALLBACK(si_audacious_playback_ctrl) , 442 si_smenu_quit_item = gtk_image_menu_item_new_from_stock(
427 GINT_TO_POINTER(SI_AUDACIOUS_PLAYBACK_CTRL_EJECT) ); 443 GTK_STOCK_QUIT , NULL );
428 gtk_menu_shell_append( GTK_MENU_SHELL(si_smenu) , si_smenu_eject_item ); 444 g_signal_connect_swapped( si_smenu_quit_item , "activate" ,
429 gtk_widget_show(si_smenu_eject_item); 445 G_CALLBACK(si_audacious_quit) , NULL );
446 gtk_menu_shell_append( GTK_MENU_SHELL(si_smenu) , si_smenu_quit_item );
447 gtk_widget_show(si_smenu_quit_item);
448 }
430 449
431 return si_smenu; 450 return si_smenu;
451 }
452
453
454 static void
455 si_ui_statusicon_smallmenu_recreate ( GtkWidget * evbox )
456 {
457 GtkWidget *smenu = g_object_get_data( G_OBJECT(evbox) , "smenu" );
458 gtk_widget_destroy( GTK_WIDGET(smenu) );
459 smenu = si_ui_statusicon_smallmenu_create();
460 g_object_set_data( G_OBJECT(evbox) , "smenu" , smenu );
461 recreate_smallmenu = FALSE;
462 return;
432 } 463 }
433 464
434 465
435 void 466 void
436 si_ui_statusicon_enable ( gboolean enable ) 467 si_ui_statusicon_enable ( gboolean enable )
437 { 468 {
438 static GtkWidget *si_evbox = NULL; 469 static GtkWidget *si_evbox = NULL;
439 static GtkWidget *si_smenu = NULL;
440 static si_hook_tchange_prevs_t *si_hook_tchange_prevs = NULL; 470 static si_hook_tchange_prevs_t *si_hook_tchange_prevs = NULL;
441 471
442 if (( enable == TRUE ) && ( si_evbox == NULL )) 472 if (( enable == TRUE ) && ( si_evbox == NULL ))
443 { 473 {
444 GtkWidget *si_image; 474 GtkWidget *si_image;
445 GtkWidget *si_popup; 475 GtkWidget *si_popup;
476 GtkWidget *si_smenu;
446 AudGtkTrayIcon *si_applet; 477 AudGtkTrayIcon *si_applet;
447 GtkRequisition req; 478 GtkRequisition req;
448 GtkAllocation allocation; 479 GtkAllocation allocation;
449 480
450 si_applet = si_ui_statusicon_create(); 481 si_applet = si_ui_statusicon_create();
506 else 537 else
507 { 538 {
508 if ( si_evbox != NULL ) 539 if ( si_evbox != NULL )
509 { 540 {
510 AudGtkTrayIcon *si_applet = g_object_get_data( G_OBJECT(si_evbox) , "applet" ); 541 AudGtkTrayIcon *si_applet = g_object_get_data( G_OBJECT(si_evbox) , "applet" );
542 GtkWidget *si_smenu = g_object_get_data( G_OBJECT(si_evbox) , "smenu" );
511 si_ui_statusicon_popup_timer_stop( si_evbox ); /* just in case the timer is active */ 543 si_ui_statusicon_popup_timer_stop( si_evbox ); /* just in case the timer is active */
512 gtk_widget_destroy( GTK_WIDGET(si_evbox) ); 544 gtk_widget_destroy( GTK_WIDGET(si_evbox) );
513 gtk_widget_destroy( GTK_WIDGET(si_applet) ); 545 gtk_widget_destroy( GTK_WIDGET(si_applet) );
514 gtk_widget_destroy( GTK_WIDGET(si_smenu) ); 546 gtk_widget_destroy( GTK_WIDGET(si_smenu) );
515 hook_dissociate( "playback begin" , si_ui_statusicon_cb_hook_pbstart ); 547 hook_dissociate( "playback begin" , si_ui_statusicon_cb_hook_pbstart );
567 si_cfg.rclick_menu = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(list->data),"val")); 599 si_cfg.rclick_menu = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(list->data),"val"));
568 break; 600 break;
569 } 601 }
570 list = g_slist_next(list); 602 list = g_slist_next(list);
571 } 603 }
572 604
573 list = g_object_get_data( G_OBJECT(prefs_win) , "msa_grp" ); 605 list = g_object_get_data( G_OBJECT(prefs_win) , "msa_grp" );
574 while ( list != NULL ) 606 while ( list != NULL )
575 { 607 {
576 if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(list->data) ) == TRUE ) 608 if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(list->data) ) == TRUE )
577 { 609 {
578 si_cfg.scroll_action = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(list->data),"val")); 610 si_cfg.scroll_action = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(list->data),"val"));
579 break; 611 break;
580 } 612 }
581 list = g_slist_next(list); 613 list = g_slist_next(list);
582 } 614 }
583 615
584 si_cfg_save(); 616 si_cfg_save();
617
618 /* request the recreation of status icon small-menu if necessary */
619 if ( si_cfg.rclick_menu != SI_CFG_RCLICK_MENU_AUD )
620 recreate_smallmenu = TRUE;
621
585 gtk_widget_destroy( GTK_WIDGET(prefs_win) ); 622 gtk_widget_destroy( GTK_WIDGET(prefs_win) );
586 } 623 }
587 624
588 625
589 void 626 void
590 si_ui_prefs_show ( void ) 627 si_ui_prefs_show ( void )
591 { 628 {
592 static GtkWidget *prefs_win = NULL; 629 static GtkWidget *prefs_win = NULL;
593 GtkWidget *prefs_vbox; 630 GtkWidget *prefs_vbox;
594 GtkWidget *prefs_rclick_frame, *prefs_rclick_vbox; 631 GtkWidget *prefs_rclick_frame, *prefs_rclick_vbox;
595 GtkWidget *prefs_rclick_audmenu_rbt, *prefs_rclick_smallmenu_rbt; 632 GtkWidget *prefs_rclick_audmenu_rbt, *prefs_rclick_smallmenu1_rbt, *prefs_rclick_smallmenu2_rbt;
596 GtkWidget *prefs_scroll_frame, *prefs_scroll_vbox; 633 GtkWidget *prefs_scroll_frame, *prefs_scroll_vbox;
597 GtkWidget *prefs_scroll_vol_rbt, *prefs_scroll_skip_rbt; 634 GtkWidget *prefs_scroll_vol_rbt, *prefs_scroll_skip_rbt;
598 GtkWidget *prefs_bbar_bbox; 635 GtkWidget *prefs_bbar_bbox;
599 GtkWidget *prefs_bbar_bt_ok, *prefs_bbar_bt_cancel; 636 GtkWidget *prefs_bbar_bt_ok, *prefs_bbar_bt_cancel;
600 GdkGeometry prefs_win_hints; 637 GdkGeometry prefs_win_hints;
625 gtk_container_add( GTK_CONTAINER(prefs_rclick_frame) , prefs_rclick_vbox ); 662 gtk_container_add( GTK_CONTAINER(prefs_rclick_frame) , prefs_rclick_vbox );
626 prefs_rclick_audmenu_rbt = gtk_radio_button_new_with_label( NULL , 663 prefs_rclick_audmenu_rbt = gtk_radio_button_new_with_label( NULL ,
627 _("Audacious standard menu") ); 664 _("Audacious standard menu") );
628 g_object_set_data( G_OBJECT(prefs_rclick_audmenu_rbt) , "val" , 665 g_object_set_data( G_OBJECT(prefs_rclick_audmenu_rbt) , "val" ,
629 GINT_TO_POINTER(SI_CFG_RCLICK_MENU_AUD) ); 666 GINT_TO_POINTER(SI_CFG_RCLICK_MENU_AUD) );
630 prefs_rclick_smallmenu_rbt = gtk_radio_button_new_with_label_from_widget( 667 prefs_rclick_smallmenu1_rbt = gtk_radio_button_new_with_label_from_widget(
631 GTK_RADIO_BUTTON(prefs_rclick_audmenu_rbt) , 668 GTK_RADIO_BUTTON(prefs_rclick_audmenu_rbt) ,
632 _("Small playback menu") ); 669 _("Small playback menu #1") );
633 g_object_set_data( G_OBJECT(prefs_rclick_smallmenu_rbt) , "val" , 670 g_object_set_data( G_OBJECT(prefs_rclick_smallmenu1_rbt) , "val" ,
634 GINT_TO_POINTER(SI_CFG_RCLICK_MENU_SMALL) ); 671 GINT_TO_POINTER(SI_CFG_RCLICK_MENU_SMALL1) );
672 prefs_rclick_smallmenu2_rbt = gtk_radio_button_new_with_label_from_widget(
673 GTK_RADIO_BUTTON(prefs_rclick_audmenu_rbt) ,
674 _("Small playback menu #2") );
675 g_object_set_data( G_OBJECT(prefs_rclick_smallmenu2_rbt) , "val" ,
676 GINT_TO_POINTER(SI_CFG_RCLICK_MENU_SMALL2) );
635 g_object_set_data( G_OBJECT(prefs_win) , "rcm_grp" , 677 g_object_set_data( G_OBJECT(prefs_win) , "rcm_grp" ,
636 gtk_radio_button_get_group(GTK_RADIO_BUTTON(prefs_rclick_smallmenu_rbt)) ); 678 gtk_radio_button_get_group(GTK_RADIO_BUTTON(prefs_rclick_smallmenu1_rbt)) );
637 if ( si_cfg.rclick_menu == SI_CFG_RCLICK_MENU_AUD ) 679 switch ( si_cfg.rclick_menu )
638 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(prefs_rclick_audmenu_rbt) , TRUE ); 680 {
639 else 681 case SI_CFG_RCLICK_MENU_SMALL1:
640 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(prefs_rclick_smallmenu_rbt) , TRUE ); 682 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(prefs_rclick_smallmenu1_rbt) , TRUE );
683 break;
684 case SI_CFG_RCLICK_MENU_SMALL2:
685 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(prefs_rclick_smallmenu2_rbt) , TRUE );
686 break;
687 case SI_CFG_RCLICK_MENU_AUD:
688 default:
689 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(prefs_rclick_audmenu_rbt) , TRUE );
690 break;
691 }
641 gtk_box_pack_start( GTK_BOX(prefs_rclick_vbox) , prefs_rclick_audmenu_rbt , TRUE , TRUE , 0 ); 692 gtk_box_pack_start( GTK_BOX(prefs_rclick_vbox) , prefs_rclick_audmenu_rbt , TRUE , TRUE , 0 );
642 gtk_box_pack_start( GTK_BOX(prefs_rclick_vbox) , prefs_rclick_smallmenu_rbt , TRUE , TRUE , 0 ); 693 gtk_box_pack_start( GTK_BOX(prefs_rclick_vbox) , prefs_rclick_smallmenu1_rbt , TRUE , TRUE , 0 );
694 gtk_box_pack_start( GTK_BOX(prefs_rclick_vbox) , prefs_rclick_smallmenu2_rbt , TRUE , TRUE , 0 );
643 gtk_box_pack_start( GTK_BOX(prefs_vbox) , prefs_rclick_frame , TRUE , TRUE , 0 ); 695 gtk_box_pack_start( GTK_BOX(prefs_vbox) , prefs_rclick_frame , TRUE , TRUE , 0 );
644 696
645 prefs_scroll_frame = gtk_frame_new( _("Mouse Scroll Action") ); 697 prefs_scroll_frame = gtk_frame_new( _("Mouse Scroll Action") );
646 prefs_scroll_vbox = gtk_vbox_new( TRUE , 0 ); 698 prefs_scroll_vbox = gtk_vbox_new( TRUE , 0 );
647 gtk_container_set_border_width( GTK_CONTAINER(prefs_scroll_vbox) , 6 ); 699 gtk_container_set_border_width( GTK_CONTAINER(prefs_scroll_vbox) , 6 );
648 gtk_container_add( GTK_CONTAINER(prefs_scroll_frame) , prefs_scroll_vbox ); 700 gtk_container_add( GTK_CONTAINER(prefs_scroll_frame) , prefs_scroll_vbox );
649 prefs_scroll_vol_rbt = gtk_radio_button_new_with_label( NULL , 701 prefs_scroll_vol_rbt = gtk_radio_button_new_with_label( NULL ,