Esempio n. 1
0
/* [gtk thread] */
static gboolean do_insert_menu_item_at(gpointer data)
{
   ARGS *args = lock_args(data);
   if (!args->item->extra1) {
      args->item->extra1 = build_menu_item(args->item);
   }
   gtk_menu_shell_insert(GTK_MENU_SHELL(args->item->parent->extra1), args->item->extra1, args->i);
   
   return release_args(data);
}
Esempio n. 2
0
/* [gtk thread] */
static void build_menu(GtkWidget *gmenu, ALLEGRO_MENU *amenu)
{
   size_t i;
   
   for (i = 0; i < _al_vector_size(&amenu->items); ++i) {
      ALLEGRO_MENU_ITEM *aitem = * (ALLEGRO_MENU_ITEM **) _al_vector_ref(&amenu->items, i);
      GtkWidget *gitem = build_menu_item(aitem);
      gtk_menu_shell_append(GTK_MENU_SHELL(gmenu), gitem);
   }
}
Esempio n. 3
0
/* [gtk thread] */
static gboolean do_update_menu_item_at(gpointer data)
{
   ARGS *args = lock_args(data);
   GtkWidget *gitem;
   
   gtk_widget_destroy(args->item->extra1);
   args->item->extra1 = NULL;
   
   gitem = build_menu_item(args->item);
   gtk_menu_shell_insert(GTK_MENU_SHELL(args->item->parent->extra1), gitem, args->i);
   
   return release_args(args);
}
Esempio n. 4
0
void MainMenu::init_entries()
{
    // Update locale
    m_locale = setlocale(LC_ALL, NULL);
    int pos = m_locale.rpos('_');
    if(pos>0) m_locale.sub_delete(pos, m_locale.length()-pos);
    if(m_locale=="C" || m_locale=="POSIX") m_locale.clear();

    const char *file = fl_find_config_file("ede_mainmenu.xml", true);

    struct stat s;
    if(lstat(file, &s) == 0) {
        if(!m_modified) m_modified = s.st_mtime;
        if(m_modified != s.st_mtime) {
            //file has changed..
            m_modified = s.st_mtime;
            clear();
        }
    }

    if(children()>0) return;

    FILE *fp = fopen(file, "r");
    if(!fp) {
        Fl::warning("Menu not found, creating default..");
        try {
            Fl_Buffer buf;
            buf.append(default_menu, strlen(default_menu));
            buf.save_file(file);
        } catch(Fl_Exception &e) {
            Fl::warning(e.text());
        }
        fp = fopen(file, "r");
        if(!fp) Fl::fatal("Cannot write default menu.");
    }
    Fl_XmlLocator locator;

    Fl_XmlDoc *doc=0;
    if(fp) {
        try {
            doc = Fl_XmlParser::create_dom(fp, &locator, false);
        } catch(Fl_XmlException &exp) {
            Fl_String error(exp.text());
            error += "\n\n";
            error += Fl_XmlLocator::error_line(file, *exp.locator());
            error += '\n';
            Fl::warning(error);
        }
    }

	fclose(fp);

    if(!doc) {
        // One more try!
        try {
            Fl_Buffer buf;
            buf.append(default_menu, strlen(default_menu));
            doc = Fl_XmlParser::create_dom(buf.data(), buf.bytes(), &locator, false);
        } catch(Fl_Exception &e) {
            Fl::fatal("Cannot open menu! [%s]", e.text().c_str());
        }
    }

    if(doc) {
        begin();

        Fl_XmlNode *node = doc->root_node();
        if(node) {
            for(uint n=0; n<node->children(); n++) {
                Fl_XmlNode *np = node->child(n);
                if((np->is_element() || np->is_leaf()) && np->name()=="Item")
                    build_menu_item(np);
            }
        }

        end();
    }
}
Esempio n. 5
0
void MainMenu::build_menu_item(Fl_XmlNode *node)
{
    if(!node) return;

    int type = str_to_type(node->get_attribute("Type"));
    if(type==ITEM_NONE) return;

    Fl_Widget *w=0;
    EItemGroup *g=0;
    EItem *i=0;

    switch(type) {
    case ITEM_EXEC:
        i = new EItem(this);
        i->callback((Fl_Callback*)cb_exec_item);
        set_exec(i, node->get_attribute("Exec"));
        i->image(run_pix);
        w = (Fl_Widget *)i;
        break;

    case ITEM_APPDIR:
        g = new EItemGroup(this, APP_GROUP);
        g->image(programs_pix);
        g->dir(get_item_dir(node));
        break;

    case ITEM_SUBDIR:
        g = new EItemGroup(this, APP_GROUP);
        g->image(programs_pix);
        break;

    case ITEM_FILEBROWSER:
        g = new EItemGroup(this, BROWSER_GROUP);
        g->dir(get_item_dir(node));
        g->image(find_pix);
        break;

    case ITEM_DIVIDER:
        w = (Fl_Widget *)new Fl_Menu_Divider();
        break;
    }

    if(g) {
        g->begin();
        w = (Fl_Widget*)g;
    }

    Fl_Image *im=0;
    if(node->has_attribute("Icon")) {
        im = find_image(node->get_attribute("Icon"));
    } else {
        Fl_String im_path(node->get_attribute("Exec"));
        im_path += ".png";
        im = find_image(im_path);
    }
    if(im) w->image(im);

    Fl_String label = get_item_name(node);
    w->label(label);

    for(uint n=0; n<node->children(); n++) {
        Fl_XmlNode *np = node->child(n);
        if((np->is_element() || np->is_leaf()) && np->name()=="Item")
            build_menu_item(np);
    }

    if(w->is_group())
        ((Fl_Group*)w)->end();
}