dockapps/yawmppp/src/gtksetup/msgbox.c
2017-08-27 21:56:47 +02:00

188 lines
5.5 KiB
C

/*
Message Box Composite Widget
(currently included in various software packages)
Copyright (C) 1999-2000 Felipe Paulo Guazzi Bergo
bergo@seul.org
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 2 of the License, 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <gtk/gtk.h>
#include "msgbox.h"
#include "bong.xpm"
#include "exclam.xpm"
#include "info.xpm"
#include "question.xpm"
/* PRIVATE */
void message_box_click_yes(GtkWidget *widget,gpointer data);
void message_box_click_no(GtkWidget *widget,gpointer data);
void message_box_click_cancel(GtkWidget *widget,gpointer data);
void message_box_click_ok(GtkWidget *widget,gpointer data);
gint immortal(GtkWidget *widget,GdkEvent *event,gpointer data);
struct msgbox_data {
gint answer_available;
MsgBoxResult answer;
} cmdata;
gchar ** mb_icons[5]={NULL,bong_xpm,info_xpm,exclam_xpm,question_xpm};
MsgBoxResult
message_box(GtkWindow *parent,char *txt,char *title,MsgBoxType mbt,MsgBoxIcon mbi)
{
GtkWidget *msgbox,*b[3],*lb,*tbl,*hs;
GdkBitmap *mask;
GdkPixmap *dqmark;
GtkWidget *tqmark;
GtkStyle *style;
int i,nb;
cmdata.answer_available=FALSE;
msgbox=gtk_window_new(GTK_WINDOW_DIALOG);
tbl=gtk_table_new(3,4,FALSE);
gtk_container_add(GTK_CONTAINER(msgbox),tbl);
gtk_window_set_title(GTK_WINDOW(msgbox),title);
if (parent!=NULL)
gtk_window_set_transient_for(GTK_WINDOW(msgbox),parent);
gtk_container_set_border_width(GTK_CONTAINER(msgbox),4);
gtk_window_set_position(GTK_WINDOW(msgbox),GTK_WIN_POS_CENTER);
gtk_window_set_policy(GTK_WINDOW(msgbox),TRUE,TRUE,TRUE);
gtk_widget_realize(msgbox);
style=gtk_widget_get_style(msgbox);
if (mbi!=MSGBOX_ICON_NONE) {
dqmark=gdk_pixmap_create_from_xpm_d(msgbox->window,&mask,
&style->bg[GTK_STATE_NORMAL],
mb_icons[mbi]);
tqmark=gtk_pixmap_new(dqmark,mask);
gtk_table_attach(GTK_TABLE(tbl),tqmark,0,1,0,1,GTK_FILL,GTK_FILL,5,5);
gtk_widget_show(tqmark);
}
lb=gtk_label_new(txt);
gtk_label_set_justify(GTK_LABEL(lb),GTK_JUSTIFY_LEFT);
gtk_table_attach(GTK_TABLE(tbl),lb,1,4,0,1,GTK_FILL,GTK_FILL,10,10);
gtk_widget_show(lb);
hs=gtk_hseparator_new();
gtk_table_attach(GTK_TABLE(tbl),hs,0,4,1,2,GTK_FILL,GTK_FILL,0,10);
gtk_widget_show(hs);
/* buttons */
switch(mbt) {
case MSGBOX_OK:
nb=1;
b[0]=gtk_button_new_with_label("OK");
gtk_signal_connect(GTK_OBJECT(b[0]),"clicked",
GTK_SIGNAL_FUNC(message_box_click_ok),NULL);
break;
case MSGBOX_OKCANCEL:
nb=2;
b[0]=gtk_button_new_with_label("OK");
gtk_signal_connect(GTK_OBJECT(b[0]),"clicked",
GTK_SIGNAL_FUNC(message_box_click_ok),NULL);
b[1]=gtk_button_new_with_label("Cancel");
gtk_signal_connect(GTK_OBJECT(b[1]),"clicked",
GTK_SIGNAL_FUNC(message_box_click_cancel),NULL);
break;
case MSGBOX_YESNO:
nb=2;
b[0]=gtk_button_new_with_label("Yes");
gtk_signal_connect(GTK_OBJECT(b[0]),"clicked",
GTK_SIGNAL_FUNC(message_box_click_yes),NULL);
b[1]=gtk_button_new_with_label("No");
gtk_signal_connect(GTK_OBJECT(b[1]),"clicked",
GTK_SIGNAL_FUNC(message_box_click_no),NULL);
break;
case MSGBOX_YESNOCANCEL:
nb=3;
b[0]=gtk_button_new_with_label("Yes");
gtk_signal_connect(GTK_OBJECT(b[0]),"clicked",
GTK_SIGNAL_FUNC(message_box_click_yes),NULL);
b[1]=gtk_button_new_with_label("No");
gtk_signal_connect(GTK_OBJECT(b[1]),"clicked",
GTK_SIGNAL_FUNC(message_box_click_no),NULL);
b[2]=gtk_button_new_with_label("Cancel");
gtk_signal_connect(GTK_OBJECT(b[2]),"clicked",
GTK_SIGNAL_FUNC(message_box_click_cancel),NULL);
break;
default:
nb=0;
}
for(i=0;i<nb;i++)
gtk_table_attach(GTK_TABLE(tbl),b[i],
4-nb+i,4-nb+i+1,
2,3,
GTK_FILL,
(i?GTK_SHRINK:GTK_FILL),2,2);
GTK_WIDGET_SET_FLAGS(b[0],GTK_CAN_DEFAULT);
gtk_widget_grab_default(b[0]);
for(i=0;i<nb;i++)
gtk_widget_show(b[i]);
gtk_signal_connect(GTK_OBJECT(msgbox),"delete_event",
GTK_SIGNAL_FUNC(immortal),NULL);
gtk_widget_show(tbl);
gtk_widget_show(msgbox);
gtk_grab_add(msgbox);
/* gtk_main MUST be running before message_box is called!!! */
while(!cmdata.answer_available)
gtk_main_iteration();
gtk_grab_remove(msgbox);
gtk_widget_destroy(msgbox);
return(cmdata.answer);
}
void message_box_click_yes(GtkWidget *widget,gpointer data) {
cmdata.answer=MSGBOX_R_YES;
cmdata.answer_available=TRUE;
}
void message_box_click_no(GtkWidget *widget,gpointer data) {
cmdata.answer=MSGBOX_R_NO;
cmdata.answer_available=TRUE;
}
void message_box_click_cancel(GtkWidget *widget,gpointer data) {
cmdata.answer=MSGBOX_R_CANCEL;
cmdata.answer_available=TRUE;
}
void message_box_click_ok(GtkWidget *widget,gpointer data) {
cmdata.answer=MSGBOX_R_OK;
cmdata.answer_available=TRUE;
}
gint immortal(GtkWidget *widget,GdkEvent *event,gpointer data) {
return TRUE;
}