diff options
author | Jean-Louis Dupond <jean-louis@dupond.be> | 2012-05-29 15:08:46 +0400 |
---|---|---|
committer | Jean-Louis Dupond <jean-louis@dupond.be> | 2012-05-29 15:08:46 +0400 |
commit | a193737f3829878c88a827a5b7dd6ac72db9e941 (patch) | |
tree | fd29eaa6fd23783df0073149b9ede0fb49b52c0c /remmina-plugins/rdp | |
parent | aa9b302d8ac5b8d127bec9e1fb8d3f08a91c74ff (diff) |
Add RemoteFX support (Using GDI) and add Numlock & Capslock Sync
Diffstat (limited to 'remmina-plugins/rdp')
-rw-r--r-- | remmina-plugins/rdp/rdp_event.c | 111 | ||||
-rw-r--r-- | remmina-plugins/rdp/rdp_plugin.c | 95 | ||||
-rw-r--r-- | remmina-plugins/rdp/rdp_plugin.h | 2 |
3 files changed, 61 insertions, 147 deletions
diff --git a/remmina-plugins/rdp/rdp_event.c b/remmina-plugins/rdp/rdp_event.c index 7c23c392c..f204b21bc 100644 --- a/remmina-plugins/rdp/rdp_event.c +++ b/remmina-plugins/rdp/rdp_event.c @@ -27,6 +27,28 @@ #include <cairo/cairo-xlib.h> #include <freerdp/locale/keyboard.h> +static void remmina_rdp_event_on_focus_in(GtkWidget* widget, GdkEventKey* event, RemminaProtocolWidget* gp) +{ + rfContext* rfi; + rdpInput* input; + + rfi = GET_DATA(gp); + input = rfi->instance->input; + uint32 toggle_keys_state = 0; + + if (gdk_keymap_get_num_lock_state(gdk_keymap_get_default())) + { + toggle_keys_state |= KBD_SYNC_NUM_LOCK; + } + if (gdk_keymap_get_caps_lock_state(gdk_keymap_get_default())) + { + toggle_keys_state |= KBD_SYNC_CAPS_LOCK; + } + + input->SynchronizeEvent(input, toggle_keys_state); + input->KeyboardEvent(input, KBD_FLAGS_RELEASE, 0x0F); +} + static void remmina_rdp_event_event_push(RemminaProtocolWidget* gp, const RemminaPluginRdpEvent* e) { rfContext* rfi; @@ -238,19 +260,18 @@ static gboolean remmina_rdp_event_on_draw(GtkWidget* widget, cairo_t* context, R context = gdk_cairo_create(gtk_widget_get_window (rfi->drawing_area)); cairo_rectangle(context, x, y, event->area.width, event->area.height); -#else - cairo_rectangle(context, 0, 0, gtk_widget_get_allocated_width(widget), - gtk_widget_get_allocated_height(widget)); #endif if (scale) cairo_scale(context, rfi->scale_x, rfi->scale_y); cairo_set_source_surface(context, rfi->surface, 0, 0); - cairo_fill(context); #if GTK_VERSION == 2 + cairo_fill(context); cairo_destroy(context); +#else + cairo_paint(context); #endif return TRUE; @@ -388,8 +409,8 @@ static gboolean remmina_rdp_event_on_scroll(GtkWidget* widget, GdkEventScroll* e static gboolean remmina_rdp_event_on_key(GtkWidget* widget, GdkEventKey* event, RemminaProtocolWidget* gp) { - Display* display; - KeyCode cooked_keycode; + GdkDisplay* display; + guint16 cooked_keycode; rfContext* rfi; RemminaPluginRdpEvent rdp_event; @@ -425,8 +446,8 @@ static gboolean remmina_rdp_event_on_key(GtkWidget* widget, GdkEventKey* event, else { //TODO: Port to GDK functions - display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default()); - cooked_keycode = XKeysymToKeycode(display, XKeycodeToKeysym(display, event->hardware_keycode, 0)); + display = gdk_display_get_default(); + cooked_keycode = XKeysymToKeycode(GDK_DISPLAY_XDISPLAY(display), XKeycodeToKeysym(GDK_DISPLAY_XDISPLAY(display), event->hardware_keycode, 0)); rdp_event.key_event.key_code = freerdp_keyboard_get_rdp_scancode_from_x11_keycode(cooked_keycode); remmina_plugin_service->log_printf("[RDP]keyval=%04X raw_keycode=%i cooked_keycode=%i scancode=%i extended=%i\n", event->keyval, event->hardware_keycode, cooked_keycode, rdp_event.key_event.key_code, &rdp_event.key_event.extended); @@ -473,7 +494,7 @@ void remmina_rdp_event_init(RemminaProtocolWidget* gp) gtk_container_add(GTK_CONTAINER(gp), rfi->drawing_area); gtk_widget_add_events(rfi->drawing_area, GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK - | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_SCROLL_MASK); + | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_SCROLL_MASK | GDK_FOCUS_CHANGE_MASK); gtk_widget_set_can_focus(rfi->drawing_area, TRUE); remmina_plugin_service->protocol_plugin_register_hostkey(gp, rfi->drawing_area); @@ -503,6 +524,8 @@ void remmina_rdp_event_init(RemminaProtocolWidget* gp) G_CALLBACK(remmina_rdp_event_on_key), gp); g_signal_connect(G_OBJECT(rfi->drawing_area), "key-release-event", G_CALLBACK(remmina_rdp_event_on_key), gp); + g_signal_connect(G_OBJECT(rfi->drawing_area), "focus-in-event", + G_CALLBACK(remmina_rdp_event_on_focus_in), gp); RemminaFile* remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); if (!remmina_plugin_service->file_get_int(remminafile, "disableclipboard", FALSE)) @@ -530,8 +553,7 @@ void remmina_rdp_event_init(RemminaProtocolWidget* gp) rfi->object_table = g_hash_table_new_full(NULL, NULL, NULL, g_free); rfi->display = gdk_display_get_default(); - rfi->depth = gdk_visual_get_best_depth(); - rfi->visual = gdk_visual_get_best_with_depth(rfi->depth); + rfi->bpp = gdk_visual_get_best_depth(); } void remmina_rdp_event_uninit(RemminaProtocolWidget* gp) @@ -623,65 +645,6 @@ static void remmina_rdp_event_connected(RemminaProtocolWidget* gp, RemminaPlugin remmina_rdp_event_update_scale(gp); } -/* -static void remmina_rdp_event_rfx(RemminaProtocolWidget* gp, RemminaPluginRdpUiObject* ui) -{ - XImage* image; - gint i, tx, ty; - RFX_MESSAGE* message; - rfContext* rfi; - - rfi = GET_DATA(gp); - message = ui->rfx.message; - - XSetFunction(rfi->display, rfi->gc, GXcopy); - XSetFillStyle(rfi->display, rfi->gc, FillSolid); - - XSetClipRectangles(rfi->display, rfi->gc, ui->rfx.left, ui->rfx.top, - (XRectangle*) message->rects, message->num_rects, YXBanded); - - // Draw the tiles to primary surface, each is 64x64. - for (i = 0; i < message->num_tiles; i++) - { - image = XCreateImage(rfi->display, rfi->visual, 24, ZPixmap, 0, - (char*) message->tiles[i]->data, 64, 64, 32, 0); - - tx = message->tiles[i]->x + ui->rfx.left; - ty = message->tiles[i]->y + ui->rfx.top; - - XPutImage(rfi->display, rfi->rgb_surface, rfi->gc, image, 0, 0, tx, ty, 64, 64); - XFree(image); - - remmina_rdp_event_update_rect(gp, tx, ty, message->rects[i].width, message->rects[i].height); - } - - XSetClipMask(rfi->display, rfi->gc, None); -} - -static void remmina_rdp_event_nocodec(RemminaProtocolWidget* gp, RemminaPluginRdpUiObject* ui) -{ - XImage* image; - rfContext* rfi; - - rfi = GET_DATA(gp); - - XSetFunction(rfi->display, rfi->gc, GXcopy); - XSetFillStyle(rfi->display, rfi->gc, FillSolid); - - image = XCreateImage(rfi->display, rfi->visual, 24, ZPixmap, 0, - (char*) ui->nocodec.bitmap, ui->nocodec.width, ui->nocodec.height, 32, 0); - - XPutImage(rfi->display, rfi->rgb_surface, rfi->gc, image, 0, 0, - ui->nocodec.left, ui->nocodec.top, - ui->nocodec.width, ui->nocodec.height); - - remmina_rdp_event_update_rect(gp, - ui->nocodec.left, ui->nocodec.top, - ui->nocodec.width, ui->nocodec.height); - - XSetClipMask(rfi->display, rfi->gc, None); -} -*/ gboolean remmina_rdp_event_queue_ui(RemminaProtocolWidget* gp) { @@ -703,15 +666,7 @@ gboolean remmina_rdp_event_queue_ui(RemminaProtocolWidget* gp) case REMMINA_RDP_UI_CONNECTED: remmina_rdp_event_connected(gp, ui); break; -/* - case REMMINA_RDP_UI_RFX: - remmina_rdp_event_rfx(gp, ui); - break; - case REMMINA_RDP_UI_NOCODEC: - remmina_rdp_event_nocodec(gp, ui); - break; -*/ default: break; } diff --git a/remmina-plugins/rdp/rdp_plugin.c b/remmina-plugins/rdp/rdp_plugin.c index 901c2dfb5..f0356a10b 100644 --- a/remmina-plugins/rdp/rdp_plugin.c +++ b/remmina-plugins/rdp/rdp_plugin.c @@ -140,14 +140,14 @@ void rf_object_free(RemminaProtocolWidget* gp, RemminaPluginRdpUiObject* obj) g_free(obj); } -void rf_sw_begin_paint(rdpContext* context) +void rf_begin_paint(rdpContext* context) { rdpGdi* gdi = context->gdi; gdi->primary->hdc->hwnd->invalid->null = 1; gdi->primary->hdc->hwnd->ninvalid = 0; } -void rf_sw_end_paint(rdpContext* context) +void rf_end_paint(rdpContext* context) { sint32 x, y; uint32 w, h; @@ -178,39 +178,7 @@ void rf_sw_end_paint(rdpContext* context) rf_queue_ui(rfi->protocol_widget, ui); } -static void rf_sw_desktop_resize(rdpContext* context) -{ - rfContext* rfi; - RemminaProtocolWidget* gp; - - rfi = (rfContext*) context; - gp = rfi->protocol_widget; - - LOCK_BUFFER(TRUE) - - remmina_plugin_service->protocol_plugin_set_width(gp, rfi->settings->width); - remmina_plugin_service->protocol_plugin_set_height(gp, rfi->settings->height); - - UNLOCK_BUFFER(TRUE) - - THREADS_ENTER - remmina_rdp_event_update_scale(gp); - THREADS_LEAVE - - remmina_plugin_service->protocol_plugin_emit_signal(gp, "desktop-resize"); -} - -void rf_hw_begin_paint(rdpContext* context) -{ - -} - -void rf_hw_end_paint(rdpContext* context) -{ - -} - -static void rf_hw_desktop_resize(rdpContext* context) +static void rf_desktop_resize(rdpContext* context) { rfContext* rfi; RemminaProtocolWidget* gp; @@ -293,11 +261,14 @@ static boolean remmina_rdp_pre_connect(freerdp* instance) return True; } + static boolean remmina_rdp_post_connect(freerdp* instance) { rfContext* rfi; RemminaProtocolWidget* gp; RemminaPluginRdpUiObject* ui; + rdpGdi* gdi; + uint32 flags; rfi = (rfContext*) instance->context; gp = rfi->protocol_widget; @@ -311,33 +282,28 @@ static boolean remmina_rdp_post_connect(freerdp* instance) rf_register_graphics(instance->context->graphics); - if (rfi->sw_gdi) - { - rdpGdi* gdi; - uint32 flags; - - flags = CLRCONV_ALPHA; - - if (rfi->bpp > 16) - { - flags |= CLRBUF_32BPP; - rfi->cairo_format = CAIRO_FORMAT_ARGB32; - } - else - { - flags |= CLRBUF_16BPP; - rfi->cairo_format = CAIRO_FORMAT_RGB16_565; - } + flags = CLRCONV_ALPHA; - gdi_init(instance, flags, NULL); - gdi = instance->context->gdi; - rfi->primary_buffer = gdi->primary_buffer; + if (rfi->bpp == 32) + { + flags |= CLRBUF_32BPP; + rfi->cairo_format = CAIRO_FORMAT_ARGB32; + } + else if (rfi->bpp == 24) + { + flags |= CLRBUF_24BPP; + rfi->cairo_format = CAIRO_FORMAT_RGB24; } else { - rf_gdi_register_update_callbacks(instance->update); + flags |= CLRBUF_16BPP; + rfi->cairo_format = CAIRO_FORMAT_RGB16_565; } + gdi_init(instance, flags, NULL); + gdi = instance->context->gdi; + rfi->primary_buffer = gdi->primary_buffer; + rfi->hdc = gdi_GetDC(); rfi->hdc->bitsPerPixel = rfi->bpp; rfi->hdc->bytesPerPixel = rfi->bpp / 8; @@ -352,6 +318,7 @@ static boolean remmina_rdp_post_connect(freerdp* instance) pointer_cache_register_callbacks(instance->update); +/* if (rfi->sw_gdi != true) { glyph_cache_register_callbacks(instance->update); @@ -360,19 +327,11 @@ static boolean remmina_rdp_post_connect(freerdp* instance) offscreen_cache_register_callbacks(instance->update); palette_cache_register_callbacks(instance->update); } +*/ - if (rfi->sw_gdi) - { - instance->update->BeginPaint = rf_sw_begin_paint; - instance->update->EndPaint = rf_sw_end_paint; - instance->update->DesktopResize = rf_sw_desktop_resize; - } - else - { - instance->update->BeginPaint = rf_hw_begin_paint; - instance->update->EndPaint = rf_hw_end_paint; - instance->update->DesktopResize = rf_hw_desktop_resize; - } + instance->update->BeginPaint = rf_begin_paint; + instance->update->EndPaint = rf_end_paint; + instance->update->DesktopResize = rf_desktop_resize; freerdp_channels_post_connect(rfi->channels, instance); diff --git a/remmina-plugins/rdp/rdp_plugin.h b/remmina-plugins/rdp/rdp_plugin.h index ab0aa1082..00e188bdb 100644 --- a/remmina-plugins/rdp/rdp_plugin.h +++ b/remmina-plugins/rdp/rdp_plugin.h @@ -56,6 +56,7 @@ struct rf_bitmap { rdpBitmap bitmap; Pixmap pixmap; + cairo_surface_t* surface; }; typedef struct rf_bitmap rfBitmap; @@ -104,7 +105,6 @@ struct rf_context GdkVisual* visual; cairo_surface_t* surface; cairo_format_t cairo_format; - gint depth; gint bpp; gint width; gint height; |