* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
#define _GNU_SOURCE
uint32_t time;
GdkWindow *pointer_grab_window;
uint32_t pointer_grab_time;
+ guint32 repeat_timer;
+ guint32 repeat_key;
+ guint32 repeat_count;
DataOffer *drag_offer;
DataOffer *selection_offer;
GdkDisplayWayland *display = GDK_DISPLAY_WAYLAND (device->display);
GdkEvent *event;
uint32_t modifier;
+ int gdk_button;
+
+ switch (button) {
+ case 273:
+ gdk_button = 3;
+ break;
+ case 274:
+ gdk_button = 2;
+ break;
+ default:
+ gdk_button = button - 271;
+ break;
+ }
device->time = time;
event = gdk_event_new (state ? GDK_BUTTON_PRESS : GDK_BUTTON_RELEASE);
event->button.y_root = (gdouble) device->y;
event->button.axes = NULL;
event->button.state = device->modifiers;
- event->button.button = button - 271;
+ event->button.button = gdk_button;
gdk_event_set_screen (event, display->screen);
- modifier = 1 << (8 + button - 272);
+ modifier = 1 << (8 + gdk_button - 1);
if (state)
device->modifiers |= modifier;
else
}
}
-static void
-input_handle_key(void *data, struct wl_input_device *input_device,
- uint32_t time, uint32_t key, uint32_t state)
+static gboolean
+keyboard_repeat (gpointer data);
+
+static gboolean
+deliver_key_event(GdkWaylandDevice *device,
+ uint32_t time, uint32_t key, uint32_t state)
{
- GdkWaylandDevice *device = data;
GdkEvent *event;
uint32_t code, modifier, level;
struct xkb_desc *xkb;
"string %s, mods 0x%x",
code, event->key.keyval,
event->key.string, event->key.state));
+
+ device->repeat_count++;
+ device->repeat_key = key;
+
+ if (state == 0)
+ {
+ if (device->repeat_timer)
+ {
+ g_source_remove (device->repeat_timer);
+ device->repeat_timer = 0;
+ }
+ return FALSE;
+ }
+ else if (modifier)
+ {
+ return FALSE;
+ }
+ else switch (device->repeat_count)
+ {
+ case 1:
+ if (device->repeat_timer)
+ {
+ g_source_remove (device->repeat_timer);
+ device->repeat_timer = 0;
+ }
+
+ device->repeat_timer =
+ gdk_threads_add_timeout (400, keyboard_repeat, device);
+ return TRUE;
+ case 2:
+ device->repeat_timer =
+ gdk_threads_add_timeout (80, keyboard_repeat, device);
+ return FALSE;
+ default:
+ return TRUE;
+ }
+}
+
+static gboolean
+keyboard_repeat (gpointer data)
+{
+ GdkWaylandDevice *device = data;
+
+ return deliver_key_event (device, device->time, device->repeat_key, 1);
+}
+
+static void
+input_handle_key(void *data, struct wl_input_device *input_device,
+ uint32_t time, uint32_t key, uint32_t state)
+{
+ GdkWaylandDevice *device = data;
+
+ device->repeat_count = 0;
+ deliver_key_event (data, time, key, state);
}
static void
device->time = time;
if (device->keyboard_focus)
{
+ _gdk_wayland_window_remove_focus (device->keyboard_focus);
event = gdk_event_new (GDK_FOCUS_CHANGE);
event->focus_change.window = g_object_ref (device->keyboard_focus);
event->focus_change.send_event = FALSE;
device, device->keyboard_focus));
_gdk_wayland_display_deliver_event (device->display, event);
+
+ _gdk_wayland_window_add_focus (device->keyboard_focus);
}
}
g_debug (G_STRLOC ": %s wl_data_device = %p wl_data_offer = %p",
G_STRFUNC, wl_data_device, offer);
+ if (!offer)
+ {
+ if (device->selection_offer)
+ {
+ data_offer_unref (device->selection_offer);
+ device->selection_offer = NULL;
+ }
+
+ return;
+ }
+
if (device->selection_offer)
{
data_offer_unref (device->selection_offer);
device = GDK_DEVICE_CORE (gdk_device)->device;
- if (device->selection_offer->types->len == 0)
+ if (!device->selection_offer || device->selection_offer->types->len == 0)
{
*atoms_out = NULL;
return 0;
closure->cb (closure->device->pointer, data, len, closure->userdata);
+ g_free (data);
data_offer_unref (closure->offer);
g_io_channel_unref (channel);
g_free (closure);
int32_t fd)
{
GdkWaylandSelectionOffer *offer = (GdkWaylandSelectionOffer *)data;;
- const gchar *buf;
- gssize len, bytes_written;
+ gchar *buf;
+ gssize len, bytes_written = 0;
g_debug (G_STRLOC ": %s source = %p, mime_type = %s fd = %d",
G_STRFUNC, source, mime_type, fd);
while (len > 0)
{
- bytes_written = write (fd, buf, len);
+ bytes_written += write (fd, buf + bytes_written, len);
if (bytes_written == -1)
goto error;
len -= bytes_written;
}
close (fd);
+ g_free (buf);
return;
error:
g_strerror (errno));
close (fd);
+ g_free (buf);
}
static void