45 static void remmina_scrolled_viewport_get_preferred_width(GtkWidget* widget, gint* minimum_width, gint* natural_width)
50 if (minimum_width != NULL) *minimum_width = 100;
51 if (natural_width != NULL) *natural_width = 100;
59 if (minimum_height != NULL) *minimum_height = 100;
60 if (natural_height != NULL) *natural_height = 100;
70 #if GTK_CHECK_VERSION(3, 20, 0) 73 GdkDeviceManager *device_manager;
78 gint x, y, mx, my, w, h, rootx, rooty;
82 if (!REMMINA_IS_SCROLLED_VIEWPORT(data))
84 if (!GTK_IS_BIN(data))
86 gsv = REMMINA_SCROLLED_VIEWPORT(data);
89 child = gtk_bin_get_child(GTK_BIN(gsv));
90 if (!GTK_IS_VIEWPORT(child))
93 gsvwin = gtk_widget_get_window(GTK_WIDGET(gsv));
97 display = gdk_display_get_default();
100 #if GTK_CHECK_VERSION(3, 20, 0) 101 seat = gdk_display_get_default_seat(display);
102 pointer = gdk_seat_get_pointer(seat);
104 device_manager = gdk_display_get_device_manager(display);
105 pointer = gdk_device_manager_get_client_pointer(device_manager);
107 gdk_device_get_position(pointer, &screen, &x, &y);
109 w = gdk_window_get_width(gsvwin) + SCROLL_BORDER_SIZE;
110 h = gdk_window_get_height(gsvwin) + SCROLL_BORDER_SIZE;
112 gdk_window_get_root_origin(gsvwin, &rootx, &rooty );
117 mx = (x <= 0 ? -1 : (x >= w - 1 ? 1 : 0));
118 my = (y <= 0 ? -1 : (y >= h - 1 ? 1 : 0));
121 adj = gtk_scrollable_get_hadjustment(GTK_SCROLLABLE(child));
122 value = gtk_adjustment_get_value(GTK_ADJUSTMENT(adj)) + (gdouble)(mx * step);
123 value = MAX(0, MIN(value, gtk_adjustment_get_upper(GTK_ADJUSTMENT(adj)) - (gdouble)w + 2.0));
124 gtk_adjustment_set_value(GTK_ADJUSTMENT(adj), value);
128 adj = gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(child));
129 value = gtk_adjustment_get_value(GTK_ADJUSTMENT(adj)) + (gdouble)(my * step);
130 value = MAX(0, MIN(value, gtk_adjustment_get_upper(GTK_ADJUSTMENT(adj)) - (gdouble)h + 2.0));
131 gtk_adjustment_set_value(GTK_ADJUSTMENT(adj), value);
138 TRACE_CALL(__func__);
145 TRACE_CALL(__func__);
154 TRACE_CALL(__func__);
160 TRACE_CALL(__func__);
161 GtkWidgetClass *widget_class;
162 widget_class = (GtkWidgetClass*)klass;
164 widget_class->get_preferred_width = remmina_scrolled_viewport_get_preferred_width;
171 TRACE_CALL(__func__);
176 TRACE_CALL(__func__);
187 TRACE_CALL(__func__);
190 gsv = REMMINA_SCROLLED_VIEWPORT(g_object_new(REMMINA_TYPE_SCROLLED_VIEWPORT, NULL));
195 gtk_widget_set_size_request(GTK_WIDGET(gsv), 1, 1);
196 gtk_widget_add_events(GTK_WIDGET(gsv), GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK);
201 return GTK_WIDGET(gsv);