46 static void remmina_scrolled_viewport_get_preferred_width(GtkWidget* widget, gint* minimum_width, gint* natural_width)
51 if (minimum_width != NULL) *minimum_width = 100;
52 if (natural_width != NULL) *natural_width = 100;
60 if (minimum_height != NULL) *minimum_height = 100;
61 if (natural_height != NULL) *natural_height = 100;
75 #if GTK_CHECK_VERSION(3, 20, 0) 78 GdkDeviceManager *device_manager;
83 gint x, y, mx, my, w, h, rootx, rooty;
87 gsv = REMMINA_SCROLLED_VIEWPORT(data);
91 if (!REMMINA_IS_SCROLLED_VIEWPORT(data)) {
95 if (!GTK_IS_BIN(data)) {
100 child = gtk_bin_get_child(GTK_BIN(gsv));
101 if (!GTK_IS_VIEWPORT(child)) {
106 gsvwin = gtk_widget_get_window(GTK_WIDGET(gsv));
107 display = gdk_display_get_default();
113 #if GTK_CHECK_VERSION(3, 20, 0) 114 seat = gdk_display_get_default_seat(display);
115 pointer = gdk_seat_get_pointer(seat);
117 device_manager = gdk_display_get_device_manager(display);
118 pointer = gdk_device_manager_get_client_pointer(device_manager);
120 gdk_device_get_position(pointer, &screen, &x, &y);
122 w = gdk_window_get_width(gsvwin) + SCROLL_BORDER_SIZE;
123 h = gdk_window_get_height(gsvwin) + SCROLL_BORDER_SIZE;
125 gdk_window_get_root_origin(gsvwin, &rootx, &rooty );
130 mx = (x <= 0 ? -1 : (x >= w - 1 ? 1 : 0));
131 my = (y <= 0 ? -1 : (y >= h - 1 ? 1 : 0));
134 adj = gtk_scrollable_get_hadjustment(GTK_SCROLLABLE(child));
135 value = gtk_adjustment_get_value(GTK_ADJUSTMENT(adj)) + (gdouble)(mx * step);
136 value = MAX(0, MIN(value, gtk_adjustment_get_upper(GTK_ADJUSTMENT(adj)) - (gdouble)w + 2.0));
137 gtk_adjustment_set_value(GTK_ADJUSTMENT(adj), value);
141 adj = gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(child));
142 value = gtk_adjustment_get_value(GTK_ADJUSTMENT(adj)) + (gdouble)(my * step);
143 value = MAX(0, MIN(value, gtk_adjustment_get_upper(GTK_ADJUSTMENT(adj)) - (gdouble)h + 2.0));
144 gtk_adjustment_set_value(GTK_ADJUSTMENT(adj), value);
151 TRACE_CALL(__func__);
158 TRACE_CALL(__func__);
161 REMMINA_DEBUG(
"cleaning motion ...");
170 TRACE_CALL(__func__);
176 TRACE_CALL(__func__);
177 GtkWidgetClass *widget_class;
178 widget_class = (GtkWidgetClass*)klass;
180 widget_class->get_preferred_width = remmina_scrolled_viewport_get_preferred_width;
187 TRACE_CALL(__func__);
192 TRACE_CALL(__func__);
196 g_source_remove(handler);
203 TRACE_CALL(__func__);
206 gsv = REMMINA_SCROLLED_VIEWPORT(g_object_new(REMMINA_TYPE_SCROLLED_VIEWPORT, NULL));
210 gtk_widget_set_size_request(GTK_WIDGET(gsv), 1, 1);
211 gtk_widget_add_events(GTK_WIDGET(gsv), GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK);
216 return GTK_WIDGET(gsv);