2010-11-02 20:21:32 +01:00
|
|
|
/*
|
2020-06-27 10:39:43 +02:00
|
|
|
** Copyright (C) 2010-2020 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
|
2010-11-02 20:21:32 +01:00
|
|
|
**
|
|
|
|
** This program is free software; you can redistribute it and/or modify it
|
|
|
|
** under the terms of the GNU General Public License as published by the
|
|
|
|
** Free Software Foundation; either version 3, or (at your option) any
|
|
|
|
** later version.
|
|
|
|
**
|
|
|
|
** This program is distributed in the hope that it will be useful,
|
|
|
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
** GNU General Public License for more details.
|
|
|
|
**
|
|
|
|
** You should have received a copy of the GNU General Public License
|
|
|
|
** along with this program; if not, write to the Free Software Foundation,
|
|
|
|
** Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
**
|
|
|
|
*/
|
|
|
|
|
2010-11-07 10:11:50 +01:00
|
|
|
#include "config.h"
|
2010-11-02 20:21:32 +01:00
|
|
|
|
|
|
|
#include <gtk/gtk.h>
|
2012-07-20 17:41:25 +02:00
|
|
|
#include <gdk/gdkkeysyms.h>
|
2010-11-27 12:31:26 +01:00
|
|
|
#include <string.h> /* for memset */
|
2010-11-02 20:21:32 +01:00
|
|
|
|
2019-12-16 20:44:35 +01:00
|
|
|
#include <utils/mu-util.h>
|
2019-08-01 21:12:23 +02:00
|
|
|
#include <mu-store.hh>
|
2020-11-07 13:06:23 +01:00
|
|
|
#include <mu-runtime.hh>
|
2010-11-02 20:21:32 +01:00
|
|
|
|
|
|
|
#include "mug-msg-list-view.h"
|
|
|
|
#include "mug-query-bar.h"
|
|
|
|
#include "mug-msg-view.h"
|
2010-11-13 14:18:01 +01:00
|
|
|
#include "mug-shortcuts.h"
|
2010-11-02 20:21:32 +01:00
|
|
|
|
|
|
|
struct _MugData {
|
2010-11-07 10:11:50 +01:00
|
|
|
GtkWidget *win;
|
2010-11-02 20:21:32 +01:00
|
|
|
GtkWidget *statusbar;
|
|
|
|
GtkWidget *mlist;
|
|
|
|
GtkWidget *toolbar;
|
2010-11-02 21:17:08 +01:00
|
|
|
GtkWidget *msgview;
|
2010-11-02 21:45:11 +01:00
|
|
|
GtkWidget *querybar;
|
2010-11-13 14:18:01 +01:00
|
|
|
GtkWidget *shortcuts;
|
2010-11-12 20:01:00 +01:00
|
|
|
gchar *muhome;
|
2010-11-02 20:21:32 +01:00
|
|
|
};
|
|
|
|
typedef struct _MugData MugData;
|
|
|
|
|
2012-08-03 08:47:09 +02:00
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
static void
|
|
|
|
about_mug (MugData * mugdata)
|
2010-11-07 10:11:50 +01:00
|
|
|
{
|
|
|
|
GtkWidget *about;
|
|
|
|
about = gtk_message_dialog_new
|
2010-11-27 13:53:09 +01:00
|
|
|
(GTK_WINDOW (mugdata->win), GTK_DIALOG_MODAL,
|
2010-11-27 12:31:26 +01:00
|
|
|
GTK_MESSAGE_INFO, GTK_BUTTONS_OK,
|
|
|
|
"Mug version %s\n"
|
|
|
|
"A graphical frontend to the 'mu' e-mail search engine\n\n"
|
2013-03-30 10:32:07 +01:00
|
|
|
"(c) 2010-2013 Dirk-Jan C. Binnema\n"
|
2010-11-27 12:31:26 +01:00
|
|
|
"Released under the terms of the GPLv3+", VERSION);
|
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
gtk_dialog_run (GTK_DIALOG (about));
|
|
|
|
gtk_widget_destroy (about);
|
2010-11-07 10:11:50 +01:00
|
|
|
}
|
|
|
|
|
2010-11-02 20:21:32 +01:00
|
|
|
enum _ToolAction {
|
|
|
|
ACTION_PREV_MSG = 1,
|
|
|
|
ACTION_NEXT_MSG,
|
2012-08-03 08:47:09 +02:00
|
|
|
ACTION_REINDEX,
|
2010-11-02 20:56:25 +01:00
|
|
|
ACTION_DO_QUIT,
|
2010-11-02 22:14:29 +01:00
|
|
|
ACTION_ABOUT,
|
2010-11-27 12:31:26 +01:00
|
|
|
ACTION_SEPARATOR /* pseudo action */
|
2010-11-02 20:21:32 +01:00
|
|
|
};
|
|
|
|
typedef enum _ToolAction ToolAction;
|
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
static void
|
|
|
|
on_tool_button_clicked (GtkToolButton * btn, MugData * mugdata)
|
2010-11-02 20:21:32 +01:00
|
|
|
{
|
|
|
|
ToolAction action;
|
2010-11-27 13:53:09 +01:00
|
|
|
action = (ToolAction)
|
|
|
|
GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (btn), "action"));
|
2010-11-02 20:21:32 +01:00
|
|
|
switch (action) {
|
2010-11-27 12:31:26 +01:00
|
|
|
|
2010-11-02 20:21:32 +01:00
|
|
|
case ACTION_DO_QUIT:
|
2010-11-27 13:53:09 +01:00
|
|
|
gtk_main_quit ();
|
2010-11-02 20:21:32 +01:00
|
|
|
break;
|
2010-11-02 20:51:10 +01:00
|
|
|
case ACTION_NEXT_MSG:
|
2010-11-27 13:53:09 +01:00
|
|
|
mug_msg_list_view_move_next (MUG_MSG_LIST_VIEW
|
|
|
|
(mugdata->mlist));
|
2010-11-02 20:51:10 +01:00
|
|
|
break;
|
|
|
|
case ACTION_PREV_MSG:
|
2010-11-27 13:53:09 +01:00
|
|
|
mug_msg_list_view_move_prev (MUG_MSG_LIST_VIEW
|
|
|
|
(mugdata->mlist));
|
2010-11-02 22:14:29 +01:00
|
|
|
break;
|
|
|
|
case ACTION_ABOUT:
|
2010-11-27 13:53:09 +01:00
|
|
|
about_mug (mugdata);
|
2010-11-02 22:14:29 +01:00
|
|
|
break;
|
2010-11-02 20:21:32 +01:00
|
|
|
default:
|
2010-11-27 13:53:09 +01:00
|
|
|
g_print ("%u\n", action);
|
2010-11-02 20:21:32 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-12-17 07:00:04 +01:00
|
|
|
|
|
|
|
|
|
|
|
static GtkToolItem*
|
|
|
|
tool_button (const char *name)
|
|
|
|
{
|
|
|
|
GtkWidget *icon;
|
|
|
|
|
|
|
|
icon = gtk_image_new_from_icon_name
|
|
|
|
(name, GTK_ICON_SIZE_SMALL_TOOLBAR);
|
2017-10-24 08:17:27 +02:00
|
|
|
|
2013-12-17 07:00:04 +01:00
|
|
|
return gtk_menu_tool_button_new (icon, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
static GtkToolItem*
|
|
|
|
get_connected_tool_button (const char* stock_id, ToolAction action,
|
|
|
|
MugData *mugdata)
|
|
|
|
{
|
|
|
|
GtkToolItem *btn;
|
2011-08-30 21:03:29 +02:00
|
|
|
|
2013-12-17 07:00:04 +01:00
|
|
|
btn = tool_button (stock_id);
|
2010-11-27 13:53:09 +01:00
|
|
|
g_object_set_data (G_OBJECT (btn), "action",
|
|
|
|
GUINT_TO_POINTER (action));
|
|
|
|
g_signal_connect (G_OBJECT (btn), "clicked",
|
|
|
|
G_CALLBACK (on_tool_button_clicked),
|
|
|
|
mugdata);
|
|
|
|
return btn;
|
|
|
|
}
|
|
|
|
|
|
|
|
static GtkWidget *
|
|
|
|
mug_toolbar (MugData * mugdata)
|
2010-11-02 20:21:32 +01:00
|
|
|
{
|
|
|
|
GtkWidget *toolbar;
|
|
|
|
int i;
|
|
|
|
struct {
|
2010-11-27 12:31:26 +01:00
|
|
|
const char *stock_id;
|
2010-11-02 20:21:32 +01:00
|
|
|
ToolAction action;
|
|
|
|
} tools[] = {
|
2013-12-17 07:00:04 +01:00
|
|
|
{"go-up", ACTION_PREV_MSG},
|
|
|
|
{"go-down", ACTION_NEXT_MSG},
|
2010-11-27 13:53:09 +01:00
|
|
|
{NULL, ACTION_SEPARATOR},
|
2013-12-17 07:00:04 +01:00
|
|
|
{"view-refresh", ACTION_REINDEX},
|
2012-08-03 08:47:09 +02:00
|
|
|
{NULL, ACTION_SEPARATOR},
|
2013-12-17 07:00:04 +01:00
|
|
|
{"help-about", ACTION_ABOUT},
|
2010-11-27 13:53:09 +01:00
|
|
|
{NULL, ACTION_SEPARATOR},
|
2013-12-17 07:00:04 +01:00
|
|
|
{"application-exit", ACTION_DO_QUIT}};
|
2010-11-27 13:53:09 +01:00
|
|
|
|
|
|
|
toolbar = gtk_toolbar_new ();
|
|
|
|
for (i = 0; i != G_N_ELEMENTS (tools); ++i) {
|
|
|
|
if (tools[i].action == ACTION_SEPARATOR) { /* separator? */
|
|
|
|
gtk_toolbar_insert (GTK_TOOLBAR (toolbar),
|
|
|
|
gtk_separator_tool_item_new (), i);
|
2010-11-02 20:56:25 +01:00
|
|
|
continue;
|
2010-11-27 13:53:09 +01:00
|
|
|
} else /* nope: a real item */
|
|
|
|
gtk_toolbar_insert (GTK_TOOLBAR (toolbar),
|
|
|
|
get_connected_tool_button
|
|
|
|
(tools[i].stock_id, tools[i].action,
|
|
|
|
mugdata), i);
|
2010-11-02 20:21:32 +01:00
|
|
|
}
|
2011-08-30 21:03:29 +02:00
|
|
|
|
2010-11-02 20:21:32 +01:00
|
|
|
return toolbar;
|
|
|
|
}
|
|
|
|
|
2010-11-13 14:18:01 +01:00
|
|
|
static void
|
2010-11-27 13:53:09 +01:00
|
|
|
on_shortcut_clicked (GtkWidget * w, const gchar * query, MugData * mdata)
|
2010-11-13 14:18:01 +01:00
|
|
|
{
|
2010-11-27 13:53:09 +01:00
|
|
|
mug_query_bar_set_query (MUG_QUERY_BAR (mdata->querybar), query, TRUE);
|
2010-11-13 14:18:01 +01:00
|
|
|
}
|
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
static GtkWidget *
|
|
|
|
mug_shortcuts_bar (MugData * data)
|
2010-11-13 14:18:01 +01:00
|
|
|
{
|
2011-03-19 09:07:32 +01:00
|
|
|
data->shortcuts = mug_shortcuts_new
|
|
|
|
(mu_runtime_path(MU_RUNTIME_PATH_BOOKMARKS));
|
2010-11-27 12:31:26 +01:00
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
g_signal_connect (G_OBJECT (data->shortcuts), "clicked",
|
|
|
|
G_CALLBACK (on_shortcut_clicked), data);
|
2010-11-27 12:31:26 +01:00
|
|
|
|
2010-11-13 14:18:01 +01:00
|
|
|
return data->shortcuts;
|
|
|
|
}
|
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
static GtkWidget *
|
|
|
|
mug_statusbar (void)
|
2010-11-02 20:21:32 +01:00
|
|
|
{
|
|
|
|
GtkWidget *statusbar;
|
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
statusbar = gtk_statusbar_new ();
|
2010-11-02 20:21:32 +01:00
|
|
|
|
|
|
|
return statusbar;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2010-11-27 13:53:09 +01:00
|
|
|
on_query_changed (MugQueryBar * bar, const char *query, MugData * mugdata)
|
2010-11-02 20:21:32 +01:00
|
|
|
{
|
|
|
|
int count;
|
|
|
|
|
2010-11-02 21:17:08 +01:00
|
|
|
/* clear the old message */
|
2010-11-27 13:53:09 +01:00
|
|
|
mug_msg_view_set_msg (MUG_MSG_VIEW (mugdata->msgview), NULL);
|
2010-11-27 12:31:26 +01:00
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
count = mug_msg_list_view_query (MUG_MSG_LIST_VIEW (mugdata->mlist),
|
|
|
|
query);
|
2010-11-02 20:21:32 +01:00
|
|
|
if (count >= 0) {
|
2010-11-27 13:53:09 +01:00
|
|
|
gchar *msg =
|
|
|
|
g_strdup_printf ("%d message%s found matching '%s'",
|
|
|
|
count,
|
|
|
|
count > 1 ? "s" : "",
|
|
|
|
mug_msg_list_view_get_query
|
|
|
|
(MUG_MSG_LIST_VIEW (mugdata->mlist)));
|
|
|
|
gtk_statusbar_push (GTK_STATUSBAR (mugdata->statusbar), 0, msg);
|
|
|
|
g_free (msg);
|
|
|
|
|
|
|
|
mug_msg_list_view_move_first (MUG_MSG_LIST_VIEW
|
|
|
|
(mugdata->mlist));
|
|
|
|
gtk_widget_grab_focus (GTK_WIDGET (mugdata->mlist));
|
2010-11-27 12:31:26 +01:00
|
|
|
}
|
2010-11-02 20:21:32 +01:00
|
|
|
|
2010-11-27 12:31:26 +01:00
|
|
|
if (count == 0) /* nothing found */
|
2010-11-27 13:53:09 +01:00
|
|
|
mug_query_bar_grab_focus (MUG_QUERY_BAR (bar));
|
2010-11-27 12:31:26 +01:00
|
|
|
}
|
2010-11-02 20:21:32 +01:00
|
|
|
|
|
|
|
static void
|
2010-11-27 13:53:09 +01:00
|
|
|
on_msg_selected (MugMsgListView * mlist, const char *mpath, MugData * mugdata)
|
2010-11-02 20:21:32 +01:00
|
|
|
{
|
2010-11-27 13:53:09 +01:00
|
|
|
mug_msg_view_set_msg (MUG_MSG_VIEW (mugdata->msgview), mpath);
|
2010-11-02 20:21:32 +01:00
|
|
|
}
|
|
|
|
|
2010-11-24 08:03:06 +01:00
|
|
|
static void
|
2010-11-27 13:53:09 +01:00
|
|
|
on_list_view_error (MugMsgListView * mlist, MugError err, MugData * mugdata)
|
2010-11-24 08:03:06 +01:00
|
|
|
{
|
|
|
|
GtkWidget *errdialog;
|
2010-11-27 12:31:26 +01:00
|
|
|
const char *msg;
|
2010-11-24 08:03:06 +01:00
|
|
|
|
|
|
|
switch (err) {
|
|
|
|
case MUG_ERROR_XAPIAN_NOT_UPTODATE:
|
2010-11-27 12:31:26 +01:00
|
|
|
msg = "The Xapian Database has the wrong version\n"
|
|
|
|
"Please run 'mu index --rebuild'";
|
|
|
|
break;
|
2010-11-24 08:03:06 +01:00
|
|
|
case MUG_ERROR_XAPIAN_DIR:
|
2010-11-27 12:31:26 +01:00
|
|
|
msg = "Cannot find the Xapian database dir\n"
|
|
|
|
"Please restart mug with --muhome=... pointing\n"
|
|
|
|
"to your mu home directory";
|
|
|
|
break;
|
2010-11-24 08:03:06 +01:00
|
|
|
case MUG_ERROR_QUERY:
|
2010-11-27 12:31:26 +01:00
|
|
|
msg = "Error in query";
|
|
|
|
break;
|
2010-11-24 08:03:06 +01:00
|
|
|
default:
|
2019-11-06 16:13:39 +01:00
|
|
|
msg = "Some error occurred";
|
2010-11-27 12:31:26 +01:00
|
|
|
break;
|
2010-11-24 08:03:06 +01:00
|
|
|
}
|
2010-11-27 12:31:26 +01:00
|
|
|
|
2010-11-24 08:03:06 +01:00
|
|
|
errdialog = gtk_message_dialog_new
|
2010-11-27 13:53:09 +01:00
|
|
|
(GTK_WINDOW (mugdata->win), GTK_DIALOG_MODAL,
|
2010-11-27 12:31:26 +01:00
|
|
|
GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "%s", msg);
|
2010-11-24 08:03:06 +01:00
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
gtk_dialog_run (GTK_DIALOG (errdialog));
|
|
|
|
gtk_widget_destroy (errdialog);
|
2010-11-24 08:03:06 +01:00
|
|
|
|
2012-08-03 08:47:09 +02:00
|
|
|
if (err == MUG_ERROR_QUERY)
|
2010-11-27 13:53:09 +01:00
|
|
|
mug_query_bar_grab_focus (MUG_QUERY_BAR (mugdata->querybar));
|
2010-11-24 08:03:06 +01:00
|
|
|
}
|
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
static GtkWidget *
|
|
|
|
mug_querybar (void)
|
2010-11-02 20:21:32 +01:00
|
|
|
{
|
|
|
|
GtkWidget *querybar;
|
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
querybar = mug_query_bar_new ();
|
2010-11-27 12:31:26 +01:00
|
|
|
|
2010-11-02 20:21:32 +01:00
|
|
|
return querybar;
|
|
|
|
}
|
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
static GtkWidget *
|
|
|
|
mug_query_area (MugData * mugdata)
|
2010-11-02 20:21:32 +01:00
|
|
|
{
|
2012-08-03 08:47:09 +02:00
|
|
|
GtkWidget *queryarea, *paned, *scrolled;
|
2010-11-02 20:51:10 +01:00
|
|
|
|
2012-04-21 08:10:12 +02:00
|
|
|
queryarea = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
|
|
|
|
paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
|
2010-11-02 20:51:10 +01:00
|
|
|
|
2011-03-19 09:07:32 +01:00
|
|
|
mugdata->mlist = mug_msg_list_view_new
|
|
|
|
(mu_runtime_path(MU_RUNTIME_PATH_XAPIANDB));
|
2010-11-27 13:53:09 +01:00
|
|
|
scrolled = gtk_scrolled_window_new (NULL, NULL);
|
|
|
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
|
|
|
|
GTK_POLICY_AUTOMATIC,
|
|
|
|
GTK_POLICY_AUTOMATIC);
|
2010-11-27 12:31:26 +01:00
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
gtk_container_add (GTK_CONTAINER (scrolled), mugdata->mlist);
|
|
|
|
gtk_paned_add1 (GTK_PANED (paned), scrolled);
|
2010-11-27 12:31:26 +01:00
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
mugdata->msgview = mug_msg_view_new ();
|
2012-08-03 08:47:09 +02:00
|
|
|
mug_msg_view_set_note (MUG_MSG_VIEW(mugdata->msgview),
|
|
|
|
"<h1>Welcome to <i>mug</i>!</h1><hr>"
|
|
|
|
"<tt>mug</tt> is an experimental UI for <tt>mu</tt>, which will "
|
|
|
|
"slowly evolve into something useful.<br><br>Enjoy the ride.");
|
2010-11-27 13:53:09 +01:00
|
|
|
g_signal_connect (G_OBJECT (mugdata->mlist), "msg-selected",
|
|
|
|
G_CALLBACK (on_msg_selected), mugdata);
|
|
|
|
g_signal_connect (G_OBJECT (mugdata->mlist), "error-occured",
|
|
|
|
G_CALLBACK (on_list_view_error), mugdata);
|
|
|
|
gtk_paned_add2 (GTK_PANED (paned), mugdata->msgview);
|
2010-11-27 12:31:26 +01:00
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
mugdata->querybar = mug_querybar ();
|
|
|
|
g_signal_connect (G_OBJECT (mugdata->querybar), "query-changed",
|
|
|
|
G_CALLBACK (on_query_changed), mugdata);
|
2010-11-27 12:31:26 +01:00
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
gtk_box_pack_start (GTK_BOX (queryarea),
|
|
|
|
mugdata->querybar, FALSE, FALSE, 2);
|
|
|
|
gtk_box_pack_start (GTK_BOX (queryarea), paned, TRUE, TRUE, 2);
|
2010-11-27 12:31:26 +01:00
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
gtk_widget_show_all (queryarea);
|
2010-11-02 20:21:32 +01:00
|
|
|
return queryarea;
|
|
|
|
}
|
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
static GtkWidget *
|
|
|
|
mug_main_area (MugData * mugdata)
|
2010-11-02 20:21:32 +01:00
|
|
|
{
|
2010-11-27 12:31:26 +01:00
|
|
|
GtkWidget *mainarea, *w;
|
2012-04-21 08:10:12 +02:00
|
|
|
|
|
|
|
mainarea = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
|
2010-11-02 20:21:32 +01:00
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
w = mug_shortcuts_bar (mugdata);
|
|
|
|
gtk_box_pack_start (GTK_BOX (mainarea), w, FALSE, FALSE, 0);
|
|
|
|
gtk_widget_show (w);
|
2010-11-13 14:18:01 +01:00
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
w = mug_query_area (mugdata);
|
|
|
|
gtk_box_pack_start (GTK_BOX (mainarea), w, TRUE, TRUE, 0);
|
|
|
|
gtk_widget_show (w);
|
2010-11-02 20:21:32 +01:00
|
|
|
|
|
|
|
return mainarea;
|
|
|
|
}
|
|
|
|
|
2017-10-24 08:17:27 +02:00
|
|
|
static GtkWidget*
|
|
|
|
mug_shell (MugData *mugdata)
|
2010-11-02 20:21:32 +01:00
|
|
|
{
|
2010-11-07 10:11:50 +01:00
|
|
|
GtkWidget *vbox;
|
2010-11-02 20:21:32 +01:00
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
mugdata->win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
|
|
|
gtk_window_set_title (GTK_WINDOW (mugdata->win), "Mug Mail Search");
|
2010-11-27 12:31:26 +01:00
|
|
|
|
2012-04-21 08:10:12 +02:00
|
|
|
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
|
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
mugdata->toolbar = mug_toolbar (mugdata);
|
|
|
|
gtk_box_pack_start (GTK_BOX (vbox), mugdata->toolbar, FALSE, FALSE, 2);
|
|
|
|
gtk_box_pack_start (GTK_BOX (vbox), mug_main_area (mugdata), TRUE,
|
|
|
|
TRUE, 2);
|
2010-11-27 12:31:26 +01:00
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
mugdata->statusbar = mug_statusbar ();
|
|
|
|
gtk_box_pack_start (GTK_BOX (vbox), mugdata->statusbar, FALSE, FALSE,
|
|
|
|
2);
|
2010-11-27 12:31:26 +01:00
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
gtk_container_add (GTK_CONTAINER (mugdata->win), vbox);
|
|
|
|
gtk_widget_show_all (vbox);
|
2010-11-27 12:31:26 +01:00
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
gtk_window_set_default_size (GTK_WINDOW (mugdata->win), 700, 500);
|
|
|
|
gtk_window_set_resizable (GTK_WINDOW (mugdata->win), TRUE);
|
2010-11-27 12:31:26 +01:00
|
|
|
|
2012-08-03 08:47:09 +02:00
|
|
|
{
|
|
|
|
gchar *icon;
|
|
|
|
icon = g_strdup_printf ("%s%cmug.svg",
|
|
|
|
MUGDIR, G_DIR_SEPARATOR);
|
|
|
|
gtk_window_set_icon_from_file (GTK_WINDOW (mugdata->win), icon, NULL);
|
|
|
|
g_free (icon);
|
|
|
|
}
|
2011-08-30 21:03:29 +02:00
|
|
|
|
2010-11-07 10:11:50 +01:00
|
|
|
return mugdata->win;
|
2010-11-02 20:21:32 +01:00
|
|
|
}
|
|
|
|
|
2012-07-20 17:41:25 +02:00
|
|
|
static gint
|
|
|
|
on_focus_query_bar (GtkWidget* ignored, GdkEventKey *event, MugData* mugdata)
|
|
|
|
{
|
|
|
|
if (event->type==GDK_KEY_RELEASE && event->keyval==GDK_KEY_Escape) {
|
|
|
|
mug_query_bar_grab_focus (MUG_QUERY_BAR (mugdata->querybar));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
int
|
|
|
|
main (int argc, char *argv[])
|
2010-11-02 20:21:32 +01:00
|
|
|
{
|
|
|
|
MugData mugdata;
|
|
|
|
GtkWidget *mugshell;
|
2010-11-12 20:01:00 +01:00
|
|
|
GOptionContext *octx;
|
|
|
|
GOptionEntry entries[] = {
|
|
|
|
{"muhome", 0, 0, G_OPTION_ARG_FILENAME, &mugdata.muhome,
|
|
|
|
"specify an alternative mu directory", NULL},
|
2010-11-27 12:31:26 +01:00
|
|
|
{NULL, 0, 0, G_OPTION_ARG_NONE, NULL, NULL, NULL} /* sentinel */
|
2010-11-12 20:01:00 +01:00
|
|
|
};
|
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
gtk_init (&argc, &argv);
|
2010-11-12 20:01:00 +01:00
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
octx = g_option_context_new ("- mug options");
|
|
|
|
g_option_context_add_main_entries (octx, entries, "Mug");
|
2010-11-12 20:01:00 +01:00
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
memset (&mugdata, 0, sizeof (MugData));
|
|
|
|
if (!g_option_context_parse (octx, &argc, &argv, NULL)) {
|
2012-08-03 08:47:09 +02:00
|
|
|
g_option_context_free (octx);
|
2010-11-27 13:53:09 +01:00
|
|
|
g_printerr ("mug: error in options\n");
|
2010-11-12 20:01:00 +01:00
|
|
|
return 1;
|
|
|
|
}
|
2010-11-14 12:55:04 +01:00
|
|
|
|
2012-08-03 08:47:09 +02:00
|
|
|
g_option_context_free (octx);
|
2020-05-30 12:24:53 +02:00
|
|
|
mu_runtime_init (mugdata.muhome, "mug", FALSE);
|
2010-11-27 12:31:26 +01:00
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
mugshell = mug_shell (&mugdata);
|
|
|
|
g_signal_connect (G_OBJECT (mugshell), "destroy",
|
|
|
|
G_CALLBACK (gtk_main_quit), NULL);
|
2012-07-20 17:41:25 +02:00
|
|
|
g_signal_connect (G_OBJECT (mugshell), "key_release_event",
|
|
|
|
G_CALLBACK ( on_focus_query_bar ), (gpointer)&mugdata );
|
2010-11-27 12:31:26 +01:00
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
gtk_widget_show (mugshell);
|
|
|
|
mug_query_bar_grab_focus (MUG_QUERY_BAR (mugdata.querybar));
|
2010-11-27 12:31:26 +01:00
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
gtk_main ();
|
|
|
|
g_free (mugdata.muhome);
|
2010-11-27 12:31:26 +01:00
|
|
|
|
2010-11-27 13:53:09 +01:00
|
|
|
mu_runtime_uninit ();
|
2010-11-27 12:31:26 +01:00
|
|
|
|
2010-11-02 20:21:32 +01:00
|
|
|
return 0;
|
|
|
|
}
|