Added target run
This commit is contained in:
parent
6a259fa011
commit
12529a46d6
14
src/Makefile
14
src/Makefile
|
@ -1,4 +1,4 @@
|
|||
TARGETS = calendar fontsel
|
||||
TARGETS = calendar fontsel run
|
||||
PREFIX = /usr/local
|
||||
DESTDIR =
|
||||
BINDIR = $(PREFIX)/bin
|
||||
|
@ -24,14 +24,22 @@ fontsel_CFLAGS = $(CFLAGSF) $(CFLAGS)
|
|||
fontsel: $(fontsel_OBJS)
|
||||
$(CC) $(LDFLAGSF) $(LDFLAGS) -o fontsel $(fontsel_OBJS)
|
||||
|
||||
run_OBJS = run.o
|
||||
run_CFLAGS = $(CFLAGSF) $(CFLAGS)
|
||||
run: $(run_OBJS)
|
||||
$(CC) $(LDFLAGSF) $(LDFLAGS) -o run $(run_OBJS)
|
||||
|
||||
calendar.o: calendar.c
|
||||
$(CC) $(calendar_CFLAGS) -c calendar.c
|
||||
|
||||
fontsel.o: fontsel.c
|
||||
$(CC) $(fontsel_CFLAGS) -c fontsel.c
|
||||
|
||||
run.o: run.c
|
||||
$(CC) $(run_CFLAGS) -c run.c
|
||||
|
||||
clean:
|
||||
$(RM) $(calendar_OBJS) $(fontsel_OBJS)
|
||||
$(RM) $(calendar_OBJS) $(fontsel_OBJS) $(run_OBJS)
|
||||
|
||||
distclean: clean
|
||||
$(RM) $(TARGETS)
|
||||
|
@ -40,9 +48,11 @@ install: all
|
|||
$(MKDIR) $(DESTDIR)$(BINDIR)
|
||||
$(INSTALL) -m 0755 calendar $(DESTDIR)$(BINDIR)/calendar
|
||||
$(INSTALL) -m 0755 fontsel $(DESTDIR)$(BINDIR)/fontsel
|
||||
$(INSTALL) -m 0755 run $(DESTDIR)$(BINDIR)/run
|
||||
|
||||
uninstall:
|
||||
$(RM) $(DESTDIR)$(BINDIR)/calendar
|
||||
$(RM) $(DESTDIR)$(BINDIR)/fontsel
|
||||
$(RM) $(DESTDIR)$(BINDIR)/run
|
||||
|
||||
.PHONY: all clean distclean install uninstall
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
targets=calendar,fontsel
|
||||
targets=calendar,fontsel,run
|
||||
cflags_force=-W -Wall -ansi `pkg-config gtk+-2.0 --cflags`
|
||||
cflags=-g
|
||||
ldflags_force=`pkg-config gtk+-2.0 --libs`
|
||||
|
@ -10,3 +10,7 @@ sources=calendar.c
|
|||
[fontsel]
|
||||
type=binary
|
||||
sources=fontsel.c
|
||||
|
||||
[run]
|
||||
type=binary
|
||||
sources=run.c
|
||||
|
|
132
src/run.c
Normal file
132
src/run.c
Normal file
|
@ -0,0 +1,132 @@
|
|||
/* run.c */
|
||||
|
||||
|
||||
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
|
||||
/* run */
|
||||
static int _run_error(char const * message, int ret);
|
||||
/* callbacks */
|
||||
static gboolean _on_run_closex(GtkWidget * widget, GdkEvent * event,
|
||||
gpointer data);
|
||||
static void _on_run_cancel(GtkWidget * widget, gpointer data);
|
||||
static void _on_run_choose_activate(GtkWidget * widget, gint arg1,
|
||||
gpointer data);
|
||||
static void _on_run_execute(GtkWidget * widget, gpointer data);
|
||||
static void _on_run_path_activate(GtkWidget * widget, gpointer data);
|
||||
static void _run(void)
|
||||
{
|
||||
GtkWidget * window;
|
||||
GtkWidget * vbox;
|
||||
GtkWidget * hbox;
|
||||
GtkWidget * widget;
|
||||
GtkSizeGroup * group;
|
||||
GtkWidget * entry;
|
||||
|
||||
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
||||
gtk_window_set_title(GTK_WINDOW(window), "Run program...");
|
||||
gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
|
||||
gtk_window_set_keep_above(GTK_WINDOW(window), TRUE);
|
||||
g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(
|
||||
_on_run_closex), NULL);
|
||||
group = gtk_size_group_new(GTK_SIZE_GROUP_BOTH);
|
||||
vbox = gtk_vbox_new(FALSE, 0);
|
||||
hbox = gtk_hbox_new(FALSE, 0);
|
||||
widget = gtk_label_new("Run: ");
|
||||
gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 4);
|
||||
entry = gtk_entry_new();
|
||||
g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(
|
||||
_on_run_path_activate), NULL);
|
||||
gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 4);
|
||||
widget = gtk_file_chooser_dialog_new("Run program...", GTK_WINDOW(
|
||||
window), GTK_FILE_CHOOSER_ACTION_OPEN,
|
||||
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
||||
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
|
||||
g_signal_connect(G_OBJECT(widget), "response", G_CALLBACK(
|
||||
_on_run_choose_activate), entry);
|
||||
widget = gtk_file_chooser_button_new_with_dialog(widget);
|
||||
gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 4);
|
||||
gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, FALSE, 4);
|
||||
hbox = gtk_hbox_new(FALSE, 0);
|
||||
widget = gtk_button_new_from_stock(GTK_STOCK_EXECUTE);
|
||||
g_signal_connect(G_OBJECT(widget), "clicked", G_CALLBACK(
|
||||
_on_run_execute), entry);
|
||||
gtk_size_group_add_widget(group, widget);
|
||||
gtk_box_pack_end(GTK_BOX(hbox), widget, FALSE, TRUE, 4);
|
||||
widget = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
|
||||
gtk_size_group_add_widget(group, widget);
|
||||
g_signal_connect(G_OBJECT(widget), "clicked", G_CALLBACK(
|
||||
_on_run_cancel), window);
|
||||
gtk_box_pack_end(GTK_BOX(hbox), widget, FALSE, TRUE, 4);
|
||||
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 4);
|
||||
gtk_container_add(GTK_CONTAINER(window), vbox);
|
||||
gtk_widget_show_all(window);
|
||||
}
|
||||
|
||||
static int _run_error(char const * message, int ret)
|
||||
{
|
||||
GtkWidget * dialog;
|
||||
|
||||
dialog = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_ERROR,
|
||||
GTK_BUTTONS_CLOSE, "%s", message);
|
||||
gtk_widget_show(dialog);
|
||||
gtk_dialog_run(GTK_DIALOG(dialog));
|
||||
gtk_widget_destroy(dialog);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static gboolean _on_run_closex(GtkWidget * widget, GdkEvent * event,
|
||||
gpointer data)
|
||||
{
|
||||
gtk_widget_hide(widget);
|
||||
gtk_main_quit();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void _on_run_cancel(GtkWidget * widget, gpointer data)
|
||||
{
|
||||
GtkWidget * window = data;
|
||||
|
||||
gtk_widget_hide(window);
|
||||
gtk_main_quit();
|
||||
}
|
||||
|
||||
static void _on_run_choose_activate(GtkWidget * widget, gint arg1,
|
||||
gpointer data)
|
||||
{
|
||||
GtkWidget * entry = data;
|
||||
|
||||
if(arg1 != GTK_RESPONSE_ACCEPT)
|
||||
return;
|
||||
gtk_entry_set_text(GTK_ENTRY(entry), gtk_file_chooser_get_filename(
|
||||
GTK_FILE_CHOOSER(widget)));
|
||||
}
|
||||
|
||||
static void _on_run_execute(GtkWidget * widget, gpointer data)
|
||||
{
|
||||
char const * path;
|
||||
|
||||
widget = data;
|
||||
path = gtk_entry_get_text(GTK_ENTRY(widget));
|
||||
execlp("/bin/sh", "run", "-c", path, NULL);
|
||||
_run_error(strerror(errno), 0);
|
||||
}
|
||||
|
||||
static void _on_run_path_activate(GtkWidget * widget, gpointer data)
|
||||
{
|
||||
_on_run_execute(NULL, widget);
|
||||
}
|
||||
|
||||
|
||||
/* main */
|
||||
int main(int argc, char * argv[])
|
||||
{
|
||||
gtk_init(&argc, &argv);
|
||||
_run();
|
||||
gtk_main();
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user