1 /* logjam - a GTK client for LiveJournal.
2 * Copyright (C) 2000-2003 Evan Martin <evan@livejournal.com>
4 * vim: tabstop=4 shiftwidth=4 noexpandtab :
17 #include "liblj/consolecommand.h"
22 GtkWidget
*entry
, *display
;
23 GtkTextMark
*mark_end
;
24 JamAccountLJ
*account
;
28 static const char *name_from_type (LJConsoleLineType type
) {
30 case LJ_CONSOLE_LINE_TYPE_INFO
: return "info";
31 case LJ_CONSOLE_LINE_TYPE_ERROR
: return "error";
32 case LJ_CONSOLE_LINE_TYPE_UNKNOWN
:
39 void console_print (ConsoleUI
*cui
, const char *type
, const char *text
, ...) {
42 GtkTextBuffer
*buffer
;
46 g_vsnprintf(buf
, 4096, text
, ap
);
49 buffer
= gtk_text_view_get_buffer(GTK_TEXT_VIEW(cui
->display
));
50 gtk_text_buffer_get_end_iter(buffer
, &iter
);
52 gtk_text_buffer_insert_with_tags_by_name(buffer
, &iter
, buf
, -1, type
, NULL
);
54 gtk_text_buffer_insert(buffer
, &iter
, buf
, -1);
56 gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(cui
->display
), cui
->mark_end
, 0.0, FALSE
, 0, 0);
60 gboolean
run_console_command (ConsoleUI
*cui
, const char *command
) {
65 console_print(cui
, NULL
, _("Running command: '"));
66 console_print(cui
, "command", command
);
67 console_print(cui
, NULL
, "'.\n");
69 cc
= lj_consolecommand_new(jam_account_lj_get_user(cui
->account
), command
);
71 ctx
= net_ctx_gtk_new(GTK_WINDOW(cui
->win
), _("Running Command"));
72 if (!net_run_verb_ctx((LJVerb
*) cc
, ctx
, NULL
)) {
73 console_print(cui
, "error", _("Error running command.\n"));
74 lj_consolecommand_free(cc
);
75 net_ctx_gtk_free(ctx
);
79 for (i
= 0; i
< cc
->linecount
; ++i
) {
80 const char *typename
= name_from_type(cc
->lines
[i
].type
);
81 console_print(cui
, typename
, cc
->lines
[i
].text
);
82 console_print(cui
, typename
, "\n");
85 lj_consolecommand_free(cc
);
86 net_ctx_gtk_free(ctx
);
92 static void submit_cb (GtkWidget
*w
, ConsoleUI
*cui
) {
93 char *command
= gtk_editable_get_chars(GTK_EDITABLE(cui
->entry
), 0, -1);
94 if (run_console_command(cui
, command
)) gtk_editable_delete_text(GTK_EDITABLE(cui
->entry
), 0, -1);
99 static void console_help (GtkWidget
*w
, ConsoleUI
*cui
) {
100 run_console_command(cui
, "help");
104 void console_dialog_run (GtkWindow
*parent
, JamAccountLJ
*acc
) {
106 GtkWidget
*vbox
, *hbox
, *button
;
107 GtkTextBuffer
*buffer
;
110 cui
= g_new0(ConsoleUI
, 1);
112 cui
->win
= gtk_dialog_new_with_buttons(_("LiveJournal Console"), parent
, GTK_DIALOG_DESTROY_WITH_PARENT
, GTK_STOCK_CLOSE
, GTK_RESPONSE_CLOSE
, NULL
);
113 jam_win_set_size(GTK_WINDOW(cui
->win
), 500, 400);
114 g_signal_connect_swapped(G_OBJECT(cui
->win
), "response", G_CALLBACK(gtk_widget_destroy
), cui
->win
);
115 g_signal_connect_swapped(G_OBJECT(cui
->win
), "destroy", G_CALLBACK(g_free
), cui
);
116 geometry_tie(cui
->win
, GEOM_CONSOLE
);
118 vbox
= gtk_vbox_new(FALSE
, 5);
120 hbox
= gtk_hbox_new(FALSE
, 5);
121 cui
->entry
= gtk_entry_new();
122 gtk_box_pack_start(GTK_BOX(hbox
), cui
->entry
, TRUE
, TRUE
, 0);
124 button
= gtk_button_new_with_mnemonic(_(" _Submit "));
125 gtk_box_pack_start(GTK_BOX(hbox
), button
, FALSE
, FALSE
, 0);
127 g_signal_connect(G_OBJECT(cui
->entry
), "activate", G_CALLBACK(submit_cb
), cui
);
128 g_signal_connect(G_OBJECT(button
), "clicked", G_CALLBACK(submit_cb
), cui
);
130 button
= gtk_button_new_from_stock(GTK_STOCK_HELP
);
131 g_signal_connect(G_OBJECT(button
), "clicked", G_CALLBACK(console_help
), cui
);
132 gtk_box_pack_start(GTK_BOX(hbox
), button
, FALSE
, FALSE
, 0);
134 gtk_box_pack_start(GTK_BOX(vbox
), hbox
, FALSE
, FALSE
, 0);
136 cui
->display
= gtk_text_view_new();
137 gtk_text_view_set_editable(GTK_TEXT_VIEW(cui
->display
), FALSE
);
138 gtk_box_pack_start(GTK_BOX(vbox
), scroll_wrap(cui
->display
), TRUE
, TRUE
, 0);
140 buffer
= gtk_text_view_get_buffer(GTK_TEXT_VIEW(cui
->display
));
141 gtk_text_buffer_get_end_iter(buffer
, &end
);
142 cui
->mark_end
= gtk_text_buffer_create_mark(buffer
, NULL
, &end
, FALSE
);
143 gtk_text_buffer_create_tag(buffer
, "command", "family", "monospace", NULL
);
144 gtk_text_buffer_create_tag(buffer
, "info", "family", "monospace", "foreground", "darkgreen", NULL
);
145 gtk_text_buffer_create_tag(buffer
, "error", "family", "monospace", "weight", PANGO_WEIGHT_BOLD
, "foreground", "red", NULL
);
147 jam_dialog_set_contents(GTK_DIALOG(cui
->win
), vbox
);
149 console_print(cui
, NULL
, _("LiveJournal console ready.\n"));
151 gtk_widget_show(cui
->win
);