Автор Тема: Добавка к терминалу  (Прочитано 4946 раз)

Оффлайн keremet

  • Global Moderator
  • ROOT
  • *****
  • Сообщений: 462
  • Репутация: +237/-0
    • Просмотр профиля
    • OpenSolaris
Добавка к терминалу
« : Октябрь 19, 2011, 05:49:27 am »
Для во время разработки и тестирования одного скрипта мне приходилось передавать ему попеременно разные параметры командной строки. Удалять из терминала достаточно длинные параметры и вставлять вместо них другие оказалось достаточно трудоемко. Для облегчения работы была написана приведенная ниже программа. Изменение или вставка параметров делаются через строку редактирования, запуск скрипта  - по кнопке Run.

$cat testfield.cpp
#include <gtk/gtk.h>
#include <stdlib.h>
#include <string>
#include <iostream>
using namespace std;

GtkWidget *entryRunB, *entryRun, *entryRunE;

void buttonRunClicked(GtkWidget *widget, void* p) {
   string s = string(gtk_entry_get_text(GTK_ENTRY(entryRunB)))+ gtk_entry_get_text(GTK_ENTRY(entryRun))+gtk_entry_get_text(GTK_ENTRY(entryRunE));
   cout << s<<endl;
   system(s.c_str());
}

int main(int argc, char** argv) {
   gtk_init(&argc, &argv);
   GtkWidget* window    = gtk_window_new(GTK_WINDOW_TOPLEVEL);
   GtkWidget* hbox     = gtk_hbox_new(false, 0);
   gtk_container_add(GTK_CONTAINER(window), hbox);

   GtkWidget *hpaned = gtk_hpaned_new ();
   gtk_box_pack_start (GTK_BOX (hbox), hpaned, TRUE, TRUE, 0);

   entryRunB = gtk_entry_new ();
   gtk_paned_add1 (GTK_PANED (hpaned), entryRunB);
   GtkWidget *hpaned2 = gtk_hpaned_new ();
   gtk_paned_add2 (GTK_PANED (hpaned), hpaned2);
   entryRun = gtk_entry_new ();
   gtk_paned_add1 (GTK_PANED (hpaned2), entryRun);
   entryRunE = gtk_entry_new ();
   gtk_paned_add2 (GTK_PANED (hpaned2), entryRunE);

   GtkWidget* buttonRun = gtk_button_new_with_label("Run");
   gtk_box_pack_start (GTK_BOX (hbox), buttonRun, FALSE, FALSE, 0);
   g_signal_connect( G_OBJECT(buttonRun), "clicked", G_CALLBACK(buttonRunClicked), 0);
   g_signal_connect( G_OBJECT(window),  "delete_event", G_CALLBACK(gtk_main_quit), 0);
   gtk_widget_show_all(window);
   gtk_main();
   return 0;
}

$cat makefile
APP=testfield
all: $(APP)
$(APP): testfield.cpp
g++ -o$@ `pkg-config gtk+-2.0 --cflags --libs` testfield.cpp
clean:
rm -f $(APP)


В дальнейшем хорошо бы добавить ввод начала и конца команды для универсальности - динамически настраиваемое количество частей команды; возможность просмотра и выбора предыдущих команд. Ввод команды при нажатии enter. Получится хорошая надстройка над psql для работы с postgres, скорее всего и для других СУБД тоже подойдет.
Динамически настраиваемое количество строк ввода команд, вкладки, отображение вывода команды в TextView (возможность копировать по ctrl+C), сохранение/восстановление состояний из файлов.


Оффлайн keremet

  • Global Moderator
  • ROOT
  • *****
  • Сообщений: 462
  • Репутация: +237/-0
    • Просмотр профиля
    • OpenSolaris
Re: Добавка к терминалу
« Ответ #2 : Октябрь 27, 2011, 04:09:52 am »
Реализовано динамически настраиваемое количество строк ввода команд, отображение вывода команды в TextView (возможность копировать по ctrl+C, отсутствие необходимости запускать в терминале(если не нужно отображение ошибок))

#include <gtk/gtk.h>
#include <stdlib.h>
#include <string>
#include <vector>
#include <iostream>
using namespace std;

GtkTextBuffer *buffer;
GtkWidget* vbox;
vector<string> getCommandParts(GtkWidget* hpaned1){
vector<string> vs;
GList* hpaned1List = gtk_container_get_children(GTK_CONTAINER( hpaned1 ));
for(int i=0;i<g_list_length(hpaned1List);i++){
GtkWidget* w1 = (GtkWidget* )g_list_nth_data(hpaned1List, i);
if(GTK_IS_ENTRY(w1)){
string s=gtk_entry_get_text(GTK_ENTRY(w1));
vs.push_back(s);
}else if(GTK_IS_HPANED(w1)){
GList* hpaned2List = gtk_container_get_children(GTK_CONTAINER( w1 ));
for(int i=0;i<g_list_length(hpaned2List);i++){
GtkWidget* w2 = (GtkWidget* )g_list_nth_data(hpaned2List, i);
if(GTK_IS_ENTRY(w2)){
string s=gtk_entry_get_text(GTK_ENTRY(w2));
vs.push_back(s);
}
}
}
}
return vs;
}

void buttonRunClicked(GtkWidget *widget, GtkWidget* hpaned1) {
vector<string> vs=getCommandParts( hpaned1 );
string s;
for(int i=0;i<vs.size();i++)
s+=vs[i];

FILE *f = popen(s.c_str(),"r");
if(!f)
return;
GtkTextIter iter;
gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
gtk_text_buffer_insert (buffer, &iter, (string("##")+s+"\n").c_str(), -1);
int c;
string out;
while((c=fgetc(f))!=EOF){
out+=(char)c;
}
gtk_text_buffer_insert (buffer, &iter, out.c_str(), -1);
gtk_text_buffer_insert (buffer, &iter, "\n", -1);
pclose(f);
}
void buttonDelClicked(GtkWidget *widget, GtkWidget* hbox) {
gtk_widget_destroy(hbox);
}
void buttonCopyClicked(GtkWidget *widget, GtkWidget* hpaned1) {
GtkWidget* hbox     = gtk_hbox_new(false, 0);
gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
gtk_box_reorder_child(GTK_BOX(vbox),hbox, 1);
GtkWidget *hpaned = gtk_hpaned_new ();
gtk_box_pack_start (GTK_BOX (hbox), hpaned, TRUE, TRUE, 0);

GtkWidget *entryRunB = gtk_entry_new ();
gtk_paned_add1 (GTK_PANED (hpaned), entryRunB);

GtkWidget *hpaned2 = gtk_hpaned_new ();
gtk_paned_add2 (GTK_PANED (hpaned), hpaned2);
GtkWidget *entryRun = gtk_entry_new ();
gtk_paned_add1 (GTK_PANED (hpaned2), entryRun);

GtkWidget *entryRunE = gtk_entry_new ();
gtk_paned_add2 (GTK_PANED (hpaned2), entryRunE);

if(hpaned1){
vector<string> vs=getCommandParts( hpaned1 );
gtk_entry_set_text(GTK_ENTRY(entryRunB),vs[0].c_str());
gtk_entry_set_text(GTK_ENTRY(entryRun),vs[1].c_str());
gtk_entry_set_text(GTK_ENTRY(entryRunE),vs[2].c_str());
}
GtkWidget* buttonRun = gtk_button_new_with_label("Run");
gtk_box_pack_start (GTK_BOX (hbox), buttonRun, FALSE, FALSE, 0);
g_signal_connect( G_OBJECT(buttonRun), "clicked", G_CALLBACK(buttonRunClicked), hpaned);

GtkWidget* buttonCopy = gtk_button_new_with_label("+");
gtk_box_pack_start (GTK_BOX (hbox), buttonCopy, FALSE, FALSE, 0);
g_signal_connect( G_OBJECT(buttonCopy), "clicked", G_CALLBACK(buttonCopyClicked), hpaned);

GtkWidget* buttonDel = gtk_button_new_with_label("-");
gtk_box_pack_start (GTK_BOX (hbox), buttonDel, FALSE, FALSE, 0);
g_signal_connect( G_OBJECT(buttonDel), "clicked", G_CALLBACK(buttonDelClicked), hbox);

gtk_widget_show_all(hbox);
}


int main(int argc, char** argv) {
gtk_init(&argc, &argv);
GtkWidget* window    = gtk_window_new(GTK_WINDOW_TOPLEVEL);
vbox     = gtk_vbox_new(false, 0);
gtk_container_add(GTK_CONTAINER(window), vbox);

GtkWidget* sw = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
gtk_box_pack_end (GTK_BOX (vbox), sw, TRUE, TRUE, 0);

GtkWidget*view = gtk_text_view_new ();
gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (view), GTK_WRAP_WORD);
gtk_container_add (GTK_CONTAINER (sw), view);
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));

buttonCopyClicked(0, 0);
g_signal_connect( G_OBJECT(window),  "delete_event", G_CALLBACK(gtk_main_quit), 0);
gtk_widget_show_all(window);
gtk_main();
return 0;
}

Оффлайн keremet

  • Global Moderator
  • ROOT
  • *****
  • Сообщений: 462
  • Репутация: +237/-0
    • Просмотр профиля
    • OpenSolaris
Re: Добавка к терминалу
« Ответ #3 : Август 28, 2018, 04:47:26 pm »
#include <gtk/gtk.h>
#include <stdlib.h>
#include <string>
#include <vector>
#include <iostream>
using namespace std;

GtkWidget* vbox;
vector<string> getCommandParts(GtkWidget* hpaned1){
vector<string> vs;
GList* hpaned1List = gtk_container_get_children(GTK_CONTAINER( hpaned1 ));
for(int i=0;i<g_list_length(hpaned1List);i++){
GtkWidget* w1 = (GtkWidget* )g_list_nth_data(hpaned1List, i);
if(GTK_IS_ENTRY(w1)){
string s=gtk_entry_get_text(GTK_ENTRY(w1));
vs.push_back(s);
}else if(GTK_IS_HPANED(w1)){
GList* hpaned2List = gtk_container_get_children(GTK_CONTAINER( w1 ));
for(int i=0;i<g_list_length(hpaned2List);i++){
GtkWidget* w2 = (GtkWidget* )g_list_nth_data(hpaned2List, i);
if(GTK_IS_ENTRY(w2)){
string s=gtk_entry_get_text(GTK_ENTRY(w2));
vs.push_back(s);
}
}
}
}
return vs;
}

void buttonRunClicked(GtkWidget *widget, GtkWidget* hpaned1) {
vector<string> vs=getCommandParts( hpaned1 );
string s;
for(int i=0;i<vs.size();i++)
s+=vs[i];

   cout << s << endl;
   system(s.c_str());
}

void buttonDelClicked(GtkWidget *widget, GtkWidget* hbox) {
gtk_widget_destroy(hbox);
}

void buttonCopyClicked(GtkWidget *widget, GtkWidget* hpaned1);

void createCommand(const char* txtB, const char* txt, const char* txtE) {
GtkWidget* hbox     = gtk_hbox_new(false, 0);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
gtk_box_reorder_child(GTK_BOX(vbox),hbox, 1);
GtkWidget *hpaned = gtk_hpaned_new ();
gtk_box_pack_start (GTK_BOX (hbox), hpaned, TRUE, TRUE, 0);

GtkWidget *entryRunB = gtk_entry_new ();
gtk_paned_add1 (GTK_PANED (hpaned), entryRunB);

GtkWidget *hpaned2 = gtk_hpaned_new ();
gtk_paned_add2 (GTK_PANED (hpaned), hpaned2);
GtkWidget *entryRun = gtk_entry_new ();
gtk_paned_add1 (GTK_PANED (hpaned2), entryRun);

GtkWidget *entryRunE = gtk_entry_new ();
gtk_paned_add2 (GTK_PANED (hpaned2), entryRunE);


gtk_entry_set_text(GTK_ENTRY(entryRunB), txtB);
gtk_entry_set_text(GTK_ENTRY(entryRun), txt);
gtk_entry_set_text(GTK_ENTRY(entryRunE), txtE);

GtkWidget* buttonRun = gtk_button_new_with_label("Run");
gtk_box_pack_start (GTK_BOX (hbox), buttonRun, FALSE, FALSE, 0);
g_signal_connect( G_OBJECT(buttonRun), "clicked", G_CALLBACK(buttonRunClicked), hpaned);

GtkWidget* buttonCopy = gtk_button_new_with_label("+");
gtk_box_pack_start (GTK_BOX (hbox), buttonCopy, FALSE, FALSE, 0);
g_signal_connect( G_OBJECT(buttonCopy), "clicked", G_CALLBACK(buttonCopyClicked), hpaned);

GtkWidget* buttonDel = gtk_button_new_with_label("-");
gtk_box_pack_start (GTK_BOX (hbox), buttonDel, FALSE, FALSE, 0);
g_signal_connect( G_OBJECT(buttonDel), "clicked", G_CALLBACK(buttonDelClicked), hbox);

gtk_widget_show_all(hbox);
}

void buttonCopyClicked(GtkWidget *widget, GtkWidget* hpaned1) {
vector<string> vs=getCommandParts( hpaned1 );
createCommand(vs[0].c_str(), vs[1].c_str(), vs[2].c_str());
}

int main(int argc, char** argv) {
gtk_init(&argc, &argv);
GtkWidget* window    = gtk_window_new(GTK_WINDOW_TOPLEVEL);
vbox     = gtk_vbox_new(false, 0);
gtk_container_add(GTK_CONTAINER(window), vbox);

createCommand("ls", "", "");
createCommand("ls|wc -l", "", "");
g_signal_connect( G_OBJECT(window),  "delete_event", G_CALLBACK(gtk_main_quit), 0);
gtk_widget_show_all(window);
gtk_main();
return 0;
}