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

Last change on this file since 516 was 516, checked in by mabarracus, 5 years ago

Copy trusty code

File size: 7.4 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 yes_clicked(GtkWidget * widget, GtkWidget * mywin)
49{
50    gtk_main_quit();
51    exit(0);
52}
53
54void no_clicked(GtkWidget * widget, GtkWidget * mywin)
55{
56    gtk_main_quit();
57    exit(1);
58}
59
60void link_clicked(GtkWidget * widget, GtkLabel * mywin)
61{
62    printf("url: %s\n",gtk_label_get_current_uri(GTK_LABEL(widget)));
63    gtk_main_quit();
64    exit(0);
65}
66
67void update_progressbar()
68{
69    gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress), current_number/100.0);
70    if(current_number < 100.0) {
71        if(yes)
72            gtk_widget_set_sensitive(yes, FALSE);
73    } else {
74        if(auto_close == TRUE)
75            yes_clicked(NULL, NULL);
76        if(yes) {
77            gtk_widget_set_sensitive(yes, TRUE);
78            gtk_widget_grab_focus(yes);
79        }
80    }
81}
82
83void update_progressbar_from_channel(GIOChannel * channel)
84{
85    GString *buf;
86    buf = g_string_new("");
87    g_io_channel_read_line_string(channel, buf, NULL, NULL);
88    current_number = atof(buf->str);
89    update_progressbar();
90    g_string_free(buf, TRUE);
91    g_io_channel_flush(g_stdin, NULL);
92}
93
94void usage(char * progname) {
95    printf("Usage: %s --message|--question|--progress [mode specific options] \"message\"\n", progname);
96    printf("Progress mode options: --auto-close\n");
97    exit(1);
98}
99
100#define USAGE() usage(argv[0])
101
102int main(int argc, char ** argv){
103    GtkWidget *mywin, *vbox, *hbox, *label, *spacer, *big_hbox, *ospacer, *o2spacer;
104    int mode;
105    int retval;
106    char * message;
107    int has_no_button, has_yes_button;
108    mode = NOTHING;
109    has_no_button = TRUE;
110    has_yes_button = TRUE;
111    auto_close = FALSE;
112
113    setlocale (LC_ALL, "");
114    bindtextdomain (GETTEXT_PACKAGE, LOCALE_DIR);
115    bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
116    textdomain (GETTEXT_PACKAGE);
117
118    // Option processing
119    struct option longopts[] = {
120        {"message", 0, 0, MESSAGE},
121        {"question", 0, 0, QUESTION},
122        {"progress", 0, 0, PROGRESS},
123        {"auto-close", 0, 0, AUTO_CLOSE_OPTION},
124        {0,0,0,0}
125    };
126    while(1) {
127        retval = getopt_long(argc, argv, "", longopts, NULL);
128        if(retval == -1)
129            break;
130        switch(retval) {
131        case MESSAGE:
132        case QUESTION:
133        case PROGRESS:
134            if(mode != NOTHING)
135                USAGE();
136            mode = retval;
137            break;
138        case AUTO_CLOSE_OPTION:
139            auto_close = TRUE;
140            break;
141        default:
142            USAGE();
143            break;
144        }
145    }
146    if(mode == NOTHING)
147        USAGE();
148    if((argc - optind) != 1)
149        USAGE();
150    if(auto_close == TRUE && mode != PROGRESS)
151        USAGE();
152    message = argv[optind];
153    switch(mode) {
154    case MESSAGE:
155        has_no_button = FALSE;
156        break;
157    case QUESTION:
158        break;
159    case PROGRESS:
160        if(auto_close == TRUE)
161            has_yes_button = FALSE;
162        break;
163    }
164
165    // Set up the basic stuff
166    gtk_init(&argc, &argv);
167
168    // Theme
169    char * ldm_theme;
170    gchar * ldm_gtkrc;
171    ldm_theme = getenv("LDM_THEME");
172    if (ldm_theme)
173    {
174        if(*ldm_theme == '/')
175            ldm_gtkrc = g_strconcat(ldm_theme, "/greeter-gtkrc", NULL);
176        else
177            ldm_gtkrc = g_strconcat(LDM_THEME_DIR, ldm_theme, "/greeter-gtkrc", NULL);
178    } else
179        ldm_gtkrc = g_strconcat(LDM_THEME_DIR, "default", "/greeter-gtkrc", NULL);
180    gtk_rc_add_default_file(ldm_gtkrc);
181    g_free(ldm_gtkrc);
182    // Finish setting up the basic stuff
183    mywin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
184    gdk_window_set_cursor(gdk_get_default_root_window(), gdk_cursor_new(GDK_LEFT_PTR));
185    gtk_window_set_title(GTK_WINDOW(mywin),"");
186    gtk_window_set_skip_taskbar_hint(GTK_WINDOW(mywin),TRUE);
187    gtk_window_set_resizable (GTK_WINDOW(mywin),0);
188    gtk_window_set_position(GTK_WINDOW(mywin), GTK_WIN_POS_CENTER_ALWAYS);
189    g_signal_connect(GTK_WINDOW(mywin), "destroy", G_CALLBACK(no_clicked), mywin);
190    hbox = gtk_hbox_new(FALSE, 3);
191    spacer = gtk_label_new("");
192    ospacer = gtk_label_new("");
193    o2spacer = gtk_label_new("");
194    gtk_widget_set_size_request(ospacer, 0, 8);
195    gtk_widget_set_size_request(o2spacer, 0, 8);
196    gtk_box_pack_start(GTK_BOX(hbox), spacer, TRUE, FALSE, 0);
197
198    // Make the yes button
199    if(has_yes_button == TRUE) {
200        yes = gtk_button_new_from_stock("gtk-ok");
201        g_signal_connect(G_OBJECT(yes), "clicked", G_CALLBACK(yes_clicked), mywin);
202        gtk_box_pack_start(GTK_BOX(hbox), yes, FALSE, FALSE, 0);
203    }
204
205    // Make the no button
206    if(has_no_button == TRUE) {
207        no = gtk_button_new_from_stock("gtk-cancel");
208        g_signal_connect(G_OBJECT(no), "clicked", G_CALLBACK(no_clicked), mywin);
209        gtk_box_pack_start(GTK_BOX(hbox), no, FALSE, FALSE, 0);
210    }
211
212    // Create the label
213    label = gtk_label_new(message);
214    gtk_label_set_markup(GTK_LABEL(label), message);
215    gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
216    gtk_window_set_default_size(GTK_WINDOW(mywin), 300, -1);
217    g_signal_connect(GTK_LABEL(label), "activate-link", G_CALLBACK(link_clicked), label);
218
219    vbox = gtk_vbox_new(FALSE, 0);
220    GtkWidget * blah;
221    blah = gtk_alignment_new(0, 0.5, 0, 0);
222    gtk_container_add(GTK_CONTAINER(blah), label);
223    gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(blah), FALSE, FALSE, 10);
224
225    if(mode == PROGRESS) {
226        // Make the progress bar
227        progress = gtk_progress_bar_new();
228        gtk_box_pack_start(GTK_BOX(vbox), progress, FALSE, FALSE, 0);
229        gtk_box_pack_start(GTK_BOX(vbox), o2spacer, FALSE, FALSE, 0);
230
231        // Set the starting value
232        current_number = 0.0;
233        update_progressbar();
234
235        // Set up the hook that listens for input
236        g_stdin = g_io_channel_unix_new(0);
237        g_io_add_watch(g_stdin, G_IO_IN, (GIOFunc) update_progressbar_from_channel, g_stdin);
238    }
239
240    // More basic GTK stuff
241    gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
242    gtk_box_pack_start(GTK_BOX(vbox), ospacer, FALSE, FALSE, 0);
243    big_hbox = gtk_hbox_new(FALSE, 0);
244    gtk_box_pack_start(GTK_BOX(big_hbox), vbox, TRUE, TRUE, 10);
245    gtk_container_add(GTK_CONTAINER(mywin), big_hbox);
246    gtk_widget_show_all(mywin);
247    gtk_main();
248    return 0;
249}
Note: See TracBrowser for help on using the repository browser.