first try to journal_store_get_latest_id() for sqlite
[k8lowj.git] / src / console.c
blob39528455529259b025fc61e7638cc83ed117fbe0
1 /* logjam - a GTK client for LiveJournal.
2 * Copyright (C) 2000-2003 Evan Martin <evan@livejournal.com>
4 * vim: tabstop=4 shiftwidth=4 noexpandtab :
5 */
6 #include "gtk-all.h"
7 #include "util-gtk.h"
9 #include <stdarg.h>
10 #include <stdio.h>
11 #include <stdlib.h>
13 #include "conf.h"
14 #include "console.h"
15 #include "network.h"
17 #include "liblj/consolecommand.h"
20 typedef struct {
21 GtkWidget *win;
22 GtkWidget *entry, *display;
23 GtkTextMark *mark_end;
24 JamAccountLJ *account;
25 } ConsoleUI;
28 static const char *name_from_type (LJConsoleLineType type) {
29 switch (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:
33 default:
34 return NULL;
39 void console_print (ConsoleUI *cui, const char *type, const char *text, ...) {
40 char buf[4096];
41 va_list ap;
42 GtkTextBuffer *buffer;
43 GtkTextIter iter;
45 va_start(ap, text);
46 g_vsnprintf(buf, 4096, text, ap);
47 va_end(ap);
49 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(cui->display));
50 gtk_text_buffer_get_end_iter(buffer, &iter);
51 if (type) {
52 gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, buf, -1, type, NULL);
53 } else {
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) {
61 NetContext *ctx;
62 LJConsoleCommand *cc;
63 int i;
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);
76 return FALSE;
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);
88 return TRUE;
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);
95 g_free(command);
99 static void console_help (GtkWidget *w, ConsoleUI *cui) {
100 run_console_command(cui, "help");
104 void console_dialog_run (GtkWindow *parent, JamAccountLJ *acc) {
105 ConsoleUI *cui;
106 GtkWidget *vbox, *hbox, *button;
107 GtkTextBuffer *buffer;
108 GtkTextIter end;
110 cui = g_new0(ConsoleUI, 1);
111 cui->account = acc;
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);