blob: 1d460d973f7cd8b206ecdae337bcc827270c5aba (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
#include "input.h"
#include "file.h"
#include "image.h"
#include "window.h"
#include <gtk-3.0/gtk/gtk.h>
#define TIMEOUT 20
int grabbed = 0;
gdouble start_x, start_y;
void next()
{
char *name;
if ((name = get_next_file()) != NULL)
load_image(name);
}
void prev()
{
char *name;
if ((name = get_prev_file()) != NULL)
load_image(name);
}
void first()
{
char *name;
if ((name = get_first_file()) != NULL)
load_image(name);
}
void last()
{
char *name;
if ((name = get_last_file()) != NULL)
load_image(name);
}
void handle_key_press(GdkEventKey key)
{
switch (key.keyval) {
case GDK_KEY_q:
quit();
case GDK_KEY_w:
fit_image();
break;
case GDK_KEY_plus:
case GDK_KEY_KP_Add:
zoom(1);
break;
case GDK_KEY_minus:
case GDK_KEY_KP_Subtract:
zoom(-1);
break;
case GDK_KEY_equal:
zoom(0);
break;
case GDK_KEY_n:
case GDK_KEY_j:
case GDK_KEY_Right:
next();
break;
case GDK_KEY_p:
case GDK_KEY_k:
case GDK_KEY_Left:
prev();
break;
case GDK_KEY_g:
case GDK_KEY_Home:
first();
break;
case GDK_KEY_G:
case GDK_KEY_End:
last();
break;
default:
break;
}
}
void handle_button_press(GdkEvent *event)
{
grabbed = 1;
start_x = event->motion.x;
start_y = event->motion.y;
}
void handle_button_release()
{
grabbed = 0;
}
void handle_mouse_move(gdouble x, gdouble y)
{
if (grabbed) {
gdouble diff_x = start_x - x;
gdouble diff_y = start_y - y;
start_x = x;
start_y = y;
scroll_window(diff_x, diff_y);
}
}
void handle_scroll(GdkEvent *event)
{
GdkModifierType state;
gdk_event_get_state(event, &state);
switch (event->scroll.direction) {
case GDK_SCROLL_UP:
if (state & GDK_CONTROL_MASK) {
zoom(1);
} else {
prev();
}
break;
case GDK_SCROLL_DOWN:
if (state & GDK_CONTROL_MASK) {
zoom(-1);
} else {
next();
}
break;
default:
break;
}
}
gboolean resize_done(gpointer data)
{
guint *id = data;
*id = 0;
fit_image();
return FALSE;
}
void handle_resize()
{
if (curr_scale_mod != fit)
return;
static guint id = 0;
if (id)
g_source_remove(id);
id = g_timeout_add(TIMEOUT, resize_done, &id);
}
|