Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "mainwin.h"
- #include "utils.h"
- #include <glib.h>
- #include <stdio.h>
- #include <string.h>
- #include <glib/gstdio.h>
- #define LOAD_BUFFER_SIZE 65536
- static ImageList* image_list;
- static GdkPixbufAnimation* animation;
- static GtkAnimView* aview;
- static GdkPixbufLoader* loader;
- static GCancellable* generator_cancellable = NULL;
- static void main_win_init( MainWin*mw );
- static void main_win_finalize( GObject* obj );
- static void on_prev(MainWin* mw );
- static void full_screen(MainWin *mw);
- /* signal handlers */
- static gboolean on_delete_event( GtkWidget* widget, GdkEventAny* evt );
- // Begin of GObject-related stuff
- G_DEFINE_TYPE( MainWin, main_win, GTK_TYPE_WINDOW)
- void
- main_win_class_init( MainWinClass* klass )
- {
- GObjectClass * obj_class;
- GtkWidgetClass *widget_class;
- obj_class = ( GObjectClass * ) klass;
- obj_class->finalize = main_win_finalize;
- widget_class = GTK_WIDGET_CLASS ( klass );
- widget_class->delete_event = on_delete_event;
- }
- void main_win_finalize( GObject* obj )
- {
- MainWin *mw = (MainWin*)obj;
- main_win_close(mw);
- if( G_LIKELY(image_list) )
- image_list_free(image_list );
- gtk_main_quit();
- }
- GtkWindow*
- main_win_new()
- {
- return (GtkWindow*)g_object_new (MAIN_WIN_TYPE, NULL);
- }
- gchar *ui_info =
- "<ui>"
- "<toolbar name = 'ToolBar'>"
- "<toolitem action='Go Back'/>"
- "<toolitem action='FullScreen'/>"
- "</toolbar>"
- "</ui>";
- static const GtkActionEntry entries[] = {
- {"Go Back",GTK_STOCK_GO_BACK, "Go Back",
- "<control>b","Go Back", G_CALLBACK(on_prev)
- },
- {"FullScreen",GTK_STOCK_FULLSCREEN, "Full screen",
- "<control>r","Show the image in FULL SCREEN",G_CALLBACK(full_screen)
- },
- };
- static guint n_entries = G_N_ELEMENTS (entries);
- void
- main_win_close( MainWin* mw )
- {
- gtk_main_quit ();
- }
- void
- main_win_init( MainWin *mw )
- {
- GError *error = NULL;
- aview = gtk_anim_view_new();
- image_list = image_list_new();
- gtk_window_set_default_size((GtkWindow*)mw, 670, 480 );
- gtk_window_set_position((GtkWindow*)mw, GTK_WIN_POS_CENTER);
- mw->max_width = gdk_screen_width () * 0.7;
- mw->max_height = gdk_screen_height () * 0.7;
- mw->box = gtk_vbox_new(FALSE, 0);
- mw->img_box = gtk_vbox_new(FALSE, 0);
- mw->scroll = GTK_IMAGE_SCROLL_WIN (gtk_image_scroll_win_new (aview));
- gtk_box_pack_start(GTK_BOX(mw->box), mw->img_box, TRUE, TRUE,0);
- gtk_box_pack_start(GTK_BOX(mw->img_box),mw->scroll,TRUE,TRUE,0);
- gtk_box_pack_start(GTK_BOX(mw->box), gtk_hseparator_new(), FALSE, TRUE,0);
- //gtkuimanager
- mw->actions = gtk_action_group_new ("Actions");
- mw->uimanager = gtk_ui_manager_new();
- gtk_ui_manager_insert_action_group (mw->uimanager, mw->actions, 0);
- gtk_action_group_add_actions (mw->actions, entries, n_entries, (GtkWindow*)mw);
- gtk_window_add_accel_group (GTK_WINDOW (mw),
- gtk_ui_manager_get_accel_group (mw->uimanager));
- gtk_box_pack_end(GTK_BOX (mw->box), gtk_ui_manager_get_widget(mw->uimanager, "/ToolBar"), FALSE, TRUE,0);
- gtk_toolbar_set_style(gtk_ui_manager_get_widget(mw->uimanager, "/ToolBar"), GTK_TOOLBAR_ICONS);
- //end gtuimanager
- gtk_container_add((GtkContainer*)mw, mw->box);
- gtk_widget_show(mw->box);
- gtk_widget_show_all(mw);
- g_object_unref(mw->uimanager);
- g_signal_connect (G_OBJECT (mw), "destroy",
- G_CALLBACK (gtk_main_quit), NULL);
- gtk_widget_grab_focus(aview);
- }
- gboolean
- main_win_open( MainWin* mw, const char* file_path)
- {
- GError *error;
- GInputStream* input_stream;
- GFile *file = g_file_new_for_path(file_path);
- loader = gdk_pixbuf_loader_new();
- animation = gdk_pixbuf_animation_new_from_file(file_path,error);
- gssize n_read;
- gboolean res;
- guchar buffer[LOAD_BUFFER_SIZE];
- input_stream = g_file_read(file,generator_cancellable ,NULL);
- res = TRUE;
- while (1){
- n_read = g_input_stream_read(input_stream, buffer, sizeof (buffer),generator_cancellable,error);
- if (n_read < 0) {
- res = FALSE;
- error = NULL;
- break;
- }
- if (n_read == 0)
- break;
- if (!gdk_pixbuf_loader_write(loader, buffer, sizeof(buffer), error)){
- res = FALSE;
- break;
- }
- }
- if (res){
- animation = gdk_pixbuf_loader_get_animation((loader));
- gtk_anim_view_set_anim (aview,animation);
- char* dir_path = g_path_get_dirname( file_path );
- image_list_open_dir(image_list, dir_path, NULL );
- image_list_sort_by_name( image_list, GTK_SORT_ASCENDING );
- image_list_sort_by_name( image_list, GTK_SORT_DESCENDING );
- g_free( dir_path );
- char* base_name = g_path_get_basename( file_path );
- image_list_set_current( image_list, base_name );
- char* disp_name = g_filename_display_name( base_name );
- g_free( base_name );
- g_free( disp_name );
- gdk_pixbuf_loader_close(loader,NULL);
- }
- else
- {
- res = FALSE;
- error = NULL;
- g_object_unref (input_stream);
- g_object_unref (file);
- g_object_unref (generator_cancellable);
- return;
- }
- }
- // error window
- void
- main_win_show_error( MainWin* mw, const char* message )
- {
- GtkWidget* dlg = gtk_message_dialog_new( (GtkWindow*)mw,
- GTK_DIALOG_MODAL,
- GTK_MESSAGE_ERROR,
- GTK_BUTTONS_OK,
- "%s", message );
- gtk_dialog_run( (GtkDialog*)dlg );
- gtk_widget_destroy( dlg );
- }
- gboolean
- on_delete_event( GtkWidget* widget, GdkEventAny* evt )
- {
- gtk_widget_destroy( widget );
- return TRUE;
- }
- static void
- full_screen(MainWin* mw)
- {
- gtk_window_fullscreen(GTK_WINDOW(mw));
- }
Advertisement
Add Comment
Please, Sign In to add comment