Statistics
| Revision:

root / trunk / gui_base / gui_base.c @ 1897

History | View | Annotate | Download (4.9 KB)

1
/* 
2
    Copyright (C) 2005-2010  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 
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("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);
128
    g_log_set_handler("NNTPGrab-utils", G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, log_func, NULL);
129
    g_log_set_handler("NNTPGrab-automation", G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, log_func, NULL);
130
    g_log_set_handler("NNTPGrab-server", G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, log_func, NULL);
131

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

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

                
148
    g_free(interface_filename);
149

                
150
    builder = gtk_builder_new();
151
    if (!gtk_builder_add_from_file(builder, filename, &err)) {
152
        builder = NULL;
153
        g_error("%s\n", err->message);
154
    }
155

                
156
    gtk_builder_connect_signals(builder, NULL);
157

                
158
    g_free(filename);
159

                
160
    // Set the icon of the window
161
    windowMain = nntpgrab_gui_base_get_widget("windowMain");
162
    pixbuf = gdk_pixbuf_new_from_xpm_data((const char **) &icon_64x64_xpm);
163
    gtk_window_set_icon(GTK_WINDOW(windowMain), pixbuf);
164
    g_object_unref(pixbuf);
165

                
166
    g_signal_connect(G_OBJECT(windowMain), "window_state_event",
167
                           G_CALLBACK(window_state_changed), NULL);
168
}
169

                
170
void
171
nntpgrab_gui_base_destroy_ui(void)
172
{
173
    g_object_unref(builder);
174
    builder = NULL;
175
}
176