source: ldm/trunk/fuentes/misc/ldm-dialog.c @ 855

Last change on this file since 855 was 855, checked in by mabarracus, 5 years ago
  • Updated sources to 2.2.18
  • Ported code from patches to apply in 2.2.18
File size: 7.7 KB
Line 
1/*
2 * LDM Dialog
3 * Copyright (2009) Ryan Niebur <RyanRyan52@gmail.com>
4
5 * Author: Ryan Niebur <RyanRyan52@gmail.com>
6
7 * 2009, Ryan Niebur <RyanRyan52@gmail.com>
8
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License as
11 * published by the Free Software Foundation; either version 2 of
12 * the License, or (at your option) any later version.
13
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18
19 * You should have received a copy of the GNU General Public License
20 * along with this program.  If not, you can find it on the World Wide
21 * Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
22 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
23 * MA 02110-1301, USA.
24
25 */
26
27#include <gtk/gtk.h>
28#include <stdio.h>
29#include <stdlib.h>
30#include <string.h>
31#include <getopt.h>
32#include <locale.h>
33#include <libintl.h>
34#define _(text) gettext(text)
35
36#define NOTHING 0
37#define MESSAGE 1
38#define QUESTION 2
39#define PROGRESS 3
40
41#define AUTO_CLOSE_OPTION 100
42
43GtkWidget *progress, *yes, *no;
44double current_number;
45GIOChannel *g_stdin;
46int auto_close;
47
48void
49yes_clicked(GtkWidget * widget, GtkWidget * mywin)
50{
51    gtk_main_quit();
52    exit(0);
53}
54
55void
56no_clicked(GtkWidget * widget, GtkWidget * mywin)
57{
58    gtk_main_quit();
59    exit(1);
60}
61
62void
63link_clicked(GtkWidget * widget, GtkLabel * mywin)
64{
65    printf("url: %s\n", gtk_label_get_current_uri(GTK_LABEL(widget)));
66    gtk_main_quit();
67    exit(0);
68}
69
70void
71update_progressbar()
72{
73    gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress),
74                                  current_number / 100.0);
75    if (current_number < 100.0) {
76        if (yes)
77            gtk_widget_set_sensitive(yes, FALSE);
78    } else {
79        if (auto_close == TRUE)
80            yes_clicked(NULL, NULL);
81        if (yes) {
82            gtk_widget_set_sensitive(yes, TRUE);
83            gtk_widget_grab_focus(yes);
84        }
85    }
86}
87
88void
89update_progressbar_from_channel(GIOChannel * channel)
90{
91    GString *buf;
92    buf = g_string_new("");
93    g_io_channel_read_line_string(channel, buf, NULL, NULL);
94    current_number = atof(buf->str);
95    update_progressbar();
96    g_string_free(buf, TRUE);
97    g_io_channel_flush(g_stdin, NULL);
98}
99
100void
101usage(char *progname)
102{
103    printf
104        ("Usage: %s --message|--question|--progress [mode specific options] \"message\"\n",
105         progname);
106    printf("Progress mode options: --auto-close\n");
107    exit(1);
108}
109
110#define USAGE() usage(argv[0])
111
112int
113main(int argc, char **argv)
114{
115    GtkWidget *mywin, *vbox, *hbox, *label, *spacer, *big_hbox, *ospacer,
116        *o2spacer;
117    int mode;
118    int retval;
119    char *message;
120    int has_no_button, has_yes_button;
121    mode = NOTHING;
122    has_no_button = TRUE;
123    has_yes_button = TRUE;
124    auto_close = FALSE;
125
126    setlocale(LC_ALL, "");
127    bindtextdomain(GETTEXT_PACKAGE, LOCALE_DIR);
128    bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
129    textdomain(GETTEXT_PACKAGE);
130
131    // Option processing
132    struct option longopts[] = {
133        {"message", 0, 0, MESSAGE},
134        {"question", 0, 0, QUESTION},
135        {"progress", 0, 0, PROGRESS},
136        {"auto-close", 0, 0, AUTO_CLOSE_OPTION},
137        {0, 0, 0, 0}
138    };
139    while (1) {
140        retval = getopt_long(argc, argv, "", longopts, NULL);
141        if (retval == -1)
142            break;
143        switch (retval) {
144        case MESSAGE:
145        case QUESTION:
146        case PROGRESS:
147            if (mode != NOTHING)
148                USAGE();
149            mode = retval;
150            break;
151        case AUTO_CLOSE_OPTION:
152            auto_close = TRUE;
153            break;
154        default:
155            USAGE();
156            break;
157        }
158    }
159    if (mode == NOTHING)
160        USAGE();
161    if ((argc - optind) != 1)
162        USAGE();
163    if (auto_close == TRUE && mode != PROGRESS)
164        USAGE();
165    message = argv[optind];
166    switch (mode) {
167    case MESSAGE:
168        has_no_button = FALSE;
169        break;
170    case QUESTION:
171        break;
172    case PROGRESS:
173        if (auto_close == TRUE)
174            has_yes_button = FALSE;
175        break;
176    }
177
178    // Set up the basic stuff
179    gtk_init(&argc, &argv);
180
181    // Theme
182    char *ldm_theme;
183    gchar *ldm_gtkrc;
184    ldm_theme = getenv("LDM_THEME");
185    if (ldm_theme) {
186        if (*ldm_theme == '/')
187            ldm_gtkrc = g_strconcat(ldm_theme, "/greeter-gtkrc", NULL);
188        else
189            ldm_gtkrc =
190                g_strconcat(LDM_THEME_DIR, ldm_theme, "/greeter-gtkrc",
191                            NULL);
192    } else
193        ldm_gtkrc =
194            g_strconcat(LDM_THEME_DIR, "default", "/greeter-gtkrc", NULL);
195    gtk_rc_add_default_file(ldm_gtkrc);
196    g_free(ldm_gtkrc);
197    // Finish setting up the basic stuff
198    mywin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
199    gdk_window_set_cursor(gdk_get_default_root_window(),
200                          gdk_cursor_new(GDK_LEFT_PTR));
201    gtk_window_set_title(GTK_WINDOW(mywin), "");
202    gtk_window_set_skip_taskbar_hint(GTK_WINDOW(mywin), TRUE);
203    gtk_window_set_resizable(GTK_WINDOW(mywin), 0);
204    gtk_window_set_position(GTK_WINDOW(mywin), GTK_WIN_POS_CENTER_ALWAYS);
205    g_signal_connect(GTK_WINDOW(mywin), "destroy", G_CALLBACK(no_clicked),
206                     mywin);
207    hbox = gtk_hbox_new(FALSE, 3);
208    spacer = gtk_label_new("");
209    ospacer = gtk_label_new("");
210    o2spacer = gtk_label_new("");
211    gtk_widget_set_size_request(ospacer, 0, 8);
212    gtk_widget_set_size_request(o2spacer, 0, 8);
213    gtk_box_pack_start(GTK_BOX(hbox), spacer, TRUE, FALSE, 0);
214
215    // Make the yes button
216    if (has_yes_button == TRUE) {
217        yes = gtk_button_new_from_stock("gtk-ok");
218        g_signal_connect(G_OBJECT(yes), "clicked", G_CALLBACK(yes_clicked),
219                         mywin);
220        gtk_box_pack_start(GTK_BOX(hbox), yes, FALSE, FALSE, 0);
221    }
222    // Make the no button
223    if (has_no_button == TRUE) {
224        no = gtk_button_new_from_stock("gtk-cancel");
225        g_signal_connect(G_OBJECT(no), "clicked", G_CALLBACK(no_clicked),
226                         mywin);
227        gtk_box_pack_start(GTK_BOX(hbox), no, FALSE, FALSE, 0);
228    }
229    // Create the label
230    label = gtk_label_new(message);
231    gtk_label_set_markup(GTK_LABEL(label), message);
232    gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
233    gtk_window_set_default_size(GTK_WINDOW(mywin), 300, -1);
234    g_signal_connect(GTK_LABEL(label), "activate-link",
235                     G_CALLBACK(link_clicked), label);
236
237    vbox = gtk_vbox_new(FALSE, 0);
238    GtkWidget *blah;
239    blah = gtk_alignment_new(0, 0.5, 0, 0);
240    gtk_container_add(GTK_CONTAINER(blah), label);
241    gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(blah), FALSE, FALSE, 10);
242
243    if (mode == PROGRESS) {
244        // Make the progress bar
245        progress = gtk_progress_bar_new();
246        gtk_box_pack_start(GTK_BOX(vbox), progress, FALSE, FALSE, 0);
247        gtk_box_pack_start(GTK_BOX(vbox), o2spacer, FALSE, FALSE, 0);
248
249        // Set the starting value
250        current_number = 0.0;
251        update_progressbar();
252
253        // Set up the hook that listens for input
254        g_stdin = g_io_channel_unix_new(0);
255        g_io_add_watch(g_stdin, G_IO_IN,
256                       (GIOFunc) update_progressbar_from_channel, g_stdin);
257    }
258    // More basic GTK stuff
259    gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
260    gtk_box_pack_start(GTK_BOX(vbox), ospacer, FALSE, FALSE, 0);
261    big_hbox = gtk_hbox_new(FALSE, 0);
262    gtk_box_pack_start(GTK_BOX(big_hbox), vbox, TRUE, TRUE, 10);
263    gtk_container_add(GTK_CONTAINER(mywin), big_hbox);
264    gtk_widget_show_all(mywin);
265    gtk_main();
266    return 0;
267}
Note: See TracBrowser for help on using the repository browser.