Hello Everyone, I am trying to create a gedit like program in C++ using gtkmm.
But, here I am facing two problems.
First One, whenever I click on File->New, then I get error Segmentation Fault.
Using GNU Debugger, I found error in Gtk::TextBuffer::set_text(Glib::ustring&).
Second One, I don't know how to connect the gtksourceview::SourceView signal_key_press_event
to a callback function. I have tried, but nothing happen.
Here's the code
proj.cpp
Code:
#include "proj.h"
#include <iostream>
main_window::main_window()
: txtinputarray(20),
scrollwinarray(20)
{
Gtk::ScrolledWindow *scroll = new Gtk::ScrolledWindow;
gtksourceview::SourceView *txt = new gtksourceview::SourceView;
std::fill(scrollwinarray.begin(),scrollwinarray.end(),scroll);
std::fill(txtinputarray.begin(),txtinputarray.end(),txt);
set_title("IDE C#");
set_default_size(600,400);
set_border_width(5);
lang_manager = gtksourceview::SourceLanguageManager::create();
action_group = Gtk::ActionGroup::create();
action_group->add(Gtk::Action::create("FileMenu","File"));
action_group->add(Gtk::Action::create("FileNew",Gtk::Stock::NEW),sigc::mem_fun(*this,&main_window::filenew_activated));
action_group->add(Gtk::Action::create("FileNewTab",Gtk::Stock::SAVE_AS),sigc::mem_fun(*this,&main_window::filenewtab_activated));
action_group->add(Gtk::Action::create("FileOpen",Gtk::Stock::OPEN),sigc::mem_fun(*this,&main_window::fileopen_activated));
action_group->add(Gtk::Action::create("FileSave",Gtk::Stock::SAVE),sigc::mem_fun(*this,&main_window::filesave_activated));
action_group->add(Gtk::Action::create("FileSaveAs",Gtk::Stock::SAVE_AS),sigc::mem_fun(*this,&main_window::filesaveas_activated));
action_group->add(Gtk::Action::create("FileSaveAll","Save All",""),sigc::mem_fun(*this,&main_window::filesaveall_activated));
action_group->add(Gtk::Action::create("FileSaveAllAs","Save All As",""),sigc::mem_fun(*this,&main_window::filesaveallas_activated));
action_group->add(Gtk::Action::create("FileSaveCopyAs","Save Copy As",""),sigc::mem_fun(*this,&main_window::filesavecopyas_activated));
action_group->add(Gtk::Action::create("FileRemoveTab","Remove Current Tab",""),sigc::mem_fun(*this,&main_window::fileremovetab_activated));
action_group->add(Gtk::Action::create("FileQuit",Gtk::Stock::QUIT),sigc::mem_fun(*this,&main_window::filequit_activated));
action_group->add(Gtk::Action::create("EditMenu","Edit"));
action_group->add(Gtk::Action::create("EditUndo",Gtk::Stock::UNDO),sigc::mem_fun(*this,&main_window::editundo_activated));
action_group->add(Gtk::Action::create("EditRedo",Gtk::Stock::REDO),sigc::mem_fun(*this,&main_window::editredo_activated));
action_group->add(Gtk::Action::create("EditCopy",Gtk::Stock::COPY),sigc::mem_fun(*this,&main_window::editcopy_activated));
action_group->add(Gtk::Action::create("EditCut",Gtk::Stock::CUT),sigc::mem_fun(*this,&main_window::editcut_activated));
action_group->add(Gtk::Action::create("EditPaste",Gtk::Stock::PASTE),sigc::mem_fun(*this,&main_window::editpaste_activated));
action_group->add(Gtk::Action::create("EditSelectAll","Select All",""),sigc::mem_fun(*this,&main_window::editselectall_activated));
action_group->add(Gtk::Action::create("EditGoToLine","Go To Line",""),sigc::mem_fun(*this,&main_window::editgotoline_activated));
action_group->add(Gtk::Action::create("EditFind",Gtk::Stock::FIND),sigc::mem_fun(*this,&main_window::editfind_activated));
action_group->add(Gtk::Action::create("EditFindAndReplace",Gtk::Stock::FIND_AND_REPLACE),sigc::mem_fun(*this,&main_window::editfindandreplace_activated));
action_group->add(Gtk::Action::create("FormatMenu","Format"));
action_group->add(Gtk::Action::create("FormatIndent","Indent Region",""),sigc::mem_fun(*this,&main_window::formatindentregion_activated));
action_group->add(Gtk::Action::create("FormatDedent","Dedent Region",""),sigc::mem_fun(*this,&main_window::formatdedentregion_activated));
action_group->add(Gtk::Action::create("FormatComment","Comment Out Region",""),sigc::mem_fun(*this,&main_window::formatcommentout_activated));
action_group->add(Gtk::Action::create("FormatUncomment","Uncomment Out Region",""),sigc::mem_fun(*this,&main_window::formatuncommentout_activated));
action_group->add(Gtk::Action::create("FormatStripSpaces","Strip Trailing Spaces",""),sigc::mem_fun(*this,&main_window::formatstripspaces_activated));
ui_manager = Gtk::UIManager::create();
ui_manager->insert_action_group(action_group);
Glib::ustring ui_info =
"<ui>"
"<menubar name = 'MenuBar'>"
"<menu action = 'FileMenu'>"
"<menuitem action = 'FileNew'/>"
"<menuitem action = 'FileNewTab'/>"
"<separator/>"
"<menuitem action = 'FileOpen'/>"
"<menuitem action = 'FileSave'/>"
"<menuitem action = 'FileSaveAs'/>"
"<menuitem action = 'FileSaveAll'/>"
"<menuitem action = 'FileSaveAllAs'/>"
"<menuitem action = 'FileSaveCopyAs'/>"
"<separator/>"
"<menuitem action = 'FileRemoveTab'/>"
"<menuitem action = 'FileQuit'/>"
"</menu>"
"<menu action = 'EditMenu'>"
"<menuitem action = 'EditUndo'/>"
"<menuitem action = 'EditRedo'/>"
"<menuitem action = 'EditCopy'/>"
"<menuitem action = 'EditCut'/>"
"<menuitem action = 'EditPaste'/>"
"<menuitem action = 'EditSelectAll'/>"
"<separator/>"
"<menuitem action = 'EditGoToLine'/>"
"<menuitem action = 'EditFind'/>"
"<menuitem action = 'EditFindAndReplace'/>"
"</menu>"
"<menu action = 'FormatMenu'>"
"<menuitem action = 'FormatIndent'/>"
"<menuitem action = 'FormatDedent'/>"
"<menuitem action = 'FormatComment'/>"
"<menuitem action = 'FormatUncomment'/>"
"<menuitem action = 'FormatStripSpaces'/>"
"</menu>"
"</menubar>"
"<toolbar name = 'ToolBar'>"
"<toolitem action = 'FileNew'/>"
"<toolitem action = 'FileOpen'/>"
"<toolitem action = 'FileSave'/>"
"<toolitem action = 'FileSaveAs'/>"
"<separator/>"
"<toolitem action = 'EditUndo'/>"
"<toolitem action = 'EditRedo'/>"
"<toolitem action = 'EditCopy'/>"
"<toolitem action = 'EditCut'/>"
"<toolitem action = 'EditPaste'/>"
"<toolitem action = 'EditFind'/>"
"<toolitem action = 'EditFindAndReplace'/>"
"<separator/>"
"</toolbar>"
"</ui>";
ui_manager->add_ui_from_string(ui_info);
Gtk::Widget *menu_bar = ui_manager->get_widget("/MenuBar");
if(menu_bar)
vbox.pack_start(*menu_bar,Gtk::PACK_SHRINK);
Gtk::Widget *toolbar = ui_manager->get_widget("/ToolBar");
if(toolbar)
vbox.pack_start(*toolbar,Gtk::PACK_SHRINK);
txtinputarray[0]->signal_key_press_event().connect(sigc::mem_fun(*this,&main_window::on_txtinput_key_press));
scrollwinarray[0]->set_policy(Gtk::POLICY_AUTOMATIC,Gtk::POLICY_AUTOMATIC);
scrollwinarray[0]->add(*txtinputarray[0]);
notebook.append_page(*scrollwinarray[0],"New File");
vbox.pack_start(notebook,Gtk::PACK_EXPAND_WIDGET);
add(vbox);
show_all_children();
}
main_window::~main_window()
{
}
bool main_window::on_txtinput_key_press(GdkEventKey *event)
{
if (event->keyval == GDK_Return)
{
buffer = txtinputarray[notebook.get_current_page()]->get_source_buffer();
Gtk::TextBuffer::iterator current_iter;
current_iter = buffer->get_iter_at_mark(buffer->get_insert());
std::cout<<"gggg"<<std::endl;
return false;
}
void main_window::filenew_activated()
{
buffer = txtinputarray[notebook.get_current_page()]->get_source_buffer();
notebook.set_tab_label_text(*scrollwinarray[notebook.get_current_page()],"New File");
std::string str = "";
buffer->set_text(str);
//filepathsarray[notebook.get_current_page()] = "";
std::cout<<"gggg"<<std::endl;
}
void main_window::filenewtab_activated()
{
txtinputarray[notebook.get_n_pages()] = new gtksourceview::SourceView;
scrollwinarray[notebook.get_n_pages()] = new Gtk::ScrolledWindow;
scrollwinarray[notebook.get_n_pages()]->set_policy(Gtk::POLICY_AUTOMATIC,Gtk::POLICY_AUTOMATIC);
scrollwinarray[notebook.get_n_pages()]->add(*txtinputarray[notebook.get_n_pages()]);
filepathsarray[notebook.get_n_pages()] = "";
notebook.append_page(*scrollwinarray[notebook.get_current_page()],"New File");
}
void main_window::fileopen_activated()
{
std::string filepath;
int result;
Gtk::FileChooserDialog dialog("Open File",Gtk::FILE_CHOOSER_ACTION_OPEN);
dialog.add_button("Cancel",Gtk::RESPONSE_CANCEL);
dialog.add_button("Open",Gtk::RESPONSE_OK);
result = dialog.run();
if(result == Gtk::RESPONSE_OK)
{
filepath = dialog.get_filename();
buffer = txtinputarray[notebook.get_current_page()]->get_source_buffer();
buffer->set_text(Glib::file_get_contents(filepath));
filepathsarray[notebook.get_current_page()] = filepath;
buffer->set_highlight_syntax(true);
Glib::RefPtr<gtksourceview::SourceLanguage> lang = lang_manager->guess_language(filepath,Glib::ustring());
std::string filename;
for(int i=filepath.rfind("/")+1;i<=filepath.size()-1;i++)
{
filename = filename + filepath[i];
}
notebook.set_tab_label_text(*scrollwinarray[notebook.get_current_page()],filename);
buffer->set_language(lang);
}
}
void main_window::filesave_activated()
{
std::string filepath;
int result;
Gtk::FileChooserDialog dialog("Save File",Gtk::FILE_CHOOSER_ACTION_SAVE);
dialog.add_button("Cancel",Gtk::RESPONSE_CANCEL);
dialog.add_button("Save",Gtk::RESPONSE_OK);
result = dialog.run();
if(result == Gtk::RESPONSE_OK)
{
filepath = dialog.get_filename();
buffer = txtinputarray[notebook.get_current_page()]->get_source_buffer();
Glib::file_set_contents(filepath,buffer->get_text());
filepathsarray[notebook.get_current_page()] = filepath;
buffer->set_highlight_syntax(true);
Glib::RefPtr<gtksourceview::SourceLanguage> lang = lang_manager->guess_language(filepath,Glib::ustring());
std::string filename;
for(int i=filepath.rfind("/")+1;i<=filepath.size()-1;i++)
{
filename = filename + filepath[i];
}
notebook.set_tab_label_text(*scrollwinarray[notebook.get_current_page()],filename);
buffer->set_language(lang);
}
}
void main_window::filesaveas_activated()
{
std::string filepath;
int result;
Gtk::FileChooserDialog dialog("Save As",Gtk::FILE_CHOOSER_ACTION_SAVE);
dialog.add_button("Cancel",Gtk::RESPONSE_CANCEL);
dialog.add_button("Save",Gtk::RESPONSE_OK);
result = dialog.run();
if(result == Gtk::RESPONSE_OK)
{
filepath = dialog.get_filename();
buffer = txtinputarray[notebook.get_current_page()]->get_source_buffer();
Glib::file_set_contents(filepath,buffer->get_text());
filepathsarray[notebook.get_current_page()] = filepath;
buffer->set_highlight_syntax(true);
Glib::RefPtr<gtksourceview::SourceLanguage> lang = lang_manager->guess_language(filepath,Glib::ustring());
std::string filename;
for(int i=filepath.rfind("/")+1;i<=filepath.size()-1;i++)
{
filename = filename + filepath[i];
}
notebook.set_tab_label_text(*scrollwinarray[notebook.get_current_page()],filename);
buffer->set_language(lang);
}
}
void main_window::filesaveall_activated()
{
int current_page = notebook.get_current_page();
for (int i =0; i<notebook.get_n_pages();i++)
{
notebook.set_current_page(i);
filesave_activated();
}
notebook.set_current_page(current_page);
}
void main_window::filesaveallas_activated()
{
int current_page = notebook.get_current_page();
for (int i =0; i<notebook.get_n_pages();i++)
{
notebook.set_current_page(i);
filesaveas_activated();
}
notebook.set_current_page(current_page);
}
void main_window::filesavecopyas_activated()
{
std::string filepath;
int result;
Gtk::FileChooserDialog dialog("Save As",Gtk::FILE_CHOOSER_ACTION_SAVE);
dialog.add_button("Cancel",Gtk::RESPONSE_CANCEL);
dialog.add_button("Save",Gtk::RESPONSE_OK);
result = dialog.run();
if(result == Gtk::RESPONSE_OK)
{
filepath = dialog.get_filename();
buffer = txtinputarray[notebook.get_current_page()]->get_source_buffer();
Glib::file_set_contents(filepath,buffer->get_text());
}
}
void main_window::fileremovetab_activated()
{
int current_page = notebook.get_current_page();
for(int i=current_page;i<notebook.get_n_pages();i++)
{
txtinputarray[i] = txtinputarray[i+1];
scrollwinarray[i] = scrollwinarray[i+1];
filepathsarray[i] = filepathsarray[i+1];
}
notebook.remove_page(notebook.get_current_page());
}
void main_window::filequit_activated()
{
destroy_();
}
void main_window::editundo_activated()
{
buffer = txtinputarray[notebook.get_current_page()]->get_source_buffer();
if (buffer->can_undo() == TRUE)
buffer->undo();
}
void main_window::editredo_activated()
{
buffer = txtinputarray[notebook.get_current_page()]->get_source_buffer();
if (buffer->can_undo() == FALSE)
buffer->redo();
}
void main_window::editcopy_activated()
{
const Glib::RefPtr<Gtk::Clipboard> clipboard = Gtk::Clipboard::get();
buffer = txtinputarray[notebook.get_current_page()]->get_source_buffer();
buffer->copy_clipboard(clipboard);
}
void main_window::editcut_activated()
{
const Glib::RefPtr<Gtk::Clipboard> clipboard = Gtk::Clipboard::get();
buffer = txtinputarray[notebook.get_current_page()]->get_source_buffer();
buffer->cut_clipboard(clipboard);
}
void main_window::editpaste_activated()
{
const Glib::RefPtr<Gtk::Clipboard> clipboard = Gtk::Clipboard::get();
buffer = txtinputarray[notebook.get_current_page()]->get_source_buffer();
buffer->paste_clipboard(clipboard);
}
void main_window::editselectall_activated()
{
Glib::RefPtr<Gtk::TextBuffer> txtbuffer = txtinputarray[notebook.get_current_page()]->get_source_buffer();
Gtk::TextBuffer::iterator start_iter,end_iter;
start_iter = buffer->begin();
end_iter = buffer->end();
txtbuffer->select_range(start_iter,end_iter);
}
void main_window::editgotoline_activated()
{
}
void main_window::editfind_activated(){}
void main_window::editfindandreplace_activated(){}
void main_window::formatindentregion_activated(){}
void main_window::formatcommentout_activated(){}
void main_window::formatdedentregion_activated(){}
void main_window::formatuncommentout_activated(){}
void main_window::formatstripspaces_activated(){}
proj.h
Code:
#include<gtkmm.h>
#include<gtksourceviewmm/sourcebuffer.h>
#include<gtksourceviewmm/sourceview.h>
#include<gtksourceviewmm/sourcelanguagemanager.h>
#include<vector>
template<class T>
class collection
{
enum {size = 10};
T C[size];
public:
T& operator[] (int index)
{
if (index>0 && index<10)
return C[index];
}
};
class main_window : public Gtk::Window
{
public:
main_window();
virtual ~main_window();
bool on_txtinput_key_press(GdkEventKey *event);
protected:
virtual void filenew_activated();
virtual void filenewtab_activated();
virtual void fileopen_activated();
virtual void filesave_activated();
virtual void filesaveas_activated();
virtual void filesaveall_activated();
virtual void filesaveallas_activated();
virtual void filesavecopyas_activated();
virtual void fileremovetab_activated();
virtual void filequit_activated();
virtual void editundo_activated();
virtual void editredo_activated();
virtual void editcopy_activated();
virtual void editcut_activated();
virtual void editpaste_activated();
virtual void editselectall_activated();
virtual void editgotoline_activated();
virtual void editfind_activated();
virtual void editfindandreplace_activated();
virtual void formatindentregion_activated();
virtual void formatdedentregion_activated();
virtual void formatcommentout_activated();
virtual void formatuncommentout_activated();
virtual void formatstripspaces_activated();
Gtk::VBox vbox;
Gtk::Notebook notebook;
Glib::RefPtr<Gtk::UIManager> ui_manager;
Glib::RefPtr<Gtk::ActionGroup> action_group;
std::vector<gtksourceview::SourceView *> txtinputarray;
std::vector<Gtk::ScrolledWindow *> scrollwinarray;
Glib::RefPtr<gtksourceview::SourceBuffer> buffer;
Glib::RefPtr<gtksourceview::SourceLanguageManager> lang_manager;
std::string filepathsarray[20];
};
Code:
#include"proj.h"
int main(int argc,char *argv[])
{
Gtk::Main kit(argc,argv);
main_window main_win;
Gtk::Main::run(main_win);
return 0;
}