void mforms::gtk::MenuItemImpl::insert_item(mforms::MenuBase *menub, int index, mforms::MenuItem *item) {
  Gtk::MenuShell *menu_shell = cast<Gtk::MenuShell *>(menub->get_data_ptr());
  Gtk::MenuItem *item_to_insert = cast<Gtk::MenuItem *>(item->get_data_ptr());

  if (!menu_shell) // menub is not a menubar
  {
    Gtk::MenuItem *mi = cast<Gtk::MenuItem *>(menub->get_data_ptr());
    if (mi) {
      Gtk::Menu *menu = 0;
      if (mi->has_submenu()) // item already has submenu, add to it
        menu = mi->get_submenu();
      else { // no submenu yet in item, create one
        menu = Gtk::manage(new Gtk::Menu());
        mi->signal_activate().connect(sigc::bind(sigc::ptr_fun(menu_will_show), menub));
        mi->set_submenu(*menu);
        menu->show();
      }
      menu_shell = menu;
    } else
      logError("Passed MenuBase %p does not contain neither Gtk::MenuBar nor Gtk::MenuItem\n", menub);
  } else {
    if (menub->get_parent() && get_accel_group(menub))
      propagate_accel_group(menub, get_accel_group(menub));
  }
  if (menu_shell && item_to_insert)
    menu_shell->insert(*item_to_insert, index);
  else
    logError("Internal error in MenuBase::insert_item()\n");
}
Beispiel #2
0
    Glib::RefPtr<Gtk::UIManager> SmartChessWindow::createUIManager(
            Glib::RefPtr<Gtk::ActionGroup> &action_group) {
        auto ui_manager = Gtk::UIManager::create();

        ui_manager->insert_action_group(action_group);
        add_accel_group(ui_manager->get_accel_group());

        Glib::ustring ui_info =
                "<ui>"
                "  <menubar name='MenuBar'>"
                "    <menu action='MenuFile'>"
                "      <separator/>"
                "      <menuitem action='Quit'/>"
                "    </menu>"
                "       <menu action='MenuView'>"
                "           <menuitem action='ShowOptionsArea' />"
                "           <menuitem action='ShowLogArea' />"
                "       </menu>"
                "       <menu action='MenuHelp'>"
                "           <menuitem action='About' />"
                "       </menu>"
                "  </menubar>"
                "  <toolbar  name='ToolBar'>"
                "    <toolitem action='Quit'/>"
                "  </toolbar>"
                "</ui>";

        ui_manager->add_ui_from_string(ui_info);
        return ui_manager;
    }
Beispiel #3
0
void
libbalsa_window_set_accels(GtkApplicationWindow * window,
                           GMenuModel           * menu_model)
{
    GSList *accel_groups;
    GtkAccelGroup *accel_group;

    /* Remove current accelerators: */
    accel_groups = gtk_accel_groups_from_object(G_OBJECT(window));
    if (accel_groups)
        /* Last is first... */
        gtk_window_remove_accel_group(GTK_WINDOW(window),
                                      accel_groups->data);

    accel_group = get_accel_group(menu_model, G_ACTION_MAP(window));
    gtk_window_add_accel_group(GTK_WINDOW(window), accel_group);
    g_object_unref(accel_group);
}
//------------------------------------------------------------------------------
void mforms::gtk::MenuItemImpl::set_shortcut(mforms::MenuItem *item, const std::string &item_shortcut) {
  if (item_shortcut.empty()) {
    logWarning("Shortcut is empty\n");
    return;
  }

  Gtk::MenuItem *menu_item = cast<Gtk::MenuItem *>(item->get_data_ptr());

  if (menu_item == NULL) {
    logError("Menu item was not defined (%s)\n", item_shortcut.c_str());
    return;
  }

  // convert the accelerator format from Control+X to <control>x which is recognized by gtk
  std::vector<std::string> parts(base::split(item_shortcut, "+"));

  std::vector<std::string> keys;
  std::string key = parts.back();
  parts.pop_back();

  if (key == "Space")
    keys.push_back("space");
  else if (key == "PageUp") {
    keys.push_back("Page_Up");
    keys.push_back("KP_Page_Up");
  } else if (key == "PageDown") {
    keys.push_back("Page_Down");
    keys.push_back("KP_Page_Down");
  } else if (key == "Slash") {
    keys.push_back("slash");
    keys.push_back("KP_Divide");
  } else if (key == "Minus") {
    keys.push_back("minus");
    keys.push_back("KP_Subtract");
  } else if (key == "Plus") {
    keys.push_back("plus");
    keys.push_back("KP_Add");
  } else if (key == "Asterisk") {
    keys.push_back("multiply");
    keys.push_back("KP_Multiply");
  } else if (key == "Period") {
    keys.push_back("period");
    keys.push_back("KP_Decimal");
  } else if (key == "Return") {
    keys.push_back("Return");
    keys.push_back("KP_Enter");
  } else if (key == "Home") {
    keys.push_back("Home");
    keys.push_back("KP_Home");
  } else if (key == "End") {
    keys.push_back("End");
    keys.push_back("KP_End");
  } else if (key == "Insert") {
    keys.push_back("Insert");
    keys.push_back("KP_Insert");
  } else if (key == "Delete") {
    keys.push_back("Delete");
    keys.push_back("KP_Delete");
  } else if (key == "Up") {
    keys.push_back("Up");
    keys.push_back("KP_Up");
  } else if (key == "Down") {
    keys.push_back("Down");
    keys.push_back("KP_Down");
  } else if (key == "Left") {
    keys.push_back("Left");
    keys.push_back("KP_Left");
  } else if (key == "Right") {
    keys.push_back("Right");
    keys.push_back("KP_Right");
  } else if (key == "0") {
    keys.push_back("0");
    keys.push_back("KP_0");
  } else if (key == "1") {
    keys.push_back("1");
    keys.push_back("KP_1");
  } else if (key == "2") {
    keys.push_back("2");
    keys.push_back("KP_2");
  } else if (key == "3") {
    keys.push_back("3");
    keys.push_back("KP_3");
  } else if (key == "4") {
    keys.push_back("4");
    keys.push_back("KP_4");
  } else if (key == "5") {
    keys.push_back("5");
    keys.push_back("KP_5");
  } else if (key == "6") {
    keys.push_back("6");
    keys.push_back("KP_6");
  } else if (key == "7") {
    keys.push_back("7");
    keys.push_back("KP_7");
  } else if (key == "8") {
    keys.push_back("8");
    keys.push_back("KP_8");
  } else if (key == "9") {
    keys.push_back("9");
    keys.push_back("KP_9");
  } else
    keys.push_back(key);

  // if the item is not in a menu yet, the shortcut adding will be deferred
  if (item->get_parent() && get_accel_group(item->get_parent()))
    add_shortcuts(get_accel_group(item->get_parent()), menu_item, parts, keys);
}
Beispiel #5
0
mixer_window::mixer_window(mixer & mixer)
    : mixer_(mixer),
      file_menu_item_(gettext("_File"), true),
      quit_menu_item_(Gtk::StockID("gtk-quit")),
      settings_menu_item_(gettext("_Settings"), true),
      format_menu_item_(gettext("_Format"), true),
      sources_menu_item_(gettext("_Sources"), true),
      safe_area_menu_item_(gettext("_Highlight safe area"), true),
      fullscreen_menu_item_(gettext("Fu_ll screen"), true),
      status_bar_menu_item_(gettext("Status _Bar"), true),
      status_bar_radio_grp(),
      status_bar_on_menu_item_(status_bar_radio_grp, gettext("On"), false),
      status_bar_off_menu_item_(status_bar_radio_grp, gettext("Off"), false),
      status_bar_blink_menu_item_(status_bar_radio_grp, gettext("Blink"), false),
      record_button_(),
      record_icon_(Gtk::Stock::MEDIA_RECORD, Gtk::ICON_SIZE_BUTTON),
      cut_button_(),
      cut_icon_(Gtk::Stock::CUT, Gtk::ICON_SIZE_BUTTON),
      effects_frame_(gettext("Effects")),
      none_button_(effect_group_, gettext("No effect/transition")),
      pip_button_(effect_group_, gettext("_Pic-in-pic"), true),
      mfade_button_(effect_group_, gettext("_Manual fade"), true),
      tfade_button_(effect_group_, gettext("Timed fa_de"), true),
      tfade_label_(gettext("Transition speed [ms]:")),
      tfade_value_(40, 15040, 40),
      mfade_label_(gettext("Manual fade A/B:")),
      mfade_ab_(0, 256, 1),
      apply_button_(),
      apply_icon_(Gtk::Stock::APPLY, Gtk::ICON_SIZE_BUTTON),
      trans_frame_(gettext("Transitions")),
      vu_meter_(-56, 0),
      pri_video_source_id_(0),
      sec_video_source_id_(0),
      pip_active_(false),
      pip_pending_(false),
      mfade_active_(false),
      progress_active_(false),
      fullscreen_state_(false),
      wakeup_pipe_(O_NONBLOCK, O_NONBLOCK),
      next_source_id_(0),
      osc_(NULL),
      source_count_(0)
{
    // In some locales (e.g., Dutch), the shortcuts of the stock button
    // labels conflict (e.g., _record -> op_nemen, cu_t -> k_nippen).
    // So, rather than using stock buttons, use buttons with our own
    // gettexted strings, and the same stock labels; the look will be
    // the same, but now the shortcut can be overridden for localized
    // variants.
    record_button_.set_label(gettext("_Record"));
    record_button_.set_use_underline();
    record_button_.set_image(record_icon_);
    cut_button_.set_label(gettext("Cu_t"));
    cut_button_.set_use_underline();
    cut_button_.set_image(cut_icon_);
    apply_button_.set_label(gettext("_Apply"));
    apply_button_.set_use_underline();
    apply_button_.set_image(apply_icon_);

    Glib::RefPtr<Glib::IOSource> pipe_io_source(
	Glib::IOSource::create(wakeup_pipe_.reader.get(), Glib::IO_IN));
    pipe_io_source->set_priority(Glib::PRIORITY_DEFAULT_IDLE);
    pipe_io_source->connect(sigc::mem_fun(this, &mixer_window::update));
    pipe_io_source->attach();

    set_mnemonic_modifier(Gdk::ModifierType(0));

    quit_menu_item_.signal_activate().connect(sigc::mem_fun(this, &mixer_window::open_quit_dialog));
    quit_menu_item_.show();
    file_menu_.add(quit_menu_item_);
    file_menu_item_.set_submenu(file_menu_);
    file_menu_item_.show();
    menu_bar_.add(file_menu_item_);
    format_menu_item_.signal_activate().connect(
	sigc::mem_fun(this, &mixer_window::open_format_dialog));
    format_menu_item_.show();
    sources_menu_item_.signal_activate().connect(
	sigc::mem_fun(this, &mixer_window::open_sources_dialog));
    sources_menu_item_.show();
    safe_area_menu_item_.signal_toggled().connect(
	sigc::mem_fun(this, &mixer_window::toggle_safe_area_display));
    safe_area_menu_item_.show();
    safe_area_menu_item_.set_active(true);
    fullscreen_menu_item_.signal_toggled().connect(
    	sigc::mem_fun(this, &mixer_window::toggle_fullscreen));
    fullscreen_menu_item_.show();
    fullscreen_menu_item_.set_active(false);

    settings_menu_.add(sources_menu_item_);
    settings_menu_.add(format_menu_item_);
    settings_menu_.add(safe_area_menu_item_);
    settings_menu_.add(fullscreen_menu_item_);

    status_bar_on_menu_item_.signal_toggled().connect(
	sigc::bind<0>(sigc::mem_fun(osd_, &status_overlay::set_bar_mode), status_overlay::BAR_ON));
    status_bar_off_menu_item_.signal_toggled().connect(
	sigc::bind<0>(sigc::mem_fun(osd_, &status_overlay::set_bar_mode), status_overlay::BAR_OFF));
    status_bar_blink_menu_item_.signal_toggled().connect(
	sigc::bind<0>(sigc::mem_fun(osd_, &status_overlay::set_bar_mode), status_overlay::BAR_BLINK));

    status_bar_blink_menu_item_.set_active(true);
    status_bar_on_menu_item_.show();
    status_bar_off_menu_item_.show();
    status_bar_blink_menu_item_.show();
    status_bar_menu_.add(status_bar_on_menu_item_);
    status_bar_menu_.add(status_bar_off_menu_item_);
    status_bar_menu_.add(status_bar_blink_menu_item_);
    status_bar_menu_item_.show();
    status_bar_menu_item_.set_submenu(status_bar_menu_);
    settings_menu_.add(status_bar_menu_item_);

    settings_menu_item_.set_submenu(settings_menu_);
    settings_menu_item_.show();
    menu_bar_.add(settings_menu_item_);
    menu_bar_.show();

    record_button_.set_mode(/*draw_indicator=*/false);
    record_button_.signal_toggled().connect(
	sigc::mem_fun(*this, &mixer_window::toggle_record));
    record_button_.set_sensitive(false);
    record_button_.show();

    cut_button_.set_sensitive(false);
    cut_button_.signal_clicked().connect(sigc::mem_fun(mixer_, &mixer::cut));
    cut_button_.show();

    command_sep_.show();

    none_button_.set_mode(/*draw_indicator=*/false);
    none_button_.set_sensitive(false);
    none_button_.signal_clicked().connect(
	sigc::mem_fun(this, &mixer_window::cancel_effect));
    none_button_.add_accelerator("activate",
				 get_accel_group(),
				 GDK_Escape,
				 Gdk::ModifierType(0),
				 Gtk::AccelFlags(0));
    none_button_.show();

    pip_button_.set_mode(/*draw_indicator=*/false);
    pip_button_.set_sensitive(false);
    pip_button_.signal_clicked().connect(
	sigc::mem_fun(this, &mixer_window::begin_pic_in_pic));
    pip_button_.show();

    mfade_button_.set_mode(/*draw_indicator=*/false);
    mfade_button_.set_sensitive(false);
    mfade_button_.signal_clicked().connect(
    	sigc::mem_fun(this, &mixer_window::begin_mfade));
    mfade_button_.show();

    tfade_button_.set_mode(/*draw_indicator=*/false);
    tfade_button_.set_sensitive(false);
    tfade_button_.signal_clicked().connect(
        sigc::mem_fun(this, &mixer_window::begin_tfade));
    tfade_button_.show();

    // there are no stacked effects: manual and timed fading is exclusive:
    // starting a timed fade will cancel the manual one.
    // a short fade (2-3 frames) can still trick the viewer.
    // once effect stacking is possible this should likley be set to 
    // a sane default - i.e 500 ms - 2 seconds is rather long.
    tfade_value_.set_value(100);

    tfade_value_.set_sensitive(false);
    tfade_value_.set_value_pos(Gtk::POS_BOTTOM);
    tfade_value_.show();
    tfade_label_.show();

    mfade_ab_.set_value(0);
    mfade_ab_.set_draw_value(false);
    mfade_ab_.set_sensitive(false);
    mfade_ab_.show();
    mfade_label_.show();

    mfade_ab_.signal_value_changed().connect(
	sigc::mem_fun(this, &mixer_window::mfade_update));

    apply_button_.set_sensitive(false);
    apply_button_.signal_clicked().connect(
	sigc::mem_fun(this, &mixer_window::apply_effect));
    apply_button_.add_accelerator("activate",
				  get_accel_group(),
				  GDK_Return,
				  Gdk::ModifierType(0),
				  Gtk::AccelFlags(0));
    apply_button_.add_accelerator("activate",
				  get_accel_group(),
				  GDK_KP_Enter,
				  Gdk::ModifierType(0),
				  Gtk::AccelFlags(0));
    apply_button_.show();

    progress_.set_text(gettext("Transition Progress"));
    progress_.show();

    vu_meter_.show();

    display_.show();

    osd_.add(display_);
    osd_.set_status(gettext("STOP"), "gtk-media-stop");
    osd_.show();

    selector_.set_border_width(gui_standard_spacing);
    selector_.set_accel_group(get_accel_group());
    selector_.signal_pri_video_selected().connect(
	sigc::mem_fun(*this, &mixer_window::set_pri_video_source));
    selector_.signal_sec_video_selected().connect(
	sigc::mem_fun(*this, &mixer_window::set_sec_video_source));
    selector_.signal_audio_selected().connect(
	sigc::mem_fun(mixer_, &mixer::set_audio_source));
    selector_.show();

    effects_box_.set_border_width(gui_standard_spacing);
    effects_box_.set_spacing(gui_standard_spacing);
    effects_box_.pack_start(apply_button_, Gtk::PACK_SHRINK);
    effects_box_.pack_start(pip_button_, Gtk::PACK_SHRINK);
    effects_box_.pack_start(mfade_button_, Gtk::PACK_SHRINK);
    effects_box_.pack_start(mfade_label_, Gtk::PACK_SHRINK);
    effects_box_.pack_start(mfade_ab_, Gtk::PACK_SHRINK);
    effects_box_.show();
    effects_frame_.add(effects_box_);
    effects_frame_.show();

    trans_box_.set_border_width(gui_standard_spacing);
    trans_box_.set_spacing(gui_standard_spacing);
    trans_box_.pack_start(tfade_button_, Gtk::PACK_SHRINK);
    trans_box_.pack_start(tfade_label_, Gtk::PACK_SHRINK);
    trans_box_.pack_start(tfade_value_, Gtk::PACK_SHRINK);
    trans_box_.pack_start(progress_, Gtk::PACK_SHRINK);
    trans_box_.show();
    trans_frame_.add(trans_box_);
    trans_frame_.show();

    command_box_.set_spacing(gui_standard_spacing);
    command_box_.pack_start(record_button_, Gtk::PACK_SHRINK);
    command_box_.pack_start(cut_button_, Gtk::PACK_SHRINK);
    command_box_.pack_start(command_sep_, Gtk::PACK_SHRINK);
    command_box_.pack_start(none_button_, Gtk::PACK_SHRINK);
    command_box_.pack_start(effects_frame_,Gtk::PACK_SHRINK);
    command_box_.pack_start(trans_frame_,Gtk::PACK_SHRINK);
    command_box_.pack_start(vu_meter_, Gtk::PACK_EXPAND_WIDGET);
    command_box_.show();

    upper_box_.set_border_width(gui_standard_spacing);
    upper_box_.set_spacing(gui_standard_spacing);
    upper_box_.pack_start(command_box_, Gtk::PACK_SHRINK);
    upper_box_.pack_start(osd_, Gtk::PACK_EXPAND_PADDING);
    upper_box_.show();

    main_box_.pack_start(menu_bar_, Gtk::PACK_SHRINK);
    main_box_.pack_start(upper_box_, Gtk::PACK_SHRINK);
    main_box_.pack_start(selector_, Gtk::PACK_EXPAND_PADDING);
    main_box_.show();
    add(main_box_);
}
Beispiel #6
0
void AppWindow::add_accelerator(Gtk::MenuItem *it, char accelerator) {
  it->add_accelerator("activate", get_accel_group(), accelerator, (Gdk::ModifierType) 0, Gtk::ACCEL_VISIBLE);
  it->add_accelerator("activate", get_accel_group(), accelerator, Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE);
}