aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornirav <nirav@teisuu.com>2018-10-14 18:30:40 +0530
committerDandelion <nirav@teisuu.com>2018-10-14 18:30:40 +0530
commita7488f38fef1960086af860063f1958fb75d58f3 (patch)
treef2308d105bdbd5de1a178429c7e2d2b002a8339a
parentfde5cb29f95f51ed075c34f5eebdccb81fa2f0e4 (diff)
downloadim-a7488f38fef1960086af860063f1958fb75d58f3.tar.gz
im-a7488f38fef1960086af860063f1958fb75d58f3.zip
Added info panel to show current file name, resolution and list index
-rw-r--r--.gitignore2
-rw-r--r--Makefile25
-rw-r--r--data/qwe.css9
-rw-r--r--data/qwe.gresources.xml6
-rw-r--r--src/file.c10
-rw-r--r--src/file.h2
-rw-r--r--src/image.c6
-rw-r--r--src/input.c3
-rw-r--r--src/window.c71
-rw-r--r--src/window.h3
10 files changed, 119 insertions, 18 deletions
diff --git a/.gitignore b/.gitignore
index 992e5e8..787c97d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,3 @@
-.clang_complete
+src/resources.c
qwe
*.o
diff --git a/Makefile b/Makefile
index 12c939f..09b3341 100644
--- a/Makefile
+++ b/Makefile
@@ -1,35 +1,42 @@
CC?=cc
INSTALL?=install
+PKGCONFIG?=$(shell which pkg-config)
+GLIB_COMPILE_RESOURCES?=$(shell $(PKGCONFIG) --variable=glib_compile_resources gio-2.0)
CFLAGS?=-o2 -pipe
CFLAGS+=-Wall -Wextra -Wno-unused-parameter
-CFLAGS+=$(shell pkg-config --cflags gtk+-3.0)
-LDFLAGS+=$(shell pkg-config --libs gtk+-3.0)
-PREFIX?=/usr
+CFLAGS+=$(shell $(PKGCONFIG) --cflags gtk+-3.0)
+LDFLAGS+=$(shell $(PKGCONFIG) --libs gtk+-3.0)
+PREFIX?=/usr/local
BINDIR?=$(PREFIX)/bin
APPDIR?=$(PREFIX)/share/applications
MANDIR?=$(PREFIX)/share/man/man1
SRCDIR=src
+DATADIR=data
OUTDIR=build
-OBJECTS=\
- $(OUTDIR)/main.o \
- $(OUTDIR)/file.o \
- $(OUTDIR)/image.o \
- $(OUTDIR)/input.o \
- $(OUTDIR)/window.o \
+OBJECTS= $(OUTDIR)/main.o \
+ $(OUTDIR)/file.o \
+ $(OUTDIR)/image.o \
+ $(OUTDIR)/input.o \
+ $(OUTDIR)/window.o \
+ $(OUTDIR)/resources.o
all: qwe
qwe: $(OBJECTS)
$(CC) -o qwe $(OBJECTS) $(LDFLAGS)
+$(SRCDIR)/resources.c: $(DATADIR)/qwe.gresources.xml $(DATADIR)/qwe.css
+ $(GLIB_COMPILE_RESOURCES) $(DATADIR)/qwe.gresources.xml --target=$(SRCDIR)/resources.c --generate-source
+
$(OUTDIR)/%.o: $(SRCDIR)/%.c
@mkdir -p $(OUTDIR)
$(CC) -c $(CFLAGS) -o $@ $<
clean:
rm -rf $(OUTDIR) qwe
+ rm -rf $(SRCDIR)/resources.c
install: qwe qwe.desktop
$(INSTALL) -m0755 qwe $(BINDIR)
diff --git a/data/qwe.css b/data/qwe.css
new file mode 100644
index 0000000..375165e
--- /dev/null
+++ b/data/qwe.css
@@ -0,0 +1,9 @@
+#info-panel {
+ background-color: #000000;
+ color: #ffffff;
+ padding: 0px 4px;
+}
+
+#main-window {
+ background-color: #444444;
+}
diff --git a/data/qwe.gresources.xml b/data/qwe.gresources.xml
new file mode 100644
index 0000000..336977a
--- /dev/null
+++ b/data/qwe.gresources.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+ <gresource prefix="/org/gtk/qwe">
+ <file alias="qwe.css">data/qwe.css</file>
+ </gresource>
+</gresources>
diff --git a/src/file.c b/src/file.c
index 22067c2..3a6b005 100644
--- a/src/file.c
+++ b/src/file.c
@@ -133,3 +133,13 @@ void clean()
}
g_free(file_list);
}
+
+int get_current_file_index()
+{
+ return curr_file_index;
+}
+
+int get_total_file_count()
+{
+ return file_list_count;
+}
diff --git a/src/file.h b/src/file.h
index 9a82160..1050c77 100644
--- a/src/file.h
+++ b/src/file.h
@@ -7,5 +7,7 @@ void prev_file();
void first_file();
void last_file();
void clean();
+int get_current_file_index();
+int get_total_file_count();
#endif
diff --git a/src/image.c b/src/image.c
index 3daf00e..052f1b3 100644
--- a/src/image.c
+++ b/src/image.c
@@ -40,6 +40,9 @@ void pixbuf_load_callback(GObject *source_object, GAsyncResult *res,
gdk_pixbuf_get_height(GDK_PIXBUF(pixbuf));
aspect_ratio = (double)pixbuf_width / (double)pixbuf_height;
fit_image();
+ set_window_title(g_file_get_basename(file), pixbuf_width, pixbuf_height);
+ if (file != NULL)
+ g_object_unref(file);
loading = 0;
}
@@ -64,10 +67,7 @@ int load_image(char *file_name)
file = g_file_new_for_path(file_name);
g_file_read_async(file, G_PRIORITY_DEFAULT, NULL, &file_read_callback,
NULL);
- if (file != NULL)
- g_object_unref(file);
curr_zoom = 1.0;
- set_window_title(g_path_get_basename(file_name));
return 0;
}
diff --git a/src/input.c b/src/input.c
index 76b61a9..40a717a 100644
--- a/src/input.c
+++ b/src/input.c
@@ -110,6 +110,9 @@ void handle_key_press(GdkEvent *event)
case GDK_KEY_f:
toggle_fullscreen();
break;
+ case GDK_KEY_i:
+ toggle_infopanel();
+ break;
default:
break;
}
diff --git a/src/window.c b/src/window.c
index 2f0dbce..1a81796 100644
--- a/src/window.c
+++ b/src/window.c
@@ -5,8 +5,11 @@
#include <gtk-3.0/gtk/gtk.h>
GtkWidget *window;
+GtkWidget *info_panel;
GtkWidget *scrolled_window;
+GtkWidget *info_panel_left, *info_panel_right;
int is_fullscreen = 0;
+int show_info = 0;
static gboolean key_press(GtkWindow *window, GdkEvent *event, gpointer data)
{
@@ -47,11 +50,24 @@ static gboolean configure_callback(GtkWindow *window, GdkEvent *event,
return TRUE;
}
+void load_css()
+{
+ GtkCssProvider *provider = gtk_css_provider_new();
+ gtk_css_provider_load_from_resource(provider, "/org/gtk/qwe/qwe.css");
+ gtk_style_context_add_provider_for_screen(
+ gdk_display_get_default_screen(gdk_display_get_default()),
+ GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+ g_object_unref(provider);
+}
+
void create_main_window(GApplication *app)
{
+ // root window
window = gtk_application_window_new(GTK_APPLICATION(app));
+ gtk_widget_set_name(GTK_WIDGET(window), "main-window");
gtk_window_set_title(GTK_WINDOW(window), "qwe");
gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
+ gtk_widget_add_events(GTK_WIDGET(window), GDK_SCROLL_MASK);
g_signal_connect(G_OBJECT(window), "configure-event",
G_CALLBACK(configure_callback), NULL);
g_signal_connect(G_OBJECT(window), "key-press-event", G_CALLBACK(key_press),
@@ -62,16 +78,45 @@ void create_main_window(GApplication *app)
G_CALLBACK(button_release), NULL);
g_signal_connect(G_OBJECT(window), "motion-notify-event",
G_CALLBACK(motion_notify), NULL);
- gtk_widget_add_events(GTK_WIDGET(window), GDK_SCROLL_MASK);
g_signal_connect(G_OBJECT(window), "scroll-event",
G_CALLBACK(scroll_callback), NULL);
+ // scrolled window
scrolled_window = gtk_scrolled_window_new(NULL, NULL);
+ gtk_widget_set_vexpand(GTK_WIDGET(scrolled_window), TRUE);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_container_add(GTK_CONTAINER(scrolled_window), GTK_WIDGET(new_image()));
- gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(scrolled_window));
+ GtkWidget *viewport = gtk_viewport_new(NULL, NULL);
+ gtk_container_add(GTK_CONTAINER(viewport), GTK_WIDGET(new_image()));
+ gtk_container_add(GTK_CONTAINER(scrolled_window), GTK_WIDGET(viewport));
+
+ // info panel
+ info_panel = gtk_grid_new();
+ gtk_widget_set_name(GTK_WIDGET(info_panel), "info_panel");
+ info_panel_left = gtk_label_new(NULL);
+ gtk_widget_set_hexpand(GTK_WIDGET(info_panel_left), TRUE);
+ gtk_label_set_ellipsize(GTK_LABEL(info_panel_left), PANGO_ELLIPSIZE_END);
+ gtk_label_set_xalign(GTK_LABEL(info_panel_left), 0.0f);
+ gtk_grid_attach(GTK_GRID(info_panel), GTK_WIDGET(info_panel_left), 0, 0, 1,
+ 1);
+ info_panel_right = gtk_label_new(NULL);
+ gtk_grid_attach(GTK_GRID(info_panel), GTK_WIDGET(info_panel_right), 1, 0, 1,
+ 1);
+ gtk_widget_set_valign(GTK_WIDGET(info_panel), GTK_ALIGN_END);
+ gtk_widget_set_name(GTK_WIDGET(info_panel_left), "info-panel");
+ gtk_widget_set_name(GTK_WIDGET(info_panel_right), "info-panel");
+
+ // overlay
+ GtkWidget *overlay = gtk_overlay_new();
+ gtk_overlay_add_overlay(GTK_OVERLAY(overlay), GTK_WIDGET(scrolled_window));
+ gtk_overlay_add_overlay(GTK_OVERLAY(overlay), GTK_WIDGET(info_panel));
+ gtk_overlay_set_overlay_pass_through(GTK_OVERLAY(overlay),
+ GTK_WIDGET(info_panel), TRUE);
+
+ gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(overlay));
gtk_widget_show_all(GTK_WIDGET(window));
+ gtk_widget_hide(GTK_WIDGET(info_panel));
+ load_css();
}
void scroll_window(gdouble x, gdouble y)
@@ -88,9 +133,16 @@ void scroll_window(gdouble x, gdouble y)
v_adj);
}
-void set_window_title(const char *title)
+void set_window_title(const char *title, int width, int height)
{
gtk_window_set_title(GTK_WINDOW(window), title);
+ // TODO use malloc
+ char file[100], count[100];
+ sprintf(file, "%s - %dx%d", title, width, height);
+ sprintf(count, "%d/%d", get_current_file_index() + 1,
+ get_total_file_count());
+ gtk_label_set_text(GTK_LABEL(info_panel_left), file);
+ gtk_label_set_text(GTK_LABEL(info_panel_right), count);
}
void get_curr_win_size(gint *width, gint *height)
@@ -115,3 +167,14 @@ void toggle_fullscreen()
is_fullscreen = 1;
}
}
+
+void toggle_infopanel()
+{
+ if (show_info) {
+ gtk_widget_hide(GTK_WIDGET(info_panel));
+ show_info = 0;
+ } else {
+ gtk_widget_show(GTK_WIDGET(info_panel));
+ show_info = 1;
+ }
+}
diff --git a/src/window.h b/src/window.h
index 0c9dbd9..3b344b0 100644
--- a/src/window.h
+++ b/src/window.h
@@ -6,8 +6,9 @@
void create_main_window(GApplication *app);
void get_curr_win_size(gint *width, gint *height);
void scroll_window(gdouble x, gdouble y);
-void set_window_title(const char *title);
+void set_window_title(const char *title, int width, int height);
void quit();
void toggle_fullscreen();
+void toggle_infopanel();
#endif