Statistics
| Branch: | Tag: | Revision:

root / gui_base / gui_base.c @ master

History | View | Annotate | Download (6.4 KB)

1
/* 
2
    Copyright (C) 2005-2012  Erik van Pienbroek
3

                
4
    This program is free software; you can redistribute it and/or modify
5
    it under the terms of the GNU General Public License as published by
6
    the Free Software Foundation; either version 2 of the License, or
7
    (at your option) any later version.
8

                
9
    This program is distributed in the hope that it will be useful,
10
    but WITHOUT ANY WARRANTY; without even the implied warranty of
11
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
    GNU General Public License for more details.
13

                
14
    You should have received a copy of the GNU General Public License
15
    along with this program; if not, write to the Free Software
16
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
*/
18

                
19
#include <string.h>
20
#include "nntpgrab_gui_base.h"
21
#include "icon_64x64.xpm"
22

                
23
static GtkBuilder *builder = NULL;
24

                
25
GObject *
26
nntpgrab_gui_base_get_object(const char *name)
27
{
28
    GObject *obj;
29

                
30
    if (!builder) {
31
        return NULL;
32
    }
33

                
34
    obj = gtk_builder_get_object(builder, name);
35
    if (!obj) {
36
        g_critical(_("No widget found with name '%s'\n"), name);
37
    }
38

                
39
    return obj;
40
}
41

                
42
GtkWidget *
43
nntpgrab_gui_base_get_widget(const char *name)
44
{
45
    return GTK_WIDGET(nntpgrab_gui_base_get_object(name));
46
}
47

                
48
static gboolean
49
window_state_changed(GtkWidget *caller, GdkEvent *event, gpointer data)
50
{
51
    if (!nntpgrab_gui_base_tray_icon_get_is_shown()) {
52
        return FALSE;
53
    }
54

                
55
    if (    (event->window_state.new_window_state & GDK_WINDOW_STATE_ICONIFIED) == GDK_WINDOW_STATE_ICONIFIED &&
56
            (event->window_state.changed_mask & GDK_WINDOW_STATE_ICONIFIED) == GDK_WINDOW_STATE_ICONIFIED) {
57
#ifdef WIN32
58
        gtk_widget_hide(caller);
59
#else
60
        gtk_window_set_skip_taskbar_hint(GTK_WINDOW(caller), TRUE);
61
#endif
62
    }
63

                
64
    return FALSE;
65
}
66

                
67
typedef struct _log_func_data {
68
    char msg[1024];
69
    GLogLevelFlags log_level;
70
} LogFuncData;
71

                
72
static gboolean
73
log_func_phase2(gpointer data)
74
{
75
    LogFuncData *func_data = (LogFuncData*) data;
76
    GtkWidget *window;
77

                
78
    window = nntpgrab_gui_base_get_widget("windowMain");
79

                
80
    nntpgrab_gui_base_dialog_show(window, func_data->msg, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK);
81

                
82
    if (func_data->log_level & G_LOG_LEVEL_ERROR) {
83
        gtk_main_quit();
84
    }
85

                
86
    g_slice_free(LogFuncData, func_data);
87

                
88
    return FALSE;
89
}
90

                
91
static void
92
log_func (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data)
93
{
94
    LogFuncData *func_data = g_slice_new(LogFuncData);
95
    char *msg;
96

                
97
    if (log_domain) {
98
        msg = g_strdup_printf("%s: %s", log_domain, message);
99
    } else {
100
        msg = g_strdup(message);
101
    }
102

                
103
    strncpy(func_data->msg, msg, sizeof(func_data->msg) - 1);
104
    func_data->log_level = log_level;
105

                
106
    g_print("%s\n", msg);
107

                
108
    g_idle_add_full(G_PRIORITY_HIGH, log_func_phase2, func_data, NULL);
109

                
110
    g_free(msg);
111
}
112

                
113
void
114
nntpgrab_gui_base_create_ui(const char *interface_name)
115
{
116
    GtkWidget *windowMain;
117
    char *filename;
118
    GdkPixbuf *pixbuf;
119
    GError *err = NULL;
120
    const char *path;
121
    char *interface_filename;
122
#if defined(WIN32)
123
    char *dirname;
124
#endif
125

                
126
    g_log_set_handler(NULL, G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, log_func, NULL);
127
    g_log_set_handler("libpeas", G_LOG_LEVEL_WARNING | G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, log_func, NULL);
128
    g_log_set_handler("NNTPGrab Core", G_LOG_LEVEL_WARNING | G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, log_func, NULL);
129
    g_log_set_handler("NNTPGrab-utils", G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, log_func, NULL);
130
    g_log_set_handler("NNTPGrab-automation", G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, log_func, NULL);
131
    g_log_set_handler("NNTPGrab-server", G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, log_func, NULL);
132

                
133
    /* load the interface */
134
#ifdef WIN32
135
    dirname = g_win32_get_package_installation_directory_of_module(NULL);
136
    path = g_build_path(G_DIR_SEPARATOR_S, dirname, "\\share\\nntpgrab", NULL);
137
    g_free(dirname);
138
#else
139
    if (g_getenv("NNTPGRAB_DATA_DIR")) {
140
        path = g_getenv("NNTPGRAB_DATA_DIR");
141
    } else {
142
        path = SHARE_DIR;
143
    }
144
#endif
145

                
146
    interface_filename = g_strdup_printf("%s.ui", interface_name);
147
    filename = g_build_filename(path, G_DIR_SEPARATOR_S, interface_filename, NULL);
148

                
149
#ifdef WIN32
150
    g_free(path);
151
#endif
152

                
153
    g_free(interface_filename);
154

                
155
    builder = gtk_builder_new();
156
    if (!gtk_builder_add_from_file(builder, filename, &err)) {
157
        builder = NULL;
158
        g_error("%s\n", err->message);
159
    }
160

                
161
    gtk_builder_connect_signals(builder, NULL);
162

                
163
    g_free(filename);
164

                
165
    // Set the icon of the window
166
    windowMain = nntpgrab_gui_base_get_widget("windowMain");
167
    pixbuf = gdk_pixbuf_new_from_xpm_data((const char **) &icon_64x64_xpm);
168
    gtk_window_set_icon(GTK_WINDOW(windowMain), pixbuf);
169
    g_object_unref(pixbuf);
170

                
171
    g_signal_connect(G_OBJECT(windowMain), "window_state_event",
172
                           G_CALLBACK(window_state_changed), NULL);
173
}
174

                
175
void
176
nntpgrab_gui_base_destroy_ui(void)
177
{
178
    g_object_unref(builder);
179
    builder = NULL;
180
}
181

                
182
gboolean
183
nntpgrab_gui_base_append_plugin_ui(const char *interface_name)
184
{
185
    char *filename;
186
    GError *err = NULL;
187
    char *path;
188
    char *interface_filename;
189
#if defined(WIN32)
190
    char *dirname;
191
#endif
192

                
193
    g_return_val_if_fail(interface_name != NULL, FALSE);
194
    g_return_val_if_fail(builder != NULL, FALSE);
195

                
196
    /* load the interface */
197
#ifdef WIN32
198
    dirname = g_win32_get_package_installation_directory_of_module(NULL);
199
    path = g_build_path(G_DIR_SEPARATOR_S, dirname, "\\share\\nntpgrab\\plugins", NULL);
200
    g_free(dirname);
201
#else
202
    if (g_getenv("NNTPGRAB_DATA_DIR")) {
203
        path = g_build_path(G_DIR_SEPARATOR_S, g_getenv("NNTPGRAB_DATA_DIR"), "plugins", NULL);
204
    } else {
205
        path = g_build_path(G_DIR_SEPARATOR_S, SHARE_DIR, "plugins", NULL);
206
    }
207
#endif
208

                
209
    interface_filename = g_strdup_printf("%s.ui", interface_name);
210
    filename = g_build_filename(path, G_DIR_SEPARATOR_S, interface_filename, NULL);
211
    g_free(interface_filename);
212
    g_free(path);
213

                
214
    if (!gtk_builder_add_from_file(builder, filename, &err)) {
215
        g_warning("Unable to load interface '%s': %s\n", interface_filename, err->message);
216
        g_error_free(err);
217
        return FALSE;
218
    }
219

                
220
    gtk_builder_connect_signals(builder, NULL);
221

                
222
    g_free(filename);
223

                
224
    return TRUE;
225
}