2 * FreeRDP: A Remote Desktop Protocol Client
3 * Remote Applications Integrated Locally (RAIL)
5 * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
20 #include <freerdp/utils/stream.h>
21 #include <freerdp/utils/memory.h>
25 #include <freerdp/rail/rail.h>
26 #include <freerdp/rail/window_list.h>
28 static void rail_WindowCreate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* window_state)
30 rdpRail* rail = context->rail;
31 window_list_create(rail->list, orderInfo, window_state);
34 static void rail_WindowUpdate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* window_state)
36 rdpRail* rail = context->rail;
37 window_list_update(rail->list, orderInfo, window_state);
40 static void rail_WindowDelete(rdpContext* context, WINDOW_ORDER_INFO* orderInfo)
42 rdpRail* rail = context->rail;
43 window_list_delete(rail->list, orderInfo);
46 static void rail_WindowIcon(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_ICON_ORDER* window_icon)
50 rdpRail* rail = context->rail;
52 if (window_icon->iconInfo->cacheEntry != 0xFFFF)
57 window = window_list_get_by_id(rail->list, orderInfo->windowId);
59 icon = (rdpIcon*) xzalloc(sizeof(rdpIcon));
60 icon->entry = window_icon->iconInfo;
61 icon->big = (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_ICON_BIG) ? true : false;
63 DEBUG_RAIL("Window Icon: %dx%d@%dbpp cbBitsColor:%d cbBitsMask:%d cbColorTable:%d",
64 window_icon->iconInfo->width, window_icon->iconInfo->height, window_icon->iconInfo->bpp,
65 window_icon->iconInfo->cbBitsColor, window_icon->iconInfo->cbBitsMask, window_icon->iconInfo->cbColorTable);
68 window->bigIcon = icon;
70 window->smallIcon = icon;
72 IFCALL(rail->rail_SetWindowIcon, rail, window, icon);
75 static void rail_WindowCachedIcon(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_CACHED_ICON_ORDER* window_cached_icon)
80 static void rail_NotifyIconCreate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notify_icon_state)
85 static void rail_NotifyIconUpdate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notify_icon_state)
90 static void rail_NotifyIconDelete(rdpContext* context, WINDOW_ORDER_INFO* orderInfo)
95 static void rail_MonitoredDesktop(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, MONITORED_DESKTOP_ORDER* monitored_desktop)
100 static void rail_NonMonitoredDesktop(rdpContext* context, WINDOW_ORDER_INFO* orderInfo)
105 void rail_register_update_callbacks(rdpRail* rail, rdpUpdate* update)
107 rdpWindowUpdate* window = update->window;
109 window->WindowCreate = rail_WindowCreate;
110 window->WindowUpdate = rail_WindowUpdate;
111 window->WindowDelete = rail_WindowDelete;
112 window->WindowIcon = rail_WindowIcon;
113 window->WindowCachedIcon = rail_WindowCachedIcon;
114 window->NotifyIconCreate = rail_NotifyIconCreate;
115 window->NotifyIconUpdate = rail_NotifyIconUpdate;
116 window->NotifyIconDelete = rail_NotifyIconDelete;
117 window->MonitoredDesktop = rail_MonitoredDesktop;
118 window->NonMonitoredDesktop = rail_NonMonitoredDesktop;
121 rdpRail* rail_new(rdpSettings* settings)
125 rail = (rdpRail*) xzalloc(sizeof(rdpRail));
129 rail->settings = settings;
130 rail->cache = icon_cache_new(rail);
131 rail->list = window_list_new(rail);
132 rail->uniconv = freerdp_uniconv_new();
133 rail->clrconv = (CLRCONV*) xzalloc(sizeof(CLRCONV));
139 void rail_free(rdpRail* rail)
143 icon_cache_free(rail->cache);
144 window_list_free(rail->list);
145 freerdp_uniconv_free(rail->uniconv);
146 xfree(rail->clrconv);