2021-02-21 08:37:19 +08:00
|
|
|
#include <gtk/gtk.h>
|
|
|
|
#include <res/winpe.xpm>
|
|
|
|
|
|
|
|
GtkWidget *background;
|
|
|
|
|
|
|
|
void dialog_response(GtkWidget *widget,int response){
|
|
|
|
//Handle file chooser response and set background
|
|
|
|
const gchar *filename;
|
|
|
|
GFile *file;
|
|
|
|
//g_print("%s\n",filename);
|
|
|
|
if(response==GTK_RESPONSE_OK){
|
|
|
|
file=gtk_file_chooser_get_file(GTK_FILE_CHOOSER(widget));
|
2021-02-27 13:47:48 +08:00
|
|
|
gtk_picture_set_file(GTK_PICTURE(background),file);
|
|
|
|
/*
|
2021-02-21 08:37:19 +08:00
|
|
|
filename=g_file_get_path(file);
|
|
|
|
GdkPixbuf *pixbuf=gdk_pixbuf_new_from_file(filename,NULL);
|
|
|
|
GdkPixbuf *sized=gdk_pixbuf_scale_simple(pixbuf,640,360,GDK_INTERP_BILINEAR);
|
2021-02-27 13:47:48 +08:00
|
|
|
gtk_picture_set_pixbuf(GTK_PICTURE(background),sized);*/
|
2021-02-21 08:37:19 +08:00
|
|
|
}
|
|
|
|
gtk_window_destroy(GTK_WINDOW(widget));
|
|
|
|
}
|
|
|
|
|
|
|
|
void change_background(GtkWidget *widget,GtkWindow *parent){
|
|
|
|
//Change background
|
|
|
|
GtkWidget *dialog;
|
|
|
|
GtkFileChooserAction action=GTK_FILE_CHOOSER_ACTION_OPEN;
|
|
|
|
dialog=gtk_file_chooser_dialog_new("Choose a image File",parent,action,
|
|
|
|
"OK",GTK_RESPONSE_OK,"Cancel",GTK_RESPONSE_CANCEL,NULL);
|
|
|
|
//Use GtkFileFilter to select image file
|
|
|
|
GtkFileFilter *filter=gtk_file_filter_new();
|
|
|
|
gtk_file_filter_add_pattern(filter,"*.png");
|
|
|
|
gtk_file_filter_add_pattern(filter,"*.jpg");
|
|
|
|
gtk_file_filter_add_pattern(filter,"*.jpeg");
|
|
|
|
gtk_file_filter_add_pattern(filter,"*.bmp");
|
|
|
|
gtk_file_filter_add_pattern(filter,"*.xpm");
|
|
|
|
gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog),filter);
|
|
|
|
gtk_widget_show(dialog);
|
|
|
|
g_signal_connect(dialog,"response",G_CALLBACK(dialog_response),NULL);
|
|
|
|
}
|
|
|
|
|
2021-02-27 13:47:48 +08:00
|
|
|
void default_background(int width,int height){
|
|
|
|
//Image as background
|
|
|
|
GdkPixbuf *pixbuf=gdk_pixbuf_new_from_xpm_data(winpe);
|
|
|
|
GdkPixbuf *sized=gdk_pixbuf_scale_simple(pixbuf,width,height,GDK_INTERP_BILINEAR);
|
|
|
|
background=gtk_picture_new_for_pixbuf(sized);
|
|
|
|
}
|
|
|
|
|
|
|
|
void image_resize(GtkWidget *widget,gpointer data){
|
|
|
|
//Get resized width and height
|
|
|
|
int width,height;
|
|
|
|
width=gtk_widget_get_allocated_width(widget);
|
|
|
|
height=gtk_widget_get_allocated_height(widget);
|
|
|
|
default_background(width,height);
|
|
|
|
}
|
|
|
|
|
2021-02-21 08:37:19 +08:00
|
|
|
static void gtkmain(GtkApplication *app,gpointer user_data){
|
|
|
|
GtkWidget *window,*overlay,*button,*header;
|
|
|
|
//Window initalize
|
|
|
|
window=gtk_application_window_new(app);
|
|
|
|
gtk_window_set_default_size(GTK_WINDOW(window),640,360);
|
|
|
|
gtk_window_set_title(GTK_WINDOW(window),"gtk4-test2");
|
|
|
|
//Window icon
|
2021-02-23 10:51:31 +08:00
|
|
|
gtk_window_set_icon_name(GTK_WINDOW(window),"org.gtk.daleclack");
|
2021-02-21 08:37:19 +08:00
|
|
|
//GtkHeaderBar
|
|
|
|
header=gtk_header_bar_new();
|
|
|
|
gtk_header_bar_set_show_title_buttons(GTK_HEADER_BAR(header),TRUE);
|
|
|
|
gtk_header_bar_set_decoration_layout(GTK_HEADER_BAR(header),"close,minimize,maximize:icon");
|
|
|
|
gtk_window_set_titlebar(GTK_WINDOW(window),header);
|
2021-02-27 13:47:48 +08:00
|
|
|
//GtkOverlay:Lay widget on the top of background
|
2021-02-21 08:37:19 +08:00
|
|
|
overlay=gtk_overlay_new();
|
2021-02-27 13:47:48 +08:00
|
|
|
default_background(640,360);
|
2021-02-21 08:37:19 +08:00
|
|
|
gtk_widget_set_size_request(background,640,360);
|
|
|
|
gtk_overlay_set_child(GTK_OVERLAY(overlay),background);
|
2021-02-27 13:47:48 +08:00
|
|
|
//g_signal_connect_after(background,"resized",G_CALLBACK(image_resize),NULL);
|
2021-02-21 08:37:19 +08:00
|
|
|
//GtkButton
|
|
|
|
button=gtk_button_new_with_label("Change Background");
|
|
|
|
//gtk_widget_set_size_request(button,200,50);
|
|
|
|
gtk_widget_set_halign(button,GTK_ALIGN_CENTER);
|
|
|
|
gtk_widget_set_valign(button,GTK_ALIGN_CENTER);
|
|
|
|
gtk_overlay_add_overlay(GTK_OVERLAY(overlay),button);
|
|
|
|
g_signal_connect(button,"clicked",G_CALLBACK(change_background),window);
|
|
|
|
//Show all widget
|
|
|
|
gtk_window_set_child(GTK_WINDOW(window),overlay);
|
|
|
|
gtk_widget_show(window);
|
|
|
|
}
|
|
|
|
|
|
|
|
int main(int argc,char *argv[]){
|
|
|
|
int status;
|
|
|
|
GtkApplication *app=gtk_application_new("org.gtk.daleclack",G_APPLICATION_NON_UNIQUE);
|
|
|
|
g_signal_connect(app,"activate",G_CALLBACK(gtkmain),NULL);
|
|
|
|
status=g_application_run(G_APPLICATION(app),argc,argv);
|
|
|
|
g_object_unref(app);
|
|
|
|
return status;
|
|
|
|
}
|