Compare commits
25 Commits
stack
...
wip/baseli
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
308aebff9d | ||
|
|
c8ac4b8fb3 | ||
|
|
c3669407dc | ||
|
|
90ab5e6a26 | ||
|
|
1c04da3152 | ||
|
|
e68a98e7b3 | ||
|
|
cecf3657f7 | ||
|
|
d1795a536b | ||
|
|
280a94506c | ||
|
|
4ad55c3488 | ||
|
|
edcf32323f | ||
|
|
115155ff52 | ||
|
|
b8f1f78e4a | ||
|
|
9ce05f75ff | ||
|
|
44fbf3eed1 | ||
|
|
a985b5a904 | ||
|
|
0f16dbed52 | ||
|
|
f690eae695 | ||
|
|
21a265f16e | ||
|
|
794d68f47a | ||
|
|
b2d80f9183 | ||
|
|
5cb27b3abf | ||
|
|
eda436a4be | ||
|
|
28b77076a8 | ||
|
|
f7361c6eb9 |
12
README.in
12
README.in
@@ -69,17 +69,7 @@ to that bug report.
|
||||
Otherwise, enter a new bug report that describes the patch,
|
||||
and attach the patch to that bug report.
|
||||
|
||||
Patches should be in unified diff form. (The -up option to GNU diff)
|
||||
Even better are git-formatted patches. (Use git format-patch)
|
||||
|
||||
|
||||
Release notes for 3.10
|
||||
======================
|
||||
|
||||
* GDK has been changed to allow only a single screen per display.
|
||||
Only the X11 backend had multiple screens before, and multi-screen
|
||||
setups (not multi-monitor!) are very rare nowadays. If you really
|
||||
need multiple X screens, open them as separate displays.
|
||||
Patches should be in unified diff form. (The -up option to GNU diff.)
|
||||
|
||||
Release notes for 3.8
|
||||
=====================
|
||||
|
||||
@@ -42,7 +42,7 @@ AC_CANONICAL_TARGET
|
||||
m4_define([gtk_binary_version], [3.0.0])
|
||||
|
||||
# required versions of other packages
|
||||
m4_define([glib_required_version], [2.37.0])
|
||||
m4_define([glib_required_version], [2.35.3])
|
||||
m4_define([pango_required_version], [1.32.4])
|
||||
m4_define([atk_required_version], [2.7.5])
|
||||
m4_define([cairo_required_version], [1.10.0])
|
||||
|
||||
@@ -43,7 +43,6 @@ demos = \
|
||||
search_entry.c \
|
||||
sizegroup.c \
|
||||
spinner.c \
|
||||
stack.c \
|
||||
stock_browser.c \
|
||||
textview.c \
|
||||
textscroll.c \
|
||||
@@ -111,7 +110,6 @@ RESOURCES= $(demos) \
|
||||
application.ui \
|
||||
demo.ui \
|
||||
menus.ui \
|
||||
stack.ui \
|
||||
theming.ui \
|
||||
alphatest.png \
|
||||
apple-red.png \
|
||||
|
||||
@@ -1,23 +1,24 @@
|
||||
/* Change Display
|
||||
*
|
||||
* Demonstrates migrating a window between different displays.
|
||||
* A display is a mouse and keyboard with some number of
|
||||
* associated monitors. The neat thing about having multiple
|
||||
* displays is that they can be on a completely separate
|
||||
* Demonstrates migrating a window between different displays and
|
||||
* screens. A display is a mouse and keyboard with some number of
|
||||
* associated monitors. A screen is a set of monitors grouped
|
||||
* into a single physical work area. The neat thing about having
|
||||
* multiple displays is that they can be on a completely separate
|
||||
* computers, as long as there is a network connection to the
|
||||
* computer where the application is running.
|
||||
*
|
||||
* Only some of the windowing systems where GTK+ runs have the
|
||||
* concept of multiple displays. (The X Window System is the
|
||||
* main example.) Other windowing systems can only handle one
|
||||
* keyboard and mouse, and combine all monitors into
|
||||
* a single display.
|
||||
* concept of multiple displays and screens. (The X Window System
|
||||
* is the main example.) Other windowing systems can only
|
||||
* handle one keyboard and mouse, and combine all monitors into
|
||||
* a single screen.
|
||||
*
|
||||
* This is a moderately complex example, and demonstrates:
|
||||
*
|
||||
* - Tracking the currently open displays
|
||||
* - Tracking the currently open displays and screens
|
||||
*
|
||||
* - Changing the display for a window
|
||||
* - Changing the screen for a window
|
||||
*
|
||||
* - Letting the user choose a window by clicking on it
|
||||
*
|
||||
@@ -44,8 +45,11 @@ struct _ChangeDisplayInfo
|
||||
GtkSizeGroup *size_group;
|
||||
|
||||
GtkTreeModel *display_model;
|
||||
GtkTreeModel *screen_model;
|
||||
GtkTreeSelection *screen_selection;
|
||||
|
||||
GdkDisplay *current_display;
|
||||
GdkScreen *current_screen;
|
||||
};
|
||||
|
||||
/* These enumerations provide symbolic names for the columns
|
||||
@@ -173,11 +177,40 @@ query_change_display (ChangeDisplayInfo *info)
|
||||
"to move to the new screen");
|
||||
|
||||
if (toplevel)
|
||||
gtk_window_set_screen (GTK_WINDOW (toplevel), gdk_display_get_screen (info->current_display, 0));
|
||||
gtk_window_set_screen (GTK_WINDOW (toplevel), info->current_screen);
|
||||
else
|
||||
gdk_display_beep (gdk_screen_get_display (screen));
|
||||
}
|
||||
|
||||
/* Fills in the screen list based on the current display
|
||||
*/
|
||||
static void
|
||||
fill_screens (ChangeDisplayInfo *info)
|
||||
{
|
||||
gtk_list_store_clear (GTK_LIST_STORE (info->screen_model));
|
||||
|
||||
if (info->current_display)
|
||||
{
|
||||
gint n_screens = gdk_display_get_n_screens (info->current_display);
|
||||
gint i;
|
||||
|
||||
for (i = 0; i < n_screens; i++)
|
||||
{
|
||||
GdkScreen *screen = gdk_display_get_screen (info->current_display, i);
|
||||
GtkTreeIter iter;
|
||||
|
||||
gtk_list_store_append (GTK_LIST_STORE (info->screen_model), &iter);
|
||||
gtk_list_store_set (GTK_LIST_STORE (info->screen_model), &iter,
|
||||
SCREEN_COLUMN_NUMBER, i,
|
||||
SCREEN_COLUMN_SCREEN, screen,
|
||||
-1);
|
||||
|
||||
if (i == 0)
|
||||
gtk_tree_selection_select_iter (info->screen_selection, &iter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Called when the user clicks on a button in our dialog or
|
||||
* closes the dialog through the window manager. Unless the
|
||||
* "Change" button was clicked, we destroy the dialog.
|
||||
@@ -287,6 +320,28 @@ display_changed_cb (GtkTreeSelection *selection,
|
||||
-1);
|
||||
else
|
||||
info->current_display = NULL;
|
||||
|
||||
fill_screens (info);
|
||||
}
|
||||
|
||||
/* Called when the selected row in the sceen list changes.
|
||||
* Updates info->current_screen.
|
||||
*/
|
||||
static void
|
||||
screen_changed_cb (GtkTreeSelection *selection,
|
||||
ChangeDisplayInfo *info)
|
||||
{
|
||||
GtkTreeModel *model;
|
||||
GtkTreeIter iter;
|
||||
|
||||
if (info->current_screen)
|
||||
g_object_unref (info->current_screen);
|
||||
if (gtk_tree_selection_get_selected (selection, &model, &iter))
|
||||
gtk_tree_model_get (model, &iter,
|
||||
SCREEN_COLUMN_SCREEN, &info->current_screen,
|
||||
-1);
|
||||
else
|
||||
info->current_screen = NULL;
|
||||
}
|
||||
|
||||
/* This function is used both for creating the "Display" and
|
||||
@@ -391,6 +446,37 @@ create_display_frame (ChangeDisplayInfo *info)
|
||||
return frame;
|
||||
}
|
||||
|
||||
/* Creates the "Screen" frame in the main window.
|
||||
*/
|
||||
GtkWidget *
|
||||
create_screen_frame (ChangeDisplayInfo *info)
|
||||
{
|
||||
GtkWidget *frame;
|
||||
GtkWidget *tree_view;
|
||||
GtkWidget *button_vbox;
|
||||
GtkTreeViewColumn *column;
|
||||
|
||||
create_frame (info, "Screen", &frame, &tree_view, &button_vbox);
|
||||
|
||||
info->screen_model = (GtkTreeModel *)gtk_list_store_new (SCREEN_NUM_COLUMNS,
|
||||
G_TYPE_INT,
|
||||
GDK_TYPE_SCREEN);
|
||||
|
||||
gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view), info->screen_model);
|
||||
|
||||
column = gtk_tree_view_column_new_with_attributes ("Number",
|
||||
gtk_cell_renderer_text_new (),
|
||||
"text", SCREEN_COLUMN_NUMBER,
|
||||
NULL);
|
||||
gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
|
||||
|
||||
info->screen_selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view));
|
||||
g_signal_connect (info->screen_selection, "changed",
|
||||
G_CALLBACK (screen_changed_cb), info);
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
/* Called when one of the currently open displays is closed.
|
||||
* Remove it from our list of displays.
|
||||
*/
|
||||
@@ -494,9 +580,12 @@ destroy_info (ChangeDisplayInfo *info)
|
||||
|
||||
g_object_unref (info->size_group);
|
||||
g_object_unref (info->display_model);
|
||||
g_object_unref (info->screen_model);
|
||||
|
||||
if (info->current_display)
|
||||
g_object_unref (info->current_display);
|
||||
if (info->current_screen)
|
||||
g_object_unref (info->current_screen);
|
||||
|
||||
g_free (info);
|
||||
}
|
||||
@@ -548,6 +637,9 @@ do_changedisplay (GtkWidget *do_widget)
|
||||
frame = create_display_frame (info);
|
||||
gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
|
||||
|
||||
frame = create_screen_frame (info);
|
||||
gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
|
||||
|
||||
initialize_displays (info);
|
||||
|
||||
gtk_widget_show_all (info->window);
|
||||
|
||||
@@ -55,9 +55,6 @@
|
||||
<file preprocess="to-pixdata">gnome-fs-directory.png</file>
|
||||
<file preprocess="to-pixdata">gnome-fs-regular.png</file>
|
||||
</gresource>
|
||||
<gresource prefix="/stack">
|
||||
<file>stack.ui</file>
|
||||
</gresource>
|
||||
<gresource prefix="/images">
|
||||
<file>alphatest.png</file>
|
||||
<file>floppybuddy.gif</file>
|
||||
@@ -113,7 +110,6 @@
|
||||
<file>rotated_text.c</file>
|
||||
<file>search_entry.c</file>
|
||||
<file>sizegroup.c</file>
|
||||
<file>stack.c</file>
|
||||
<file>spinner.c</file>
|
||||
<file>stock_browser.c</file>
|
||||
<file>textview.c</file>
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
/* Stack
|
||||
*
|
||||
* GtkStack is a container that shows a single child at a time,
|
||||
* with nice transitions when the visible child changes.
|
||||
*
|
||||
* GtkStackSwitcher adds buttons to control which child is visible.
|
||||
*/
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
static GtkBuilder *builder;
|
||||
|
||||
GtkWidget *
|
||||
do_stack (GtkWidget *do_widget)
|
||||
{
|
||||
static GtkWidget *window = NULL;
|
||||
GError *err = NULL;
|
||||
|
||||
if (!window)
|
||||
{
|
||||
builder = gtk_builder_new ();
|
||||
gtk_builder_add_from_resource (builder, "/stack/stack.ui", &err);
|
||||
if (err)
|
||||
{
|
||||
g_error ("ERROR: %s\n", err->message);
|
||||
return NULL;
|
||||
}
|
||||
gtk_builder_connect_signals (builder, NULL);
|
||||
window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
|
||||
gtk_window_set_screen (GTK_WINDOW (window),
|
||||
gtk_widget_get_screen (do_widget));
|
||||
g_signal_connect (window, "destroy",
|
||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
||||
}
|
||||
|
||||
if (!gtk_widget_get_visible (window))
|
||||
{
|
||||
gtk_widget_show_all (window);
|
||||
}
|
||||
else
|
||||
{
|
||||
gtk_widget_destroy (window);
|
||||
window = NULL;
|
||||
}
|
||||
|
||||
|
||||
return window;
|
||||
}
|
||||
@@ -1,82 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface>
|
||||
<!-- interface-requires gtk+ 3.6 -->
|
||||
<object class="GtkWindow" id="window1">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="title" translatable="yes">GtkStack</property>
|
||||
<child>
|
||||
<object class="GtkGrid" id="grid1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<child>
|
||||
<object class="GtkStackSwitcher" id="switcher">
|
||||
<property name="visible">True</property>
|
||||
<property name="stack">stack</property>
|
||||
<property name="halign">center</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">0</property>
|
||||
<property name="top_attach">0</property>
|
||||
<property name="width">1</property>
|
||||
<property name="height">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkStack" id="stack">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="transition-type">crossfade</property>
|
||||
<child>
|
||||
<object class="GtkImage" id="image1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="margin-top">20</property>
|
||||
<property name="margin-bottom">20</property>
|
||||
<property name="resource">/application/gtk-logo-48.png</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="name">page1</property>
|
||||
<property name="title" translatable="yes">Page 1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkCheckButton" id="checkbutton1">
|
||||
<property name="label" translatable="yes">Page 2</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
<property name="halign">center</property>
|
||||
<property name="valign">center</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="name">page2</property>
|
||||
<property name="title" translatable="yes">Page 2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSpinner" id="spinner1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="halign">center</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="active">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="name">page3</property>
|
||||
<property name="icon-name">face-laugh-symbolic</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">0</property>
|
||||
<property name="top_attach">1</property>
|
||||
<property name="width">1</property>
|
||||
<property name="height">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</interface>
|
||||
@@ -85,7 +85,7 @@ scroll_to_bottom (GtkTextView *textview)
|
||||
gtk_text_iter_set_line_offset (&iter, 0);
|
||||
|
||||
/* and place the mark at iter. the mark will stay there after we
|
||||
* insert some text at the end because it has left gravity.
|
||||
* insert some text at the end because it has right gravity.
|
||||
*/
|
||||
mark = gtk_text_buffer_get_mark (buffer, "scroll");
|
||||
gtk_text_buffer_move_mark (buffer, mark, &iter);
|
||||
|
||||
@@ -43,7 +43,6 @@
|
||||
<xi:include href="xml/pango_interaction.xml" />
|
||||
<xi:include href="xml/cairo_interaction.xml" />
|
||||
<xi:include href="xml/x_interaction.xml" />
|
||||
<xi:include href="xml/wayland_interaction.xml" />
|
||||
<xi:include href="xml/gdkapplaunchcontext.xml" />
|
||||
<xi:include href="xml/gdktestutils.xml" />
|
||||
</reference>
|
||||
|
||||
@@ -52,7 +52,6 @@ gdk_error_trap_pop_ignored
|
||||
GDK_WINDOWING_X11
|
||||
GDK_WINDOWING_WIN32
|
||||
GDK_WINDOWING_QUARTZ
|
||||
GDK_WINDOWING_WAYLAND
|
||||
|
||||
<SUBSECTION>
|
||||
GDK_VERSION_3_0
|
||||
@@ -1129,54 +1128,6 @@ gdk_x11_window_get_type
|
||||
gdk_window_impl_x11_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<INCLUDE>gdk/gdkwayland.h</INCLUDE>
|
||||
<TITLE>Wayland Interaction</TITLE>
|
||||
<FILE>wayland_interaction</FILE>
|
||||
gdk_wayland_device_get_wl_keyboard
|
||||
gdk_wayland_device_get_wl_pointer
|
||||
gdk_wayland_device_get_wl_seat
|
||||
gdk_wayland_display_get_wl_compositor
|
||||
gdk_wayland_display_get_wl_display
|
||||
gdk_wayland_display_get_wl_shell
|
||||
gdk_wayland_window_get_wl_shell_surface
|
||||
gdk_wayland_window_get_wl_surface
|
||||
gdk_wayland_window_set_use_custom_surface
|
||||
|
||||
<SUBSECTION Standard>
|
||||
GDK_TYPE_WAYLAND_DEVICE
|
||||
GDK_WAYLAND_DEVICE
|
||||
GDK_WAYLAND_DEVICE_CLASS
|
||||
GDK_WAYLAND_DEVICE_GET_CLASS
|
||||
GDK_IS_WAYLAND_DEVICE
|
||||
GDK_IS_WAYLAND_DEVICE_CLASS
|
||||
GDK_TYPE_WAYLAND_DISPLAY
|
||||
GDK_WAYLAND_DISPLAY
|
||||
GDK_WAYLAND_DISPLAY_CLASS
|
||||
GDK_WAYLAND_DISPLAY_GET_CLASS
|
||||
GDK_IS_WAYLAND_DISPLAY
|
||||
GDK_IS_WAYLAND_DISPLAY_CLASS
|
||||
GDK_TYPE_WAYLAND_DISPLAY_MANAGER
|
||||
GDK_WAYLAND_DISPLAY_MANAGER
|
||||
GDK_WAYLAND_DISPLAY_MANAGER_CLASS
|
||||
GDK_WAYLAND_DISPLAY_MANAGER_GET_CLASS
|
||||
GDK_IS_WAYLAND_DISPLAY_MANAGER
|
||||
GDK_IS_WAYLAND_DISPLAY_MANAGER_CLASS
|
||||
GDK_TYPE_WAYLAND_WINDOW
|
||||
GDK_WAYLAND_WINDOW
|
||||
GDK_WAYLAND_WINDOW_CLASS
|
||||
GDK_WAYLAND_WINDOW_GET_CLASS
|
||||
GDK_IS_WAYLAND_WINDOW
|
||||
GDK_IS_WAYLAND_WINDOW_CLASS
|
||||
|
||||
<SUBSECTION Private>
|
||||
gdk_wayland_device_get_type
|
||||
gdk_wayland_display_get_type
|
||||
gdk_wayland_display_manager_get_type
|
||||
gdk_wayland_window_get_type
|
||||
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<TITLE>Application launching</TITLE>
|
||||
<FILE>gdkapplaunchcontext</FILE>
|
||||
|
||||
@@ -54,15 +54,6 @@ Start your applications like this:
|
||||
BROADWAY_DISPLAY=:5 gtk3-demo
|
||||
</programlisting>
|
||||
|
||||
You can add password protection for your session by creating a file in
|
||||
<filename>$XDG_CONFIG_HOME/broadway.passwd</filename> or <filename>$HOME/.config/broadway.passwd</filename>
|
||||
with a crypt(3) style password hash.
|
||||
|
||||
A simple way to generate it is with openssl:
|
||||
<programlisting>
|
||||
openssl passwd -1 > ~/.config/broadway.passwd
|
||||
</programlisting>
|
||||
|
||||
</para>
|
||||
</refsect1>
|
||||
|
||||
|
||||
@@ -220,7 +220,6 @@
|
||||
<xi:include href="xml/gtkfontbutton.xml" />
|
||||
<xi:include href="xml/gtkfontchooserwidget.xml" />
|
||||
<xi:include href="xml/gtkfontchooserdialog.xml" />
|
||||
<xi:include href="xml/gtkplacessidebar.xml" />
|
||||
</chapter>
|
||||
|
||||
<chapter id="LayoutContainers">
|
||||
@@ -234,8 +233,6 @@
|
||||
<xi:include href="xml/gtkpaned.xml" />
|
||||
<xi:include href="xml/gtklayout.xml" />
|
||||
<xi:include href="xml/gtknotebook.xml" />
|
||||
<xi:include href="xml/gtkstack.xml" />
|
||||
<xi:include href="xml/gtkstackswitcher.xml" />
|
||||
<xi:include href="xml/gtkexpander.xml" />
|
||||
<xi:include href="xml/gtkoverlay.xml" />
|
||||
<xi:include href="xml/gtkheaderbar.xml" />
|
||||
|
||||
@@ -486,6 +486,8 @@ gtk_box_set_spacing
|
||||
gtk_box_reorder_child
|
||||
gtk_box_query_child_packing
|
||||
gtk_box_set_child_packing
|
||||
gtk_box_get_baseline_position
|
||||
gtk_box_set_baseline_position
|
||||
<SUBSECTION Standard>
|
||||
GTK_BOX
|
||||
GTK_IS_BOX
|
||||
@@ -539,9 +541,6 @@ gtk_builder_get_objects
|
||||
gtk_builder_expose_object
|
||||
gtk_builder_connect_signals
|
||||
gtk_builder_connect_signals_full
|
||||
gtk_builder_add_callback_symbol
|
||||
gtk_builder_add_callback_symbols
|
||||
gtk_builder_lookup_callback_symbol
|
||||
gtk_builder_set_translation_domain
|
||||
gtk_builder_get_translation_domain
|
||||
gtk_builder_get_type_from_name
|
||||
@@ -2483,32 +2482,6 @@ GTK_PANED_GET_CLASS
|
||||
gtk_paned_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtkplacessidebar</FILE>
|
||||
<TITLE>GtkPlacesSidebar</FILE>
|
||||
GtkPlacesSidebar
|
||||
GtkPlacesOpenFlags
|
||||
gtk_places_sidebar_new
|
||||
gtk_places_sidebar_set_open_flags
|
||||
gtk_places_sidebar_set_location
|
||||
gtk_places_sidebar_get_location
|
||||
gtk_places_sidebar_set_show_desktop
|
||||
gtk_places_sidebar_set_accept_uri_drops
|
||||
gtk_places_sidebar_add_shortcut
|
||||
gtk_places_sidebar_remove_shortcut
|
||||
gtk_places_sidebar_list_shortcuts
|
||||
gtk_places_sidebar_get_nth_bookmark
|
||||
<SUBSECTION Standard>
|
||||
GTK_PLACES_SIDEBAR
|
||||
GTK_IS_PLACES_SIDEBAR
|
||||
GTK_TYPE_PLACES_SIDEBAR
|
||||
GTK_PLACES_SIDEBAR_CLASS
|
||||
GTK_IS_PLACES_SIDEBAR_CLASS
|
||||
GTK_PLACES_SIDEBAR_GET_CLASS
|
||||
<SUBSECTION Private>
|
||||
gtk_places_sidebar_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtkplug</FILE>
|
||||
<TITLE>GtkPlug</TITLE>
|
||||
@@ -3605,11 +3578,11 @@ gtk_text_mark_get_type
|
||||
<TITLE>GtkTextTag</TITLE>
|
||||
GtkTextTag
|
||||
GtkWrapMode
|
||||
GtkTextAttributes
|
||||
gtk_text_tag_new
|
||||
gtk_text_tag_get_priority
|
||||
gtk_text_tag_set_priority
|
||||
gtk_text_tag_event
|
||||
GtkTextAttributes
|
||||
GtkTextAppearance
|
||||
gtk_text_attributes_new
|
||||
gtk_text_attributes_copy
|
||||
@@ -5188,6 +5161,7 @@ gtk_widget_remove_tick_callback
|
||||
gtk_widget_size_request
|
||||
gtk_widget_get_child_requisition
|
||||
gtk_widget_size_allocate
|
||||
gtk_widget_size_allocate_with_baseline
|
||||
gtk_widget_add_accelerator
|
||||
gtk_widget_remove_accelerator
|
||||
gtk_widget_set_accel_path
|
||||
@@ -5320,6 +5294,7 @@ gtk_widget_get_allocated_width
|
||||
gtk_widget_get_allocated_height
|
||||
gtk_widget_get_allocation
|
||||
gtk_widget_set_allocation
|
||||
gtk_widget_get_allocated_baseline
|
||||
gtk_widget_get_app_paintable
|
||||
gtk_widget_get_can_default
|
||||
gtk_widget_set_can_default
|
||||
@@ -5380,8 +5355,10 @@ gtk_widget_get_preferred_height
|
||||
gtk_widget_get_preferred_width
|
||||
gtk_widget_get_preferred_height_for_width
|
||||
gtk_widget_get_preferred_width_for_height
|
||||
gtk_widget_get_preferred_height_and_baseline_for_width
|
||||
gtk_widget_get_request_mode
|
||||
gtk_widget_get_preferred_size
|
||||
gtk_widget_get_preferred_size_and_baseline
|
||||
gtk_distribute_natural_allocation
|
||||
|
||||
<SUBSECTION Alignment and Margins>
|
||||
@@ -5389,6 +5366,7 @@ GtkAlign
|
||||
gtk_widget_get_halign
|
||||
gtk_widget_set_halign
|
||||
gtk_widget_get_valign
|
||||
gtk_widget_get_valign_with_baseline
|
||||
gtk_widget_set_valign
|
||||
gtk_widget_get_margin_left
|
||||
gtk_widget_set_margin_left
|
||||
@@ -5411,18 +5389,6 @@ gtk_widget_set_vexpand_set
|
||||
gtk_widget_queue_compute_expand
|
||||
gtk_widget_compute_expand
|
||||
|
||||
<SUBSECTION Templates>
|
||||
gtk_widget_init_template
|
||||
gtk_widget_class_set_template
|
||||
gtk_widget_class_set_template_from_resource
|
||||
gtk_widget_get_automated_child
|
||||
gtk_widget_class_bind_child
|
||||
gtk_widget_class_bind_child_internal
|
||||
gtk_widget_class_automate_child
|
||||
gtk_widget_class_bind_callback
|
||||
gtk_widget_class_declare_callback
|
||||
gtk_widget_class_set_connect_func
|
||||
|
||||
<SUBSECTION Standard>
|
||||
GTK_WIDGET
|
||||
GTK_IS_WIDGET
|
||||
@@ -7290,6 +7256,10 @@ gtk_grid_set_column_homogeneous
|
||||
gtk_grid_get_column_homogeneous
|
||||
gtk_grid_set_column_spacing
|
||||
gtk_grid_get_column_spacing
|
||||
gtk_grid_get_baseline_row
|
||||
gtk_grid_set_baseline_row
|
||||
gtk_grid_get_row_baseline_position
|
||||
gtk_grid_set_row_baseline_position
|
||||
|
||||
<SUBSECTION Standard>
|
||||
GtkGridClass
|
||||
@@ -7564,33 +7534,3 @@ GTK_HEADER_BAR_GET_CLASS
|
||||
<SUBSECTION Private>
|
||||
gtk_header_bar_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtkstack</FILE>
|
||||
<TITLE>GtkStack</TITLE>
|
||||
GtkStack
|
||||
gtk_stack_new
|
||||
gtk_stack_add_named
|
||||
gtk_stack_add_titled
|
||||
gtk_stack_set_visible_child
|
||||
gtk_stack_get_visible_child
|
||||
gtk_stack_set_visible_child_name
|
||||
gtk_stack_get_visible_child_name
|
||||
gtk_stack_set_visible_child_full
|
||||
gtk_stack_set_homogeneous
|
||||
gtk_stack_get_homogeneous
|
||||
gtk_stack_set_transition_duration
|
||||
gtk_stack_get_transition_duration
|
||||
GtkStackTransitionType
|
||||
gtk_stack_set_transition_type
|
||||
gtk_stack_get_transition_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtkstackswitcher</FILE>
|
||||
<TITLE>GtkStackSwitcher</TITLE>
|
||||
GtkStackSwitcher
|
||||
gtk_stack_switcher_new
|
||||
gtk_stack_switcher_set_stack
|
||||
gtk_stack_switcher_get_stack
|
||||
</SECTION>
|
||||
|
||||
@@ -153,7 +153,7 @@ You can change the default attributes for a given #GtkTextView, and you can
|
||||
apply tags that change the attributes for a region of text. For text features
|
||||
that come from the theme — such as font and foreground color — use
|
||||
standard #GtkWidget functions such as gtk_widget_modify_font() or
|
||||
gtk_widget_override_color(). For other attributes there are dedicated methods on
|
||||
gtk_widget_override_text(). For other attributes there are dedicated methods on
|
||||
#GtkTextView such as gtk_text_view_set_tabs().
|
||||
|
||||
<informalexample><programlisting>
|
||||
|
||||
@@ -34,29 +34,6 @@ change_fullscreen_state (GSimpleAction *action,
|
||||
g_simple_action_set_state (action, state);
|
||||
}
|
||||
|
||||
static void
|
||||
change_busy_state (GSimpleAction *action,
|
||||
GVariant *state,
|
||||
gpointer user_data)
|
||||
{
|
||||
GtkWindow *window = user_data;
|
||||
GApplication *application = G_APPLICATION (gtk_window_get_application (window));
|
||||
|
||||
/* do this twice to test multiple busy counter increases */
|
||||
if (g_variant_get_boolean (state))
|
||||
{
|
||||
g_application_mark_busy (application);
|
||||
g_application_mark_busy (application);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_application_unmark_busy (application);
|
||||
g_application_unmark_busy (application);
|
||||
}
|
||||
|
||||
g_simple_action_set_state (action, state);
|
||||
}
|
||||
|
||||
static void
|
||||
change_justify_state (GSimpleAction *action,
|
||||
GVariant *state,
|
||||
@@ -117,7 +94,6 @@ static GActionEntry win_entries[] = {
|
||||
{ "copy", window_copy, NULL, NULL, NULL },
|
||||
{ "paste", window_paste, NULL, NULL, NULL },
|
||||
{ "fullscreen", activate_toggle, NULL, "false", change_fullscreen_state },
|
||||
{ "busy", activate_toggle, NULL, "false", change_busy_state },
|
||||
{ "justify", activate_radio, "s", "'left'", change_justify_state }
|
||||
};
|
||||
|
||||
@@ -380,10 +356,6 @@ bloat_pad_startup (GApplication *application)
|
||||
" <attribute name='action'>win.fullscreen</attribute>"
|
||||
" <attribute name='accel'>F11</attribute>"
|
||||
" </item>"
|
||||
" <item>"
|
||||
" <attribute name='label' translatable='yes'>_Look Busy</attribute>"
|
||||
" <attribute name='action'>win.busy</attribute>"
|
||||
" </item>"
|
||||
" </section>"
|
||||
" </submenu>"
|
||||
" <submenu id='time-menu'>"
|
||||
|
||||
@@ -134,7 +134,6 @@ gdk_c_sources = \
|
||||
gdkframeclockidle.c \
|
||||
gdkpango.c \
|
||||
gdkpixbuf-drawable.c \
|
||||
gdkproperty.c \
|
||||
gdkrectangle.c \
|
||||
gdkrgba.c \
|
||||
gdkscreen.c \
|
||||
|
||||
@@ -60,7 +60,9 @@ libgdk_broadway_la_SOURCES = \
|
||||
gdkeventsource.c \
|
||||
gdkeventsource.h \
|
||||
gdkglobals-broadway.c \
|
||||
gdkim-broadway.c \
|
||||
gdkkeys-broadway.c \
|
||||
gdkmain-broadway.c \
|
||||
gdkproperty-broadway.c \
|
||||
gdkscreen-broadway.c \
|
||||
gdkscreen-broadway.h \
|
||||
@@ -81,7 +83,7 @@ broadwayd_SOURCES = \
|
||||
broadway-output.h \
|
||||
broadway-output.c
|
||||
|
||||
broadwayd_LDADD = $(GDK_DEP_LIBS) -lrt -lcrypt
|
||||
broadwayd_LDADD = $(GDK_DEP_LIBS) -lrt
|
||||
|
||||
MAINTAINERCLEANFILES = $(broadway_built_sources)
|
||||
EXTRA_DIST += $(broadway_built_sources)
|
||||
|
||||
@@ -317,13 +317,6 @@ broadway_output_get_next_serial (BroadwayOutput *output)
|
||||
return output->serial;
|
||||
}
|
||||
|
||||
void
|
||||
broadway_output_set_next_serial (BroadwayOutput *output,
|
||||
guint32 serial)
|
||||
{
|
||||
output->serial = serial;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Core rendering operations *
|
||||
@@ -478,24 +471,6 @@ broadway_output_new_surface(BroadwayOutput *output,
|
||||
append_bool (output, is_temp);
|
||||
}
|
||||
|
||||
void
|
||||
broadway_output_request_auth (BroadwayOutput *output)
|
||||
{
|
||||
write_header (output, BROADWAY_OP_REQUEST_AUTH);
|
||||
}
|
||||
|
||||
void
|
||||
broadway_output_auth_ok (BroadwayOutput *output)
|
||||
{
|
||||
write_header (output, BROADWAY_OP_AUTH_OK);
|
||||
}
|
||||
|
||||
void
|
||||
broadway_output_disconnected (BroadwayOutput *output)
|
||||
{
|
||||
write_header (output, BROADWAY_OP_DISCONNECTED);
|
||||
}
|
||||
|
||||
void
|
||||
broadway_output_show_surface(BroadwayOutput *output, int id)
|
||||
{
|
||||
|
||||
@@ -23,8 +23,6 @@ BroadwayOutput *broadway_output_new (GOutputStream *out,
|
||||
void broadway_output_free (BroadwayOutput *output);
|
||||
int broadway_output_flush (BroadwayOutput *output);
|
||||
int broadway_output_has_error (BroadwayOutput *output);
|
||||
void broadway_output_set_next_serial (BroadwayOutput *output,
|
||||
guint32 serial);
|
||||
guint32 broadway_output_get_next_serial (BroadwayOutput *output);
|
||||
void broadway_output_new_surface (BroadwayOutput *output,
|
||||
int id,
|
||||
@@ -33,9 +31,6 @@ void broadway_output_new_surface (BroadwayOutput *output,
|
||||
int w,
|
||||
int h,
|
||||
gboolean is_temp);
|
||||
void broadway_output_request_auth (BroadwayOutput *output);
|
||||
void broadway_output_auth_ok (BroadwayOutput *output);
|
||||
void broadway_output_disconnected (BroadwayOutput *output);
|
||||
void broadway_output_show_surface (BroadwayOutput *output,
|
||||
int id);
|
||||
void broadway_output_hide_surface (BroadwayOutput *output,
|
||||
|
||||
@@ -36,9 +36,6 @@ typedef enum {
|
||||
BROADWAY_OP_SET_TRANSIENT_FOR = 'p',
|
||||
BROADWAY_OP_PUT_RGB = 'i',
|
||||
BROADWAY_OP_FLUSH = 'f',
|
||||
BROADWAY_OP_REQUEST_AUTH = 'l',
|
||||
BROADWAY_OP_AUTH_OK = 'L',
|
||||
BROADWAY_OP_DISCONNECTED = 'D',
|
||||
} BroadwayOpType;
|
||||
|
||||
typedef struct {
|
||||
|
||||
@@ -2,8 +2,6 @@
|
||||
|
||||
#include "broadway-output.h"
|
||||
|
||||
#define _XOPEN_SOURCE /* for crypt */
|
||||
|
||||
#include <glib.h>
|
||||
#include <glib/gprintf.h>
|
||||
#include "gdktypes.h"
|
||||
@@ -11,10 +9,6 @@
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <crypt.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
@@ -25,7 +19,6 @@ typedef struct BroadwayWindow BroadwayWindow;
|
||||
struct _BroadwayServer {
|
||||
GObject parent_instance;
|
||||
|
||||
char *password;
|
||||
char *address;
|
||||
int port;
|
||||
GSocketService *service;
|
||||
@@ -76,7 +69,6 @@ typedef struct HttpRequest {
|
||||
|
||||
struct BroadwayInput {
|
||||
BroadwayServer *server;
|
||||
BroadwayOutput *output;
|
||||
GSocketConnection *connection;
|
||||
GByteArray *buffer;
|
||||
GSource *source;
|
||||
@@ -84,7 +76,6 @@ struct BroadwayInput {
|
||||
gint64 time_base;
|
||||
gboolean proto_v7_plus;
|
||||
gboolean binary;
|
||||
gboolean active;
|
||||
};
|
||||
|
||||
struct BroadwayWindow {
|
||||
@@ -99,9 +90,6 @@ struct BroadwayWindow {
|
||||
gint32 transient_for;
|
||||
|
||||
cairo_surface_t *last_surface;
|
||||
|
||||
char *cached_surface_name;
|
||||
cairo_surface_t *cached_surface;
|
||||
};
|
||||
|
||||
static void broadway_server_resync_windows (BroadwayServer *server);
|
||||
@@ -112,8 +100,6 @@ static void
|
||||
broadway_server_init (BroadwayServer *server)
|
||||
{
|
||||
BroadwayWindow *root;
|
||||
char *passwd_file;
|
||||
char *password, *p;
|
||||
|
||||
server->service = g_socket_service_new ();
|
||||
server->pointer_grab_window_id = -1;
|
||||
@@ -122,22 +108,6 @@ broadway_server_init (BroadwayServer *server)
|
||||
server->id_ht = g_hash_table_new (NULL, NULL);
|
||||
server->id_counter = 0;
|
||||
|
||||
passwd_file = g_build_filename (g_get_user_config_dir (),
|
||||
"broadway.passwd", NULL);
|
||||
|
||||
if (g_file_get_contents (passwd_file,
|
||||
&password, NULL, NULL))
|
||||
{
|
||||
p = strchr (password, '\n');
|
||||
if (p)
|
||||
*p = 0;
|
||||
g_strstrip (password);
|
||||
if (strlen (password) > 3)
|
||||
server->password = password;
|
||||
else
|
||||
g_free (password);
|
||||
}
|
||||
|
||||
root = g_new0 (BroadwayWindow, 1);
|
||||
root->id = server->id_counter++;
|
||||
root->width = 1024;
|
||||
@@ -169,7 +139,7 @@ broadway_server_class_init (BroadwayServerClass * class)
|
||||
object_class->finalize = broadway_server_finalize;
|
||||
}
|
||||
|
||||
static void start (BroadwayInput *input);
|
||||
static void start_output (HttpRequest *request, gboolean proto_v7_plus, gboolean binary);
|
||||
|
||||
static void
|
||||
http_request_free (HttpRequest *request)
|
||||
@@ -379,14 +349,6 @@ update_future_pointer_info (BroadwayServer *server, BroadwayInputPointerMsg *dat
|
||||
server->future_mouse_in_toplevel = data->mouse_window_id;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
verify_password (BroadwayServer *server, const char *password)
|
||||
{
|
||||
char *hash;
|
||||
hash = crypt (password, server->password);
|
||||
return strcmp (hash, server->password) == 0;
|
||||
}
|
||||
|
||||
static void
|
||||
parse_input_message (BroadwayInput *input, const char *message)
|
||||
{
|
||||
@@ -395,22 +357,6 @@ parse_input_message (BroadwayInput *input, const char *message)
|
||||
char *p;
|
||||
gint64 time_;
|
||||
|
||||
if (!input->active)
|
||||
{
|
||||
/* The input has not been activated yet, handle auth/start */
|
||||
|
||||
if (message[0] != 'l' ||
|
||||
!verify_password (server, message+1))
|
||||
{
|
||||
broadway_output_request_auth (input->output);
|
||||
broadway_output_flush (input->output);
|
||||
}
|
||||
else
|
||||
start (input);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
memset (&msg, 0, sizeof (msg));
|
||||
|
||||
p = (char *)message;
|
||||
@@ -624,7 +570,7 @@ parse_input (BroadwayInput *input)
|
||||
}
|
||||
break;
|
||||
case BROADWAY_WS_CNX_PING:
|
||||
broadway_output_pong (input->output);
|
||||
broadway_output_pong (server->output);
|
||||
break;
|
||||
case BROADWAY_WS_CNX_PONG:
|
||||
break; /* we never send pings, but tolerate pongs */
|
||||
@@ -650,8 +596,7 @@ parse_input (BroadwayInput *input)
|
||||
|
||||
if (buf[0] != 0)
|
||||
{
|
||||
if (server->input == input)
|
||||
server->input = NULL;
|
||||
server->input = NULL;
|
||||
broadway_input_free (input);
|
||||
return;
|
||||
}
|
||||
@@ -668,8 +613,7 @@ parse_input (BroadwayInput *input)
|
||||
|
||||
if (len > 0 && buf[0] != 0)
|
||||
{
|
||||
if (server->input == input)
|
||||
server->input = NULL;
|
||||
server->input = NULL;
|
||||
broadway_input_free (input);
|
||||
break;
|
||||
}
|
||||
@@ -696,16 +640,19 @@ queue_process_input_at_idle (BroadwayServer *server)
|
||||
}
|
||||
|
||||
static void
|
||||
broadway_server_read_all_input_nonblocking (BroadwayInput *input)
|
||||
broadway_server_read_all_input_nonblocking (BroadwayServer *server)
|
||||
{
|
||||
GInputStream *in;
|
||||
gssize res;
|
||||
guint8 buffer[1024];
|
||||
GError *error;
|
||||
BroadwayInput *input;
|
||||
|
||||
if (input == NULL)
|
||||
if (server->input == NULL)
|
||||
return;
|
||||
|
||||
input = server->input;
|
||||
|
||||
in = g_io_stream_get_input_stream (G_IO_STREAM (input->connection));
|
||||
|
||||
error = NULL;
|
||||
@@ -721,8 +668,7 @@ broadway_server_read_all_input_nonblocking (BroadwayInput *input)
|
||||
return;
|
||||
}
|
||||
|
||||
if (input->server->input == input)
|
||||
input->server->input = NULL;
|
||||
server->input = NULL;
|
||||
broadway_input_free (input);
|
||||
if (res < 0)
|
||||
{
|
||||
@@ -740,7 +686,7 @@ broadway_server_read_all_input_nonblocking (BroadwayInput *input)
|
||||
static void
|
||||
broadway_server_consume_all_input (BroadwayServer *server)
|
||||
{
|
||||
broadway_server_read_all_input_nonblocking (server->input);
|
||||
broadway_server_read_all_input_nonblocking (server);
|
||||
|
||||
/* Since we're parsing input but not processing the resulting messages
|
||||
we might not get a readable callback on the stream, so queue an idle to
|
||||
@@ -755,10 +701,9 @@ input_data_cb (GObject *stream,
|
||||
{
|
||||
BroadwayServer *server = input->server;
|
||||
|
||||
broadway_server_read_all_input_nonblocking (input);
|
||||
broadway_server_read_all_input_nonblocking (server);
|
||||
|
||||
if (input->active)
|
||||
process_input_messages (server);
|
||||
process_input_messages (server);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -933,14 +878,15 @@ start_input (HttpRequest *request, gboolean binary)
|
||||
gsize len;
|
||||
GChecksum *checksum;
|
||||
char *origin, *host;
|
||||
BroadwayServer *server;
|
||||
BroadwayInput *input;
|
||||
const void *data_buffer;
|
||||
gsize data_buffer_size;
|
||||
GInputStream *in;
|
||||
char *key_v7;
|
||||
gboolean proto_v7_plus;
|
||||
GSocket *socket;
|
||||
int flag = 1;
|
||||
|
||||
server = request->server;
|
||||
|
||||
#ifdef DEBUG_WEBSOCKETS
|
||||
g_print ("incoming request:\n%s\n", request->request->str);
|
||||
@@ -1087,11 +1033,15 @@ start_input (HttpRequest *request, gboolean binary)
|
||||
proto_v7_plus = FALSE;
|
||||
}
|
||||
|
||||
socket = g_socket_connection_get_socket (request->connection);
|
||||
setsockopt (g_socket_get_fd (socket), IPPROTO_TCP,
|
||||
TCP_NODELAY, (char *) &flag, sizeof(int));
|
||||
|
||||
if (server->input != NULL)
|
||||
{
|
||||
broadway_input_free (server->input);
|
||||
server->input = NULL;
|
||||
}
|
||||
|
||||
input = g_new0 (BroadwayInput, 1);
|
||||
|
||||
input->server = request->server;
|
||||
input->connection = g_object_ref (request->connection);
|
||||
input->proto_v7_plus = proto_v7_plus;
|
||||
@@ -1101,9 +1051,9 @@ start_input (HttpRequest *request, gboolean binary)
|
||||
input->buffer = g_byte_array_sized_new (data_buffer_size);
|
||||
g_byte_array_append (input->buffer, data_buffer, data_buffer_size);
|
||||
|
||||
input->output =
|
||||
broadway_output_new (g_io_stream_get_output_stream (G_IO_STREAM (request->connection)),
|
||||
0, proto_v7_plus, binary);
|
||||
server->input = input;
|
||||
|
||||
start_output (request, proto_v7_plus, binary);
|
||||
|
||||
/* This will free and close the data input stream, but we got all the buffered content already */
|
||||
http_request_free (request);
|
||||
@@ -1113,53 +1063,35 @@ start_input (HttpRequest *request, gboolean binary)
|
||||
g_source_set_callback (input->source, (GSourceFunc)input_data_cb, input, NULL);
|
||||
g_source_attach (input->source, NULL);
|
||||
|
||||
if (input->server->password)
|
||||
{
|
||||
broadway_output_request_auth (input->output);
|
||||
broadway_output_flush (input->output);
|
||||
}
|
||||
else
|
||||
start (input);
|
||||
|
||||
/* Process any data in the pipe already */
|
||||
parse_input (input);
|
||||
process_input_messages (server);
|
||||
|
||||
g_strfreev (lines);
|
||||
}
|
||||
|
||||
static void
|
||||
start (BroadwayInput *input)
|
||||
start_output (HttpRequest *request, gboolean proto_v7_plus, gboolean binary)
|
||||
{
|
||||
GSocket *socket;
|
||||
BroadwayServer *server;
|
||||
int flag = 1;
|
||||
|
||||
input->active = TRUE;
|
||||
socket = g_socket_connection_get_socket (request->connection);
|
||||
setsockopt(g_socket_get_fd (socket), IPPROTO_TCP,
|
||||
TCP_NODELAY, (char *) &flag, sizeof(int));
|
||||
|
||||
server = BROADWAY_SERVER (input->server);
|
||||
|
||||
if (server->output)
|
||||
{
|
||||
broadway_output_disconnected (server->output);
|
||||
broadway_output_flush (server->output);
|
||||
}
|
||||
|
||||
if (server->input != NULL)
|
||||
{
|
||||
broadway_input_free (server->input);
|
||||
server->input = NULL;
|
||||
}
|
||||
|
||||
server->input = input;
|
||||
server = BROADWAY_SERVER (request->server);
|
||||
|
||||
if (server->output)
|
||||
{
|
||||
server->saved_serial = broadway_output_get_next_serial (server->output);
|
||||
broadway_output_free (server->output);
|
||||
}
|
||||
server->output = input->output;
|
||||
|
||||
broadway_output_set_next_serial (server->output, server->saved_serial);
|
||||
broadway_output_auth_ok (server->output);
|
||||
broadway_output_flush (server->output);
|
||||
server->output =
|
||||
broadway_output_new (g_io_stream_get_output_stream (G_IO_STREAM (request->connection)),
|
||||
server->saved_serial, proto_v7_plus, binary);
|
||||
|
||||
broadway_server_resync_windows (server);
|
||||
|
||||
@@ -1167,8 +1099,6 @@ start (BroadwayInput *input)
|
||||
broadway_output_grab_pointer (server->output,
|
||||
server->pointer_grab_window_id,
|
||||
server->pointer_grab_owner_events);
|
||||
|
||||
process_input_messages (server);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1419,12 +1349,6 @@ broadway_server_destroy_window (BroadwayServer *server,
|
||||
server->toplevels = g_list_remove (server->toplevels, window);
|
||||
g_hash_table_remove (server->id_ht,
|
||||
GINT_TO_POINTER (id));
|
||||
|
||||
if (window->cached_surface_name != NULL)
|
||||
g_free (window->cached_surface_name);
|
||||
if (window->cached_surface != NULL)
|
||||
cairo_surface_destroy (window->cached_surface);
|
||||
|
||||
g_free (window);
|
||||
}
|
||||
}
|
||||
@@ -1659,11 +1583,6 @@ broadway_server_window_update (BroadwayServer *server,
|
||||
window->width,
|
||||
window->height);
|
||||
|
||||
g_assert (window->width == cairo_image_surface_get_width (window->last_surface));
|
||||
g_assert (window->width == cairo_image_surface_get_width (surface));
|
||||
g_assert (window->height == cairo_image_surface_get_height (window->last_surface));
|
||||
g_assert (window->height == cairo_image_surface_get_height (surface));
|
||||
|
||||
if (server->output != NULL)
|
||||
{
|
||||
if (window->last_synced)
|
||||
@@ -1820,86 +1739,6 @@ broadway_server_ungrab_pointer (BroadwayServer *server,
|
||||
return serial;
|
||||
}
|
||||
|
||||
static const cairo_user_data_key_t shm_cairo_key;
|
||||
|
||||
typedef struct {
|
||||
void *data;
|
||||
gsize data_size;
|
||||
} ShmSurfaceData;
|
||||
|
||||
static void
|
||||
shm_data_unmap (void *_data)
|
||||
{
|
||||
ShmSurfaceData *data = _data;
|
||||
munmap (data->data, data->data_size);
|
||||
g_free (data);
|
||||
}
|
||||
|
||||
cairo_surface_t *
|
||||
broadway_server_open_surface (BroadwayServer *server,
|
||||
guint32 id,
|
||||
char *name,
|
||||
int width,
|
||||
int height)
|
||||
{
|
||||
BroadwayWindow *window;
|
||||
ShmSurfaceData *data;
|
||||
cairo_surface_t *surface;
|
||||
gsize size;
|
||||
void *ptr;
|
||||
int fd;
|
||||
|
||||
window = g_hash_table_lookup (server->id_ht,
|
||||
GINT_TO_POINTER (id));
|
||||
if (window == NULL)
|
||||
return NULL;
|
||||
|
||||
if (window->cached_surface_name != NULL &&
|
||||
strcmp (name, window->cached_surface_name) == 0)
|
||||
return cairo_surface_reference (window->cached_surface);
|
||||
|
||||
size = width * height * sizeof (guint32);
|
||||
|
||||
fd = shm_open(name, O_RDONLY, 0600);
|
||||
if (fd == -1)
|
||||
{
|
||||
perror ("Failed to shm_open");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ptr = mmap(0, size, PROT_READ, MAP_SHARED, fd, 0);
|
||||
(void) close(fd);
|
||||
|
||||
shm_unlink (name);
|
||||
|
||||
if (ptr == NULL)
|
||||
return NULL;
|
||||
|
||||
data = g_new0 (ShmSurfaceData, 1);
|
||||
|
||||
data->data = ptr;
|
||||
data->data_size = size;
|
||||
|
||||
surface = cairo_image_surface_create_for_data ((guchar *)data->data,
|
||||
CAIRO_FORMAT_RGB24,
|
||||
width, height,
|
||||
width * sizeof (guint32));
|
||||
g_assert (surface != NULL);
|
||||
|
||||
cairo_surface_set_user_data (surface, &shm_cairo_key,
|
||||
data, shm_data_unmap);
|
||||
|
||||
if (window->cached_surface_name != NULL)
|
||||
g_free (window->cached_surface_name);
|
||||
window->cached_surface_name = g_strdup (name);
|
||||
|
||||
if (window->cached_surface != NULL)
|
||||
cairo_surface_destroy (window->cached_surface);
|
||||
window->cached_surface = cairo_surface_reference (surface);
|
||||
|
||||
return surface;
|
||||
}
|
||||
|
||||
guint32
|
||||
broadway_server_new_window (BroadwayServer *server,
|
||||
int x,
|
||||
|
||||
@@ -78,10 +78,5 @@ gboolean broadway_server_window_move_resize (BroadwayServer *
|
||||
int y,
|
||||
int width,
|
||||
int height);
|
||||
cairo_surface_t * broadway_server_open_surface (BroadwayServer *server,
|
||||
guint32 id,
|
||||
char *name,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
#endif /* __BROADWAY_SERVER__ */
|
||||
|
||||
@@ -225,16 +225,34 @@ function flushSurface(surface)
|
||||
context.save();
|
||||
context.beginPath();
|
||||
|
||||
var minx;
|
||||
var miny;
|
||||
var maxx;
|
||||
var maxy;
|
||||
for (var j = 0; j < cmd.rects.length; j++) {
|
||||
var rect = cmd.rects[j];
|
||||
context.rect(rect.x, rect.y, rect.w, rect.h);
|
||||
if (j == 0) {
|
||||
minx = rect.x;
|
||||
miny = rect.y;
|
||||
maxx = rect.x + rect.w;
|
||||
maxy = rect.y + rect.h;
|
||||
} else {
|
||||
if (rect.x < minx)
|
||||
minx = rect.x;
|
||||
if (rect.y < miny)
|
||||
miny = rect.y;
|
||||
if (rect.x + rect.w > maxx)
|
||||
maxx = rect.x + rect.w;
|
||||
if (rect.y + rect.h > maxy)
|
||||
maxy = rect.y + rect.h;
|
||||
}
|
||||
}
|
||||
context.clip();
|
||||
// This seems to break chrome when src overlaps dest
|
||||
// But source-over should be fine for rgb surfaces anyway
|
||||
//context.globalCompositeOperation = "copy";
|
||||
context.drawImage(surface.canvas,
|
||||
cmd.dx, cmd.dy);
|
||||
context.globalCompositeOperation = "copy";
|
||||
context.drawImage(context.canvas,
|
||||
minx - cmd.dx, miny - cmd.dy, maxx - minx, maxy - miny,
|
||||
minx, miny, maxx - minx, maxy - miny);
|
||||
context.restore();
|
||||
break;
|
||||
|
||||
@@ -478,6 +496,12 @@ function cmdMoveResizeSurface(id, has_pos, x, y, has_size, w, h)
|
||||
var xOffset = surface.x;
|
||||
var yOffset = surface.y;
|
||||
|
||||
var transientToplevel = getTransientToplevel(surface);
|
||||
if (transientToplevel) {
|
||||
xOffset = surface.x - transientToplevel.x;
|
||||
yOffset = surface.y - transientToplevel.y;
|
||||
}
|
||||
|
||||
var element = surface.canvas;
|
||||
if (surface.frame) {
|
||||
element = surface.frame;
|
||||
@@ -519,21 +543,6 @@ function handleCommands(cmd)
|
||||
var command = cmd.get_char();
|
||||
lastSerial = cmd.get_32();
|
||||
switch (command) {
|
||||
case 'l':
|
||||
login ();
|
||||
break;
|
||||
|
||||
case 'L':
|
||||
if (loginDiv != null)
|
||||
loginDiv.parentNode.removeChild(loginDiv);
|
||||
start ();
|
||||
break;
|
||||
|
||||
case 'D':
|
||||
alert ("disconnected");
|
||||
inputSocket = null;
|
||||
break;
|
||||
|
||||
case 's': // create new surface
|
||||
id = cmd.get_16();
|
||||
x = cmd.get_16s();
|
||||
@@ -733,12 +742,8 @@ BinCommands.prototype.get_32 = function() {
|
||||
};
|
||||
BinCommands.prototype.get_image_url = function() {
|
||||
var size = this.get_32();
|
||||
var png_blob = new Blob ([new Uint8Array (this.arraybuffer, this.pos, size)], {type:"image/png"});
|
||||
var url;
|
||||
if (window.webkitURL)
|
||||
url = window.webkitURL.createObjectURL(png_blob);
|
||||
else
|
||||
url = window.URL.createObjectURL(png_blob, {oneTimeOnly: true});
|
||||
var png_blob = new Blob ([this.arraybuffer.slice (this.pos, this.pos + size)], {type:"image/png"});
|
||||
var url = URL.createObjectURL(png_blob, {oneTimeOnly: true});
|
||||
this.pos = this.pos + size;
|
||||
return url;
|
||||
};
|
||||
@@ -2585,7 +2590,7 @@ function onMouseWheel(ev)
|
||||
var id = getSurfaceId(ev);
|
||||
var pos = getPositionsFromEvent(ev, id);
|
||||
|
||||
var offset = ev.detail ? ev.detail : -ev.wheelDelta;
|
||||
var offset = ev.detail ? ev.detail : ev.wheelDelta;
|
||||
var dir = 0;
|
||||
if (offset > 0)
|
||||
dir = 1;
|
||||
@@ -2626,47 +2631,6 @@ function newWS(loc) {
|
||||
return ws;
|
||||
}
|
||||
|
||||
function start()
|
||||
{
|
||||
setupDocument(document);
|
||||
|
||||
var w, h;
|
||||
w = window.innerWidth;
|
||||
h = window.innerHeight;
|
||||
window.onresize = function(ev) {
|
||||
var w, h;
|
||||
w = window.innerWidth;
|
||||
h = window.innerHeight;
|
||||
sendInput ("d", [w, h]);
|
||||
};
|
||||
sendInput ("d", [w, h]);
|
||||
}
|
||||
|
||||
var loginDiv = null;
|
||||
function login()
|
||||
{
|
||||
if (loginDiv == null) {
|
||||
var div = document.createElement('div');
|
||||
document.body.appendChild(div);
|
||||
div.innerHTML = "Please enter password<br>";
|
||||
div.style.marginTop = "40px";
|
||||
div.style.textAlign = "center";
|
||||
|
||||
var input = document.createElement("input");
|
||||
input.setAttribute("type", "password");
|
||||
div.appendChild(input);
|
||||
input.focus ();
|
||||
input.onkeyup = function(e) {
|
||||
if (e.keyCode === 13 && input.value != "") {
|
||||
inputSocket.send ("l" + input.value);
|
||||
}
|
||||
}
|
||||
loginDiv = div;
|
||||
} else {
|
||||
alert ("Wrong password");
|
||||
}
|
||||
}
|
||||
|
||||
function connect()
|
||||
{
|
||||
var url = window.location.toString();
|
||||
@@ -2675,7 +2639,7 @@ function connect()
|
||||
var params = query_string[1].split("&");
|
||||
}
|
||||
|
||||
var loc = window.location.toString().replace("http:", "ws:").replace("https:", "wss:");
|
||||
var loc = window.location.toString().replace("http:", "ws:");
|
||||
loc = loc.substr(0, loc.lastIndexOf('/')) + "/socket";
|
||||
|
||||
var supports_binary = newWS (loc + "-test").binaryType == "blob";
|
||||
@@ -2688,13 +2652,23 @@ function connect()
|
||||
|
||||
ws.onopen = function() {
|
||||
inputSocket = ws;
|
||||
var w, h;
|
||||
w = window.innerWidth;
|
||||
h = window.innerHeight;
|
||||
window.onresize = function(ev) {
|
||||
var w, h;
|
||||
w = window.innerWidth;
|
||||
h = window.innerHeight;
|
||||
sendInput ("d", [w, h]);
|
||||
};
|
||||
sendInput ("d", [w, h]);
|
||||
};
|
||||
ws.onclose = function() {
|
||||
if (inputSocket != null)
|
||||
alert ("disconnected");
|
||||
inputSocket = null;
|
||||
};
|
||||
ws.onmessage = function(event) {
|
||||
handleMessage(event.data);
|
||||
};
|
||||
|
||||
setupDocument(document);
|
||||
}
|
||||
|
||||
@@ -140,6 +140,62 @@ region_from_rects (BroadwayRect *rects, int n_rects)
|
||||
return region;
|
||||
}
|
||||
|
||||
static const cairo_user_data_key_t shm_cairo_key;
|
||||
|
||||
typedef struct {
|
||||
void *data;
|
||||
gsize data_size;
|
||||
} ShmSurfaceData;
|
||||
|
||||
static void
|
||||
shm_data_unmap (void *_data)
|
||||
{
|
||||
ShmSurfaceData *data = _data;
|
||||
munmap (data->data, data->data_size);
|
||||
g_free (data);
|
||||
}
|
||||
|
||||
cairo_surface_t *
|
||||
open_surface (char *name, int width, int height)
|
||||
{
|
||||
ShmSurfaceData *data;
|
||||
cairo_surface_t *surface;
|
||||
gsize size;
|
||||
void *ptr;
|
||||
int fd;
|
||||
|
||||
size = width * height * sizeof (guint32);
|
||||
|
||||
fd = shm_open(name, O_RDONLY, 0600);
|
||||
if (fd == -1)
|
||||
{
|
||||
perror ("Failed to shm_open");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ptr = mmap(0, size, PROT_READ, MAP_SHARED, fd, 0);
|
||||
(void) close(fd);
|
||||
|
||||
if (ptr == NULL)
|
||||
return NULL;
|
||||
|
||||
data = g_new0 (ShmSurfaceData, 1);
|
||||
|
||||
data->data = ptr;
|
||||
data->data_size = size;
|
||||
|
||||
surface = cairo_image_surface_create_for_data ((guchar *)data->data,
|
||||
CAIRO_FORMAT_RGB24,
|
||||
width, height,
|
||||
width * sizeof (guint32));
|
||||
g_assert (surface != NULL);
|
||||
|
||||
cairo_surface_set_user_data (surface, &shm_cairo_key,
|
||||
data, shm_data_unmap);
|
||||
|
||||
return surface;
|
||||
}
|
||||
|
||||
void
|
||||
add_client_serial_mapping (BroadwayClient *client,
|
||||
guint32 client_serial,
|
||||
@@ -281,11 +337,9 @@ client_handle_request (BroadwayClient *client,
|
||||
cairo_region_destroy (area);
|
||||
break;
|
||||
case BROADWAY_REQUEST_UPDATE:
|
||||
surface = broadway_server_open_surface (server,
|
||||
request->update.id,
|
||||
request->update.name,
|
||||
request->update.width,
|
||||
request->update.height);
|
||||
surface = open_surface (request->update.name,
|
||||
request->update.width,
|
||||
request->update.height);
|
||||
if (surface != NULL)
|
||||
{
|
||||
broadway_server_window_update (server,
|
||||
|
||||
@@ -506,7 +506,7 @@ make_valid_fs_char (char c)
|
||||
{
|
||||
char chars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890";
|
||||
|
||||
return chars[c % (sizeof (chars) - 1)];
|
||||
return chars[c % sizeof (chars)];
|
||||
}
|
||||
|
||||
/* name must have at least space for 34 bytes */
|
||||
@@ -582,13 +582,6 @@ _gdk_broadway_server_create_surface (int width,
|
||||
res = ftruncate (fd, data->data_size);
|
||||
g_assert (res != -1);
|
||||
|
||||
res = posix_fallocate (fd, 0, data->data_size);
|
||||
if (res != 0)
|
||||
{
|
||||
shm_unlink (data->name);
|
||||
g_error ("Not enough shared memory for window surface");
|
||||
}
|
||||
|
||||
data->data = mmap(0, data->data_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
|
||||
(void) close(fd);
|
||||
|
||||
|
||||
@@ -116,7 +116,7 @@ gdk_broadway_device_get_state (GdkDevice *device,
|
||||
{
|
||||
gint x_int, y_int;
|
||||
|
||||
gdk_window_get_device_position (window, device, &x_int, &y_int, mask);
|
||||
gdk_window_get_pointer (window, &x_int, &y_int, mask);
|
||||
|
||||
if (axes)
|
||||
{
|
||||
@@ -188,7 +188,7 @@ gdk_broadway_device_query_state (GdkDevice *device,
|
||||
if (root_y)
|
||||
*root_y = device_root_y;
|
||||
if (win_x)
|
||||
*win_x = device_root_x - toplevel->x;
|
||||
*win_x = device_root_y - toplevel->x;
|
||||
if (win_y)
|
||||
*win_y = device_root_y - toplevel->y;
|
||||
if (mask)
|
||||
@@ -211,29 +211,6 @@ gdk_broadway_device_query_state (GdkDevice *device,
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_broadway_window_grab_check_unmap (GdkWindow *window,
|
||||
gulong serial)
|
||||
{
|
||||
GdkDisplay *display = gdk_window_get_display (window);
|
||||
GdkDeviceManager *device_manager;
|
||||
GList *devices, *d;
|
||||
|
||||
device_manager = gdk_display_get_device_manager (display);
|
||||
|
||||
/* Get all devices */
|
||||
devices = gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_MASTER);
|
||||
devices = g_list_concat (devices, gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_SLAVE));
|
||||
devices = g_list_concat (devices, gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_FLOATING));
|
||||
|
||||
/* End all grabs on the newly hidden window */
|
||||
for (d = devices; d; d = d->next)
|
||||
_gdk_display_end_device_grab (display, d->data, serial, window, TRUE);
|
||||
|
||||
g_list_free (devices);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_gdk_broadway_window_grab_check_destroy (GdkWindow *window)
|
||||
{
|
||||
|
||||
@@ -55,6 +55,8 @@ G_DEFINE_TYPE (GdkBroadwayDisplay, gdk_broadway_display, GDK_TYPE_DISPLAY)
|
||||
static void
|
||||
gdk_broadway_display_init (GdkBroadwayDisplay *display)
|
||||
{
|
||||
_gdk_broadway_display_manager_add_display (gdk_display_manager_get (),
|
||||
GDK_DISPLAY_OBJECT (display));
|
||||
display->id_ht = g_hash_table_new (NULL, NULL);
|
||||
}
|
||||
|
||||
@@ -171,6 +173,7 @@ _gdk_broadway_display_open (const gchar *display_name)
|
||||
}
|
||||
|
||||
g_signal_emit_by_name (display, "opened");
|
||||
g_signal_emit_by_name (gdk_display_manager_get (), "display-opened", display);
|
||||
|
||||
return display;
|
||||
}
|
||||
@@ -183,6 +186,24 @@ gdk_broadway_display_get_name (GdkDisplay *display)
|
||||
return (gchar *) "Broadway";
|
||||
}
|
||||
|
||||
static gint
|
||||
gdk_broadway_display_get_n_screens (GdkDisplay *display)
|
||||
{
|
||||
g_return_val_if_fail (GDK_IS_DISPLAY (display), 0);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static GdkScreen *
|
||||
gdk_broadway_display_get_screen (GdkDisplay *display,
|
||||
gint screen_num)
|
||||
{
|
||||
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
|
||||
g_return_val_if_fail (screen_num == 0, NULL);
|
||||
|
||||
return GDK_BROADWAY_DISPLAY (display)->screens[screen_num];
|
||||
}
|
||||
|
||||
static GdkScreen *
|
||||
gdk_broadway_display_get_default_screen (GdkDisplay *display)
|
||||
{
|
||||
@@ -236,6 +257,9 @@ gdk_broadway_display_dispose (GObject *object)
|
||||
{
|
||||
GdkBroadwayDisplay *broadway_display = GDK_BROADWAY_DISPLAY (object);
|
||||
|
||||
_gdk_broadway_display_manager_remove_display (gdk_display_manager_get (),
|
||||
GDK_DISPLAY_OBJECT (object));
|
||||
|
||||
g_list_foreach (broadway_display->input_devices, (GFunc) g_object_run_dispose, NULL);
|
||||
|
||||
_gdk_screen_close (broadway_display->screens[0]);
|
||||
@@ -370,6 +394,8 @@ gdk_broadway_display_class_init (GdkBroadwayDisplayClass * class)
|
||||
display_class->window_type = GDK_TYPE_BROADWAY_WINDOW;
|
||||
|
||||
display_class->get_name = gdk_broadway_display_get_name;
|
||||
display_class->get_n_screens = gdk_broadway_display_get_n_screens;
|
||||
display_class->get_screen = gdk_broadway_display_get_screen;
|
||||
display_class->get_default_screen = gdk_broadway_display_get_default_screen;
|
||||
display_class->beep = gdk_broadway_display_beep;
|
||||
display_class->sync = gdk_broadway_display_sync;
|
||||
|
||||
@@ -66,8 +66,6 @@ struct _GdkBroadwayDisplay
|
||||
GdkWindow *active_offscreen_window;
|
||||
|
||||
GdkBroadwayServer *server;
|
||||
|
||||
gpointer move_resize_data;
|
||||
};
|
||||
|
||||
struct _GdkBroadwayDisplayClass
|
||||
|
||||
@@ -34,6 +34,9 @@ struct _GdkBroadwayDisplayManager
|
||||
{
|
||||
GdkDisplayManager parent;
|
||||
|
||||
GdkDisplay *default_display;
|
||||
GSList *displays;
|
||||
|
||||
gboolean init_failed;
|
||||
};
|
||||
|
||||
@@ -81,9 +84,56 @@ g_initable_iface_init (GInitableIface *iface)
|
||||
iface->init = gdk_broadway_display_manager_initable_init;
|
||||
}
|
||||
|
||||
static GdkDisplay *
|
||||
gdk_broadway_display_manager_open_display (GdkDisplayManager *manager,
|
||||
const gchar *name)
|
||||
{
|
||||
return _gdk_broadway_display_open (name);
|
||||
}
|
||||
|
||||
static GSList *
|
||||
gdk_broadway_display_manager_list_displays (GdkDisplayManager *manager)
|
||||
{
|
||||
GdkBroadwayDisplayManager *manager_broadway = GDK_BROADWAY_DISPLAY_MANAGER (manager);
|
||||
|
||||
return g_slist_copy (manager_broadway->displays);
|
||||
}
|
||||
|
||||
static GdkDisplay *
|
||||
gdk_broadway_display_manager_get_default_display (GdkDisplayManager *manager)
|
||||
{
|
||||
return GDK_BROADWAY_DISPLAY_MANAGER (manager)->default_display;
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_broadway_display_manager_set_default_display (GdkDisplayManager *manager,
|
||||
GdkDisplay *display)
|
||||
{
|
||||
GdkBroadwayDisplayManager *manager_broadway = GDK_BROADWAY_DISPLAY_MANAGER (manager);
|
||||
|
||||
manager_broadway->default_display = display;
|
||||
}
|
||||
|
||||
#include "../gdkkeynames.c"
|
||||
|
||||
static gchar *
|
||||
gdk_broadway_display_manager_get_keyval_name (GdkDisplayManager *manager,
|
||||
guint keyval)
|
||||
{
|
||||
return _gdk_keyval_name (keyval);
|
||||
}
|
||||
|
||||
static guint
|
||||
gdk_broadway_display_manager_lookup_keyval (GdkDisplayManager *manager,
|
||||
const gchar *name)
|
||||
{
|
||||
return _gdk_keyval_from_name (name);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_broadway_display_manager_init (GdkBroadwayDisplayManager *manager)
|
||||
{
|
||||
_gdk_broadway_windowing_init ();
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -98,6 +148,45 @@ static void
|
||||
gdk_broadway_display_manager_class_init (GdkBroadwayDisplayManagerClass *class)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (class);
|
||||
GdkDisplayManagerClass *manager_class = GDK_DISPLAY_MANAGER_CLASS (class);
|
||||
|
||||
object_class->finalize = gdk_broadway_display_manager_finalize;
|
||||
|
||||
manager_class->open_display = gdk_broadway_display_manager_open_display;
|
||||
manager_class->list_displays = gdk_broadway_display_manager_list_displays;
|
||||
manager_class->set_default_display = gdk_broadway_display_manager_set_default_display;
|
||||
manager_class->get_default_display = gdk_broadway_display_manager_get_default_display;
|
||||
manager_class->atom_intern = _gdk_broadway_display_manager_atom_intern;
|
||||
manager_class->get_atom_name = _gdk_broadway_display_manager_get_atom_name;
|
||||
manager_class->lookup_keyval = gdk_broadway_display_manager_lookup_keyval;
|
||||
manager_class->get_keyval_name = gdk_broadway_display_manager_get_keyval_name;
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_broadway_display_manager_add_display (GdkDisplayManager *manager,
|
||||
GdkDisplay *display)
|
||||
{
|
||||
GdkBroadwayDisplayManager *manager_broadway = GDK_BROADWAY_DISPLAY_MANAGER (manager);
|
||||
|
||||
if (manager_broadway->displays == NULL)
|
||||
gdk_display_manager_set_default_display (manager, display);
|
||||
|
||||
manager_broadway->displays = g_slist_prepend (manager_broadway->displays, display);
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_broadway_display_manager_remove_display (GdkDisplayManager *manager,
|
||||
GdkDisplay *display)
|
||||
{
|
||||
GdkBroadwayDisplayManager *manager_broadway = GDK_BROADWAY_DISPLAY_MANAGER (manager);
|
||||
|
||||
manager_broadway->displays = g_slist_remove (manager_broadway->displays, display);
|
||||
|
||||
if (manager_broadway->default_display == display)
|
||||
{
|
||||
if (manager_broadway->displays)
|
||||
gdk_display_manager_set_default_display (manager, manager_broadway->displays->data);
|
||||
else
|
||||
gdk_display_manager_set_default_display (manager, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -247,7 +247,7 @@ _gdk_broadway_events_got_input (BroadwayInputMsg *message)
|
||||
break;
|
||||
case BROADWAY_EVENT_GRAB_NOTIFY:
|
||||
case BROADWAY_EVENT_UNGRAB_NOTIFY:
|
||||
_gdk_display_device_grab_update (display, display->core_pointer, display->core_pointer, message->base.serial);
|
||||
_gdk_display_device_grab_update (display, display->core_pointer, NULL, message->base.serial);
|
||||
break;
|
||||
|
||||
case BROADWAY_EVENT_CONFIGURE_NOTIFY:
|
||||
@@ -256,6 +256,10 @@ _gdk_broadway_events_got_input (BroadwayInputMsg *message)
|
||||
{
|
||||
window->x = message->configure_notify.x;
|
||||
window->y = message->configure_notify.y;
|
||||
window->width = message->configure_notify.width;
|
||||
window->height = message->configure_notify.height;
|
||||
_gdk_window_update_size (window);
|
||||
_gdk_broadway_window_resize_surface (window);
|
||||
|
||||
event = gdk_event_new (GDK_CONFIGURE);
|
||||
event->configure.window = g_object_ref (window);
|
||||
|
||||
38
gdk/broadway/gdkim-broadway.c
Normal file
38
gdk/broadway/gdkim-broadway.c
Normal file
@@ -0,0 +1,38 @@
|
||||
/* GDK - The GIMP Drawing Kit
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* 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, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
|
||||
* file for a list of people on the GTK+ Team. See the ChangeLog
|
||||
* files for a list of changes. These files are distributed with
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "gdkmain.h"
|
||||
#include "gdkinternals.h"
|
||||
#include "gdkdisplay-broadway.h"
|
||||
|
||||
#include <locale.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
void
|
||||
_gdk_broadway_initialize_locale (void)
|
||||
{
|
||||
}
|
||||
44
gdk/broadway/gdkmain-broadway.c
Normal file
44
gdk/broadway/gdkmain-broadway.c
Normal file
@@ -0,0 +1,44 @@
|
||||
/* GDK - The GIMP Drawing Kit
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* 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, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
|
||||
* file for a list of people on the GTK+ Team. See the ChangeLog
|
||||
* files for a list of changes. These files are distributed with
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "gdkdisplay-broadway.h"
|
||||
#include "gdkinternals.h"
|
||||
#include "gdkprivate-broadway.h"
|
||||
#include "gdkintl.h"
|
||||
#include "gdkdeviceprivate.h"
|
||||
|
||||
#include <glib/gprintf.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <limits.h>
|
||||
#include <errno.h>
|
||||
|
||||
void
|
||||
_gdk_broadway_windowing_init (void)
|
||||
{
|
||||
_gdk_broadway_initialize_locale ();
|
||||
}
|
||||
@@ -40,6 +40,20 @@
|
||||
#include "gdkbroadwaywindow.h"
|
||||
|
||||
void _gdk_broadway_resync_windows (void);
|
||||
void _gdk_broadway_windowing_init (void);
|
||||
|
||||
gchar * _gdk_broadway_display_manager_get_atom_name (GdkDisplayManager *manager,
|
||||
GdkAtom atom);
|
||||
void _gdk_broadway_display_manager_add_display (GdkDisplayManager *manager,
|
||||
GdkDisplay *display);
|
||||
void _gdk_broadway_display_manager_remove_display (GdkDisplayManager *manager,
|
||||
GdkDisplay *display);
|
||||
GdkAtom _gdk_broadway_display_manager_atom_intern_static_string (GdkDisplayManager *manager,
|
||||
const gchar *atom_name);
|
||||
GdkAtom _gdk_broadway_display_manager_atom_intern (GdkDisplayManager *manager,
|
||||
const gchar *atom_name,
|
||||
gboolean only_if_exists);
|
||||
|
||||
|
||||
void _gdk_broadway_window_register_dnd (GdkWindow *window);
|
||||
GdkDragContext * _gdk_broadway_window_drag_begin (GdkWindow *window,
|
||||
@@ -78,8 +92,6 @@ gboolean _gdk_broadway_moveresize_configure_done (GdkDisplay *display,
|
||||
|
||||
void _gdk_broadway_selection_window_destroyed (GdkWindow *window);
|
||||
void _gdk_broadway_window_grab_check_destroy (GdkWindow *window);
|
||||
void _gdk_broadway_window_grab_check_unmap (GdkWindow *window,
|
||||
gulong serial);
|
||||
|
||||
void _gdk_keymap_keys_changed (GdkDisplay *display);
|
||||
gint _gdk_broadway_get_group_for_state (GdkDisplay *display,
|
||||
@@ -89,6 +101,8 @@ void _gdk_keymap_add_virtual_modifiers_compat (GdkKeymap *keymap,
|
||||
gboolean _gdk_keymap_key_is_modifier (GdkKeymap *keymap,
|
||||
guint keycode);
|
||||
|
||||
void _gdk_broadway_initialize_locale (void);
|
||||
|
||||
void _gdk_broadway_screen_events_init (GdkScreen *screen);
|
||||
GdkVisual *_gdk_broadway_screen_get_system_visual (GdkScreen * screen);
|
||||
gint _gdk_broadway_screen_visual_get_best_depth (GdkScreen * screen);
|
||||
@@ -203,6 +217,9 @@ void _gdk_broadway_window_resize_surface (GdkWindow *window);
|
||||
void _gdk_broadway_cursor_update_theme (GdkCursor *cursor);
|
||||
void _gdk_broadway_cursor_display_finalize (GdkDisplay *display);
|
||||
|
||||
#define GDK_SCREEN_DISPLAY(screen) (GDK_BROADWAY_SCREEN (screen)->display)
|
||||
#define GDK_WINDOW_SCREEN(win) (GDK_WINDOW_IMPL_BROADWAY (((GdkWindow *)win)->impl)->screen)
|
||||
#define GDK_WINDOW_DISPLAY(win) (GDK_BROADWAY_SCREEN (GDK_WINDOW_SCREEN (win))->display)
|
||||
#define GDK_WINDOW_IS_BROADWAY(win) (GDK_IS_WINDOW_IMPL_BROADWAY (((GdkWindow *)win)->impl))
|
||||
|
||||
#endif /* __GDK_PRIVATE_BROADWAY_H__ */
|
||||
|
||||
@@ -35,6 +35,34 @@
|
||||
|
||||
#include <string.h>
|
||||
|
||||
GdkAtom
|
||||
_gdk_broadway_display_manager_atom_intern (GdkDisplayManager *manager,
|
||||
const gchar *atom_name,
|
||||
gboolean only_if_exists)
|
||||
{
|
||||
return _GDK_MAKE_ATOM (g_quark_from_string (atom_name));
|
||||
}
|
||||
|
||||
GdkAtom
|
||||
_gdk_broadway_display_manager_atom_intern_static_string (GdkDisplayManager *manager,
|
||||
const gchar *atom_name)
|
||||
{
|
||||
return _GDK_MAKE_ATOM (g_quark_from_static_string (atom_name));
|
||||
}
|
||||
|
||||
static const char *
|
||||
get_atom_name (GdkAtom atom)
|
||||
{
|
||||
return g_quark_to_string (GPOINTER_TO_UINT(atom));
|
||||
}
|
||||
|
||||
gchar *
|
||||
_gdk_broadway_display_manager_get_atom_name (GdkDisplayManager *manager,
|
||||
GdkAtom atom)
|
||||
{
|
||||
return g_strdup (get_atom_name (atom));
|
||||
}
|
||||
|
||||
gboolean
|
||||
_gdk_broadway_window_get_property (GdkWindow *window,
|
||||
GdkAtom property,
|
||||
|
||||
@@ -83,16 +83,18 @@ G_DEFINE_TYPE (GdkWindowImplBroadway,
|
||||
gdk_window_impl_broadway,
|
||||
GDK_TYPE_WINDOW_IMPL)
|
||||
|
||||
static void
|
||||
update_dirty_windows_and_sync (void)
|
||||
static guint dirty_flush_id = 0;
|
||||
|
||||
static gboolean
|
||||
dirty_flush_idle (gpointer data)
|
||||
{
|
||||
GList *l;
|
||||
GdkBroadwayDisplay *display;
|
||||
gboolean updated_surface;
|
||||
|
||||
dirty_flush_id = 0;
|
||||
|
||||
display = GDK_BROADWAY_DISPLAY (gdk_display_get_default ());
|
||||
|
||||
updated_surface = FALSE;
|
||||
for (l = display->toplevels; l != NULL; l = l->next)
|
||||
{
|
||||
GdkWindowImplBroadway *impl = l->data;
|
||||
@@ -100,7 +102,6 @@ update_dirty_windows_and_sync (void)
|
||||
if (impl->dirty)
|
||||
{
|
||||
impl->dirty = FALSE;
|
||||
updated_surface = TRUE;
|
||||
_gdk_broadway_server_window_update (display->server,
|
||||
impl->id,
|
||||
impl->surface);
|
||||
@@ -109,32 +110,16 @@ update_dirty_windows_and_sync (void)
|
||||
|
||||
/* We sync here to ensure all references to the impl->surface memory
|
||||
is done, as we may later paint new data in them. */
|
||||
if (updated_surface)
|
||||
gdk_display_sync (GDK_DISPLAY (display));
|
||||
else
|
||||
gdk_display_flush (GDK_DISPLAY (display));
|
||||
}
|
||||
|
||||
static guint flush_id = 0;
|
||||
|
||||
static gboolean
|
||||
flush_idle (gpointer data)
|
||||
{
|
||||
flush_id = 0;
|
||||
|
||||
gdk_display_flush (gdk_display_get_default ());
|
||||
gdk_display_sync (GDK_DISPLAY (display));
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* We need to flush in an idle rather than AFTER_PAINT, as the clock
|
||||
is frozen during e.g. window resizes so the paint will not happen
|
||||
and the window resize request is never flushed. */
|
||||
static void
|
||||
queue_flush (GdkWindow *window)
|
||||
queue_dirty_flush (GdkBroadwayDisplay *display)
|
||||
{
|
||||
if (flush_id == 0)
|
||||
flush_id = gdk_threads_add_idle (flush_idle, NULL);
|
||||
if (dirty_flush_id == 0)
|
||||
dirty_flush_id = gdk_threads_add_idle (dirty_flush_idle, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -212,25 +197,6 @@ _gdk_broadway_screen_init_root_window (GdkScreen * screen)
|
||||
_gdk_window_update_size (broadway_screen->root_window);
|
||||
}
|
||||
|
||||
static void
|
||||
on_frame_clock_after_paint (GdkFrameClock *clock,
|
||||
GdkWindow *window)
|
||||
{
|
||||
update_dirty_windows_and_sync ();
|
||||
}
|
||||
|
||||
static void
|
||||
connect_frame_clock (GdkWindow *window)
|
||||
{
|
||||
if (WINDOW_IS_TOPLEVEL (window))
|
||||
{
|
||||
GdkFrameClock *frame_clock = gdk_window_get_frame_clock (window);
|
||||
|
||||
g_signal_connect (frame_clock, "after-paint",
|
||||
G_CALLBACK (on_frame_clock_after_paint), window);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_broadway_display_create_window_impl (GdkDisplay *display,
|
||||
GdkWindow *window,
|
||||
@@ -263,21 +229,22 @@ _gdk_broadway_display_create_window_impl (GdkDisplay *display,
|
||||
g_assert (GDK_WINDOW_TYPE (window->parent) == GDK_WINDOW_ROOT);
|
||||
|
||||
broadway_display->toplevels = g_list_prepend (broadway_display->toplevels, impl);
|
||||
|
||||
connect_frame_clock (window);
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_broadway_window_resize_surface (GdkWindow *window)
|
||||
{
|
||||
GdkWindowImplBroadway *impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
|
||||
cairo_surface_t *old;
|
||||
|
||||
if (impl->surface)
|
||||
{
|
||||
cairo_surface_destroy (impl->surface);
|
||||
old = impl->surface;
|
||||
|
||||
impl->surface = _gdk_broadway_server_create_surface (gdk_window_get_width (impl->wrapper),
|
||||
gdk_window_get_height (impl->wrapper));
|
||||
|
||||
cairo_surface_destroy (old);
|
||||
}
|
||||
|
||||
if (impl->ref_surface)
|
||||
@@ -417,7 +384,7 @@ gdk_window_broadway_show (GdkWindow *window, gboolean already_mapped)
|
||||
|
||||
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window));
|
||||
if (_gdk_broadway_server_window_show (broadway_display->server, impl->id))
|
||||
queue_flush (window);
|
||||
queue_dirty_flush (broadway_display);
|
||||
|
||||
}
|
||||
|
||||
@@ -437,12 +404,8 @@ gdk_window_broadway_hide (GdkWindow *window)
|
||||
_gdk_make_event (GDK_WINDOW (window), GDK_UNMAP, NULL, FALSE);
|
||||
|
||||
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window));
|
||||
|
||||
_gdk_broadway_window_grab_check_unmap (window,
|
||||
_gdk_broadway_server_get_next_serial (broadway_display->server));
|
||||
|
||||
if (_gdk_broadway_server_window_hide (broadway_display->server, impl->id))
|
||||
queue_flush (window);
|
||||
queue_dirty_flush (broadway_display);
|
||||
|
||||
_gdk_window_clear_update_area (window);
|
||||
}
|
||||
@@ -497,7 +460,7 @@ gdk_window_broadway_move_resize (GdkWindow *window,
|
||||
with_move,
|
||||
x, y,
|
||||
window->width, window->height);
|
||||
queue_flush (window);
|
||||
queue_dirty_flush (broadway_display);
|
||||
if (size_changed)
|
||||
window->resize_count++;
|
||||
}
|
||||
@@ -582,12 +545,6 @@ gdk_broadway_window_set_geometry_hints (GdkWindow *window,
|
||||
const GdkGeometry *geometry,
|
||||
GdkWindowHints geom_mask)
|
||||
{
|
||||
GdkWindowImplBroadway *impl;
|
||||
|
||||
impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
|
||||
|
||||
impl->geometry_hints = *geometry;
|
||||
impl->geometry_hints_mask = geom_mask;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1035,8 +992,6 @@ struct _MoveResizeData
|
||||
gint moveresize_orig_width;
|
||||
gint moveresize_orig_height;
|
||||
long moveresize_process_time;
|
||||
GdkWindowHints moveresize_geom_mask;
|
||||
GdkGeometry moveresize_geometry;
|
||||
BroadwayInputMsg *moveresize_pending_event;
|
||||
};
|
||||
|
||||
@@ -1044,19 +999,20 @@ static MoveResizeData *
|
||||
get_move_resize_data (GdkDisplay *display,
|
||||
gboolean create)
|
||||
{
|
||||
GdkBroadwayDisplay *broadway_display;
|
||||
MoveResizeData *mv_resize;
|
||||
static GQuark move_resize_quark = 0;
|
||||
|
||||
broadway_display = GDK_BROADWAY_DISPLAY (display);
|
||||
if (!move_resize_quark)
|
||||
move_resize_quark = g_quark_from_static_string ("gdk-window-moveresize");
|
||||
|
||||
mv_resize = broadway_display->move_resize_data;
|
||||
mv_resize = g_object_get_qdata (G_OBJECT (display), move_resize_quark);
|
||||
|
||||
if (!mv_resize && create)
|
||||
{
|
||||
mv_resize = g_new0 (MoveResizeData, 1);
|
||||
mv_resize->display = display;
|
||||
|
||||
broadway_display->move_resize_data = mv_resize;
|
||||
g_object_set_qdata (G_OBJECT (display), move_resize_quark, mv_resize);
|
||||
}
|
||||
|
||||
return mv_resize;
|
||||
@@ -1125,13 +1081,6 @@ update_pos (MoveResizeData *mv_resize,
|
||||
w = MAX (w, 1);
|
||||
h = MAX (h, 1);
|
||||
|
||||
if (mv_resize->moveresize_geom_mask)
|
||||
{
|
||||
gdk_window_constrain_size (&mv_resize->moveresize_geometry,
|
||||
mv_resize->moveresize_geom_mask,
|
||||
w, h, &w, &h);
|
||||
}
|
||||
|
||||
gdk_window_move_resize (mv_resize->moveresize_window, x, y, w, h);
|
||||
}
|
||||
else
|
||||
@@ -1186,7 +1135,7 @@ _gdk_broadway_moveresize_handle_event (GdkDisplay *display,
|
||||
|
||||
switch (event->base.type)
|
||||
{
|
||||
case BROADWAY_EVENT_POINTER_MOVE:
|
||||
case 'm':
|
||||
if (mv_resize->moveresize_window->resize_count > 0)
|
||||
{
|
||||
if (mv_resize->moveresize_pending_event)
|
||||
@@ -1214,7 +1163,7 @@ _gdk_broadway_moveresize_handle_event (GdkDisplay *display,
|
||||
finish_drag (mv_resize);
|
||||
break;
|
||||
|
||||
case BROADWAY_EVENT_BUTTON_RELEASE:
|
||||
case 'B':
|
||||
update_pos (mv_resize,
|
||||
event->pointer.root_x,
|
||||
event->pointer.root_y);
|
||||
@@ -1275,7 +1224,6 @@ create_moveresize_window (MoveResizeData *mv_resize,
|
||||
|
||||
gdk_window_show (mv_resize->moveresize_emulation_window);
|
||||
|
||||
G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
|
||||
status = gdk_pointer_grab (mv_resize->moveresize_emulation_window,
|
||||
FALSE,
|
||||
GDK_BUTTON_RELEASE_MASK |
|
||||
@@ -1283,7 +1231,6 @@ create_moveresize_window (MoveResizeData *mv_resize,
|
||||
NULL,
|
||||
NULL,
|
||||
timestamp);
|
||||
G_GNUC_END_IGNORE_DEPRECATIONS;
|
||||
|
||||
if (status != GDK_GRAB_SUCCESS)
|
||||
{
|
||||
@@ -1296,71 +1243,6 @@ create_moveresize_window (MoveResizeData *mv_resize,
|
||||
mv_resize->moveresize_process_time = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
calculate_unmoving_origin (MoveResizeData *mv_resize)
|
||||
{
|
||||
GdkRectangle rect;
|
||||
gint width, height;
|
||||
|
||||
if (mv_resize->moveresize_geom_mask & GDK_HINT_WIN_GRAVITY &&
|
||||
mv_resize->moveresize_geometry.win_gravity == GDK_GRAVITY_STATIC)
|
||||
{
|
||||
gdk_window_get_origin (mv_resize->moveresize_window,
|
||||
&mv_resize->moveresize_orig_x,
|
||||
&mv_resize->moveresize_orig_y);
|
||||
}
|
||||
else
|
||||
{
|
||||
gdk_window_get_frame_extents (mv_resize->moveresize_window, &rect);
|
||||
gdk_window_get_geometry (mv_resize->moveresize_window,
|
||||
NULL, NULL, &width, &height);
|
||||
|
||||
switch (mv_resize->moveresize_geometry.win_gravity)
|
||||
{
|
||||
case GDK_GRAVITY_NORTH_WEST:
|
||||
mv_resize->moveresize_orig_x = rect.x;
|
||||
mv_resize->moveresize_orig_y = rect.y;
|
||||
break;
|
||||
case GDK_GRAVITY_NORTH:
|
||||
mv_resize->moveresize_orig_x = rect.x + rect.width / 2 - width / 2;
|
||||
mv_resize->moveresize_orig_y = rect.y;
|
||||
break;
|
||||
case GDK_GRAVITY_NORTH_EAST:
|
||||
mv_resize->moveresize_orig_x = rect.x + rect.width - width;
|
||||
mv_resize->moveresize_orig_y = rect.y;
|
||||
break;
|
||||
case GDK_GRAVITY_WEST:
|
||||
mv_resize->moveresize_orig_x = rect.x;
|
||||
mv_resize->moveresize_orig_y = rect.y + rect.height / 2 - height / 2;
|
||||
break;
|
||||
case GDK_GRAVITY_CENTER:
|
||||
mv_resize->moveresize_orig_x = rect.x + rect.width / 2 - width / 2;
|
||||
mv_resize->moveresize_orig_y = rect.y + rect.height / 2 - height / 2;
|
||||
break;
|
||||
case GDK_GRAVITY_EAST:
|
||||
mv_resize->moveresize_orig_x = rect.x + rect.width - width;
|
||||
mv_resize->moveresize_orig_y = rect.y + rect.height / 2 - height / 2;
|
||||
break;
|
||||
case GDK_GRAVITY_SOUTH_WEST:
|
||||
mv_resize->moveresize_orig_x = rect.x;
|
||||
mv_resize->moveresize_orig_y = rect.y + rect.height - height;
|
||||
break;
|
||||
case GDK_GRAVITY_SOUTH:
|
||||
mv_resize->moveresize_orig_x = rect.x + rect.width / 2 - width / 2;
|
||||
mv_resize->moveresize_orig_y = rect.y + rect.height - height;
|
||||
break;
|
||||
case GDK_GRAVITY_SOUTH_EAST:
|
||||
mv_resize->moveresize_orig_x = rect.x + rect.width - width;
|
||||
mv_resize->moveresize_orig_y = rect.y + rect.height - height;
|
||||
break;
|
||||
default:
|
||||
mv_resize->moveresize_orig_x = rect.x;
|
||||
mv_resize->moveresize_orig_y = rect.y;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_broadway_window_begin_resize_drag (GdkWindow *window,
|
||||
GdkWindowEdge edge,
|
||||
@@ -1371,15 +1253,12 @@ gdk_broadway_window_begin_resize_drag (GdkWindow *window,
|
||||
guint32 timestamp)
|
||||
{
|
||||
MoveResizeData *mv_resize;
|
||||
GdkWindowImplBroadway *impl;
|
||||
|
||||
impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
|
||||
|
||||
if (GDK_WINDOW_DESTROYED (window) ||
|
||||
!WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
|
||||
return;
|
||||
|
||||
mv_resize = get_move_resize_data (gdk_window_get_display (window), TRUE);
|
||||
mv_resize = get_move_resize_data (GDK_WINDOW_DISPLAY (window), TRUE);
|
||||
|
||||
mv_resize->is_resize = TRUE;
|
||||
mv_resize->moveresize_button = button;
|
||||
@@ -1388,14 +1267,12 @@ gdk_broadway_window_begin_resize_drag (GdkWindow *window,
|
||||
mv_resize->moveresize_y = root_y;
|
||||
mv_resize->moveresize_window = g_object_ref (window);
|
||||
|
||||
gdk_window_get_origin (mv_resize->moveresize_window,
|
||||
&mv_resize->moveresize_orig_x,
|
||||
&mv_resize->moveresize_orig_y);
|
||||
mv_resize->moveresize_orig_width = gdk_window_get_width (window);
|
||||
mv_resize->moveresize_orig_height = gdk_window_get_height (window);
|
||||
|
||||
mv_resize->moveresize_geom_mask = impl->geometry_hints_mask;
|
||||
mv_resize->moveresize_geometry = impl->geometry_hints;
|
||||
|
||||
calculate_unmoving_origin (mv_resize);
|
||||
|
||||
create_moveresize_window (mv_resize, timestamp);
|
||||
}
|
||||
|
||||
@@ -1451,6 +1328,7 @@ gdk_broadway_window_process_updates_recurse (GdkWindow *window,
|
||||
|
||||
impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
|
||||
impl->dirty = TRUE;
|
||||
queue_dirty_flush (GDK_BROADWAY_DISPLAY (gdk_window_get_display (window)));
|
||||
}
|
||||
|
||||
void
|
||||
@@ -1516,7 +1394,7 @@ _gdk_broadway_window_translate (GdkWindow *window,
|
||||
if (_gdk_broadway_server_window_translate (broadway_display->server,
|
||||
impl->id,
|
||||
area, dx, dy))
|
||||
queue_flush (window);
|
||||
queue_dirty_flush (broadway_display);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -64,9 +64,6 @@ struct _GdkWindowImplBroadway
|
||||
gint8 toplevel_window_type;
|
||||
gboolean dirty;
|
||||
gboolean last_synced;
|
||||
|
||||
GdkGeometry geometry_hints;
|
||||
GdkWindowHints geometry_hints_mask;
|
||||
};
|
||||
|
||||
struct _GdkWindowImplBroadwayClass
|
||||
|
||||
18
gdk/gdk.c
18
gdk/gdk.c
@@ -325,24 +325,6 @@ gdk_parse_args (int *argc,
|
||||
GDK_NOTE (MISC, g_message ("progname: \"%s\"", g_get_prgname ()));
|
||||
}
|
||||
|
||||
/**
|
||||
* gdk_get_display:
|
||||
*
|
||||
* Gets the name of the display, which usually comes from the
|
||||
* <envar>DISPLAY</envar> environment variable or the
|
||||
* <option>--display</option> command line option.
|
||||
*
|
||||
* Returns: the name of the display.
|
||||
*
|
||||
* Deprecated: 3.8: Call gdk_display_get_name (gdk_display_get_default ()))
|
||||
* instead.
|
||||
*/
|
||||
gchar *
|
||||
gdk_get_display (void)
|
||||
{
|
||||
return g_strdup (gdk_display_get_name (gdk_display_get_default ()));
|
||||
}
|
||||
|
||||
/**
|
||||
* gdk_get_display_arg_name:
|
||||
*
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
#include "gdkdisplayprivate.h"
|
||||
|
||||
#include "gdkdeviceprivate.h"
|
||||
#include "gdkdisplaymanagerprivate.h"
|
||||
#include "gdkevents.h"
|
||||
#include "gdkwindowimpl.h"
|
||||
#include "gdkinternals.h"
|
||||
@@ -82,36 +81,6 @@ static guint signals[LAST_SIGNAL] = { 0 };
|
||||
|
||||
G_DEFINE_TYPE (GdkDisplay, gdk_display, G_TYPE_OBJECT)
|
||||
|
||||
static void
|
||||
gdk_display_real_make_default (GdkDisplay *display)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
device_removed_cb (GdkDeviceManager *device_manager,
|
||||
GdkDevice *device,
|
||||
GdkDisplay *display)
|
||||
{
|
||||
g_hash_table_remove (display->multiple_click_info, device);
|
||||
g_hash_table_remove (display->device_grabs, device);
|
||||
g_hash_table_remove (display->pointers_info, device);
|
||||
|
||||
/* FIXME: change core pointer and remove from device list */
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_display_real_opened (GdkDisplay *display)
|
||||
{
|
||||
GdkDeviceManager *device_manager;
|
||||
|
||||
device_manager = gdk_display_get_device_manager (display);
|
||||
|
||||
g_signal_connect (device_manager, "device-removed",
|
||||
G_CALLBACK (device_removed_cb), display);
|
||||
|
||||
_gdk_display_manager_add_display (gdk_display_manager_get (), display);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_display_class_init (GdkDisplayClass *class)
|
||||
{
|
||||
@@ -123,9 +92,6 @@ gdk_display_class_init (GdkDisplayClass *class)
|
||||
class->get_app_launch_context = gdk_display_real_get_app_launch_context;
|
||||
class->window_type = GDK_TYPE_WINDOW;
|
||||
|
||||
class->opened = gdk_display_real_opened;
|
||||
class->make_default = gdk_display_real_make_default;
|
||||
|
||||
/**
|
||||
* GdkDisplay::opened:
|
||||
* @display: the object on which the signal is emitted
|
||||
@@ -137,8 +103,7 @@ gdk_display_class_init (GdkDisplayClass *class)
|
||||
g_signal_new (g_intern_static_string ("opened"),
|
||||
G_OBJECT_CLASS_TYPE (object_class),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
G_STRUCT_OFFSET (GdkDisplayClass, opened),
|
||||
NULL, NULL,
|
||||
0, NULL, NULL,
|
||||
g_cclosure_marshal_VOID__VOID,
|
||||
G_TYPE_NONE, 0);
|
||||
|
||||
@@ -192,6 +157,29 @@ free_device_grabs_foreach (gpointer key,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
device_removed_cb (GdkDeviceManager *device_manager,
|
||||
GdkDevice *device,
|
||||
GdkDisplay *display)
|
||||
{
|
||||
g_hash_table_remove (display->multiple_click_info, device);
|
||||
g_hash_table_remove (display->device_grabs, device);
|
||||
g_hash_table_remove (display->pointers_info, device);
|
||||
|
||||
/* FIXME: change core pointer and remove from device list */
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_display_opened (GdkDisplay *display)
|
||||
{
|
||||
GdkDeviceManager *device_manager;
|
||||
|
||||
device_manager = gdk_display_get_device_manager (display);
|
||||
|
||||
g_signal_connect (device_manager, "device-removed",
|
||||
G_CALLBACK (device_removed_cb), display);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_display_init (GdkDisplay *display)
|
||||
{
|
||||
@@ -208,6 +196,9 @@ gdk_display_init (GdkDisplay *display)
|
||||
|
||||
display->multiple_click_info = g_hash_table_new_full (NULL, NULL, NULL,
|
||||
(GDestroyNotify) g_free);
|
||||
|
||||
g_signal_connect (display, "opened",
|
||||
G_CALLBACK (gdk_display_opened), NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -218,8 +209,6 @@ gdk_display_dispose (GObject *object)
|
||||
|
||||
device_manager = gdk_display_get_device_manager (GDK_DISPLAY (object));
|
||||
|
||||
_gdk_display_manager_remove_display (gdk_display_manager_get (), display);
|
||||
|
||||
g_list_free_full (display->queued_events, (GDestroyNotify) gdk_event_free);
|
||||
display->queued_events = NULL;
|
||||
display->queued_tail = NULL;
|
||||
@@ -1426,6 +1415,12 @@ gdk_display_get_name (GdkDisplay *display)
|
||||
return GDK_DISPLAY_GET_CLASS (display)->get_name (display);
|
||||
}
|
||||
|
||||
gchar *
|
||||
gdk_get_display (void)
|
||||
{
|
||||
return g_strdup (gdk_display_get_name (gdk_display_get_default ()));
|
||||
}
|
||||
|
||||
/**
|
||||
* gdk_display_get_n_screens:
|
||||
* @display: a #GdkDisplay
|
||||
@@ -1435,15 +1430,13 @@ gdk_display_get_name (GdkDisplay *display)
|
||||
* Returns: number of screens.
|
||||
*
|
||||
* Since: 2.2
|
||||
*
|
||||
* Deprecated: 3.10: The number of screens is always 1.
|
||||
*/
|
||||
gint
|
||||
gdk_display_get_n_screens (GdkDisplay *display)
|
||||
{
|
||||
g_return_val_if_fail (GDK_IS_DISPLAY (display), 0);
|
||||
|
||||
return 1;
|
||||
return GDK_DISPLAY_GET_CLASS (display)->get_n_screens (display);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1462,9 +1455,8 @@ gdk_display_get_screen (GdkDisplay *display,
|
||||
gint screen_num)
|
||||
{
|
||||
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
|
||||
g_return_val_if_fail (screen_num == 0, NULL);
|
||||
|
||||
return gdk_display_get_default_screen (display);
|
||||
return GDK_DISPLAY_GET_CLASS (display)->get_screen (display, screen_num);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -45,7 +45,6 @@ GdkDisplay *gdk_display_open (const gchar *display_name);
|
||||
|
||||
const gchar * gdk_display_get_name (GdkDisplay *display);
|
||||
|
||||
GDK_DEPRECATED_IN_3_10
|
||||
gint gdk_display_get_n_screens (GdkDisplay *display);
|
||||
GdkScreen * gdk_display_get_screen (GdkDisplay *display,
|
||||
gint screen_num);
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#include "gdkconfig.h"
|
||||
#include "gdkdisplaymanagerprivate.h"
|
||||
#include "gdkdisplayprivate.h"
|
||||
#include "gdkinternals.h"
|
||||
#include "gdkkeysprivate.h"
|
||||
#include "gdkmarshalers.h"
|
||||
@@ -34,7 +33,6 @@
|
||||
|
||||
#ifdef GDK_WINDOWING_X11
|
||||
#include "x11/gdkx.h"
|
||||
#include "x11/gdkprivate-x11.h"
|
||||
#endif
|
||||
|
||||
#ifdef GDK_WINDOWING_QUARTZ
|
||||
@@ -43,22 +41,18 @@
|
||||
* "generic" GDK source code.
|
||||
*/
|
||||
#include "quartz/gdkquartzdisplaymanager.h"
|
||||
#include "quartz/gdkprivate-quartz.h"
|
||||
#endif
|
||||
|
||||
#ifdef GDK_WINDOWING_BROADWAY
|
||||
#include "broadway/gdkbroadwaydisplaymanager.h"
|
||||
#include "broadway/gdkprivate-broadway.h"
|
||||
#endif
|
||||
|
||||
#ifdef GDK_WINDOWING_WIN32
|
||||
#include "win32/gdkwin32.h"
|
||||
#include "win32/gdkprivate-win32.h"
|
||||
#endif
|
||||
|
||||
#ifdef GDK_WINDOWING_WAYLAND
|
||||
#include "wayland/gdkwayland.h"
|
||||
#include "wayland/gdkprivate-wayland.h"
|
||||
#endif
|
||||
|
||||
/**
|
||||
@@ -158,6 +152,8 @@ gdk_display_manager_class_init (GdkDisplayManagerClass *klass)
|
||||
object_class->set_property = gdk_display_manager_set_property;
|
||||
object_class->get_property = gdk_display_manager_get_property;
|
||||
|
||||
klass->keyval_convert_case = _gdk_display_manager_real_keyval_convert_case;
|
||||
|
||||
/**
|
||||
* GdkDisplayManager::display-opened:
|
||||
* @manager: the object on which the signal is emitted
|
||||
@@ -301,34 +297,6 @@ gdk_display_manager_get (void)
|
||||
return manager;
|
||||
}
|
||||
|
||||
typedef struct _GdkBackend GdkBackend;
|
||||
|
||||
struct _GdkBackend {
|
||||
const char *name;
|
||||
GType (* get_backend_type) (void);
|
||||
GdkDisplay * (* open_display) (const char *name);
|
||||
};
|
||||
|
||||
GdkBackend gdk_backends[] = {
|
||||
#ifdef GDK_WINDOWING_QUARTZ
|
||||
{ "quartz", gdk_quartz_display_manager_get_type, _gdk_quartz_display_open },
|
||||
#endif
|
||||
#ifdef GDK_WINDOWING_WIN32
|
||||
{ "win32", gdk_win32_display_manager_get_type, _gdk_win32_display_open },
|
||||
#endif
|
||||
#ifdef GDK_WINDOWING_X11
|
||||
{ "x11", gdk_x11_display_manager_get_type, _gdk_x11_display_open },
|
||||
#endif
|
||||
#ifdef GDK_WINDOWING_WAYLAND
|
||||
{ "wayland", gdk_wayland_display_manager_get_type, _gdk_wayland_display_open },
|
||||
#endif
|
||||
#ifdef GDK_WINDOWING_BROADWAY
|
||||
{ "broadway", gdk_broadway_display_manager_get_type, _gdk_broadway_display_open },
|
||||
#endif
|
||||
/* NULL-terminating this array so we can use commas above */
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
/**
|
||||
* gdk_display_manager_peek:
|
||||
*
|
||||
@@ -348,7 +316,7 @@ gdk_display_manager_peek (void)
|
||||
{
|
||||
const gchar *backend_list;
|
||||
gchar **backends;
|
||||
gint i, j;
|
||||
gint i;
|
||||
gboolean allow_any;
|
||||
|
||||
if (allowed_backends == NULL)
|
||||
@@ -368,18 +336,61 @@ gdk_display_manager_peek (void)
|
||||
if (!allow_any && !any && !strstr (allowed_backends, backend))
|
||||
continue;
|
||||
|
||||
for (j = 0; gdk_backends[j].name != NULL; j++)
|
||||
#ifdef GDK_WINDOWING_QUARTZ
|
||||
if ((any && allow_any) ||
|
||||
(any && strstr (allowed_backends, "quartz")) ||
|
||||
g_str_equal (backend, "quartz"))
|
||||
{
|
||||
if ((any && allow_any) ||
|
||||
(any && strstr (allowed_backends, gdk_backends[j].name)) ||
|
||||
g_str_equal (backend, gdk_backends[j].name))
|
||||
{
|
||||
GDK_NOTE (MISC, g_message ("Trying %s backend", gdk_backends[j].name));
|
||||
manager = g_initable_new (gdk_backends[j].get_backend_type (), NULL, NULL, NULL);
|
||||
if (manager)
|
||||
break;
|
||||
}
|
||||
GDK_NOTE (MISC, g_message ("Trying quartz backend"));
|
||||
manager = g_initable_new (gdk_quartz_display_manager_get_type (), NULL, NULL, NULL);
|
||||
if (manager)
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
#ifdef GDK_WINDOWING_WIN32
|
||||
if ((any && allow_any) ||
|
||||
(any && strstr (allowed_backends, "win32")) ||
|
||||
g_str_equal (backend, "win32"))
|
||||
{
|
||||
GDK_NOTE (MISC, g_message ("Trying win32 backend"));
|
||||
manager = g_initable_new (gdk_win32_display_manager_get_type (), NULL, NULL, NULL);
|
||||
if (manager)
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
#ifdef GDK_WINDOWING_X11
|
||||
if ((any && allow_any) ||
|
||||
(any && strstr (allowed_backends, "x11")) ||
|
||||
g_str_equal (backend, "x11"))
|
||||
{
|
||||
GDK_NOTE (MISC, g_message ("Trying x11 backend"));
|
||||
manager = g_initable_new (gdk_x11_display_manager_get_type (), NULL, NULL, NULL);
|
||||
if (manager)
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
#ifdef GDK_WINDOWING_WAYLAND
|
||||
if ((any && allow_any) ||
|
||||
(any && strstr (allowed_backends, "wayland")) ||
|
||||
g_str_equal (backend, "wayland"))
|
||||
{
|
||||
GDK_NOTE (MISC, g_message ("Trying wayland backend"));
|
||||
manager = g_initable_new (gdk_wayland_display_manager_get_type (), NULL, NULL, NULL);
|
||||
if (manager)
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
#ifdef GDK_WINDOWING_BROADWAY
|
||||
if ((any && allow_any) ||
|
||||
(any && strstr (allowed_backends, "broadway")) ||
|
||||
g_str_equal (backend, "broadway"))
|
||||
{
|
||||
GDK_NOTE (MISC, g_message ("Trying broadway backend"));
|
||||
manager = g_initable_new (gdk_broadway_display_manager_get_type (), NULL, NULL, NULL);
|
||||
if (manager)
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
g_strfreev (backends);
|
||||
}
|
||||
@@ -387,6 +398,15 @@ gdk_display_manager_peek (void)
|
||||
return manager;
|
||||
}
|
||||
|
||||
/* Used for cases where we don't actually want to instantiate a
|
||||
* display manager if none exists. Internal only.
|
||||
*/
|
||||
GdkDisplayManager *
|
||||
_gdk_display_manager_get_nocreate (void)
|
||||
{
|
||||
return manager;
|
||||
}
|
||||
|
||||
/**
|
||||
* gdk_display_manager_get_default_display:
|
||||
* @manager: a #GdkDisplayManager
|
||||
@@ -401,7 +421,7 @@ gdk_display_manager_peek (void)
|
||||
GdkDisplay *
|
||||
gdk_display_manager_get_default_display (GdkDisplayManager *manager)
|
||||
{
|
||||
return manager->default_display;
|
||||
return GDK_DISPLAY_MANAGER_GET_CLASS (manager)->get_default_display (manager);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -458,10 +478,7 @@ void
|
||||
gdk_display_manager_set_default_display (GdkDisplayManager *manager,
|
||||
GdkDisplay *display)
|
||||
{
|
||||
manager->default_display = display;
|
||||
|
||||
if (display)
|
||||
GDK_DISPLAY_GET_CLASS (display)->make_default (display);
|
||||
GDK_DISPLAY_MANAGER_GET_CLASS (manager)->set_default_display (manager, display);
|
||||
|
||||
g_object_notify (G_OBJECT (manager), "default-display");
|
||||
}
|
||||
@@ -481,7 +498,7 @@ gdk_display_manager_set_default_display (GdkDisplayManager *manager,
|
||||
GSList *
|
||||
gdk_display_manager_list_displays (GdkDisplayManager *manager)
|
||||
{
|
||||
return g_slist_copy (manager->displays);
|
||||
return GDK_DISPLAY_MANAGER_GET_CLASS (manager)->list_displays (manager);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -500,45 +517,71 @@ GdkDisplay *
|
||||
gdk_display_manager_open_display (GdkDisplayManager *manager,
|
||||
const gchar *name)
|
||||
{
|
||||
guint i;
|
||||
|
||||
for (i = 0; gdk_backends[i].name != NULL; i++)
|
||||
{
|
||||
if (G_OBJECT_TYPE (manager) == gdk_backends[i].get_backend_type ())
|
||||
{
|
||||
return gdk_backends[i].open_display (name);
|
||||
}
|
||||
}
|
||||
|
||||
g_assert_not_reached ();
|
||||
|
||||
return NULL;
|
||||
return GDK_DISPLAY_MANAGER_GET_CLASS (manager)->open_display (manager, name);
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_display_manager_add_display (GdkDisplayManager *manager,
|
||||
GdkDisplay *display)
|
||||
/**
|
||||
* gdk_atom_intern:
|
||||
* @atom_name: a string.
|
||||
* @only_if_exists: if %TRUE, GDK is allowed to not create a new atom, but
|
||||
* just return %GDK_NONE if the requested atom doesn't already
|
||||
* exists. Currently, the flag is ignored, since checking the
|
||||
* existance of an atom is as expensive as creating it.
|
||||
*
|
||||
* Finds or creates an atom corresponding to a given string.
|
||||
*
|
||||
* Returns: (transfer none): the atom corresponding to @atom_name.
|
||||
*/
|
||||
GdkAtom
|
||||
gdk_atom_intern (const gchar *atom_name,
|
||||
gboolean only_if_exists)
|
||||
{
|
||||
if (manager->displays == NULL)
|
||||
gdk_display_manager_set_default_display (manager, display);
|
||||
GdkDisplayManager *manager = gdk_display_manager_get ();
|
||||
|
||||
manager->displays = g_slist_prepend (manager->displays, display);
|
||||
|
||||
g_signal_emit (manager, signals[DISPLAY_OPENED], 0, display);
|
||||
return GDK_DISPLAY_MANAGER_GET_CLASS (manager)->atom_intern (manager, atom_name, TRUE);
|
||||
}
|
||||
|
||||
/* NB: This function can be called multiple times per display. */
|
||||
void
|
||||
_gdk_display_manager_remove_display (GdkDisplayManager *manager,
|
||||
GdkDisplay *display)
|
||||
/**
|
||||
* gdk_atom_intern_static_string:
|
||||
* @atom_name: a static string
|
||||
*
|
||||
* Finds or creates an atom corresponding to a given string.
|
||||
*
|
||||
* Note that this function is identical to gdk_atom_intern() except
|
||||
* that if a new #GdkAtom is created the string itself is used rather
|
||||
* than a copy. This saves memory, but can only be used if the string
|
||||
* will <emphasis>always</emphasis> exist. It can be used with statically
|
||||
* allocated strings in the main program, but not with statically
|
||||
* allocated memory in dynamically loaded modules, if you expect to
|
||||
* ever unload the module again (e.g. do not use this function in
|
||||
* GTK+ theme engines).
|
||||
*
|
||||
* Returns: (transfer none): the atom corresponding to @atom_name
|
||||
*
|
||||
* Since: 2.10
|
||||
*/
|
||||
GdkAtom
|
||||
gdk_atom_intern_static_string (const gchar *atom_name)
|
||||
{
|
||||
manager->displays = g_slist_remove (manager->displays, display);
|
||||
GdkDisplayManager *manager = gdk_display_manager_get ();
|
||||
|
||||
if (manager->default_display == display)
|
||||
{
|
||||
if (manager->displays)
|
||||
gdk_display_manager_set_default_display (manager, manager->displays->data);
|
||||
else
|
||||
gdk_display_manager_set_default_display (manager, NULL);
|
||||
}
|
||||
return GDK_DISPLAY_MANAGER_GET_CLASS (manager)->atom_intern (manager, atom_name, FALSE);
|
||||
}
|
||||
|
||||
/**
|
||||
* gdk_atom_name:
|
||||
* @atom: a #GdkAtom.
|
||||
*
|
||||
* Determines the string corresponding to an atom.
|
||||
*
|
||||
* Returns: a newly-allocated string containing the string
|
||||
* corresponding to @atom. When you are done with the
|
||||
* return value, you should free it using g_free().
|
||||
*/
|
||||
gchar *
|
||||
gdk_atom_name (GdkAtom atom)
|
||||
{
|
||||
GdkDisplayManager *manager = gdk_display_manager_get ();
|
||||
|
||||
return GDK_DISPLAY_MANAGER_GET_CLASS (manager)->get_atom_name (manager, atom);
|
||||
}
|
||||
|
||||
@@ -31,25 +31,41 @@ typedef struct _GdkDisplayManagerClass GdkDisplayManagerClass;
|
||||
struct _GdkDisplayManager
|
||||
{
|
||||
GObject parent_instance;
|
||||
|
||||
GdkDisplay *default_display;
|
||||
|
||||
GSList *displays;
|
||||
};
|
||||
|
||||
struct _GdkDisplayManagerClass
|
||||
{
|
||||
GObjectClass parent_class;
|
||||
|
||||
GSList * (*list_displays) (GdkDisplayManager *manager);
|
||||
GdkDisplay * (*get_default_display) (GdkDisplayManager *manager);
|
||||
void (*set_default_display) (GdkDisplayManager *manager,
|
||||
GdkDisplay *display);
|
||||
GdkDisplay * (*open_display) (GdkDisplayManager *manager,
|
||||
const gchar *name);
|
||||
|
||||
/* FIXME the following should really be frontend-only, not vfuncs */
|
||||
GdkAtom (*atom_intern) (GdkDisplayManager *manager,
|
||||
const gchar *atom_name,
|
||||
gboolean copy_name);
|
||||
gchar * (*get_atom_name) (GdkDisplayManager *manager,
|
||||
GdkAtom atom);
|
||||
guint (*lookup_keyval) (GdkDisplayManager *manager,
|
||||
const gchar *name);
|
||||
gchar * (*get_keyval_name) (GdkDisplayManager *manager,
|
||||
guint keyval);
|
||||
void (*keyval_convert_case) (GdkDisplayManager *manager,
|
||||
guint keyval,
|
||||
guint *lower,
|
||||
guint *upper);
|
||||
|
||||
/* signals */
|
||||
void (*display_opened) (GdkDisplayManager *manager,
|
||||
GdkDisplay *display);
|
||||
};
|
||||
|
||||
void _gdk_display_manager_add_display (GdkDisplayManager *manager,
|
||||
GdkDisplay *display);
|
||||
void _gdk_display_manager_remove_display (GdkDisplayManager *manager,
|
||||
GdkDisplay *display);
|
||||
GdkDisplayManager *
|
||||
_gdk_display_manager_get_nocreate (void);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
||||
@@ -136,13 +136,15 @@ struct _GdkDisplayClass
|
||||
GType window_type; /* type for native windows for this display, set in class_init */
|
||||
|
||||
const gchar * (*get_name) (GdkDisplay *display);
|
||||
gint (*get_n_screens) (GdkDisplay *display);
|
||||
GdkScreen * (*get_screen) (GdkDisplay *display,
|
||||
gint screen_num);
|
||||
GdkScreen * (*get_default_screen) (GdkDisplay *display);
|
||||
void (*beep) (GdkDisplay *display);
|
||||
void (*sync) (GdkDisplay *display);
|
||||
void (*flush) (GdkDisplay *display);
|
||||
gboolean (*has_pending) (GdkDisplay *display);
|
||||
void (*queue_events) (GdkDisplay *display);
|
||||
void (*make_default) (GdkDisplay *display);
|
||||
GdkWindow * (*get_default_group) (GdkDisplay *display);
|
||||
gboolean (*supports_selection_notification) (GdkDisplay *display);
|
||||
gboolean (*request_selection_notification) (GdkDisplay *display,
|
||||
@@ -237,7 +239,6 @@ struct _GdkDisplayClass
|
||||
const gchar *text);
|
||||
|
||||
/* Signals */
|
||||
void (*opened) (GdkDisplay *display);
|
||||
void (*closed) (GdkDisplay *display,
|
||||
gboolean is_error);
|
||||
};
|
||||
|
||||
@@ -346,6 +346,8 @@ void _gdk_screen_close (GdkScreen *screen);
|
||||
void _gdk_cursor_destroy (GdkCursor *cursor);
|
||||
|
||||
extern const GOptionEntry _gdk_windowing_args[];
|
||||
gchar *_gdk_windowing_substitute_screen_number (const gchar *display_name,
|
||||
gint screen_number);
|
||||
|
||||
void _gdk_windowing_got_event (GdkDisplay *display,
|
||||
GList *event_link,
|
||||
|
||||
@@ -90,10 +90,7 @@ _gdk_keyval_from_name (const gchar *keyval_name)
|
||||
gdk_key *found;
|
||||
|
||||
g_return_val_if_fail (keyval_name != NULL, 0);
|
||||
|
||||
if (strncmp (keyval_name,"XF86", 4) == 0)
|
||||
keyval_name += 4;
|
||||
|
||||
|
||||
found = bsearch (keyval_name, gdk_keys_by_name,
|
||||
GDK_NUM_KEYS, sizeof (gdk_key),
|
||||
gdk_keys_name_compare);
|
||||
|
||||
@@ -189,6 +189,28 @@ gdk_keymap_init (GdkKeymap *keymap)
|
||||
/* Other key-handling stuff
|
||||
*/
|
||||
|
||||
/**
|
||||
* gdk_keyval_convert_case:
|
||||
* @symbol: a keyval
|
||||
* @lower: (out): return location for lowercase version of @symbol
|
||||
* @upper: (out): return location for uppercase version of @symbol
|
||||
*
|
||||
* Obtains the upper- and lower-case versions of the keyval @symbol.
|
||||
* Examples of keyvals are #GDK_KEY_a, #GDK_KEY_Enter, #GDK_KEY_F1, etc.
|
||||
*/
|
||||
void
|
||||
gdk_keyval_convert_case (guint symbol,
|
||||
guint *lower,
|
||||
guint *upper)
|
||||
{
|
||||
GdkDisplayManager *manager = _gdk_display_manager_get_nocreate ();
|
||||
|
||||
if (manager)
|
||||
GDK_DISPLAY_MANAGER_GET_CLASS (manager)->keyval_convert_case (manager, symbol, lower, upper);
|
||||
else
|
||||
_gdk_display_manager_real_keyval_convert_case (NULL, symbol, lower, upper);
|
||||
}
|
||||
|
||||
/**
|
||||
* gdk_keyval_to_upper:
|
||||
* @keyval: a key value.
|
||||
@@ -674,7 +696,6 @@ gdk_keymap_get_modifier_mask (GdkKeymap *keymap,
|
||||
return GDK_KEYMAP_GET_CLASS (keymap)->get_modifier_mask (keymap, intent);
|
||||
}
|
||||
|
||||
#include "gdkkeynames.c"
|
||||
|
||||
/**
|
||||
* gdk_keyval_name:
|
||||
@@ -693,7 +714,10 @@ gdk_keymap_get_modifier_mask (GdkKeymap *keymap,
|
||||
gchar *
|
||||
gdk_keyval_name (guint keyval)
|
||||
{
|
||||
return _gdk_keyval_name (keyval);
|
||||
GdkDisplayManager *manager = gdk_display_manager_get ();
|
||||
|
||||
return GDK_DISPLAY_MANAGER_GET_CLASS (manager)->get_keyval_name (manager,
|
||||
keyval);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -712,27 +736,20 @@ gdk_keyval_name (guint keyval)
|
||||
guint
|
||||
gdk_keyval_from_name (const gchar *keyval_name)
|
||||
{
|
||||
return _gdk_keyval_from_name (keyval_name);
|
||||
GdkDisplayManager *manager = gdk_display_manager_get ();
|
||||
|
||||
return GDK_DISPLAY_MANAGER_GET_CLASS (manager)->lookup_keyval (manager,
|
||||
keyval_name);
|
||||
}
|
||||
|
||||
/**
|
||||
* gdk_keyval_convert_case:
|
||||
* @symbol: a keyval
|
||||
* @lower: (out): return location for lowercase version of @symbol
|
||||
* @upper: (out): return location for uppercase version of @symbol
|
||||
*
|
||||
* Obtains the upper- and lower-case versions of the keyval @symbol.
|
||||
* Examples of keyvals are #GDK_KEY_a, #GDK_KEY_Enter, #GDK_KEY_F1, etc.
|
||||
*/
|
||||
void
|
||||
gdk_keyval_convert_case (guint symbol,
|
||||
guint *lower,
|
||||
guint *upper)
|
||||
_gdk_display_manager_real_keyval_convert_case (GdkDisplayManager *manager,
|
||||
guint symbol,
|
||||
guint *lower,
|
||||
guint *upper)
|
||||
{
|
||||
guint xlower, xupper;
|
||||
|
||||
xlower = symbol;
|
||||
xupper = symbol;
|
||||
guint xlower = symbol;
|
||||
guint xupper = symbol;
|
||||
|
||||
/* Check for directly encoded 24-bit UCS characters: */
|
||||
if ((symbol & 0xff000000) == 0x01000000)
|
||||
|
||||
@@ -76,6 +76,11 @@ struct _GdkKeymap
|
||||
GdkDisplay *display;
|
||||
};
|
||||
|
||||
void _gdk_display_manager_real_keyval_convert_case (GdkDisplayManager *manager,
|
||||
guint symbol,
|
||||
guint *lower,
|
||||
guint *upper);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif
|
||||
|
||||
@@ -2278,7 +2278,6 @@
|
||||
#define GDK_TouchpadToggle 0x1008ffa9
|
||||
#define GDK_TouchpadOn 0x1008ffb0
|
||||
#define GDK_TouchpadOff 0x1008ffb1
|
||||
#define GDK_AudioMicMute 0x1008ffb2
|
||||
#define GDK_Switch_VT_1 0x1008fe01
|
||||
#define GDK_Switch_VT_2 0x1008fe02
|
||||
#define GDK_Switch_VT_3 0x1008fe03
|
||||
|
||||
@@ -2287,7 +2287,6 @@
|
||||
#define GDK_KEY_TouchpadToggle 0x1008ffa9
|
||||
#define GDK_KEY_TouchpadOn 0x1008ffb0
|
||||
#define GDK_KEY_TouchpadOff 0x1008ffb1
|
||||
#define GDK_KEY_AudioMicMute 0x1008ffb2
|
||||
#define GDK_KEY_Switch_VT_1 0x1008fe01
|
||||
#define GDK_KEY_Switch_VT_2 0x1008fe02
|
||||
#define GDK_KEY_Switch_VT_3 0x1008fe03
|
||||
|
||||
@@ -65,7 +65,15 @@ void gdk_error_trap_pop_ignored (void);
|
||||
|
||||
const gchar * gdk_get_display_arg_name (void);
|
||||
|
||||
GDK_DEPRECATED_IN_3_8_FOR(gdk_display_get_name (gdk_display_get_default ()))
|
||||
/**
|
||||
* gdk_get_display:
|
||||
*
|
||||
* Gets the name of the display, which usually comes from the
|
||||
* <envar>DISPLAY</envar> environment variable or the
|
||||
* <option>--display</option> command line option.
|
||||
*
|
||||
* Returns: the name of the display.
|
||||
*/
|
||||
gchar* gdk_get_display (void);
|
||||
|
||||
#ifndef GDK_MULTIDEVICE_SAFE
|
||||
|
||||
@@ -713,16 +713,6 @@ gdk_offscreen_window_process_updates_recurse (GdkWindow *window,
|
||||
_gdk_window_process_updates_recurse (window, region);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_offscreen_window_get_frame_extents (GdkWindow *window,
|
||||
GdkRectangle *rect)
|
||||
{
|
||||
rect->x = window->x;
|
||||
rect->y = window->y;
|
||||
rect->width = window->width;
|
||||
rect->height = window->height;
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_offscreen_window_class_init (GdkOffscreenWindowClass *klass)
|
||||
{
|
||||
@@ -773,7 +763,7 @@ gdk_offscreen_window_class_init (GdkOffscreenWindowClass *klass)
|
||||
impl_class->set_startup_id = gdk_offscreen_window_set_string;
|
||||
impl_class->set_transient_for = gdk_offscreen_window_set_transient_for;
|
||||
impl_class->get_root_origin = NULL;
|
||||
impl_class->get_frame_extents = gdk_offscreen_window_get_frame_extents;
|
||||
impl_class->get_frame_extents = NULL;
|
||||
impl_class->set_override_redirect = NULL;
|
||||
impl_class->set_accept_focus = NULL;
|
||||
impl_class->set_focus_on_map = gdk_offscreen_window_set_boolean;
|
||||
|
||||
@@ -29,8 +29,6 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
const char * _gdk_atom_name_const (GdkAtom atom);
|
||||
|
||||
void gdk_window_destroy_notify (GdkWindow *window);
|
||||
|
||||
void gdk_synthesize_window_state (GdkWindow *window,
|
||||
|
||||
@@ -1,254 +0,0 @@
|
||||
/* GDK - The GIMP Drawing Kit
|
||||
* Copyright (C) 2000 Red Hat, Inc.
|
||||
* 2005 Imendio AB
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* 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, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "gdkproperty.h"
|
||||
|
||||
#include "gdkprivate.h"
|
||||
|
||||
/**
|
||||
* SECTION:properties
|
||||
* @Short_description: Functions to manipulate properties on windows
|
||||
* @Title: Properties and Atoms
|
||||
*
|
||||
* Each window under X can have any number of associated
|
||||
* <firstterm>properties</firstterm> attached to it.
|
||||
* Properties are arbitrary chunks of data identified by
|
||||
* <firstterm>atom</firstterm>s. (An <firstterm>atom</firstterm>
|
||||
* is a numeric index into a string table on the X server. They are used
|
||||
* to transfer strings efficiently between clients without
|
||||
* having to transfer the entire string.) A property
|
||||
* has an associated type, which is also identified
|
||||
* using an atom.
|
||||
*
|
||||
* A property has an associated <firstterm>format</firstterm>,
|
||||
* an integer describing how many bits are in each unit
|
||||
* of data inside the property. It must be 8, 16, or 32.
|
||||
* When data is transferred between the server and client,
|
||||
* if they are of different endianesses it will be byteswapped
|
||||
* as necessary according to the format of the property.
|
||||
* Note that on the client side, properties of format 32
|
||||
* will be stored with one unit per <emphasis>long</emphasis>,
|
||||
* even if a long integer has more than 32 bits on the platform.
|
||||
* (This decision was apparently made for Xlib to maintain
|
||||
* compatibility with programs that assumed longs were 32
|
||||
* bits, at the expense of programs that knew better.)
|
||||
*
|
||||
* The functions in this section are used to add, remove
|
||||
* and change properties on windows, to convert atoms
|
||||
* to and from strings and to manipulate some types of
|
||||
* data commonly stored in X window properties.
|
||||
*/
|
||||
|
||||
static GHashTable *names_to_atoms;
|
||||
static GPtrArray *atoms_to_names;
|
||||
|
||||
static const gchar xatoms_string[] =
|
||||
/* These are all the standard predefined X atoms */
|
||||
"NONE\0"
|
||||
"PRIMARY\0"
|
||||
"SECONDARY\0"
|
||||
"ARC\0"
|
||||
"ATOM\0"
|
||||
"BITMAP\0"
|
||||
"CARDINAL\0"
|
||||
"COLORMAP\0"
|
||||
"CURSOR\0"
|
||||
"CUT_BUFFER0\0"
|
||||
"CUT_BUFFER1\0"
|
||||
"CUT_BUFFER2\0"
|
||||
"CUT_BUFFER3\0"
|
||||
"CUT_BUFFER4\0"
|
||||
"CUT_BUFFER5\0"
|
||||
"CUT_BUFFER6\0"
|
||||
"CUT_BUFFER7\0"
|
||||
"DRAWABLE\0"
|
||||
"FONT\0"
|
||||
"INTEGER\0"
|
||||
"PIXMAP\0"
|
||||
"POINT\0"
|
||||
"RECTANGLE\0"
|
||||
"RESOURCE_MANAGER\0"
|
||||
"RGB_COLOR_MAP\0"
|
||||
"RGB_BEST_MAP\0"
|
||||
"RGB_BLUE_MAP\0"
|
||||
"RGB_DEFAULT_MAP\0"
|
||||
"RGB_GRAY_MAP\0"
|
||||
"RGB_GREEN_MAP\0"
|
||||
"RGB_RED_MAP\0"
|
||||
"STRING\0"
|
||||
"VISUALID\0"
|
||||
"WINDOW\0"
|
||||
"WM_COMMAND\0"
|
||||
"WM_HINTS\0"
|
||||
"WM_CLIENT_MACHINE\0"
|
||||
"WM_ICON_NAME\0"
|
||||
"WM_ICON_SIZE\0"
|
||||
"WM_NAME\0"
|
||||
"WM_NORMAL_HINTS\0"
|
||||
"WM_SIZE_HINTS\0"
|
||||
"WM_ZOOM_HINTS\0"
|
||||
"MIN_SPACE\0"
|
||||
"NORM_SPACE\0"
|
||||
"MAX_SPACE\0"
|
||||
"END_SPACE\0"
|
||||
"SUPERSCRIPT_X\0"
|
||||
"SUPERSCRIPT_Y\0"
|
||||
"SUBSCRIPT_X\0"
|
||||
"SUBSCRIPT_Y\0"
|
||||
"UNDERLINE_POSITION\0"
|
||||
"UNDERLINE_THICKNESS\0"
|
||||
"STRIKEOUT_ASCENT\0"
|
||||
"STRIKEOUT_DESCENT\0"
|
||||
"ITALIC_ANGLE\0"
|
||||
"X_HEIGHT\0"
|
||||
"QUAD_WIDTH\0"
|
||||
"WEIGHT\0"
|
||||
"POINT_SIZE\0"
|
||||
"RESOLUTION\0"
|
||||
"COPYRIGHT\0"
|
||||
"NOTICE\0"
|
||||
"FONT_NAME\0"
|
||||
"FAMILY_NAME\0"
|
||||
"FULL_NAME\0"
|
||||
"CAP_HEIGHT\0"
|
||||
"WM_CLASS\0"
|
||||
"WM_TRANSIENT_FOR\0"
|
||||
"CLIPBOARD\0" /* = 69 */;
|
||||
|
||||
static const gint xatoms_offset[] = {
|
||||
0, 5, 13, 23, 27, 32, 39, 48, 57, 64, 76, 88,
|
||||
100, 112, 124, 136, 148, 160, 169, 174, 182, 189, 195, 205,
|
||||
222, 236, 249, 262, 278, 291, 305, 317, 324, 333, 340, 351,
|
||||
360, 378, 391, 404, 412, 428, 442, 456, 466, 477, 487, 497,
|
||||
511, 525, 537, 549, 568, 588, 605, 623, 636, 645, 656, 663,
|
||||
674, 685, 695, 702, 712, 724, 734, 745, 754, 771
|
||||
};
|
||||
|
||||
static void
|
||||
ensure_atom_tables (void)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (names_to_atoms)
|
||||
return;
|
||||
|
||||
names_to_atoms = g_hash_table_new (g_str_hash, g_str_equal);
|
||||
atoms_to_names = g_ptr_array_sized_new (G_N_ELEMENTS (xatoms_offset));
|
||||
|
||||
for (i = 0; i < G_N_ELEMENTS (xatoms_offset); i++)
|
||||
{
|
||||
g_hash_table_insert(names_to_atoms, (gchar *)xatoms_string + xatoms_offset[i], GINT_TO_POINTER (i));
|
||||
g_ptr_array_add(atoms_to_names, (gchar *)xatoms_string + xatoms_offset[i]);
|
||||
}
|
||||
}
|
||||
|
||||
static GdkAtom
|
||||
intern_atom_internal (const gchar *atom_name, gboolean allocate)
|
||||
{
|
||||
gpointer result;
|
||||
gchar *name;
|
||||
|
||||
ensure_atom_tables ();
|
||||
|
||||
if (g_hash_table_lookup_extended (names_to_atoms, atom_name, NULL, &result))
|
||||
return result;
|
||||
|
||||
result = GINT_TO_POINTER (atoms_to_names->len);
|
||||
name = allocate ? g_strdup (atom_name) : (gchar *)atom_name;
|
||||
g_hash_table_insert(names_to_atoms, name, result);
|
||||
g_ptr_array_add(atoms_to_names, name);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* gdk_atom_intern:
|
||||
* @atom_name: a string.
|
||||
* @only_if_exists: if %TRUE, GDK is allowed to not create a new atom, but
|
||||
* just return %GDK_NONE if the requested atom doesn't already
|
||||
* exists. Currently, the flag is ignored, since checking the
|
||||
* existance of an atom is as expensive as creating it.
|
||||
*
|
||||
* Finds or creates an atom corresponding to a given string.
|
||||
*
|
||||
* Returns: (transfer none): the atom corresponding to @atom_name.
|
||||
*/
|
||||
GdkAtom
|
||||
gdk_atom_intern (const gchar *atom_name,
|
||||
gboolean only_if_exists)
|
||||
{
|
||||
g_return_val_if_fail (atom_name != NULL, GDK_NONE);
|
||||
|
||||
return intern_atom_internal (atom_name, TRUE);
|
||||
}
|
||||
|
||||
/**
|
||||
* gdk_atom_intern_static_string:
|
||||
* @atom_name: a static string
|
||||
*
|
||||
* Finds or creates an atom corresponding to a given string.
|
||||
*
|
||||
* Note that this function is identical to gdk_atom_intern() except
|
||||
* that if a new #GdkAtom is created the string itself is used rather
|
||||
* than a copy. This saves memory, but can only be used if the string
|
||||
* will <emphasis>always</emphasis> exist. It can be used with statically
|
||||
* allocated strings in the main program, but not with statically
|
||||
* allocated memory in dynamically loaded modules, if you expect to
|
||||
* ever unload the module again (e.g. do not use this function in
|
||||
* GTK+ theme engines).
|
||||
*
|
||||
* Returns: (transfer none): the atom corresponding to @atom_name
|
||||
*
|
||||
* Since: 2.10
|
||||
*/
|
||||
GdkAtom
|
||||
gdk_atom_intern_static_string (const gchar *atom_name)
|
||||
{
|
||||
g_return_val_if_fail (atom_name != NULL, GDK_NONE);
|
||||
|
||||
return intern_atom_internal (atom_name, FALSE);
|
||||
}
|
||||
|
||||
/**
|
||||
* gdk_atom_name:
|
||||
* @atom: a #GdkAtom.
|
||||
*
|
||||
* Determines the string corresponding to an atom.
|
||||
*
|
||||
* Returns: a newly-allocated string containing the string
|
||||
* corresponding to @atom. When you are done with the
|
||||
* return value, you should free it using g_free().
|
||||
*/
|
||||
gchar *
|
||||
gdk_atom_name (GdkAtom atom)
|
||||
{
|
||||
return g_strdup (_gdk_atom_name_const (atom));
|
||||
}
|
||||
|
||||
const gchar *
|
||||
_gdk_atom_name_const (GdkAtom atom)
|
||||
{
|
||||
ensure_atom_tables ();
|
||||
|
||||
if (GPOINTER_TO_INT (atom) >= atoms_to_names->len)
|
||||
return NULL;
|
||||
|
||||
return g_ptr_array_index (atoms_to_names, GPOINTER_TO_INT (atom));
|
||||
}
|
||||
@@ -940,26 +940,19 @@ static void
|
||||
apply_clip_as_shape (GdkWindow *window)
|
||||
{
|
||||
GdkRectangle r;
|
||||
cairo_region_t *region;
|
||||
|
||||
r.x = r.y = 0;
|
||||
r.width = window->width;
|
||||
r.height = window->height;
|
||||
|
||||
region = cairo_region_copy (window->clip_region);
|
||||
if (window->layered_region)
|
||||
cairo_region_subtract (region, window->layered_region);
|
||||
|
||||
/* We only apply the clip region if would differ
|
||||
from the actual clip region implied by the size
|
||||
of the window. This is to avoid unneccessarily
|
||||
adding meaningless shapes to all native subwindows */
|
||||
if (!region_rect_equal (region, &r))
|
||||
apply_shape (window, region);
|
||||
if (!region_rect_equal (window->clip_region, &r))
|
||||
apply_shape (window, window->clip_region);
|
||||
else
|
||||
apply_shape (window, NULL);
|
||||
|
||||
cairo_region_destroy (region);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -3499,22 +3492,24 @@ static void
|
||||
gdk_window_flush_outstanding_moves (GdkWindow *window)
|
||||
{
|
||||
GdkWindow *impl_window;
|
||||
GList *l, *outstanding;
|
||||
GdkWindowRegionMove *move;
|
||||
|
||||
impl_window = gdk_window_get_impl_window (window);
|
||||
outstanding = impl_window->outstanding_moves;
|
||||
impl_window->outstanding_moves = NULL;
|
||||
|
||||
while (impl_window->outstanding_moves)
|
||||
for (l = outstanding; l != NULL; l = l->next)
|
||||
{
|
||||
move = impl_window->outstanding_moves->data;
|
||||
impl_window->outstanding_moves =
|
||||
g_list_delete_link (impl_window->outstanding_moves,
|
||||
impl_window->outstanding_moves);
|
||||
move = l->data;
|
||||
|
||||
do_move_region_bits_on_impl (impl_window,
|
||||
move->dest_region, move->dx, move->dy);
|
||||
|
||||
gdk_window_region_move_free (move);
|
||||
}
|
||||
|
||||
g_list_free (outstanding);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -4070,7 +4065,6 @@ gdk_window_process_updates_internal (GdkWindow *window)
|
||||
GdkWindowImplClass *impl_class;
|
||||
gboolean save_region = FALSE;
|
||||
GdkRectangle clip_box;
|
||||
int iteration;
|
||||
|
||||
/* Ensure the window lives while updating it */
|
||||
g_object_ref (window);
|
||||
@@ -4078,15 +4072,8 @@ gdk_window_process_updates_internal (GdkWindow *window)
|
||||
/* If an update got queued during update processing, we can get a
|
||||
* window in the update queue that has an empty update_area.
|
||||
* just ignore it.
|
||||
*
|
||||
* We run this multiple times if needed because on win32 the
|
||||
* first run can cause new (synchronous) updates from
|
||||
* gdk_window_flush_outstanding_moves(). However, we
|
||||
* limit it to two iterations to avoid any potential loops.
|
||||
*/
|
||||
iteration = 0;
|
||||
while (window->update_area &&
|
||||
iteration++ < 2)
|
||||
if (window->update_area)
|
||||
{
|
||||
cairo_region_t *update_area = window->update_area;
|
||||
window->update_area = NULL;
|
||||
@@ -10012,9 +9999,6 @@ gdk_window_print (GdkWindow *window,
|
||||
g_print (" alpha[%d]",
|
||||
window->alpha);
|
||||
|
||||
if (window->has_alpha_background)
|
||||
g_print (" alpha_bg");
|
||||
|
||||
s = print_region (window->clip_region);
|
||||
g_print (" clipbox[%s]", s);
|
||||
|
||||
|
||||
7591
gdk/keyname-table.h
7591
gdk/keyname-table.h
File diff suppressed because it is too large
Load Diff
@@ -1,65 +1,28 @@
|
||||
BackSpace
|
||||
Tab
|
||||
Return
|
||||
Pause
|
||||
Scroll_Lock
|
||||
Sys_Req
|
||||
Escape
|
||||
Multi_key
|
||||
Home
|
||||
Left
|
||||
Up
|
||||
Right
|
||||
Down
|
||||
Page_Up
|
||||
Page_Down
|
||||
End
|
||||
Begin
|
||||
Print
|
||||
Insert
|
||||
Num_Lock
|
||||
KP_Space
|
||||
KP_Tab
|
||||
KP_Enter
|
||||
KP_Home
|
||||
KP_Left
|
||||
KP_Up
|
||||
KP_Right
|
||||
KP_Down
|
||||
KP_Page_Up
|
||||
KP_Prior
|
||||
KP_Page_Down
|
||||
KP_Next
|
||||
KP_End
|
||||
KP_Begin
|
||||
KP_Insert
|
||||
KP_Delete
|
||||
Delete
|
||||
MonBrightnessUp
|
||||
MonBrightnessDown
|
||||
KbdBrightnessUp
|
||||
KbdBrightnessDown
|
||||
AudioMute
|
||||
AudioLowerVolume
|
||||
AudioRaiseVolume
|
||||
AudioPlay
|
||||
AudioStop
|
||||
AudioNext
|
||||
AudioPrev
|
||||
AudioRecord
|
||||
AudioPause
|
||||
AudioRewind
|
||||
AudioMedia
|
||||
ScreenSaver
|
||||
Battery
|
||||
Launch1
|
||||
Forward
|
||||
Back
|
||||
Sleep
|
||||
Hibernate
|
||||
WLAN
|
||||
WebCam
|
||||
Display
|
||||
TouchpadToggle
|
||||
WakeUp
|
||||
Suspend
|
||||
XF86MonBrightnessUp
|
||||
XF86MonBrightnessDown
|
||||
XF86KbdBrightnessUp
|
||||
XF86KbdBrightnessDown
|
||||
XF86AudioMute
|
||||
XF86AudioLowerVolume
|
||||
XF86AudioRaiseVolume
|
||||
XF86AudioPlay
|
||||
XF86AudioStop
|
||||
XF86AudioNext
|
||||
XF86AudioPrev
|
||||
XF86AudioRecord
|
||||
XF86AudioPause
|
||||
XF86AudioRewind
|
||||
XF86AudioMedia
|
||||
XF86ScreenSaver
|
||||
XF86Battery
|
||||
XF86Launch1
|
||||
XF86Forward
|
||||
XF86Back
|
||||
XF86Sleep
|
||||
XF86Hibernate
|
||||
XF86WLAN
|
||||
XF86WebCam
|
||||
XF86Display
|
||||
XF86TouchpadToggle
|
||||
XF86WakeUp
|
||||
XF86Suspend
|
||||
|
||||
1069
gdk/keynames.txt
1069
gdk/keynames.txt
File diff suppressed because it is too large
Load Diff
@@ -134,7 +134,8 @@ _gdk_quartz_display_open (const gchar *display_name)
|
||||
_gdk_quartz_dnd_init ();
|
||||
#endif
|
||||
|
||||
g_signal_emit_by_name (_gdk_display, "opened");
|
||||
g_signal_emit_by_name (gdk_display_manager_get (),
|
||||
"display_opened", _gdk_display);
|
||||
|
||||
return _gdk_display;
|
||||
}
|
||||
@@ -154,6 +155,24 @@ gdk_quartz_display_get_name (GdkDisplay *display)
|
||||
return display_name;
|
||||
}
|
||||
|
||||
static gint
|
||||
gdk_quartz_display_get_n_screens (GdkDisplay *display)
|
||||
{
|
||||
g_return_val_if_fail (GDK_IS_DISPLAY (display), 0);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static GdkScreen *
|
||||
gdk_quartz_display_get_screen (GdkDisplay *display,
|
||||
gint screen_num)
|
||||
{
|
||||
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
|
||||
g_return_val_if_fail (screen_num == 0, NULL);
|
||||
|
||||
return _gdk_screen;
|
||||
}
|
||||
|
||||
static GdkScreen *
|
||||
gdk_quartz_display_get_default_screen (GdkDisplay *display)
|
||||
{
|
||||
@@ -264,6 +283,8 @@ G_DEFINE_TYPE (GdkQuartzDisplay, gdk_quartz_display, GDK_TYPE_DISPLAY)
|
||||
static void
|
||||
gdk_quartz_display_init (GdkQuartzDisplay *display)
|
||||
{
|
||||
_gdk_quartz_display_manager_add_display (gdk_display_manager_get (),
|
||||
GDK_DISPLAY_OBJECT (display));
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -271,6 +292,9 @@ gdk_quartz_display_dispose (GObject *object)
|
||||
{
|
||||
GdkQuartzDisplay *display_quartz = GDK_QUARTZ_DISPLAY (object);
|
||||
|
||||
_gdk_quartz_display_manager_remove_display (gdk_display_manager_get (),
|
||||
GDK_DISPLAY_OBJECT (object));
|
||||
|
||||
g_list_foreach (display_quartz->input_devices,
|
||||
(GFunc) g_object_run_dispose, NULL);
|
||||
|
||||
@@ -299,6 +323,8 @@ gdk_quartz_display_class_init (GdkQuartzDisplayClass *class)
|
||||
display_class->window_type = GDK_TYPE_QUARTZ_WINDOW;
|
||||
|
||||
display_class->get_name = gdk_quartz_display_get_name;
|
||||
display_class->get_n_screens = gdk_quartz_display_get_n_screens;
|
||||
display_class->get_screen = gdk_quartz_display_get_screen;
|
||||
display_class->get_default_screen = gdk_quartz_display_get_default_screen;
|
||||
display_class->beep = gdk_quartz_display_beep;
|
||||
display_class->sync = gdk_quartz_display_sync;
|
||||
|
||||
@@ -35,11 +35,60 @@
|
||||
struct _GdkQuartzDisplayManager
|
||||
{
|
||||
GdkDisplayManager parent;
|
||||
|
||||
GdkDisplay *default_display;
|
||||
GSList *displays;
|
||||
};
|
||||
|
||||
|
||||
G_DEFINE_TYPE (GdkQuartzDisplayManager, gdk_quartz_display_manager, GDK_TYPE_DISPLAY_MANAGER)
|
||||
|
||||
static GdkDisplay *
|
||||
gdk_quartz_display_manager_open_display (GdkDisplayManager *manager,
|
||||
const gchar *name)
|
||||
{
|
||||
return _gdk_quartz_display_open (name);
|
||||
}
|
||||
|
||||
static GSList *
|
||||
gdk_quartz_display_manager_list_displays (GdkDisplayManager *manager)
|
||||
{
|
||||
GdkQuartzDisplayManager *manager_quartz = GDK_QUARTZ_DISPLAY_MANAGER (manager);
|
||||
|
||||
return g_slist_copy (manager_quartz->displays);
|
||||
}
|
||||
|
||||
static GdkDisplay *
|
||||
gdk_quartz_display_manager_get_default_display (GdkDisplayManager *manager)
|
||||
{
|
||||
return GDK_QUARTZ_DISPLAY_MANAGER (manager)->default_display;
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_quartz_display_manager_set_default_display (GdkDisplayManager *manager,
|
||||
GdkDisplay *display)
|
||||
{
|
||||
GdkQuartzDisplayManager *manager_quartz = GDK_QUARTZ_DISPLAY_MANAGER (manager);
|
||||
|
||||
manager_quartz->default_display = display;
|
||||
}
|
||||
|
||||
#include "../gdkkeynames.c"
|
||||
|
||||
static gchar *
|
||||
gdk_quartz_display_manager_get_keyval_name (GdkDisplayManager *manager,
|
||||
guint keyval)
|
||||
{
|
||||
return _gdk_keyval_name (keyval);
|
||||
}
|
||||
|
||||
static guint
|
||||
gdk_quartz_display_manager_lookup_keyval (GdkDisplayManager *manager,
|
||||
const gchar *name)
|
||||
{
|
||||
return _gdk_keyval_from_name (name);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_quartz_display_manager_init (GdkQuartzDisplayManager *manager)
|
||||
{
|
||||
@@ -72,6 +121,41 @@ gdk_quartz_display_manager_class_init (GdkQuartzDisplayManagerClass *class)
|
||||
|
||||
object_class->finalize = gdk_quartz_display_manager_finalize;
|
||||
|
||||
manager_class->open_display = gdk_quartz_display_manager_open_display;
|
||||
manager_class->list_displays = gdk_quartz_display_manager_list_displays;
|
||||
manager_class->set_default_display = gdk_quartz_display_manager_set_default_display;
|
||||
manager_class->get_default_display = gdk_quartz_display_manager_get_default_display;
|
||||
manager_class->atom_intern = _gdk_quartz_display_manager_atom_intern;
|
||||
manager_class->get_atom_name = _gdk_quartz_display_manager_get_atom_name;
|
||||
manager_class->lookup_keyval = gdk_quartz_display_manager_lookup_keyval;
|
||||
manager_class->get_keyval_name = gdk_quartz_display_manager_get_keyval_name;
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_quartz_display_manager_add_display (GdkDisplayManager *manager,
|
||||
GdkDisplay *display)
|
||||
{
|
||||
GdkQuartzDisplayManager *manager_quartz = GDK_QUARTZ_DISPLAY_MANAGER (manager);
|
||||
|
||||
if (manager_quartz->displays == NULL)
|
||||
gdk_display_manager_set_default_display (manager, display);
|
||||
|
||||
manager_quartz->displays = g_slist_prepend (manager_quartz->displays, display);
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_quartz_display_manager_remove_display (GdkDisplayManager *manager,
|
||||
GdkDisplay *display)
|
||||
{
|
||||
GdkQuartzDisplayManager *manager_quartz = GDK_QUARTZ_DISPLAY_MANAGER (manager);
|
||||
|
||||
manager_quartz->displays = g_slist_remove (manager_quartz->displays, display);
|
||||
|
||||
if (manager_quartz->default_display == display)
|
||||
{
|
||||
if (manager_quartz->displays)
|
||||
gdk_display_manager_set_default_display (manager, manager_quartz->displays->data);
|
||||
else
|
||||
gdk_display_manager_set_default_display (manager, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -155,6 +155,12 @@ gchar * _gdk_quartz_display_utf8_to_string_target (GdkDisplay *disp
|
||||
const gchar *str);
|
||||
|
||||
|
||||
/* Display manager */
|
||||
void _gdk_quartz_display_manager_add_display (GdkDisplayManager *manager,
|
||||
GdkDisplay *display);
|
||||
void _gdk_quartz_display_manager_remove_display (GdkDisplayManager *manager,
|
||||
GdkDisplay *display);
|
||||
|
||||
/* Display manager methods - events */
|
||||
GdkAtom _gdk_quartz_display_manager_atom_intern (GdkDisplayManager *manager,
|
||||
const gchar *atom_name,
|
||||
|
||||
@@ -55,10 +55,6 @@ typedef enum
|
||||
|
||||
GdkOSXVersion gdk_quartz_osx_version (void);
|
||||
|
||||
GdkAtom gdk_quartz_pasteboard_type_to_atom_libgtk_only (NSString *type);
|
||||
NSString *gdk_quartz_target_to_pasteboard_type_libgtk_only (const gchar *target);
|
||||
NSString *gdk_quartz_atom_to_pasteboard_type_libgtk_only (GdkAtom atom);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#define __GDKQUARTZ_H_INSIDE__
|
||||
|
||||
@@ -301,6 +301,16 @@ gdk_quartz_screen_get_number (GdkScreen *screen)
|
||||
return 0;
|
||||
}
|
||||
|
||||
gchar *
|
||||
_gdk_windowing_substitute_screen_number (const gchar *display_name,
|
||||
int screen_number)
|
||||
{
|
||||
if (screen_number != 0)
|
||||
return NULL;
|
||||
|
||||
return g_strdup (display_name);
|
||||
}
|
||||
|
||||
static gint
|
||||
gdk_quartz_screen_get_width (GdkScreen *screen)
|
||||
{
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
|
||||
#include "gdkselection.h"
|
||||
#include "gdkproperty.h"
|
||||
#include "gdkquartz.h"
|
||||
|
||||
gboolean
|
||||
_gdk_quartz_display_set_selection_owner (GdkDisplay *display,
|
||||
@@ -172,42 +171,3 @@ _gdk_quartz_display_text_property_to_utf8_list (GdkDisplay *display,
|
||||
}
|
||||
}
|
||||
|
||||
GdkAtom
|
||||
gdk_quartz_pasteboard_type_to_atom_libgtk_only (NSString *type)
|
||||
{
|
||||
if ([type isEqualToString:NSStringPboardType])
|
||||
return gdk_atom_intern_static_string ("UTF8_STRING");
|
||||
else if ([type isEqualToString:NSTIFFPboardType])
|
||||
return gdk_atom_intern_static_string ("image/tiff");
|
||||
else if ([type isEqualToString:NSColorPboardType])
|
||||
return gdk_atom_intern_static_string ("application/x-color");
|
||||
else if ([type isEqualToString:NSURLPboardType])
|
||||
return gdk_atom_intern_static_string ("text/uri-list");
|
||||
else
|
||||
return gdk_atom_intern ([type UTF8String], FALSE);
|
||||
}
|
||||
|
||||
NSString *
|
||||
gdk_quartz_target_to_pasteboard_type_libgtk_only (const char *target)
|
||||
{
|
||||
if (strcmp (target, "UTF8_STRING") == 0)
|
||||
return NSStringPboardType;
|
||||
else if (strcmp (target, "image/tiff") == 0)
|
||||
return NSTIFFPboardType;
|
||||
else if (strcmp (target, "application/x-color") == 0)
|
||||
return NSColorPboardType;
|
||||
else if (strcmp (target, "text/uri-list") == 0)
|
||||
return NSURLPboardType;
|
||||
else
|
||||
return [NSString stringWithUTF8String:target];
|
||||
}
|
||||
|
||||
NSString *
|
||||
gdk_quartz_atom_to_pasteboard_type_libgtk_only (GdkAtom atom)
|
||||
{
|
||||
gchar *target = gdk_atom_name (atom);
|
||||
NSString *ret = gdk_quartz_target_to_pasteboard_type_libgtk_only (target);
|
||||
g_free (target);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -31,10 +31,6 @@ TEST_PROGS += display
|
||||
display_SOURCES = display.c
|
||||
display_LDADD = $(progs_ldadd)
|
||||
|
||||
TEST_PROGS += keysyms
|
||||
keysyms_SOURCES = keysyms.c
|
||||
keysyms_LDADD = $(progs_ldadd)
|
||||
|
||||
CLEANFILES = \
|
||||
cairosurface.png \
|
||||
gdksurface.png
|
||||
|
||||
@@ -1,69 +0,0 @@
|
||||
#include <locale.h>
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
static void
|
||||
test_keysyms_basic (void)
|
||||
{
|
||||
struct {
|
||||
guint keyval;
|
||||
const gchar *name;
|
||||
const gchar *other_name;
|
||||
} tests[] = {
|
||||
{ GDK_KEY_space, "space", NULL },
|
||||
{ GDK_KEY_a, "a", NULL },
|
||||
{ GDK_KEY_Thorn, "Thorn", "THORN" },
|
||||
{ GDK_KEY_Hangul_J_RieulTieut, "Hangul_J_RieulTieut", NULL },
|
||||
{ GDK_KEY_Page_Up, "Page_Up", NULL },
|
||||
{ GDK_KEY_KP_Multiply, "KP_Multiply", NULL },
|
||||
{ GDK_KEY_MonBrightnessUp, "MonBrightnessUp", NULL },
|
||||
{ 0, NULL }
|
||||
};
|
||||
gint i;
|
||||
|
||||
for (i = 0; tests[i].keyval != 0; i++)
|
||||
{
|
||||
g_assert_cmpstr (gdk_keyval_name (tests[i].keyval), ==, tests[i].name);
|
||||
g_assert_cmpuint (gdk_keyval_from_name (tests[i].name), ==, tests[i].keyval);
|
||||
if (tests[i].other_name)
|
||||
g_assert_cmpuint (gdk_keyval_from_name (tests[i].other_name), ==, tests[i].keyval);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
test_keysyms_void (void)
|
||||
{
|
||||
g_assert_cmpuint (gdk_keyval_from_name ("NoSuchKeysym"), ==, GDK_KEY_VoidSymbol);
|
||||
g_assert_cmpstr (gdk_keyval_name (GDK_KEY_VoidSymbol), ==, "0xffffff");
|
||||
}
|
||||
|
||||
static void
|
||||
test_keysyms_xf86 (void)
|
||||
{
|
||||
g_assert_cmpuint (gdk_keyval_from_name ("XF86MonBrightnessUp"), ==, GDK_KEY_MonBrightnessUp);
|
||||
g_assert_cmpuint (gdk_keyval_from_name ("XF86MonBrightnessDown"), ==, GDK_KEY_MonBrightnessDown);
|
||||
g_assert_cmpuint (gdk_keyval_from_name ("XF86KbdBrightnessUp"), ==, GDK_KEY_KbdBrightnessUp);
|
||||
g_assert_cmpuint (gdk_keyval_from_name ("XF86KbdBrightnessDown"), ==, GDK_KEY_KbdBrightnessDown);
|
||||
g_assert_cmpuint (gdk_keyval_from_name ("XF86Battery"), ==, GDK_KEY_Battery);
|
||||
g_assert_cmpuint (gdk_keyval_from_name ("XF86Display"), ==, GDK_KEY_Display);
|
||||
|
||||
g_assert_cmpuint (gdk_keyval_from_name ("MonBrightnessUp"), ==, GDK_KEY_MonBrightnessUp);
|
||||
g_assert_cmpuint (gdk_keyval_from_name ("MonBrightnessDown"), ==, GDK_KEY_MonBrightnessDown);
|
||||
g_assert_cmpuint (gdk_keyval_from_name ("KbdBrightnessUp"), ==, GDK_KEY_KbdBrightnessUp);
|
||||
g_assert_cmpuint (gdk_keyval_from_name ("KbdBrightnessDown"), ==, GDK_KEY_KbdBrightnessDown);
|
||||
g_assert_cmpuint (gdk_keyval_from_name ("Battery"), ==, GDK_KEY_Battery);
|
||||
g_assert_cmpuint (gdk_keyval_from_name ("Display"), ==, GDK_KEY_Display);
|
||||
}
|
||||
|
||||
int main (int argc, char *argv[])
|
||||
{
|
||||
setlocale (LC_ALL, "");
|
||||
|
||||
g_test_init (&argc, &argv, NULL);
|
||||
gdk_init (&argc, &argv);
|
||||
|
||||
g_test_add_func ("/keysyms/basic", test_keysyms_basic);
|
||||
g_test_add_func ("/keysyms/void", test_keysyms_void);
|
||||
g_test_add_func ("/keysyms/xf86", test_keysyms_xf86);
|
||||
|
||||
return g_test_run ();
|
||||
}
|
||||
@@ -40,8 +40,6 @@ libgdkinclude_HEADERS = \
|
||||
libgdkwaylandinclude_HEADERS = \
|
||||
gdkwaylanddevice.h \
|
||||
gdkwaylanddisplay.h \
|
||||
gdkwaylanddisplaymanager.h \
|
||||
gdkwaylandselection.h \
|
||||
gdkwaylandwindow.h
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
||||
|
||||
@@ -51,15 +51,10 @@ struct _GdkWaylandCursor
|
||||
GdkCursor cursor;
|
||||
gchar *name;
|
||||
guint serial;
|
||||
|
||||
struct
|
||||
{
|
||||
int hotspot_x, hotspot_y;
|
||||
int width, height;
|
||||
struct wl_buffer *buffer;
|
||||
} pixbuf;
|
||||
|
||||
struct wl_cursor *wl_cursor;
|
||||
int hotspot_x, hotspot_y;
|
||||
int width, height;
|
||||
struct wl_buffer *buffer;
|
||||
gboolean free_buffer;
|
||||
};
|
||||
|
||||
struct _GdkWaylandCursorClass
|
||||
@@ -150,7 +145,13 @@ set_cursor_from_theme (GdkWaylandCursor *cursor, struct wl_cursor_theme *theme)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
cursor->wl_cursor = c;
|
||||
cursor->hotspot_x = c->images[0]->hotspot_x;
|
||||
cursor->hotspot_y = c->images[0]->hotspot_y;
|
||||
cursor->width = c->images[0]->width;
|
||||
cursor->height = c->images[0]->height;
|
||||
|
||||
cursor->buffer = wl_cursor_image_get_buffer(c->images[0]);
|
||||
cursor->free_buffer = FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -168,8 +169,8 @@ gdk_wayland_cursor_finalize (GObject *object)
|
||||
GdkWaylandCursor *cursor = GDK_WAYLAND_CURSOR (object);
|
||||
|
||||
g_free (cursor->name);
|
||||
if (cursor->pixbuf.buffer)
|
||||
wl_buffer_destroy (cursor->pixbuf.buffer);
|
||||
if (cursor->free_buffer)
|
||||
wl_buffer_destroy (cursor->buffer);
|
||||
|
||||
G_OBJECT_CLASS (_gdk_wayland_cursor_parent_class)->finalize (object);
|
||||
}
|
||||
@@ -182,72 +183,20 @@ gdk_wayland_cursor_get_image (GdkCursor *cursor)
|
||||
|
||||
struct wl_buffer *
|
||||
_gdk_wayland_cursor_get_buffer (GdkCursor *cursor,
|
||||
guint image_index,
|
||||
int *hotspot_x,
|
||||
int *hotspot_y,
|
||||
int *x,
|
||||
int *y,
|
||||
int *w,
|
||||
int *h)
|
||||
{
|
||||
GdkWaylandCursor *wayland_cursor = GDK_WAYLAND_CURSOR (cursor);
|
||||
|
||||
if (wayland_cursor->wl_cursor)
|
||||
{
|
||||
struct wl_cursor_image *image;
|
||||
*x = wayland_cursor->hotspot_x;
|
||||
*y = wayland_cursor->hotspot_y;
|
||||
|
||||
if (image_index >= wayland_cursor->wl_cursor->image_count)
|
||||
{
|
||||
g_warning (G_STRLOC " out of bounds cursor image [%d / %d]",
|
||||
image_index,
|
||||
wayland_cursor->wl_cursor->image_count - 1);
|
||||
image_index = 0;
|
||||
}
|
||||
*w = wayland_cursor->width;
|
||||
*h = wayland_cursor->height;
|
||||
|
||||
image = wayland_cursor->wl_cursor->images[image_index];
|
||||
|
||||
*hotspot_x = image->hotspot_x;
|
||||
*hotspot_y = image->hotspot_y;
|
||||
|
||||
*w = image->width;
|
||||
*h = image->height;
|
||||
|
||||
return wl_cursor_image_get_buffer (image);
|
||||
}
|
||||
else /* From pixbuf */
|
||||
{
|
||||
*hotspot_x = wayland_cursor->pixbuf.hotspot_x;
|
||||
*hotspot_y = wayland_cursor->pixbuf.hotspot_y;
|
||||
|
||||
*w = wayland_cursor->pixbuf.width;
|
||||
*h = wayland_cursor->pixbuf.height;
|
||||
|
||||
return wayland_cursor->pixbuf.buffer;
|
||||
}
|
||||
}
|
||||
|
||||
guint
|
||||
_gdk_wayland_cursor_get_next_image_index (GdkCursor *cursor,
|
||||
guint current_image_index,
|
||||
guint *next_image_delay)
|
||||
{
|
||||
struct wl_cursor *wl_cursor = GDK_WAYLAND_CURSOR (cursor)->wl_cursor;
|
||||
|
||||
if (wl_cursor && wl_cursor->image_count > 1)
|
||||
{
|
||||
if (current_image_index >= wl_cursor->image_count)
|
||||
{
|
||||
g_warning (G_STRLOC " out of bounds cursor image [%d / %d]",
|
||||
current_image_index, wl_cursor->image_count - 1);
|
||||
current_image_index = 0;
|
||||
}
|
||||
|
||||
/* Return the time to next image */
|
||||
if (next_image_delay)
|
||||
*next_image_delay = wl_cursor->images[current_image_index]->delay;
|
||||
|
||||
return (current_image_index + 1) % wl_cursor->image_count;
|
||||
}
|
||||
else
|
||||
return current_image_index;
|
||||
return wayland_cursor->buffer;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -374,6 +323,11 @@ _gdk_wayland_display_get_cursor_for_name (GdkDisplay *display,
|
||||
if (!set_cursor_from_theme (private, wayland_display->cursor_theme))
|
||||
return GDK_CURSOR (private);
|
||||
|
||||
/* TODO: Do something clever so we can do animated cursors - move the
|
||||
* wl_pointer_set_cursor to a function here so that we can do the magic to
|
||||
* iterate through
|
||||
*/
|
||||
|
||||
add_to_cache (wayland_display, private);
|
||||
|
||||
return GDK_CURSOR (private);
|
||||
@@ -403,37 +357,38 @@ _gdk_wayland_display_get_cursor_for_pixbuf (GdkDisplay *display,
|
||||
NULL);
|
||||
cursor->name = NULL;
|
||||
cursor->serial = theme_serial;
|
||||
cursor->pixbuf.hotspot_x = x;
|
||||
cursor->pixbuf.hotspot_y = y;
|
||||
cursor->hotspot_x = x;
|
||||
cursor->hotspot_y = y;
|
||||
|
||||
if (pixbuf)
|
||||
{
|
||||
cursor->pixbuf.width = gdk_pixbuf_get_width (pixbuf);
|
||||
cursor->pixbuf.height = gdk_pixbuf_get_height (pixbuf);
|
||||
cursor->width = gdk_pixbuf_get_width (pixbuf);
|
||||
cursor->height = gdk_pixbuf_get_height (pixbuf);
|
||||
}
|
||||
else
|
||||
{
|
||||
cursor->pixbuf.width = 1;
|
||||
cursor->pixbuf.height = 1;
|
||||
cursor->width = 1;
|
||||
cursor->height = 1;
|
||||
}
|
||||
|
||||
pool = _create_shm_pool (wayland_display->shm,
|
||||
cursor->pixbuf.width,
|
||||
cursor->pixbuf.height,
|
||||
cursor->width,
|
||||
cursor->height,
|
||||
&size,
|
||||
&data);
|
||||
|
||||
if (pixbuf)
|
||||
set_pixbuf (data, cursor->pixbuf.width, cursor->pixbuf.height, pixbuf);
|
||||
set_pixbuf (data, cursor->width, cursor->height, pixbuf);
|
||||
else
|
||||
memset (data, 0, 4);
|
||||
|
||||
stride = cursor->pixbuf.width * 4;
|
||||
cursor->pixbuf.buffer = wl_shm_pool_create_buffer (pool, 0,
|
||||
cursor->pixbuf.width,
|
||||
cursor->pixbuf.height,
|
||||
stride,
|
||||
WL_SHM_FORMAT_ARGB8888);
|
||||
stride = cursor->width * 4;
|
||||
cursor->buffer = wl_shm_pool_create_buffer (pool, 0,
|
||||
cursor->width,
|
||||
cursor->height,
|
||||
stride,
|
||||
WL_SHM_FORMAT_ARGB8888);
|
||||
cursor->free_buffer = FALSE;
|
||||
|
||||
wl_shm_pool_destroy (pool);
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#include "gdkkeysyms.h"
|
||||
#include "gdkdeviceprivate.h"
|
||||
#include "gdkdevicemanagerprivate.h"
|
||||
#include "gdkprivate-wayland.h"
|
||||
|
||||
#include <xkbcommon/xkbcommon.h>
|
||||
#include <X11/keysym.h>
|
||||
@@ -37,13 +38,14 @@
|
||||
#include <sys/time.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
typedef struct _GdkWaylandDeviceData GdkWaylandDeviceData;
|
||||
|
||||
typedef struct _DataOffer DataOffer;
|
||||
|
||||
typedef struct _GdkWaylandSelectionOffer GdkWaylandSelectionOffer;
|
||||
|
||||
struct _GdkWaylandDeviceData
|
||||
{
|
||||
guint32 id;
|
||||
struct wl_seat *wl_seat;
|
||||
struct wl_pointer *wl_pointer;
|
||||
struct wl_keyboard *wl_keyboard;
|
||||
@@ -63,7 +65,6 @@ struct _GdkWaylandDeviceData
|
||||
double surface_x, surface_y;
|
||||
uint32_t time;
|
||||
uint32_t enter_serial;
|
||||
uint32_t button_press_serial;
|
||||
GdkWindow *pointer_grab_window;
|
||||
uint32_t pointer_grab_time;
|
||||
guint32 repeat_timer;
|
||||
@@ -71,9 +72,6 @@ struct _GdkWaylandDeviceData
|
||||
guint32 repeat_count;
|
||||
GSettings *keyboard_settings;
|
||||
|
||||
guint cursor_timeout_id;
|
||||
guint cursor_image_index;
|
||||
|
||||
DataOffer *drag_offer;
|
||||
DataOffer *selection_offer;
|
||||
|
||||
@@ -147,63 +145,14 @@ gdk_wayland_device_get_state (GdkDevice *device,
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_wayland_device_stop_window_cursor_animation (GdkWaylandDeviceData *wd)
|
||||
{
|
||||
if (wd->cursor_timeout_id > 0)
|
||||
{
|
||||
g_source_remove (wd->cursor_timeout_id);
|
||||
wd->cursor_timeout_id = 0;
|
||||
}
|
||||
wd->cursor_image_index = 0;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gdk_wayland_device_update_window_cursor (GdkWaylandDeviceData *wd)
|
||||
{
|
||||
struct wl_buffer *buffer;
|
||||
int x, y, w, h;
|
||||
guint next_image_index, next_image_delay;
|
||||
|
||||
buffer = _gdk_wayland_cursor_get_buffer (wd->cursor, wd->cursor_image_index,
|
||||
&x, &y, &w, &h);
|
||||
wl_pointer_set_cursor (wd->wl_pointer,
|
||||
wd->enter_serial,
|
||||
wd->pointer_surface,
|
||||
x, y);
|
||||
wl_surface_attach (wd->pointer_surface, buffer, 0, 0);
|
||||
wl_surface_damage (wd->pointer_surface, 0, 0, w, h);
|
||||
wl_surface_commit (wd->pointer_surface);
|
||||
|
||||
next_image_index =
|
||||
_gdk_wayland_cursor_get_next_image_index (wd->cursor,
|
||||
wd->cursor_image_index,
|
||||
&next_image_delay);
|
||||
|
||||
if (next_image_index != wd->cursor_image_index)
|
||||
{
|
||||
guint id;
|
||||
|
||||
/* Queue timeout for next frame */
|
||||
id = g_timeout_add (next_image_delay,
|
||||
(GSourceFunc)gdk_wayland_device_update_window_cursor,
|
||||
wd);
|
||||
|
||||
wd->cursor_timeout_id = id;
|
||||
wd->cursor_image_index = next_image_index;
|
||||
}
|
||||
else
|
||||
wd->cursor_timeout_id = 0;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_wayland_device_set_window_cursor (GdkDevice *device,
|
||||
GdkWindow *window,
|
||||
GdkCursor *cursor)
|
||||
{
|
||||
GdkWaylandDeviceData *wd = GDK_WAYLAND_DEVICE(device)->device;
|
||||
struct wl_buffer *buffer;
|
||||
int x, y, w, h;
|
||||
|
||||
/* Setting the cursor to NULL means that we should use the default cursor */
|
||||
if (!cursor)
|
||||
@@ -216,14 +165,19 @@ gdk_wayland_device_set_window_cursor (GdkDevice *device,
|
||||
if (cursor == wd->cursor)
|
||||
return;
|
||||
|
||||
gdk_wayland_device_stop_window_cursor_animation (wd);
|
||||
|
||||
if (wd->cursor)
|
||||
g_object_unref (wd->cursor);
|
||||
|
||||
wd->cursor = g_object_ref (cursor);
|
||||
|
||||
gdk_wayland_device_update_window_cursor (wd);
|
||||
buffer = _gdk_wayland_cursor_get_buffer (wd->cursor, &x, &y, &w, &h);
|
||||
wl_pointer_set_cursor (wd->wl_pointer,
|
||||
wd->enter_serial,
|
||||
wd->pointer_surface,
|
||||
x, y);
|
||||
wl_surface_attach (wd->pointer_surface, buffer, 0, 0);
|
||||
wl_surface_damage (wd->pointer_surface, 0, 0, w, h);
|
||||
wl_surface_commit (wd->pointer_surface);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -255,11 +209,13 @@ gdk_wayland_device_query_state (GdkDevice *device,
|
||||
*root_window = gdk_screen_get_root_window (default_screen);
|
||||
if (child_window)
|
||||
*child_window = wd->pointer_focus;
|
||||
/* TODO: Do something clever for relative here */
|
||||
/* Do something clever for relative here */
|
||||
#if 0
|
||||
if (root_x)
|
||||
*root_x = wd->surface_x;
|
||||
*root_x = wd->x;
|
||||
if (root_y)
|
||||
*root_y = wd->surface_y;
|
||||
*root_y = wd->y;
|
||||
#endif
|
||||
if (win_x)
|
||||
*win_x = wd->surface_x;
|
||||
if (win_y)
|
||||
@@ -667,7 +623,6 @@ pointer_handle_leave (void *data,
|
||||
g_object_unref(device->pointer_focus);
|
||||
if (device->cursor)
|
||||
{
|
||||
gdk_wayland_device_stop_window_cursor_animation (device);
|
||||
g_object_unref (device->cursor);
|
||||
device->cursor = NULL;
|
||||
}
|
||||
@@ -741,8 +696,6 @@ pointer_handle_button (void *data,
|
||||
}
|
||||
|
||||
device->time = time;
|
||||
if (state)
|
||||
device->button_press_serial = serial;
|
||||
|
||||
event = gdk_event_new (state ? GDK_BUTTON_PRESS : GDK_BUTTON_RELEASE);
|
||||
event->button.window = g_object_ref (device->pointer_focus);
|
||||
@@ -827,7 +780,6 @@ keyboard_handle_keymap (void *data,
|
||||
|
||||
g_signal_emit_by_name (device->keymap, "keys-changed");
|
||||
g_signal_emit_by_name (device->keymap, "state-changed");
|
||||
g_signal_emit_by_name (device->keymap, "direction-changed");
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -901,6 +853,22 @@ keyboard_handle_leave (void *data,
|
||||
static gboolean
|
||||
keyboard_repeat (gpointer data);
|
||||
|
||||
static GdkModifierType
|
||||
get_modifier (struct xkb_state *state)
|
||||
{
|
||||
GdkModifierType modifiers = 0;
|
||||
modifiers |= (xkb_state_mod_name_is_active (state, XKB_MOD_NAME_SHIFT, XKB_STATE_MODS_EFFECTIVE) > 0)?GDK_SHIFT_MASK:0;
|
||||
modifiers |= (xkb_state_mod_name_is_active (state, XKB_MOD_NAME_CAPS, XKB_STATE_MODS_EFFECTIVE) > 0)?GDK_LOCK_MASK:0;
|
||||
modifiers |= (xkb_state_mod_name_is_active (state, XKB_MOD_NAME_CTRL, XKB_STATE_MODS_EFFECTIVE) > 0)?GDK_CONTROL_MASK:0;
|
||||
modifiers |= (xkb_state_mod_name_is_active (state, XKB_MOD_NAME_ALT, XKB_STATE_MODS_EFFECTIVE) > 0)?GDK_MOD1_MASK:0;
|
||||
modifiers |= (xkb_state_mod_name_is_active (state, "Mod2", XKB_STATE_MODS_EFFECTIVE) > 0)?GDK_MOD2_MASK:0;
|
||||
modifiers |= (xkb_state_mod_name_is_active (state, "Mod3", XKB_STATE_MODS_EFFECTIVE) > 0)?GDK_MOD3_MASK:0;
|
||||
modifiers |= (xkb_state_mod_name_is_active (state, XKB_MOD_NAME_LOGO, XKB_STATE_MODS_EFFECTIVE) > 0)?GDK_MOD4_MASK:0;
|
||||
modifiers |= (xkb_state_mod_name_is_active (state, "Mod5", XKB_STATE_MODS_EFFECTIVE) > 0)?GDK_MOD5_MASK:0;
|
||||
|
||||
return modifiers;
|
||||
}
|
||||
|
||||
static void
|
||||
translate_keyboard_string (GdkEventKey *event)
|
||||
{
|
||||
@@ -1006,7 +974,7 @@ deliver_key_event(GdkWaylandDeviceData *device,
|
||||
sym = xkb_state_key_get_one_sym (xkb_state, key);
|
||||
|
||||
device->time = time;
|
||||
device->modifiers = gdk_keymap_get_modifier_state (keymap);
|
||||
device->modifiers = get_modifier (xkb_state);
|
||||
|
||||
event = gdk_event_new (state ? GDK_KEY_PRESS : GDK_KEY_RELEASE);
|
||||
event->key.window = device->keyboard_focus?g_object_ref (device->keyboard_focus):NULL;
|
||||
@@ -1014,9 +982,10 @@ deliver_key_event(GdkWaylandDeviceData *device,
|
||||
event->button.time = time;
|
||||
event->key.state = device->modifiers;
|
||||
event->key.group = 0;
|
||||
event->key.hardware_keycode = key;
|
||||
event->key.hardware_keycode = sym;
|
||||
event->key.keyval = sym;
|
||||
event->key.is_modifier = _gdk_wayland_keymap_key_is_modifier (keymap, key);
|
||||
|
||||
event->key.is_modifier = device->modifiers > 0;
|
||||
|
||||
translate_keyboard_string (&event->key);
|
||||
|
||||
@@ -1104,18 +1073,14 @@ keyboard_handle_modifiers (void *data,
|
||||
GdkWaylandDeviceData *device = data;
|
||||
GdkKeymap *keymap;
|
||||
struct xkb_state *xkb_state;
|
||||
PangoDirection direction;
|
||||
|
||||
keymap = device->keymap;
|
||||
direction = gdk_keymap_get_direction (keymap);
|
||||
xkb_state = _gdk_wayland_keymap_get_xkb_state (keymap);
|
||||
device->modifiers = mods_depressed | mods_latched | mods_locked;
|
||||
|
||||
xkb_state_update_mask (xkb_state, mods_depressed, mods_latched, mods_locked, group, 0, 0);
|
||||
|
||||
g_signal_emit_by_name (keymap, "state-changed");
|
||||
if (direction != gdk_keymap_get_direction (keymap))
|
||||
g_signal_emit_by_name (keymap, "direction-changed");
|
||||
}
|
||||
|
||||
static const struct wl_pointer_listener pointer_listener = {
|
||||
@@ -1162,8 +1127,6 @@ seat_handle_capabilities(void *data, struct wl_seat *seat,
|
||||
|
||||
device_manager->devices =
|
||||
g_list_prepend (device_manager->devices, device->pointer);
|
||||
|
||||
g_signal_emit_by_name (device_manager, "device-added", device->pointer);
|
||||
}
|
||||
else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && device->wl_pointer)
|
||||
{
|
||||
@@ -1173,12 +1136,11 @@ seat_handle_capabilities(void *data, struct wl_seat *seat,
|
||||
device_manager->devices =
|
||||
g_list_remove (device_manager->devices, device->pointer);
|
||||
|
||||
g_signal_emit_by_name (device_manager, "device-removed", device->pointer);
|
||||
g_object_unref (device->pointer);
|
||||
device->pointer = NULL;
|
||||
}
|
||||
|
||||
if ((caps & WL_SEAT_CAPABILITY_KEYBOARD) && !device->wl_keyboard)
|
||||
if ((caps & WL_SEAT_CAPABILITY_KEYBOARD) && !device->wl_keyboard)
|
||||
{
|
||||
device->wl_keyboard = wl_seat_get_keyboard(seat);
|
||||
wl_keyboard_set_user_data(device->wl_keyboard, device);
|
||||
@@ -1198,8 +1160,6 @@ seat_handle_capabilities(void *data, struct wl_seat *seat,
|
||||
|
||||
device_manager->devices =
|
||||
g_list_prepend (device_manager->devices, device->keyboard);
|
||||
|
||||
g_signal_emit_by_name (device_manager, "device-added", device->keyboard);
|
||||
}
|
||||
else if (!(caps & WL_SEAT_CAPABILITY_KEYBOARD) && device->wl_keyboard)
|
||||
{
|
||||
@@ -1209,7 +1169,6 @@ seat_handle_capabilities(void *data, struct wl_seat *seat,
|
||||
device_manager->devices =
|
||||
g_list_remove (device_manager->devices, device->keyboard);
|
||||
|
||||
g_signal_emit_by_name (device_manager, "device-removed", device->keyboard);
|
||||
g_object_unref (device->keyboard);
|
||||
device->keyboard = NULL;
|
||||
}
|
||||
@@ -1241,9 +1200,8 @@ init_settings (GdkWaylandDeviceData *device)
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_wayland_device_manager_add_seat (GdkDeviceManager *device_manager,
|
||||
guint32 id,
|
||||
struct wl_seat *wl_seat)
|
||||
_gdk_wayland_device_manager_add_device (GdkDeviceManager *device_manager,
|
||||
struct wl_seat *wl_seat)
|
||||
{
|
||||
GdkDisplay *display;
|
||||
GdkWaylandDisplay *display_wayland;
|
||||
@@ -1253,7 +1211,6 @@ _gdk_wayland_device_manager_add_seat (GdkDeviceManager *device_manager,
|
||||
display_wayland = GDK_WAYLAND_DISPLAY (display);
|
||||
|
||||
device = g_new0 (GdkWaylandDeviceData, 1);
|
||||
device->id = id;
|
||||
device->keymap = _gdk_wayland_keymap_new ();
|
||||
device->display = display;
|
||||
device->device_manager = device_manager;
|
||||
@@ -1275,32 +1232,6 @@ _gdk_wayland_device_manager_add_seat (GdkDeviceManager *device_manager,
|
||||
init_settings (device);
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_wayland_device_manager_remove_seat (GdkDeviceManager *manager,
|
||||
guint32 id)
|
||||
{
|
||||
GdkWaylandDeviceManager *device_manager = GDK_WAYLAND_DEVICE_MANAGER (manager);
|
||||
GList *l;
|
||||
|
||||
for (l = device_manager->devices; l != NULL; l = l->next)
|
||||
{
|
||||
GdkWaylandDevice *wayland_device = l->data;
|
||||
GdkWaylandDeviceData *device = wayland_device->device;
|
||||
|
||||
if (device->id == id)
|
||||
{
|
||||
seat_handle_capabilities (device, device->wl_seat, 0);
|
||||
g_object_unref (device->keymap);
|
||||
wl_surface_destroy (device->pointer_surface);
|
||||
/* FIXME: destroy data_device */
|
||||
g_clear_object (&device->keyboard_settings);
|
||||
g_free (device);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
free_device (gpointer data)
|
||||
{
|
||||
@@ -1379,12 +1310,6 @@ _gdk_wayland_device_manager_new (GdkDisplay *display)
|
||||
NULL);
|
||||
}
|
||||
|
||||
uint32_t
|
||||
_gdk_wayland_device_get_button_press_serial(GdkWaylandDeviceData *device)
|
||||
{
|
||||
return device->button_press_serial;
|
||||
}
|
||||
|
||||
gint
|
||||
gdk_wayland_device_get_selection_type_atoms (GdkDevice *gdk_device,
|
||||
GdkAtom **atoms_out)
|
||||
|
||||
@@ -34,40 +34,6 @@
|
||||
#include "gdkkeysprivate.h"
|
||||
#include "gdkprivate-wayland.h"
|
||||
|
||||
/**
|
||||
* SECTION:wayland_interaction
|
||||
* @Short_description: Wayland backend-specific functions
|
||||
* @Title: Wayland Interaction
|
||||
*
|
||||
* The functions in this section are specific to the GDK Wayland backend.
|
||||
* To use them, you need to include the <literal><gdk/gdkwayland.h></literal>
|
||||
* header and use the Wayland-specific pkg-config files to build your
|
||||
* application (either <literal>gdk-wayland-3.0</literal> or
|
||||
* <literal>gtk+-wayland-3.0</literal>).
|
||||
*
|
||||
* To make your code compile with other GDK backends, guard backend-specific
|
||||
* calls by an ifdef as follows. Since GDK may be built with multiple
|
||||
* backends, you should also check for the backend that is in use (e.g. by
|
||||
* using the GDK_IS_WAYLAND_DISPLAY() macro).
|
||||
* |[
|
||||
* #ifdef GDK_WINDOWING_WAYLAND
|
||||
* if (GDK_IS_WAYLAND_DISPLAY (display))
|
||||
* {
|
||||
* /* make Wayland-specific calls here */
|
||||
* }
|
||||
* else
|
||||
* #endif
|
||||
* #ifdef GDK_WINDOWING_X11
|
||||
* if (GDK_IS_X11_DISPLAY (display))
|
||||
* {
|
||||
* /* make X11-specific calls here */
|
||||
* }
|
||||
* else
|
||||
* #endif
|
||||
* g_error ("Unsupported GDK backend");
|
||||
* ]|
|
||||
*/
|
||||
|
||||
static void _gdk_wayland_display_load_cursor_theme (GdkWaylandDisplay *wayland_display);
|
||||
|
||||
G_DEFINE_TYPE (GdkWaylandDisplay, gdk_wayland_display, GDK_TYPE_DISPLAY)
|
||||
@@ -122,29 +88,6 @@ gdk_input_init (GdkDisplay *display)
|
||||
g_list_free (list);
|
||||
}
|
||||
|
||||
static void
|
||||
init_sync_callback(void *data, struct wl_callback *callback, uint32_t serial)
|
||||
{
|
||||
GdkWaylandDisplay *display = data;
|
||||
|
||||
display->init_ref_count--;
|
||||
wl_callback_destroy(callback);
|
||||
}
|
||||
|
||||
static const struct wl_callback_listener init_sync_listener = {
|
||||
init_sync_callback
|
||||
};
|
||||
|
||||
static void
|
||||
wait_for_roundtrip(GdkWaylandDisplay *display)
|
||||
{
|
||||
struct wl_callback *callback;
|
||||
|
||||
display->init_ref_count++;
|
||||
callback = wl_display_sync(display->wl_display);
|
||||
wl_callback_add_listener(callback, &init_sync_listener, display);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_registry_handle_global(void *data, struct wl_registry *registry, uint32_t id,
|
||||
const char *interface, uint32_t version)
|
||||
@@ -169,18 +112,11 @@ gdk_registry_handle_global(void *data, struct wl_registry *registry, uint32_t id
|
||||
} else if (strcmp(interface, "wl_output") == 0) {
|
||||
output =
|
||||
wl_registry_bind(display_wayland->wl_registry, id, &wl_output_interface, 1);
|
||||
_gdk_wayland_screen_add_output(display_wayland->screen, id, output);
|
||||
/* We need another roundtrip to receive the modes and geometry
|
||||
* events for the output, which gives us the physical properties
|
||||
* and available modes on the output. */
|
||||
wait_for_roundtrip(display_wayland);
|
||||
_gdk_wayland_screen_add_output(display_wayland->screen, output);
|
||||
} else if (strcmp(interface, "wl_seat") == 0) {
|
||||
seat = wl_registry_bind(display_wayland->wl_registry, id, &wl_seat_interface, 1);
|
||||
_gdk_wayland_device_manager_add_seat (gdk_display->device_manager, id, seat);
|
||||
/* We need another roundtrip to receive the wl_seat capabilities
|
||||
* event which informs us of available input devices on this
|
||||
* seat. */
|
||||
wait_for_roundtrip(display_wayland);
|
||||
_gdk_wayland_device_manager_add_device (gdk_display->device_manager,
|
||||
seat);
|
||||
} else if (strcmp(interface, "wl_data_device_manager") == 0) {
|
||||
display_wayland->data_device_manager =
|
||||
wl_registry_bind(display_wayland->wl_registry, id,
|
||||
@@ -194,12 +130,9 @@ gdk_registry_handle_global_remove(void *data,
|
||||
uint32_t id)
|
||||
{
|
||||
GdkWaylandDisplay *display_wayland = data;
|
||||
GdkDisplay *display = GDK_DISPLAY (display_wayland);
|
||||
|
||||
_gdk_wayland_device_manager_remove_seat (display->device_manager, id);
|
||||
_gdk_wayland_screen_remove_output (display_wayland->screen, id);
|
||||
|
||||
/* FIXME: the object needs to be destroyed here, we're leaking */
|
||||
/* We don't know what this item is - try as an output */
|
||||
_gdk_wayland_screen_remove_output_by_id (display_wayland->screen, id);
|
||||
}
|
||||
|
||||
static const struct wl_registry_listener registry_listener = {
|
||||
@@ -207,12 +140,6 @@ static const struct wl_registry_listener registry_listener = {
|
||||
gdk_registry_handle_global_remove
|
||||
};
|
||||
|
||||
static void
|
||||
log_handler(const char *format, va_list args)
|
||||
{
|
||||
g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_ERROR, format, args);
|
||||
}
|
||||
|
||||
GdkDisplay *
|
||||
_gdk_wayland_display_open (const gchar *display_name)
|
||||
{
|
||||
@@ -220,8 +147,6 @@ _gdk_wayland_display_open (const gchar *display_name)
|
||||
GdkDisplay *display;
|
||||
GdkWaylandDisplay *display_wayland;
|
||||
|
||||
wl_log_set_handler_client(log_handler);
|
||||
|
||||
wl_display = wl_display_connect(display_name);
|
||||
if (!wl_display)
|
||||
return NULL;
|
||||
@@ -239,11 +164,7 @@ _gdk_wayland_display_open (const gchar *display_name)
|
||||
display_wayland->wl_registry = wl_display_get_registry(display_wayland->wl_display);
|
||||
wl_registry_add_listener(display_wayland->wl_registry, ®istry_listener, display_wayland);
|
||||
|
||||
/* We use init_ref_count to track whether some part of our
|
||||
* initialization still needs a roundtrip to complete. */
|
||||
wait_for_roundtrip(display_wayland);
|
||||
while (display_wayland->init_ref_count > 0)
|
||||
wl_display_roundtrip(display_wayland->wl_display);
|
||||
wl_display_dispatch(display_wayland->wl_display);
|
||||
|
||||
display_wayland->event_source =
|
||||
_gdk_wayland_display_event_source_new (display);
|
||||
@@ -251,6 +172,7 @@ _gdk_wayland_display_open (const gchar *display_name)
|
||||
gdk_input_init (display);
|
||||
|
||||
g_signal_emit_by_name (display, "opened");
|
||||
g_signal_emit_by_name (gdk_display_manager_get(), "display_opened", display);
|
||||
|
||||
return display;
|
||||
}
|
||||
@@ -300,6 +222,22 @@ gdk_wayland_display_get_name (GdkDisplay *display)
|
||||
return "Wayland";
|
||||
}
|
||||
|
||||
static gint
|
||||
gdk_wayland_display_get_n_screens (GdkDisplay *display)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static GdkScreen *
|
||||
gdk_wayland_display_get_screen (GdkDisplay *display,
|
||||
gint screen_num)
|
||||
{
|
||||
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
|
||||
g_return_val_if_fail (screen_num == 0, NULL);
|
||||
|
||||
return GDK_WAYLAND_DISPLAY (display)->screen;
|
||||
}
|
||||
|
||||
static GdkScreen *
|
||||
gdk_wayland_display_get_default_screen (GdkDisplay *display)
|
||||
{
|
||||
@@ -423,6 +361,11 @@ gdk_wayland_display_get_next_serial (GdkDisplay *display)
|
||||
return ++serial;
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_wayland_display_make_default (GdkDisplay *display)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* gdk_wayland_display_broadcast_startup_message:
|
||||
* @display: a #GdkDisplay
|
||||
@@ -529,8 +472,6 @@ _gdk_wayland_display_get_keymap (GdkDisplay *display)
|
||||
break;
|
||||
}
|
||||
|
||||
g_list_free (list);
|
||||
|
||||
if (core_keyboard && tmp_keymap)
|
||||
{
|
||||
g_object_unref (tmp_keymap);
|
||||
@@ -568,6 +509,8 @@ gdk_wayland_display_class_init (GdkWaylandDisplayClass * class)
|
||||
|
||||
display_class->window_type = gdk_wayland_window_get_type ();
|
||||
display_class->get_name = gdk_wayland_display_get_name;
|
||||
display_class->get_n_screens = gdk_wayland_display_get_n_screens;
|
||||
display_class->get_screen = gdk_wayland_display_get_screen;
|
||||
display_class->get_default_screen = gdk_wayland_display_get_default_screen;
|
||||
display_class->beep = gdk_wayland_display_beep;
|
||||
display_class->sync = gdk_wayland_display_sync;
|
||||
|
||||
@@ -66,8 +66,6 @@ struct _GdkWaylandDisplay
|
||||
|
||||
GSource *event_source;
|
||||
|
||||
int init_ref_count;
|
||||
|
||||
struct xkb_context *xkb_context;
|
||||
};
|
||||
|
||||
|
||||
@@ -27,12 +27,18 @@
|
||||
#include "gdkwayland.h"
|
||||
#include "gdkinternals.h"
|
||||
|
||||
#include <xkbcommon/xkbcommon.h>
|
||||
|
||||
struct _GdkWaylandDisplayManager
|
||||
{
|
||||
GdkDisplayManager parent;
|
||||
|
||||
GdkDisplay *default_display;
|
||||
GSList *displays;
|
||||
|
||||
GHashTable *name_to_atoms;
|
||||
guint next_atom;
|
||||
|
||||
gboolean init_failed;
|
||||
};
|
||||
|
||||
@@ -53,12 +59,6 @@ gdk_wayland_display_manager_initable_init (GInitable *initable,
|
||||
{
|
||||
struct wl_display *wl_display;
|
||||
|
||||
/* Set by the compositor when launching a special client - and it gets reset
|
||||
* by wl_display_connect so we must avoid calling it twice
|
||||
*/
|
||||
if (g_getenv ("WAYLAND_SOCKET"))
|
||||
return TRUE;
|
||||
|
||||
/* check that a connection to the default display is possible */
|
||||
wl_display = wl_display_connect (gdk_get_display_arg_name ());
|
||||
|
||||
@@ -88,17 +88,170 @@ gdk_wayland_display_manager_finalize (GObject *object)
|
||||
G_OBJECT_CLASS (gdk_wayland_display_manager_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static GdkDisplay *
|
||||
gdk_wayland_display_manager_open_display (GdkDisplayManager *manager,
|
||||
const gchar *name)
|
||||
{
|
||||
return _gdk_wayland_display_open (name);
|
||||
}
|
||||
|
||||
static GSList *
|
||||
gdk_wayland_display_manager_list_displays (GdkDisplayManager *manager)
|
||||
{
|
||||
return g_slist_copy (GDK_WAYLAND_DISPLAY_MANAGER (manager)->displays);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_wayland_display_manager_set_default_display (GdkDisplayManager *manager,
|
||||
GdkDisplay *display)
|
||||
{
|
||||
GDK_WAYLAND_DISPLAY_MANAGER (manager)->default_display = display;
|
||||
|
||||
_gdk_wayland_display_make_default (display);
|
||||
}
|
||||
|
||||
static GdkDisplay *
|
||||
gdk_wayland_display_manager_get_default_display (GdkDisplayManager *manager)
|
||||
{
|
||||
return GDK_WAYLAND_DISPLAY_MANAGER (manager)->default_display;
|
||||
}
|
||||
|
||||
static GdkAtom
|
||||
gdk_wayland_display_manager_atom_intern (GdkDisplayManager *manager_in,
|
||||
const gchar *atom_name,
|
||||
gboolean dup)
|
||||
{
|
||||
GdkWaylandDisplayManager *manager = GDK_WAYLAND_DISPLAY_MANAGER (manager_in);
|
||||
GdkAtom atom;
|
||||
gpointer data;
|
||||
const gchar *atom_name_intern;
|
||||
|
||||
atom_name_intern = g_intern_string (atom_name);
|
||||
data = g_hash_table_lookup (manager->name_to_atoms, atom_name_intern);
|
||||
|
||||
if (data)
|
||||
{
|
||||
atom = GDK_POINTER_TO_ATOM (data);
|
||||
return atom;
|
||||
}
|
||||
|
||||
atom = _GDK_MAKE_ATOM (manager->next_atom);
|
||||
|
||||
g_hash_table_insert (manager->name_to_atoms,
|
||||
(gchar *)atom_name_intern,
|
||||
GDK_ATOM_TO_POINTER (atom));
|
||||
manager->next_atom++;
|
||||
|
||||
return atom;
|
||||
}
|
||||
|
||||
static gchar *
|
||||
gdk_wayland_display_manager_get_atom_name (GdkDisplayManager *manager_in,
|
||||
GdkAtom atom)
|
||||
{
|
||||
GdkWaylandDisplayManager *manager = GDK_WAYLAND_DISPLAY_MANAGER (manager_in);
|
||||
GHashTableIter iter;
|
||||
gpointer key, value;
|
||||
|
||||
g_hash_table_iter_init (&iter, manager->name_to_atoms);
|
||||
|
||||
while (g_hash_table_iter_next (&iter, &key, &value))
|
||||
{
|
||||
if (GDK_POINTER_TO_ATOM (value) == atom)
|
||||
return g_strdup (key);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static guint
|
||||
gdk_wayland_display_manager_lookup_keyval (GdkDisplayManager *manager,
|
||||
const gchar *keyval_name)
|
||||
{
|
||||
g_return_val_if_fail (keyval_name != NULL, 0);
|
||||
|
||||
return xkb_keysym_from_name (keyval_name, 0);
|
||||
}
|
||||
|
||||
static gchar *
|
||||
gdk_wayland_display_manager_get_keyval_name (GdkDisplayManager *manager,
|
||||
guint keyval)
|
||||
{
|
||||
static char buf[128];
|
||||
|
||||
switch (keyval)
|
||||
{
|
||||
case GDK_KEY_Page_Up:
|
||||
return "Page_Up";
|
||||
case GDK_KEY_Page_Down:
|
||||
return "Page_Down";
|
||||
case GDK_KEY_KP_Page_Up:
|
||||
return "KP_Page_Up";
|
||||
case GDK_KEY_KP_Page_Down:
|
||||
return "KP_Page_Down";
|
||||
}
|
||||
|
||||
xkb_keysym_get_name(keyval, buf, sizeof (buf));
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_wayland_display_manager_class_init (GdkWaylandDisplayManagerClass *class)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (class);
|
||||
GdkDisplayManagerClass *manager_class = GDK_DISPLAY_MANAGER_CLASS (class);
|
||||
|
||||
object_class->finalize = gdk_wayland_display_manager_finalize;
|
||||
|
||||
manager_class->open_display = gdk_wayland_display_manager_open_display;
|
||||
manager_class->list_displays = gdk_wayland_display_manager_list_displays;
|
||||
manager_class->set_default_display = gdk_wayland_display_manager_set_default_display;
|
||||
manager_class->get_default_display = gdk_wayland_display_manager_get_default_display;
|
||||
manager_class->atom_intern = gdk_wayland_display_manager_atom_intern;
|
||||
manager_class->get_atom_name = gdk_wayland_display_manager_get_atom_name;
|
||||
manager_class->lookup_keyval = gdk_wayland_display_manager_lookup_keyval;
|
||||
manager_class->get_keyval_name = gdk_wayland_display_manager_get_keyval_name;
|
||||
}
|
||||
|
||||
static struct {
|
||||
const gchar *name;
|
||||
guint atom_id;
|
||||
} predefined_atoms[] = {
|
||||
{ "NONE", 0 },
|
||||
{ "PRIMARY", 1 },
|
||||
{ "SECONDARY", 2 },
|
||||
{ "ATOM", 4 },
|
||||
{ "BITMAP", 5 },
|
||||
{ "COLORMAP", 7 },
|
||||
{ "DRAWABLE", 17 },
|
||||
{ "INTEGER", 19 },
|
||||
{ "PIXMAP", 20 },
|
||||
{ "STRING", 31 },
|
||||
{ "WINDOW", 33 },
|
||||
{ "CLIPBOARD", 69 },
|
||||
};
|
||||
|
||||
static void
|
||||
gdk_wayland_display_manager_init (GdkWaylandDisplayManager *manager)
|
||||
{
|
||||
gint i;
|
||||
|
||||
manager->name_to_atoms = g_hash_table_new (NULL, NULL);
|
||||
|
||||
for (i = 0; i < G_N_ELEMENTS (predefined_atoms); i++)
|
||||
{
|
||||
GdkAtom atom;
|
||||
const gchar *atom_name = predefined_atoms[i].name;
|
||||
|
||||
atom = _GDK_MAKE_ATOM (predefined_atoms[i].atom_id);
|
||||
g_hash_table_insert (manager->name_to_atoms,
|
||||
(gchar *)g_intern_static_string (atom_name),
|
||||
GDK_ATOM_TO_POINTER (atom));
|
||||
}
|
||||
|
||||
manager->next_atom =
|
||||
predefined_atoms[G_N_ELEMENTS (predefined_atoms) - 1].atom_id + 1;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -121,7 +274,7 @@ _gdk_wayland_display_manager_remove_display (GdkDisplayManager *manager,
|
||||
|
||||
manager_wayland->displays = g_slist_remove (manager_wayland->displays, display);
|
||||
|
||||
if (gdk_display_manager_get_default_display (manager) == display)
|
||||
if (manager_wayland->default_display == display)
|
||||
{
|
||||
if (manager_wayland->displays)
|
||||
gdk_display_manager_set_default_display (manager, manager_wayland->displays->data);
|
||||
|
||||
@@ -57,6 +57,9 @@ gdk_event_source_check(GSource *base)
|
||||
{
|
||||
GdkWaylandEventSource *source = (GdkWaylandEventSource *) base;
|
||||
|
||||
if (source->pfd.revents & (G_IO_ERR | G_IO_HUP))
|
||||
g_error ("Lost connection to wayland compositor");
|
||||
|
||||
if (source->display->event_pause_count > 0)
|
||||
return FALSE;
|
||||
|
||||
@@ -150,12 +153,9 @@ _gdk_wayland_display_queue_events (GdkDisplay *display)
|
||||
|
||||
display_wayland = GDK_WAYLAND_DISPLAY (display);
|
||||
source = (GdkWaylandEventSource *) display_wayland->event_source;
|
||||
if (source->pfd.revents & G_IO_IN)
|
||||
if (source->pfd.revents)
|
||||
{
|
||||
wl_display_dispatch(display_wayland->wl_display);
|
||||
source->pfd.revents = 0;
|
||||
}
|
||||
|
||||
if (source->pfd.revents & (G_IO_ERR | G_IO_HUP))
|
||||
g_error ("Lost connection to wayland compositor");
|
||||
}
|
||||
|
||||
@@ -50,9 +50,6 @@ struct _GdkWaylandKeymap
|
||||
|
||||
struct xkb_keymap *xkb_keymap;
|
||||
struct xkb_state *xkb_state;
|
||||
|
||||
PangoDirection *direction;
|
||||
gboolean bidi;
|
||||
};
|
||||
|
||||
struct _GdkWaylandKeymapClass
|
||||
@@ -73,7 +70,6 @@ gdk_wayland_keymap_finalize (GObject *object)
|
||||
|
||||
xkb_keymap_unref (keymap->xkb_keymap);
|
||||
xkb_state_unref (keymap->xkb_state);
|
||||
g_free (keymap->direction);
|
||||
|
||||
G_OBJECT_CLASS (_gdk_wayland_keymap_parent_class)->finalize (object);
|
||||
}
|
||||
@@ -81,24 +77,13 @@ gdk_wayland_keymap_finalize (GObject *object)
|
||||
static PangoDirection
|
||||
gdk_wayland_keymap_get_direction (GdkKeymap *keymap)
|
||||
{
|
||||
GdkWaylandKeymap *keymap_wayland = GDK_WAYLAND_KEYMAP (keymap);
|
||||
gint i;
|
||||
|
||||
for (i = 0; i < xkb_keymap_num_layouts (keymap_wayland->xkb_keymap); i++)
|
||||
{
|
||||
if (xkb_state_layout_index_is_active (keymap_wayland->xkb_state, i, XKB_STATE_LAYOUT_EFFECTIVE))
|
||||
return keymap_wayland->direction[i];
|
||||
}
|
||||
|
||||
return PANGO_DIRECTION_NEUTRAL;
|
||||
return PANGO_DIRECTION_NEUTRAL;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gdk_wayland_keymap_have_bidi_layouts (GdkKeymap *keymap)
|
||||
{
|
||||
GdkWaylandKeymap *keymap_wayland = GDK_WAYLAND_KEYMAP (keymap);
|
||||
|
||||
return keymap_wayland->bidi;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@@ -121,45 +106,14 @@ gdk_wayland_keymap_get_entries_for_keyval (GdkKeymap *keymap,
|
||||
GdkKeymapKey **keys,
|
||||
gint *n_keys)
|
||||
{
|
||||
struct xkb_keymap *xkb_keymap = GDK_WAYLAND_KEYMAP (keymap)->xkb_keymap;
|
||||
GArray *retval;
|
||||
guint keycode;
|
||||
|
||||
retval = g_array_new (FALSE, FALSE, sizeof (GdkKeymapKey));
|
||||
|
||||
for (keycode = 8; keycode < 255; keycode++) /* FIXME: min/max keycode */
|
||||
if (n_keys)
|
||||
*n_keys = 1;
|
||||
if (keys)
|
||||
{
|
||||
gint num_layouts, layout;
|
||||
num_layouts = xkb_keymap_num_layouts_for_key (xkb_keymap, keycode);
|
||||
for (layout = 0; layout < num_layouts; layout++)
|
||||
{
|
||||
gint num_levels, level;
|
||||
num_levels = xkb_keymap_num_levels_for_key (xkb_keymap, keycode, layout);
|
||||
for (level = 0; level < num_levels; level++)
|
||||
{
|
||||
const xkb_keysym_t *syms;
|
||||
gint num_syms, sym;
|
||||
num_syms = xkb_keymap_key_get_syms_by_level (xkb_keymap, keycode, layout, level, &syms);
|
||||
for (sym = 0; sym < num_syms; sym++)
|
||||
{
|
||||
if (syms[sym] == keyval)
|
||||
{
|
||||
GdkKeymapKey key;
|
||||
|
||||
key.keycode = keycode;
|
||||
key.group = layout;
|
||||
key.level = level;
|
||||
|
||||
g_array_append_val (retval, key);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
*keys = g_new0 (GdkKeymapKey, 1);
|
||||
(*keys)->keycode = keyval;
|
||||
}
|
||||
|
||||
*n_keys = retval->len;
|
||||
*keys = (GdkKeymapKey*) g_array_free (retval, FALSE);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -170,119 +124,26 @@ gdk_wayland_keymap_get_entries_for_keycode (GdkKeymap *keymap,
|
||||
guint **keyvals,
|
||||
gint *n_entries)
|
||||
{
|
||||
struct xkb_keymap *xkb_keymap = GDK_WAYLAND_KEYMAP (keymap)->xkb_keymap;
|
||||
gint num_layouts, layout;
|
||||
gint num_entries;
|
||||
gint i;
|
||||
|
||||
num_layouts = xkb_keymap_num_layouts_for_key (xkb_keymap, hardware_keycode);
|
||||
|
||||
num_entries = 0;
|
||||
for (layout = 0; layout < num_layouts; layout++)
|
||||
num_entries += xkb_keymap_num_levels_for_key (xkb_keymap, hardware_keycode, layout);
|
||||
|
||||
if (n_entries)
|
||||
*n_entries = num_entries;
|
||||
*n_entries = 1;
|
||||
if (keys)
|
||||
*keys = g_new0 (GdkKeymapKey, num_entries);
|
||||
if (keyvals)
|
||||
*keyvals = g_new0 (guint, num_entries);
|
||||
|
||||
i = 0;
|
||||
for (layout = 0; layout < num_layouts; layout++)
|
||||
{
|
||||
gint num_levels, level;
|
||||
num_levels = xkb_keymap_num_levels_for_key (xkb_keymap, hardware_keycode, layout);
|
||||
for (level = 0; level < num_levels; level++)
|
||||
{
|
||||
const xkb_keysym_t *syms;
|
||||
int num_syms;
|
||||
num_syms = xkb_keymap_key_get_syms_by_level (xkb_keymap, hardware_keycode, layout, 0, &syms);
|
||||
if (keys)
|
||||
{
|
||||
(*keys)[i].keycode = hardware_keycode;
|
||||
(*keys)[i].group = layout;
|
||||
(*keys)[i].level = level;
|
||||
}
|
||||
if (keyvals && num_syms > 0)
|
||||
(*keyvals)[i] = syms[0];
|
||||
|
||||
i++;
|
||||
}
|
||||
*keys = g_new0 (GdkKeymapKey, 1);
|
||||
(*keys)->keycode = hardware_keycode;
|
||||
}
|
||||
|
||||
return num_entries > 0;
|
||||
if (keyvals)
|
||||
{
|
||||
*keyvals = g_new0 (guint, 1);
|
||||
(*keyvals)[0] = hardware_keycode;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static guint
|
||||
gdk_wayland_keymap_lookup_key (GdkKeymap *keymap,
|
||||
const GdkKeymapKey *key)
|
||||
{
|
||||
struct xkb_keymap *xkb_keymap = GDK_WAYLAND_KEYMAP (keymap)->xkb_keymap;
|
||||
const xkb_keysym_t *syms;
|
||||
int num_syms;
|
||||
|
||||
num_syms = xkb_keymap_key_get_syms_by_level (xkb_keymap,
|
||||
key->keycode,
|
||||
key->group,
|
||||
key->level,
|
||||
&syms);
|
||||
if (num_syms > 0)
|
||||
return syms[0];
|
||||
else
|
||||
return XKB_KEY_NoSymbol;
|
||||
}
|
||||
|
||||
static guint32
|
||||
get_xkb_modifiers (struct xkb_keymap *xkb_keymap,
|
||||
GdkModifierType state)
|
||||
{
|
||||
guint32 mods = 0;
|
||||
|
||||
if (state & GDK_SHIFT_MASK)
|
||||
mods |= 1 << xkb_keymap_mod_get_index (xkb_keymap, XKB_MOD_NAME_SHIFT);
|
||||
if (state & GDK_LOCK_MASK)
|
||||
mods |= 1 << xkb_keymap_mod_get_index (xkb_keymap, XKB_MOD_NAME_CAPS);
|
||||
if (state & GDK_CONTROL_MASK)
|
||||
mods |= 1 << xkb_keymap_mod_get_index (xkb_keymap, XKB_MOD_NAME_CTRL);
|
||||
if (state & GDK_MOD1_MASK)
|
||||
mods |= 1 << xkb_keymap_mod_get_index (xkb_keymap, XKB_MOD_NAME_ALT);
|
||||
if (state & GDK_MOD2_MASK)
|
||||
mods |= 1 << xkb_keymap_mod_get_index (xkb_keymap, "Mod2");
|
||||
if (state & GDK_MOD3_MASK)
|
||||
mods |= 1 << xkb_keymap_mod_get_index (xkb_keymap, "Mod3");
|
||||
if (state & GDK_MOD4_MASK)
|
||||
mods |= 1 << xkb_keymap_mod_get_index (xkb_keymap, XKB_MOD_NAME_LOGO);
|
||||
if (state & GDK_MOD5_MASK)
|
||||
mods |= 1 << xkb_keymap_mod_get_index (xkb_keymap, "Mod5");
|
||||
|
||||
return mods;
|
||||
}
|
||||
|
||||
static GdkModifierType
|
||||
get_gdk_modifiers (struct xkb_keymap *xkb_keymap,
|
||||
guint32 mods)
|
||||
{
|
||||
GdkModifierType state = 0;
|
||||
|
||||
if (mods & (1 << xkb_keymap_mod_get_index (xkb_keymap, XKB_MOD_NAME_SHIFT)))
|
||||
state |= GDK_SHIFT_MASK;
|
||||
if (mods & (1 << xkb_keymap_mod_get_index (xkb_keymap, XKB_MOD_NAME_CAPS)))
|
||||
state |= GDK_LOCK_MASK;
|
||||
if (mods & (1 << xkb_keymap_mod_get_index (xkb_keymap, XKB_MOD_NAME_CTRL)))
|
||||
state |= GDK_CONTROL_MASK;
|
||||
if (mods & (1 << xkb_keymap_mod_get_index (xkb_keymap, XKB_MOD_NAME_ALT)))
|
||||
state |= GDK_MOD1_MASK;
|
||||
if (mods & (1 << xkb_keymap_mod_get_index (xkb_keymap, "Mod2")))
|
||||
state |= GDK_MOD2_MASK;
|
||||
if (mods & (1 << xkb_keymap_mod_get_index (xkb_keymap, "Mod3")))
|
||||
state |= GDK_MOD3_MASK;
|
||||
if (mods & (1 << xkb_keymap_mod_get_index (xkb_keymap, XKB_MOD_NAME_LOGO)))
|
||||
state |= GDK_MOD4_MASK;
|
||||
if (mods & (1 << xkb_keymap_mod_get_index (xkb_keymap, "Mod5")))
|
||||
state |= GDK_MOD5_MASK;
|
||||
|
||||
return state;
|
||||
return key->keycode;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@@ -292,59 +153,24 @@ gdk_wayland_keymap_translate_keyboard_state (GdkKeymap *keymap,
|
||||
gint group,
|
||||
guint *keyval,
|
||||
gint *effective_group,
|
||||
gint *effective_level,
|
||||
gint *level,
|
||||
GdkModifierType *consumed_modifiers)
|
||||
{
|
||||
struct xkb_keymap *xkb_keymap;
|
||||
struct xkb_state *xkb_state;
|
||||
guint32 modifiers;
|
||||
guint32 consumed;
|
||||
xkb_layout_index_t layout;
|
||||
xkb_level_index_t level;
|
||||
xkb_keysym_t sym;
|
||||
|
||||
g_return_val_if_fail (keymap == NULL || GDK_IS_KEYMAP (keymap), FALSE);
|
||||
g_return_val_if_fail (group < 4, FALSE);
|
||||
|
||||
xkb_keymap = GDK_WAYLAND_KEYMAP (keymap)->xkb_keymap;
|
||||
|
||||
modifiers = get_xkb_modifiers (xkb_keymap, state);
|
||||
|
||||
xkb_state = xkb_state_new (xkb_keymap);
|
||||
|
||||
xkb_state_update_mask (xkb_state, modifiers, 0, 0, group, 0, 0);
|
||||
|
||||
layout = xkb_state_key_get_layout (xkb_state, hardware_keycode);
|
||||
level = xkb_state_key_get_level (xkb_state, hardware_keycode, layout);
|
||||
sym = xkb_state_key_get_one_sym (xkb_state, hardware_keycode);
|
||||
consumed = modifiers & ~xkb_state_mod_mask_remove_consumed (xkb_state, hardware_keycode, modifiers);
|
||||
|
||||
xkb_state_unref (xkb_state);
|
||||
|
||||
if (keyval)
|
||||
*keyval = sym;
|
||||
*keyval = hardware_keycode;
|
||||
if (effective_group)
|
||||
*effective_group = layout;
|
||||
if (effective_level)
|
||||
*effective_level = level;
|
||||
*effective_group = 0;
|
||||
if (level)
|
||||
*level = 0;
|
||||
if (consumed_modifiers)
|
||||
*consumed_modifiers = get_gdk_modifiers (xkb_keymap, consumed);
|
||||
*consumed_modifiers = 0;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static guint
|
||||
gdk_wayland_keymap_get_modifier_state (GdkKeymap *keymap)
|
||||
{
|
||||
struct xkb_keymap *xkb_keymap = GDK_WAYLAND_KEYMAP (keymap)->xkb_keymap;
|
||||
struct xkb_state *xkb_state = GDK_WAYLAND_KEYMAP (keymap)->xkb_state;
|
||||
xkb_mod_mask_t mods;
|
||||
|
||||
mods = xkb_state_serialize_mods (xkb_state, XKB_STATE_MODS_EFFECTIVE);
|
||||
|
||||
return get_gdk_modifiers (xkb_keymap, mods);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_wayland_keymap_add_virtual_modifiers (GdkKeymap *keymap,
|
||||
GdkModifierType *state)
|
||||
@@ -375,7 +201,6 @@ _gdk_wayland_keymap_class_init (GdkWaylandKeymapClass *klass)
|
||||
keymap_class->get_entries_for_keycode = gdk_wayland_keymap_get_entries_for_keycode;
|
||||
keymap_class->lookup_key = gdk_wayland_keymap_lookup_key;
|
||||
keymap_class->translate_keyboard_state = gdk_wayland_keymap_translate_keyboard_state;
|
||||
keymap_class->get_modifier_state = gdk_wayland_keymap_get_modifier_state;
|
||||
keymap_class->add_virtual_modifiers = gdk_wayland_keymap_add_virtual_modifiers;
|
||||
keymap_class->map_virtual_modifiers = gdk_wayland_keymap_map_virtual_modifiers;
|
||||
}
|
||||
@@ -385,75 +210,6 @@ _gdk_wayland_keymap_init (GdkWaylandKeymap *keymap)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
update_direction (GdkWaylandKeymap *keymap)
|
||||
{
|
||||
gint num_layouts;
|
||||
gint *rtl;
|
||||
guint key;
|
||||
gboolean have_rtl, have_ltr;
|
||||
gint i;
|
||||
|
||||
num_layouts = xkb_keymap_num_layouts (keymap->xkb_keymap);
|
||||
|
||||
g_free (keymap->direction);
|
||||
keymap->direction = g_new0 (PangoDirection, num_layouts);
|
||||
|
||||
rtl = g_new0 (gint, num_layouts);
|
||||
|
||||
for (key = 8; key < 255; key++) /* FIXME: min/max keycode */
|
||||
{
|
||||
gint layouts;
|
||||
gint layout;
|
||||
|
||||
layouts = xkb_keymap_num_layouts_for_key (keymap->xkb_keymap, key);
|
||||
for (layout = 0; layout < layouts; layout++)
|
||||
{
|
||||
const xkb_keysym_t *syms;
|
||||
gint num_syms;
|
||||
gint sym;
|
||||
|
||||
num_syms = xkb_keymap_key_get_syms_by_level (keymap->xkb_keymap, key, layout, 0, &syms);
|
||||
for (sym = 0; sym < num_syms; sym++)
|
||||
{
|
||||
PangoDirection dir;
|
||||
dir = pango_unichar_direction (xkb_keysym_to_utf32 (syms[sym]));
|
||||
switch (dir)
|
||||
{
|
||||
case PANGO_DIRECTION_RTL:
|
||||
rtl[layout]++;
|
||||
break;
|
||||
case PANGO_DIRECTION_LTR:
|
||||
rtl[layout]--;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
have_rtl = have_ltr = FALSE;
|
||||
for (i = 0; i < num_layouts; i++)
|
||||
{
|
||||
if (rtl[i] > 0)
|
||||
{
|
||||
keymap->direction[i] = PANGO_DIRECTION_RTL;
|
||||
have_rtl = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
keymap->direction[i] = PANGO_DIRECTION_LTR;
|
||||
have_ltr = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (have_rtl && have_ltr)
|
||||
keymap->bidi = TRUE;
|
||||
|
||||
g_free (rtl);
|
||||
}
|
||||
|
||||
GdkKeymap *
|
||||
_gdk_wayland_keymap_new ()
|
||||
{
|
||||
@@ -474,8 +230,6 @@ _gdk_wayland_keymap_new ()
|
||||
keymap->xkb_state = xkb_state_new (keymap->xkb_keymap);
|
||||
xkb_context_unref (context);
|
||||
|
||||
update_direction (keymap);
|
||||
|
||||
return GDK_KEYMAP (keymap);
|
||||
}
|
||||
|
||||
@@ -507,8 +261,6 @@ _gdk_wayland_keymap_update_from_fd (GdkKeymap *keymap,
|
||||
keymap_wayland->xkb_state = xkb_state_new (keymap_wayland->xkb_keymap);
|
||||
|
||||
xkb_context_unref (context);
|
||||
|
||||
update_direction (keymap_wayland);
|
||||
}
|
||||
|
||||
struct xkb_keymap *_gdk_wayland_keymap_get_xkb_keymap (GdkKeymap *keymap)
|
||||
@@ -520,23 +272,3 @@ struct xkb_state *_gdk_wayland_keymap_get_xkb_state (GdkKeymap *keymap)
|
||||
{
|
||||
return GDK_WAYLAND_KEYMAP (keymap)->xkb_state;
|
||||
}
|
||||
|
||||
gboolean
|
||||
_gdk_wayland_keymap_key_is_modifier (GdkKeymap *keymap,
|
||||
guint keycode)
|
||||
{
|
||||
struct xkb_keymap *xkb_keymap = GDK_WAYLAND_KEYMAP (keymap)->xkb_keymap;
|
||||
struct xkb_state *xkb_state;
|
||||
gboolean is_modifier;
|
||||
|
||||
is_modifier = FALSE;
|
||||
|
||||
xkb_state = xkb_state_new (xkb_keymap);
|
||||
|
||||
if (xkb_state_update_key (xkb_state, keycode, XKB_KEY_DOWN) & XKB_STATE_MODS_EFFECTIVE)
|
||||
is_modifier = TRUE;
|
||||
|
||||
xkb_state_unref (xkb_state);
|
||||
|
||||
return is_modifier;
|
||||
}
|
||||
|
||||
@@ -40,6 +40,9 @@
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#define GDK_SCREEN_DISPLAY(screen) (GDK_SCREEN_WAYLAND (screen)->display)
|
||||
#define GDK_WINDOW_SCREEN(win) (gdk_window_get_screen (win))
|
||||
#define GDK_WINDOW_DISPLAY(win) (GDK_SCREEN_WAYLAND (GDK_WINDOW_SCREEN (win))->display)
|
||||
#define GDK_WINDOW_IS_WAYLAND(win) (GDK_IS_WINDOW_IMPL_WAYLAND (((GdkWindow *)win)->impl))
|
||||
|
||||
void _gdk_wayland_window_add_focus (GdkWindow *window);
|
||||
@@ -52,8 +55,6 @@ void _gdk_wayland_keymap_update_from_fd (GdkKeymap *keymap,
|
||||
uint32_t size);
|
||||
struct xkb_state *_gdk_wayland_keymap_get_xkb_state (GdkKeymap *keymap);
|
||||
struct xkb_keymap *_gdk_wayland_keymap_get_xkb_keymap (GdkKeymap *keymap);
|
||||
gboolean _gdk_wayland_keymap_key_is_modifier (GdkKeymap *keymap,
|
||||
guint keycode);
|
||||
|
||||
void _gdk_wayland_display_finalize_cursors (GdkWaylandDisplay *display);
|
||||
void _gdk_wayland_display_update_cursors (GdkWaylandDisplay *display,
|
||||
@@ -77,14 +78,10 @@ gboolean _gdk_wayland_display_supports_cursor_alpha (GdkDisplay *display);
|
||||
gboolean _gdk_wayland_display_supports_cursor_color (GdkDisplay *display);
|
||||
|
||||
struct wl_buffer *_gdk_wayland_cursor_get_buffer (GdkCursor *cursor,
|
||||
guint image_index,
|
||||
int *hotspot_x,
|
||||
int *hotspot_y,
|
||||
int *x,
|
||||
int *y,
|
||||
int *w,
|
||||
int *h);
|
||||
guint _gdk_wayland_cursor_get_next_image_index (GdkCursor *cursor,
|
||||
guint current_image_index,
|
||||
guint *next_image_delay);
|
||||
|
||||
GdkDragProtocol _gdk_wayland_window_get_drag_protocol (GdkWindow *window,
|
||||
GdkWindow **target);
|
||||
@@ -135,16 +132,10 @@ gchar * _gdk_wayland_display_utf8_to_string_target (GdkDisplay *display,
|
||||
const gchar *str);
|
||||
|
||||
GdkDeviceManager *_gdk_wayland_device_manager_new (GdkDisplay *display);
|
||||
void _gdk_wayland_device_manager_add_seat (GdkDeviceManager *device_manager,
|
||||
guint32 id,
|
||||
struct wl_seat *seat);
|
||||
void _gdk_wayland_device_manager_remove_seat (GdkDeviceManager *device_manager,
|
||||
guint32 id);
|
||||
|
||||
typedef struct _GdkWaylandDeviceData GdkWaylandDeviceData;
|
||||
void _gdk_wayland_device_manager_add_device (GdkDeviceManager *device_manager,
|
||||
struct wl_seat *seat);
|
||||
|
||||
GdkKeymap *_gdk_wayland_device_get_keymap (GdkDevice *device);
|
||||
uint32_t _gdk_wayland_device_get_button_press_serial(GdkWaylandDeviceData *device);
|
||||
|
||||
void _gdk_wayland_display_deliver_event (GdkDisplay *display, GdkEvent *event);
|
||||
GSource *_gdk_wayland_display_event_source_new (GdkDisplay *display);
|
||||
@@ -153,17 +144,17 @@ void _gdk_wayland_display_queue_events (GdkDisplay *display);
|
||||
GdkAppLaunchContext *_gdk_wayland_display_get_app_launch_context (GdkDisplay *display);
|
||||
|
||||
GdkDisplay *_gdk_wayland_display_open (const gchar *display_name);
|
||||
void _gdk_wayland_display_make_default (GdkDisplay *display);
|
||||
|
||||
GdkWindow *_gdk_wayland_screen_create_root_window (GdkScreen *screen,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
GdkScreen *_gdk_wayland_screen_new (GdkDisplay *display);
|
||||
void _gdk_wayland_screen_add_output (GdkScreen *screen,
|
||||
guint32 id,
|
||||
void _gdk_wayland_screen_add_output (GdkScreen *scren,
|
||||
struct wl_output *output);
|
||||
void _gdk_wayland_screen_remove_output (GdkScreen *screen,
|
||||
guint32 id);
|
||||
void _gdk_wayland_screen_remove_output_by_id (GdkScreen *screen,
|
||||
guint32 id);
|
||||
|
||||
void _gdk_wayland_display_manager_add_display (GdkDisplayManager *manager,
|
||||
GdkDisplay *display);
|
||||
|
||||
@@ -79,8 +79,6 @@ struct _GdkWaylandScreenClass
|
||||
|
||||
struct _GdkWaylandMonitor
|
||||
{
|
||||
GdkWaylandScreen *screen;
|
||||
guint32 id;
|
||||
struct wl_output *output;
|
||||
GdkRectangle geometry;
|
||||
int width_mm;
|
||||
@@ -790,8 +788,8 @@ _gdk_wayland_screen_new (GdkDisplay *display)
|
||||
|
||||
screen_wayland = GDK_WAYLAND_SCREEN (screen);
|
||||
screen_wayland->display = display;
|
||||
screen_wayland->width = 0;
|
||||
screen_wayland->height = 0;
|
||||
screen_wayland->width = 8192;
|
||||
screen_wayland->height = 8192;
|
||||
|
||||
screen_wayland->visual = gdk_wayland_visual_new (screen);
|
||||
|
||||
@@ -853,30 +851,6 @@ _gdk_wayland_screen_init (GdkWaylandScreen *screen_wayland)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
update_screen_size (GdkWaylandScreen *screen_wayland)
|
||||
{
|
||||
gint width, height;
|
||||
gint i;
|
||||
|
||||
width = height = 0;
|
||||
for (i = 0; i < screen_wayland->monitors->len; i++)
|
||||
{
|
||||
GdkWaylandMonitor *monitor = screen_wayland->monitors->pdata[i];
|
||||
|
||||
width = MAX (width, monitor->geometry.x + monitor->geometry.width);
|
||||
height = MAX (height, monitor->geometry.y + monitor->geometry.height);
|
||||
}
|
||||
|
||||
if (screen_wayland->width != width ||
|
||||
screen_wayland->height != height)
|
||||
{
|
||||
screen_wayland->width = width;
|
||||
screen_wayland->height = width;
|
||||
g_signal_emit_by_name (screen_wayland, "size-changed");
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
output_handle_geometry(void *data,
|
||||
struct wl_output *wl_output,
|
||||
@@ -894,12 +868,6 @@ output_handle_geometry(void *data,
|
||||
|
||||
monitor->manufacturer = g_strdup (make);
|
||||
monitor->output_name = g_strdup (model);
|
||||
|
||||
if (monitor->geometry.width != 0)
|
||||
{
|
||||
g_signal_emit_by_name (monitor->screen, "monitors-changed");
|
||||
update_screen_size (monitor->screen);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -917,9 +885,6 @@ output_handle_mode(void *data,
|
||||
|
||||
monitor->geometry.width = width;
|
||||
monitor->geometry.height = height;
|
||||
|
||||
g_signal_emit_by_name (monitor->screen, "monitors-changed");
|
||||
update_screen_size (monitor->screen);
|
||||
}
|
||||
|
||||
static const struct wl_output_listener output_listener =
|
||||
@@ -929,24 +894,21 @@ static const struct wl_output_listener output_listener =
|
||||
};
|
||||
|
||||
void
|
||||
_gdk_wayland_screen_add_output (GdkScreen *screen,
|
||||
guint32 id,
|
||||
_gdk_wayland_screen_add_output (GdkScreen *screen,
|
||||
struct wl_output *output)
|
||||
{
|
||||
GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
|
||||
GdkWaylandMonitor *monitor = g_new0(GdkWaylandMonitor, 1);
|
||||
|
||||
monitor->id = id;
|
||||
monitor->output = output;
|
||||
monitor->screen = screen_wayland;
|
||||
g_ptr_array_add(screen_wayland->monitors, monitor);
|
||||
|
||||
wl_output_add_listener(output, &output_listener, monitor);
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_wayland_screen_remove_output (GdkScreen *screen,
|
||||
guint32 id)
|
||||
_gdk_wayland_screen_remove_output_by_id (GdkScreen *screen,
|
||||
guint32 id)
|
||||
{
|
||||
GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
|
||||
int i;
|
||||
@@ -955,12 +917,9 @@ _gdk_wayland_screen_remove_output (GdkScreen *screen,
|
||||
{
|
||||
GdkWaylandMonitor *monitor = screen_wayland->monitors->pdata[i];
|
||||
|
||||
if (monitor->id == id)
|
||||
if (wl_proxy_get_id ((struct wl_proxy *)monitor->output) == id)
|
||||
{
|
||||
g_ptr_array_remove (screen_wayland->monitors, monitor);
|
||||
|
||||
g_signal_emit_by_name (screen_wayland, "monitors-changed");
|
||||
update_screen_size (screen_wayland);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,10 +31,52 @@
|
||||
|
||||
#include <gdk/wayland/gdkwaylanddevice.h>
|
||||
#include <gdk/wayland/gdkwaylanddisplay.h>
|
||||
#include <gdk/wayland/gdkwaylanddisplaymanager.h>
|
||||
#include <gdk/wayland/gdkwaylandselection.h>
|
||||
#include <gdk/wayland/gdkwaylandwindow.h>
|
||||
|
||||
#undef __GDKWAYLAND_H_INSIDE__
|
||||
G_BEGIN_DECLS
|
||||
|
||||
typedef struct _GdkWaylandDisplayManager GdkWaylandDisplayManager;
|
||||
typedef struct _GdkWaylandDisplayManagerClass GdkWaylandDisplayManagerClass;
|
||||
|
||||
#define GDK_TYPE_WAYLAND_DISPLAY_MANAGER (gdk_wayland_display_manager_get_type())
|
||||
#define GDK_WAYLAND_DISPLAY_MANAGER(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_WAYLAND_DISPLAY_MANAGER, GdkWaylandDisplayManager))
|
||||
#define GDK_WAYLAND_DISPLAY_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_WAYLAND_DISPLAY_MANAGER, GdkWaylandDisplayManagerClass))
|
||||
#define GDK_IS_WAYLAND_DISPLAY_MANAGER(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_WAYLAND_DISPLAY_MANAGER))
|
||||
#define GDK_IS_WAYLAND_DISPLAY_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_WAYLAND_DISPLAY_MANAGER))
|
||||
#define GDK_WAYLAND_DISPLAY_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_WAYLAND_DISPLAY_MANAGER, GdkWaylandDisplayManagerClass))
|
||||
|
||||
GType gdk_wayland_display_manager_get_type (void);
|
||||
|
||||
#if defined (GTK_COMPILATION) || defined (GDK_COMPILATION)
|
||||
#define gdk_wayland_device_get_selection_type_atoms gdk_wayland_device_get_selection_type_atoms_libgtk_only
|
||||
int
|
||||
gdk_wayland_device_get_selection_type_atoms (GdkDevice *device,
|
||||
GdkAtom **atoms_out);
|
||||
|
||||
typedef void (*GdkDeviceWaylandRequestContentCallback) (GdkDevice *device, const gchar *data, gsize len, gpointer userdata);
|
||||
|
||||
#define gdk_wayland_device_request_selection_content gdk_wayland_device_request_selection_content_libgtk_only
|
||||
gboolean
|
||||
gdk_wayland_device_request_selection_content (GdkDevice *device,
|
||||
const gchar *requested_mime_type,
|
||||
GdkDeviceWaylandRequestContentCallback cb,
|
||||
gpointer userdata);
|
||||
|
||||
typedef gchar *(*GdkDeviceWaylandOfferContentCallback) (GdkDevice *device, const gchar *mime_type, gssize *len, gpointer userdata);
|
||||
|
||||
#define gdk_wayland_device_offer_selection_content gdk_wayland_device_offer_selection_content_libgtk_only
|
||||
gboolean
|
||||
gdk_wayland_device_offer_selection_content (GdkDevice *gdk_device,
|
||||
const gchar **mime_types,
|
||||
gint nr_mime_types,
|
||||
GdkDeviceWaylandOfferContentCallback cb,
|
||||
gpointer userdata);
|
||||
|
||||
#define gdk_wayland_device_clear_selection_content gdk_wayland_device_clear_selection_content_libgtk_only
|
||||
gboolean
|
||||
gdk_wayland_device_clear_selection_content (GdkDevice *gdk_device);
|
||||
|
||||
#endif
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GDK_WAYLAND_H__ */
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
/* GDK - The GIMP Drawing Kit
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* 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, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
|
||||
* file for a list of people on the GTK+ Team. See the ChangeLog
|
||||
* files for a list of changes. These files are distributed with
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_WAYLAND_DISPLAY_MANAGER_H__
|
||||
#define __GDK_WAYLAND_DISPLAY_MANAGER_H__
|
||||
|
||||
#if !defined (__GDKWAYLAND_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkwayland.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
typedef struct _GdkWaylandDisplayManager GdkWaylandDisplayManager;
|
||||
typedef struct _GdkWaylandDisplayManagerClass GdkWaylandDisplayManagerClass;
|
||||
|
||||
#define GDK_TYPE_WAYLAND_DISPLAY_MANAGER (gdk_wayland_display_manager_get_type())
|
||||
#define GDK_WAYLAND_DISPLAY_MANAGER(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_WAYLAND_DISPLAY_MANAGER, GdkWaylandDisplayManager))
|
||||
#define GDK_WAYLAND_DISPLAY_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_WAYLAND_DISPLAY_MANAGER, GdkWaylandDisplayManagerClass))
|
||||
#define GDK_IS_WAYLAND_DISPLAY_MANAGER(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_WAYLAND_DISPLAY_MANAGER))
|
||||
#define GDK_IS_WAYLAND_DISPLAY_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_WAYLAND_DISPLAY_MANAGER))
|
||||
#define GDK_WAYLAND_DISPLAY_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_WAYLAND_DISPLAY_MANAGER, GdkWaylandDisplayManagerClass))
|
||||
|
||||
GType gdk_wayland_display_manager_get_type (void);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GDK_WAYLAND_DISPLAY_MANAGER_H__ */
|
||||
@@ -1,69 +0,0 @@
|
||||
/* GDK - The GIMP Drawing Kit
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* 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, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
|
||||
* file for a list of people on the GTK+ Team. See the ChangeLog
|
||||
* files for a list of changes. These files are distributed with
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_WAYLAND_SELECTION_H__
|
||||
#define __GDK_WAYLAND_SELECTION_H__
|
||||
|
||||
#if !defined (__GDKWAYLAND_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkwayland.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#if defined (GTK_COMPILATION) || defined (GDK_COMPILATION)
|
||||
#define gdk_wayland_device_get_selection_type_atoms gdk_wayland_device_get_selection_type_atoms_libgtk_only
|
||||
int
|
||||
gdk_wayland_device_get_selection_type_atoms (GdkDevice *device,
|
||||
GdkAtom **atoms_out);
|
||||
|
||||
typedef void (*GdkDeviceWaylandRequestContentCallback) (GdkDevice *device, const gchar *data, gsize len, gpointer userdata);
|
||||
|
||||
#define gdk_wayland_device_request_selection_content gdk_wayland_device_request_selection_content_libgtk_only
|
||||
gboolean
|
||||
gdk_wayland_device_request_selection_content (GdkDevice *device,
|
||||
const gchar *requested_mime_type,
|
||||
GdkDeviceWaylandRequestContentCallback cb,
|
||||
gpointer userdata);
|
||||
|
||||
typedef gchar *(*GdkDeviceWaylandOfferContentCallback) (GdkDevice *device, const gchar *mime_type, gssize *len, gpointer userdata);
|
||||
|
||||
#define gdk_wayland_device_offer_selection_content gdk_wayland_device_offer_selection_content_libgtk_only
|
||||
gboolean
|
||||
gdk_wayland_device_offer_selection_content (GdkDevice *gdk_device,
|
||||
const gchar **mime_types,
|
||||
gint nr_mime_types,
|
||||
GdkDeviceWaylandOfferContentCallback cb,
|
||||
gpointer userdata);
|
||||
|
||||
#define gdk_wayland_device_clear_selection_content gdk_wayland_device_clear_selection_content_libgtk_only
|
||||
gboolean
|
||||
gdk_wayland_device_clear_selection_content (GdkDevice *gdk_device);
|
||||
|
||||
#endif
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GDK_WAYLAND_SELECTION_H__ */
|
||||
@@ -95,6 +95,8 @@ struct _GdkWindowImplWayland
|
||||
|
||||
GdkCursor *cursor;
|
||||
|
||||
gint8 toplevel_window_type;
|
||||
|
||||
struct wl_surface *surface;
|
||||
struct wl_shell_surface *shell_surface;
|
||||
unsigned int mapped : 1;
|
||||
@@ -152,6 +154,7 @@ G_DEFINE_TYPE (GdkWindowImplWayland, _gdk_window_impl_wayland, GDK_TYPE_WINDOW_I
|
||||
static void
|
||||
_gdk_window_impl_wayland_init (GdkWindowImplWayland *impl)
|
||||
{
|
||||
impl->toplevel_window_type = -1;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -560,6 +563,8 @@ gdk_wayland_window_map (GdkWindow *window)
|
||||
{
|
||||
GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
|
||||
GdkWindowImplWayland *parent;
|
||||
GdkWaylandDisplay *wayland_display =
|
||||
GDK_WAYLAND_DISPLAY (gdk_window_get_display (window));
|
||||
GdkWindow *transient_for;
|
||||
|
||||
if (!impl->mapped && !impl->use_custom_surface)
|
||||
@@ -586,7 +591,6 @@ gdk_wayland_window_map (GdkWindow *window)
|
||||
{
|
||||
struct wl_seat *grab_input_seat = NULL;
|
||||
GdkWindowImplWayland *tmp_impl;
|
||||
GdkWaylandDeviceData *device;
|
||||
|
||||
parent = GDK_WINDOW_IMPL_WAYLAND (transient_for->impl);
|
||||
|
||||
@@ -612,10 +616,10 @@ gdk_wayland_window_map (GdkWindow *window)
|
||||
impl->hint == GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU ||
|
||||
impl->hint == GDK_WINDOW_TYPE_HINT_COMBO))
|
||||
{
|
||||
device = wl_seat_get_user_data(grab_input_seat);
|
||||
|
||||
wl_shell_surface_set_popup (impl->shell_surface,
|
||||
grab_input_seat,
|
||||
_gdk_wayland_device_get_button_press_serial(device),
|
||||
_gdk_wayland_display_get_serial (wayland_display),
|
||||
parent->surface,
|
||||
window->x, window->y, 0);
|
||||
}
|
||||
@@ -714,9 +718,7 @@ gdk_wayland_window_show (GdkWindow *window, gboolean already_mapped)
|
||||
wl_surface_set_user_data(impl->surface, window);
|
||||
}
|
||||
|
||||
if (!impl->shell_surface &&
|
||||
!impl->use_custom_surface &&
|
||||
display_wayland->shell)
|
||||
if (!impl->use_custom_surface && display_wayland->shell)
|
||||
{
|
||||
impl->shell_surface = wl_shell_get_shell_surface (display_wayland->shell,
|
||||
impl->surface);
|
||||
|
||||
@@ -215,7 +215,8 @@ _gdk_win32_display_open (const gchar *display_name)
|
||||
/* Precalculate display name */
|
||||
(void) gdk_display_get_name (_gdk_display);
|
||||
|
||||
g_signal_emit_by_name (_gdk_display, "opened");
|
||||
g_signal_emit_by_name (gdk_display_manager_get (),
|
||||
"display_opened", _gdk_display);
|
||||
|
||||
GDK_NOTE (MISC, g_print ("... _gdk_display now set up\n"));
|
||||
|
||||
@@ -298,6 +299,24 @@ gdk_win32_display_get_name (GdkDisplay *display)
|
||||
return display_name_cache;
|
||||
}
|
||||
|
||||
static gint
|
||||
gdk_win32_display_get_n_screens (GdkDisplay *display)
|
||||
{
|
||||
g_return_val_if_fail (GDK_IS_DISPLAY (display), 0);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static GdkScreen *
|
||||
gdk_win32_display_get_screen (GdkDisplay *display,
|
||||
gint screen_num)
|
||||
{
|
||||
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
|
||||
g_return_val_if_fail (screen_num == 0, NULL);
|
||||
|
||||
return _gdk_screen;
|
||||
}
|
||||
|
||||
static GdkScreen *
|
||||
gdk_win32_display_get_default_screen (GdkDisplay *display)
|
||||
{
|
||||
@@ -644,6 +663,8 @@ gdk_win32_display_class_init (GdkWin32DisplayClass *klass)
|
||||
display_class->window_type = GDK_TYPE_WIN32_WINDOW;
|
||||
|
||||
display_class->get_name = gdk_win32_display_get_name;
|
||||
display_class->get_n_screens = gdk_win32_display_get_n_screens;
|
||||
display_class->get_screen = gdk_win32_display_get_screen;
|
||||
display_class->get_default_screen = gdk_win32_display_get_default_screen;
|
||||
display_class->beep = gdk_win32_display_beep;
|
||||
display_class->sync = gdk_win32_display_sync;
|
||||
|
||||
@@ -38,6 +38,48 @@ struct _GdkWin32DisplayManagerClass
|
||||
|
||||
G_DEFINE_TYPE (GdkWin32DisplayManager, gdk_win32_display_manager, GDK_TYPE_DISPLAY_MANAGER)
|
||||
|
||||
static GdkDisplay *
|
||||
gdk_win32_display_manager_open_display (GdkDisplayManager *manager,
|
||||
const gchar *name)
|
||||
{
|
||||
return _gdk_win32_display_open (name);
|
||||
}
|
||||
|
||||
static GSList *
|
||||
gdk_win32_display_manager_list_displays (GdkDisplayManager *manager)
|
||||
{
|
||||
return g_slist_append (NULL, gdk_display_get_default ());
|
||||
}
|
||||
|
||||
static GdkDisplay *
|
||||
gdk_win32_display_manager_get_default_display (GdkDisplayManager *manager)
|
||||
{
|
||||
return _gdk_win32_display_open (NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_win32_display_manager_set_default_display (GdkDisplayManager *manager,
|
||||
GdkDisplay *display)
|
||||
{
|
||||
g_assert (gdk_display_get_default () == display);
|
||||
}
|
||||
|
||||
#include "../gdkkeynames.c"
|
||||
|
||||
static gchar *
|
||||
gdk_win32_display_manager_get_keyval_name (GdkDisplayManager *manager,
|
||||
guint keyval)
|
||||
{
|
||||
return _gdk_keyval_name (keyval);
|
||||
}
|
||||
|
||||
static guint
|
||||
gdk_win32_display_manager_lookup_keyval (GdkDisplayManager *manager,
|
||||
const gchar *name)
|
||||
{
|
||||
return _gdk_keyval_from_name (name);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_win32_display_manager_init (GdkWin32DisplayManager *manager)
|
||||
{
|
||||
@@ -62,11 +104,16 @@ static void
|
||||
gdk_win32_display_manager_class_init (GdkWin32DisplayManagerClass *class)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (class);
|
||||
GdkDisplayManagerClass *manager_class = GDK_DISPLAY_MANAGER_CLASS (class);
|
||||
|
||||
object_class->finalize = gdk_win32_display_manager_finalize;
|
||||
|
||||
#if 0
|
||||
manager_class->open_display = gdk_win32_display_manager_open_display;
|
||||
manager_class->list_displays = gdk_win32_display_manager_list_displays;
|
||||
manager_class->set_default_display = gdk_win32_display_manager_set_default_display;
|
||||
manager_class->get_default_display = gdk_win32_display_manager_get_default_display;
|
||||
manager_class->atom_intern = _gdk_win32_display_manager_atom_intern;
|
||||
manager_class->get_atom_name = _gdk_win32_display_manager_get_atom_name;
|
||||
#endif
|
||||
manager_class->lookup_keyval = gdk_win32_display_manager_lookup_keyval;
|
||||
manager_class->get_keyval_name = gdk_win32_display_manager_get_keyval_name;
|
||||
}
|
||||
|
||||
@@ -147,6 +147,16 @@ gdk_win32_screen_get_number (GdkScreen *screen)
|
||||
return 0;
|
||||
}
|
||||
|
||||
gchar *
|
||||
_gdk_windowing_substitute_screen_number (const gchar *display_name,
|
||||
int screen_number)
|
||||
{
|
||||
if (screen_number != 0)
|
||||
return NULL;
|
||||
|
||||
return g_strdup (display_name);
|
||||
}
|
||||
|
||||
static gchar *
|
||||
gdk_win32_screen_make_display_name (GdkScreen *screen)
|
||||
{
|
||||
|
||||
@@ -3330,8 +3330,9 @@ _gdk_win32_window_translate (GdkWindow *window,
|
||||
gint dy)
|
||||
{
|
||||
GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
|
||||
GdkRectangle extents;
|
||||
RECT rect;
|
||||
HRGN hrgn, area_hrgn;
|
||||
cairo_region_t *update_region;
|
||||
HDC hdc;
|
||||
int ret;
|
||||
|
||||
@@ -3366,17 +3367,19 @@ _gdk_win32_window_translate (GdkWindow *window,
|
||||
/* Clip hdc to target region */
|
||||
API_CALL (SelectClipRgn, (hdc, area_hrgn));
|
||||
|
||||
cairo_region_get_extents (area, &extents);
|
||||
|
||||
rect.left = MIN (extents.x, extents.x - dx);
|
||||
rect.top = MIN (extents.y, extents.y - dy);
|
||||
rect.right = MAX (extents.x + extents.width, extents.x - dx + extents.width);
|
||||
rect.bottom = MAX (extents.y + extents.height, extents.y - dy + extents.height);
|
||||
|
||||
SetRectRgn (hrgn, 0, 0, 0, 0);
|
||||
|
||||
if (!ScrollDC (hdc, dx, dy, NULL, NULL, hrgn, NULL))
|
||||
if (!ScrollDC (hdc, dx, dy, &rect, NULL, hrgn, NULL))
|
||||
WIN32_GDI_FAILED ("ScrollDC");
|
||||
else
|
||||
{
|
||||
update_region = _gdk_win32_hrgn_to_region (hrgn);
|
||||
if (!cairo_region_is_empty (update_region))
|
||||
_gdk_window_invalidate_for_expose (window, update_region);
|
||||
cairo_region_destroy (update_region);
|
||||
}
|
||||
else if (!InvalidateRgn (GDK_WINDOW_HWND (window), hrgn, FALSE))
|
||||
WIN32_GDI_FAILED ("InvalidateRgn");
|
||||
|
||||
/* Unset hdc clip region */
|
||||
API_CALL (SelectClipRgn, (hdc, NULL));
|
||||
|
||||
@@ -450,7 +450,7 @@ gdk_x11_device_core_window_at_position (GdkDevice *device,
|
||||
}
|
||||
else
|
||||
{
|
||||
gint width, height;
|
||||
gint i, screens, width, height;
|
||||
GList *toplevels, *list;
|
||||
Window pointer_window, root, child;
|
||||
int rootx = -1, rooty = -1;
|
||||
@@ -459,51 +459,58 @@ gdk_x11_device_core_window_at_position (GdkDevice *device,
|
||||
|
||||
/* FIXME: untrusted clients case not multidevice-safe */
|
||||
pointer_window = None;
|
||||
screen = gdk_display_get_screen (display, 0);
|
||||
toplevels = gdk_screen_get_toplevel_windows (screen);
|
||||
for (list = toplevels; list != NULL; list = g_list_next (list))
|
||||
{
|
||||
window = GDK_WINDOW (list->data);
|
||||
xwindow = GDK_WINDOW_XID (window);
|
||||
gdk_x11_display_error_trap_push (display);
|
||||
XQueryPointer (xdisplay, xwindow,
|
||||
&root, &child,
|
||||
&rootx, &rooty,
|
||||
&winx, &winy,
|
||||
&xmask);
|
||||
if (gdk_x11_display_error_trap_pop (display))
|
||||
continue;
|
||||
if (child != None)
|
||||
{
|
||||
pointer_window = child;
|
||||
break;
|
||||
}
|
||||
gdk_window_get_geometry (window, NULL, NULL, &width, &height);
|
||||
if (winx >= 0 && winy >= 0 && winx < width && winy < height)
|
||||
{
|
||||
/* A childless toplevel, or below another window? */
|
||||
XSetWindowAttributes attributes;
|
||||
Window w;
|
||||
screens = gdk_display_get_n_screens (display);
|
||||
|
||||
w = XCreateWindow (xdisplay, xwindow, winx, winy, 1, 1, 0,
|
||||
CopyFromParent, InputOnly, CopyFromParent,
|
||||
0, &attributes);
|
||||
XMapWindow (xdisplay, w);
|
||||
for (i = 0; i < screens; ++i)
|
||||
{
|
||||
screen = gdk_display_get_screen (display, i);
|
||||
toplevels = gdk_screen_get_toplevel_windows (screen);
|
||||
for (list = toplevels; list != NULL; list = g_list_next (list))
|
||||
{
|
||||
window = GDK_WINDOW (list->data);
|
||||
xwindow = GDK_WINDOW_XID (window);
|
||||
gdk_x11_display_error_trap_push (display);
|
||||
XQueryPointer (xdisplay, xwindow,
|
||||
&root, &child,
|
||||
&rootx, &rooty,
|
||||
&winx, &winy,
|
||||
&xmask);
|
||||
XDestroyWindow (xdisplay, w);
|
||||
if (child == w)
|
||||
if (gdk_x11_display_error_trap_pop (display))
|
||||
continue;
|
||||
if (child != None)
|
||||
{
|
||||
pointer_window = xwindow;
|
||||
pointer_window = child;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
gdk_window_get_geometry (window, NULL, NULL, &width, &height);
|
||||
if (winx >= 0 && winy >= 0 && winx < width && winy < height)
|
||||
{
|
||||
/* A childless toplevel, or below another window? */
|
||||
XSetWindowAttributes attributes;
|
||||
Window w;
|
||||
|
||||
g_list_free (toplevels);
|
||||
w = XCreateWindow (xdisplay, xwindow, winx, winy, 1, 1, 0,
|
||||
CopyFromParent, InputOnly, CopyFromParent,
|
||||
0, &attributes);
|
||||
XMapWindow (xdisplay, w);
|
||||
XQueryPointer (xdisplay, xwindow,
|
||||
&root, &child,
|
||||
&rootx, &rooty,
|
||||
&winx, &winy,
|
||||
&xmask);
|
||||
XDestroyWindow (xdisplay, w);
|
||||
if (child == w)
|
||||
{
|
||||
pointer_window = xwindow;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
g_list_free (toplevels);
|
||||
if (pointer_window != None)
|
||||
break;
|
||||
}
|
||||
|
||||
xwindow = pointer_window;
|
||||
}
|
||||
|
||||
@@ -512,53 +512,27 @@ gdk_x11_device_xi2_window_at_position (GdkDevice *device,
|
||||
}
|
||||
else
|
||||
{
|
||||
gint width, height;
|
||||
gint i, screens, width, height;
|
||||
GList *toplevels, *list;
|
||||
Window pointer_window, root, child;
|
||||
|
||||
/* FIXME: untrusted clients case not multidevice-safe */
|
||||
pointer_window = None;
|
||||
screens = gdk_display_get_n_screens (display);
|
||||
|
||||
screen = gdk_display_get_screen (display, 0);
|
||||
toplevels = gdk_screen_get_toplevel_windows (screen);
|
||||
for (list = toplevels; list != NULL; list = g_list_next (list))
|
||||
for (i = 0; i < screens; ++i)
|
||||
{
|
||||
window = GDK_WINDOW (list->data);
|
||||
xwindow = GDK_WINDOW_XID (window);
|
||||
|
||||
/* Free previous button mask, if any */
|
||||
g_free (button_state.mask);
|
||||
|
||||
gdk_x11_display_error_trap_push (display);
|
||||
XIQueryPointer (xdisplay,
|
||||
device_xi2->device_id,
|
||||
xwindow,
|
||||
&root, &child,
|
||||
&xroot_x, &xroot_y,
|
||||
&xwin_x, &xwin_y,
|
||||
&button_state,
|
||||
&mod_state,
|
||||
&group_state);
|
||||
if (gdk_x11_display_error_trap_pop (display))
|
||||
continue;
|
||||
if (child != None)
|
||||
screen = gdk_display_get_screen (display, i);
|
||||
toplevels = gdk_screen_get_toplevel_windows (screen);
|
||||
for (list = toplevels; list != NULL; list = g_list_next (list))
|
||||
{
|
||||
pointer_window = child;
|
||||
break;
|
||||
}
|
||||
gdk_window_get_geometry (window, NULL, NULL, &width, &height);
|
||||
if (xwin_x >= 0 && xwin_y >= 0 && xwin_x < width && xwin_y < height)
|
||||
{
|
||||
/* A childless toplevel, or below another window? */
|
||||
XSetWindowAttributes attributes;
|
||||
Window w;
|
||||
window = GDK_WINDOW (list->data);
|
||||
xwindow = GDK_WINDOW_XID (window);
|
||||
|
||||
free (button_state.mask);
|
||||
/* Free previous button mask, if any */
|
||||
g_free (button_state.mask);
|
||||
|
||||
w = XCreateWindow (xdisplay, xwindow, (int)xwin_x, (int)xwin_y, 1, 1, 0,
|
||||
CopyFromParent, InputOnly, CopyFromParent,
|
||||
0, &attributes);
|
||||
XMapWindow (xdisplay, w);
|
||||
gdk_x11_display_error_trap_push (display);
|
||||
XIQueryPointer (xdisplay,
|
||||
device_xi2->device_id,
|
||||
xwindow,
|
||||
@@ -568,12 +542,42 @@ gdk_x11_device_xi2_window_at_position (GdkDevice *device,
|
||||
&button_state,
|
||||
&mod_state,
|
||||
&group_state);
|
||||
XDestroyWindow (xdisplay, w);
|
||||
if (child == w)
|
||||
if (gdk_x11_display_error_trap_pop (display))
|
||||
continue;
|
||||
if (child != None)
|
||||
{
|
||||
pointer_window = xwindow;
|
||||
pointer_window = child;
|
||||
break;
|
||||
}
|
||||
gdk_window_get_geometry (window, NULL, NULL, &width, &height);
|
||||
if (xwin_x >= 0 && xwin_y >= 0 && xwin_x < width && xwin_y < height)
|
||||
{
|
||||
/* A childless toplevel, or below another window? */
|
||||
XSetWindowAttributes attributes;
|
||||
Window w;
|
||||
|
||||
free (button_state.mask);
|
||||
|
||||
w = XCreateWindow (xdisplay, xwindow, (int)xwin_x, (int)xwin_y, 1, 1, 0,
|
||||
CopyFromParent, InputOnly, CopyFromParent,
|
||||
0, &attributes);
|
||||
XMapWindow (xdisplay, w);
|
||||
XIQueryPointer (xdisplay,
|
||||
device_xi2->device_id,
|
||||
xwindow,
|
||||
&root, &child,
|
||||
&xroot_x, &xroot_y,
|
||||
&xwin_x, &xwin_y,
|
||||
&button_state,
|
||||
&mod_state,
|
||||
&group_state);
|
||||
XDestroyWindow (xdisplay, w);
|
||||
if (child == w)
|
||||
{
|
||||
pointer_window = xwindow;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
g_list_free (toplevels);
|
||||
|
||||
@@ -1408,11 +1408,11 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
|
||||
GdkDevice *source_device;
|
||||
|
||||
GDK_NOTE(EVENTS,
|
||||
g_message ("touch %s:\twindow %ld\n\ttouch id: %u\n\tpointer emulating: %s",
|
||||
g_message ("touch %s:\twindow %ld\n\ttouch id: %u\n\tpointer emulating: %d",
|
||||
ev->evtype == XI_TouchBegin ? "begin" : "end",
|
||||
xev->event,
|
||||
xev->detail,
|
||||
xev->flags & XITouchEmulatingPointer ? "true" : "false"));
|
||||
xev->flags & XITouchEmulatingPointer));
|
||||
|
||||
if (ev->evtype == XI_TouchBegin)
|
||||
event->touch.type = GDK_TOUCH_BEGIN;
|
||||
@@ -1481,10 +1481,10 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
|
||||
GdkDevice *source_device;
|
||||
|
||||
GDK_NOTE(EVENTS,
|
||||
g_message ("touch update:\twindow %ld\n\ttouch id: %u\n\tpointer emulating: %s",
|
||||
g_message ("touch update:\twindow %ld\n\ttouch id: %u\n\tpointer emulating: %d",
|
||||
xev->event,
|
||||
xev->detail,
|
||||
xev->flags & XITouchEmulatingPointer ? "true" : "false"));
|
||||
xev->flags & XITouchEmulatingPointer));
|
||||
|
||||
event->touch.window = window;
|
||||
event->touch.sequence = GUINT_TO_POINTER (xev->detail);
|
||||
@@ -1555,20 +1555,7 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
|
||||
source_device = g_hash_table_lookup (device_manager->id_table,
|
||||
GUINT_TO_POINTER (xev->sourceid));
|
||||
gdk_event_set_source_device (event, source_device);
|
||||
|
||||
if (gdk_device_get_device_type (source_device) != GDK_DEVICE_TYPE_MASTER)
|
||||
_gdk_device_xi2_reset_scroll_valuators (GDK_X11_DEVICE_XI2 (source_device));
|
||||
else
|
||||
{
|
||||
GList *slaves, *l;
|
||||
|
||||
slaves = gdk_device_list_slave_devices (source_device);
|
||||
|
||||
for (l = slaves; l; l = l->next)
|
||||
_gdk_device_xi2_reset_scroll_valuators (GDK_X11_DEVICE_XI2 (l->data));
|
||||
|
||||
g_list_free (slaves);
|
||||
}
|
||||
_gdk_device_xi2_reset_scroll_valuators (GDK_X11_DEVICE_XI2 (source_device));
|
||||
|
||||
event->crossing.mode = translate_crossing_mode (xev->mode);
|
||||
event->crossing.detail = translate_notify_type (xev->detail);
|
||||
|
||||
@@ -140,7 +140,6 @@ static const char *const precache_atoms[] = {
|
||||
"_NET_WM_STATE_ABOVE",
|
||||
"_NET_WM_STATE_BELOW",
|
||||
"_NET_WM_STATE_FULLSCREEN",
|
||||
"_NET_WM_STATE_HIDDEN",
|
||||
"_NET_WM_STATE_MODAL",
|
||||
"_NET_WM_STATE_MAXIMIZED_VERT",
|
||||
"_NET_WM_STATE_MAXIMIZED_HORZ",
|
||||
@@ -150,17 +149,8 @@ static const char *const precache_atoms[] = {
|
||||
"_NET_WM_SYNC_REQUEST",
|
||||
"_NET_WM_SYNC_REQUEST_COUNTER",
|
||||
"_NET_WM_WINDOW_TYPE",
|
||||
"_NET_WM_WINDOW_TYPE_COMBO",
|
||||
"_NET_WM_WINDOW_TYPE_DIALOG",
|
||||
"_NET_WM_WINDOW_TYPE_DND",
|
||||
"_NET_WM_WINDOW_TYPE_DROPDOWN_MENU",
|
||||
"_NET_WM_WINDOW_TYPE_MENU",
|
||||
"_NET_WM_WINDOW_TYPE_NORMAL",
|
||||
"_NET_WM_WINDOW_TYPE_POPUP_MENU",
|
||||
"_NET_WM_WINDOW_TYPE_TOOLTIP",
|
||||
"_NET_WM_WINDOW_TYPE_UTILITY",
|
||||
"_NET_WM_USER_TIME",
|
||||
"_NET_WM_USER_TIME_WINDOW",
|
||||
"_NET_VIRTUAL_ROOTS",
|
||||
"GDK_SELECTION",
|
||||
"_NET_WM_STATE_FOCUSED"
|
||||
@@ -176,6 +166,8 @@ G_DEFINE_TYPE_WITH_CODE (GdkX11Display, gdk_x11_display, GDK_TYPE_DISPLAY,
|
||||
static void
|
||||
gdk_x11_display_init (GdkX11Display *display)
|
||||
{
|
||||
_gdk_x11_display_manager_add_display (gdk_display_manager_get (),
|
||||
GDK_DISPLAY (display));
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -486,21 +478,27 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
|
||||
|
||||
if (xevent->type == DestroyNotify && !is_substructure)
|
||||
{
|
||||
screen = GDK_X11_DISPLAY (display)->screen;
|
||||
x11_screen = GDK_X11_SCREEN (screen);
|
||||
int i, n;
|
||||
|
||||
if (x11_screen->wmspec_check_window == xevent->xdestroywindow.window)
|
||||
n = gdk_display_get_n_screens (display);
|
||||
for (i = 0; i < n; i++)
|
||||
{
|
||||
x11_screen->wmspec_check_window = None;
|
||||
x11_screen->last_wmspec_check_time = 0;
|
||||
g_free (x11_screen->window_manager_name);
|
||||
x11_screen->window_manager_name = g_strdup ("unknown");
|
||||
screen = gdk_display_get_screen (display, i);
|
||||
x11_screen = GDK_X11_SCREEN (screen);
|
||||
|
||||
/* careful, reentrancy */
|
||||
_gdk_x11_screen_window_manager_changed (screen);
|
||||
if (x11_screen->wmspec_check_window == xevent->xdestroywindow.window)
|
||||
{
|
||||
x11_screen->wmspec_check_window = None;
|
||||
x11_screen->last_wmspec_check_time = 0;
|
||||
g_free (x11_screen->window_manager_name);
|
||||
x11_screen->window_manager_name = g_strdup ("unknown");
|
||||
|
||||
return_val = FALSE;
|
||||
goto done;
|
||||
/* careful, reentrancy */
|
||||
_gdk_x11_screen_window_manager_changed (screen);
|
||||
|
||||
return_val = FALSE;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1348,6 +1346,7 @@ _gdk_x11_display_open (const gchar *display_name)
|
||||
|
||||
XClassHint *class_hint;
|
||||
gulong pid;
|
||||
gint i;
|
||||
gint ignore;
|
||||
gint maj, min;
|
||||
|
||||
@@ -1387,12 +1386,18 @@ _gdk_x11_display_open (const gchar *display_name)
|
||||
#endif
|
||||
|
||||
/* initialize the display's screens */
|
||||
display_x11->screen = _gdk_x11_screen_new (display, DefaultScreen (display_x11->xdisplay));
|
||||
display_x11->screens = g_new (GdkScreen *, ScreenCount (display_x11->xdisplay));
|
||||
for (i = 0; i < ScreenCount (display_x11->xdisplay); i++)
|
||||
display_x11->screens[i] = _gdk_x11_screen_new (display, i);
|
||||
|
||||
/* We need to initialize events after we have the screen
|
||||
* structures in places
|
||||
*/
|
||||
_gdk_x11_xsettings_init (GDK_X11_SCREEN (display_x11->screen));
|
||||
for (i = 0; i < ScreenCount (display_x11->xdisplay); i++)
|
||||
_gdk_x11_xsettings_init (GDK_X11_SCREEN (display_x11->screens[i]));
|
||||
|
||||
/*set the default screen */
|
||||
display_x11->default_screen = display_x11->screens[DefaultScreen (display_x11->xdisplay)];
|
||||
|
||||
display->device_manager = _gdk_x11_device_manager_new (display);
|
||||
|
||||
@@ -1406,7 +1411,7 @@ _gdk_x11_display_open (const gchar *display_name)
|
||||
attr.height = 10;
|
||||
attr.event_mask = 0;
|
||||
|
||||
display_x11->leader_gdk_window = gdk_window_new (GDK_X11_SCREEN (display_x11->screen)->root_window,
|
||||
display_x11->leader_gdk_window = gdk_window_new (GDK_X11_SCREEN (display_x11->default_screen)->root_window,
|
||||
&attr, GDK_WA_X | GDK_WA_Y);
|
||||
(_gdk_x11_window_get_toplevel (display_x11->leader_gdk_window))->is_leader = TRUE;
|
||||
|
||||
@@ -1482,7 +1487,7 @@ _gdk_x11_display_open (const gchar *display_name)
|
||||
|
||||
gdk_x11_display_error_trap_push (display);
|
||||
XQueryPointer (display_x11->xdisplay,
|
||||
GDK_X11_SCREEN (display_x11->screen)->xroot_window,
|
||||
GDK_X11_SCREEN (display_x11->default_screen)->xroot_window,
|
||||
&root, &child, &rootx, &rooty, &winx, &winy, &xmask);
|
||||
if (G_UNLIKELY (gdk_x11_display_error_trap_pop (display) == BadWindow))
|
||||
{
|
||||
@@ -1580,7 +1585,8 @@ _gdk_x11_display_open (const gchar *display_name)
|
||||
|
||||
gdk_x11_display_init_input (display);
|
||||
|
||||
_gdk_x11_screen_setup (display_x11->screen);
|
||||
for (i = 0; i < ScreenCount (display_x11->xdisplay); i++)
|
||||
_gdk_x11_screen_setup (display_x11->screens[i]);
|
||||
|
||||
g_signal_emit_by_name (display, "opened");
|
||||
|
||||
@@ -1672,10 +1678,25 @@ gdk_x11_display_get_name (GdkDisplay *display)
|
||||
return (gchar *) DisplayString (GDK_X11_DISPLAY (display)->xdisplay);
|
||||
}
|
||||
|
||||
static gint
|
||||
gdk_x11_display_get_n_screens (GdkDisplay *display)
|
||||
{
|
||||
return ScreenCount (GDK_X11_DISPLAY (display)->xdisplay);
|
||||
}
|
||||
|
||||
static GdkScreen *
|
||||
gdk_x11_display_get_screen (GdkDisplay *display,
|
||||
gint screen_num)
|
||||
{
|
||||
g_return_val_if_fail (ScreenCount (GDK_X11_DISPLAY (display)->xdisplay) > screen_num, NULL);
|
||||
|
||||
return GDK_X11_DISPLAY (display)->screens[screen_num];
|
||||
}
|
||||
|
||||
static GdkScreen *
|
||||
gdk_x11_display_get_default_screen (GdkDisplay *display)
|
||||
{
|
||||
return GDK_X11_DISPLAY (display)->screen;
|
||||
return GDK_X11_DISPLAY (display)->default_screen;
|
||||
}
|
||||
|
||||
gboolean
|
||||
@@ -1683,10 +1704,16 @@ _gdk_x11_display_is_root_window (GdkDisplay *display,
|
||||
Window xroot_window)
|
||||
{
|
||||
GdkX11Display *display_x11;
|
||||
gint i;
|
||||
|
||||
display_x11 = GDK_X11_DISPLAY (display);
|
||||
|
||||
return GDK_SCREEN_XROOTWIN (display_x11->screen) == xroot_window;
|
||||
for (i = 0; i < ScreenCount (display_x11->xdisplay); i++)
|
||||
{
|
||||
if (GDK_SCREEN_XROOTWIN (display_x11->screens[i]) == xroot_window)
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
struct XPointerUngrabInfo {
|
||||
@@ -1834,11 +1861,16 @@ gdk_x11_display_ungrab (GdkDisplay *display)
|
||||
static void
|
||||
gdk_x11_display_dispose (GObject *object)
|
||||
{
|
||||
GdkDisplay *display = GDK_DISPLAY (object);
|
||||
GdkX11Display *display_x11 = GDK_X11_DISPLAY (object);
|
||||
gint i;
|
||||
|
||||
_gdk_x11_display_manager_remove_display (gdk_display_manager_get (), display);
|
||||
|
||||
g_list_foreach (display_x11->input_devices, (GFunc) g_object_run_dispose, NULL);
|
||||
|
||||
_gdk_screen_close (display_x11->screen);
|
||||
for (i = 0; i < ScreenCount (display_x11->xdisplay); i++)
|
||||
_gdk_screen_close (display_x11->screens[i]);
|
||||
|
||||
if (display_x11->event_source)
|
||||
{
|
||||
@@ -1891,7 +1923,9 @@ gdk_x11_display_finalize (GObject *object)
|
||||
g_list_free_full (display_x11->input_windows, g_free);
|
||||
|
||||
/* Free all GdkScreens */
|
||||
g_object_unref (display_x11->screen);
|
||||
for (i = 0; i < ScreenCount (display_x11->xdisplay); i++)
|
||||
g_object_unref (display_x11->screens[i]);
|
||||
g_free (display_x11->screens);
|
||||
|
||||
g_free (display_x11->startup_notification_id);
|
||||
|
||||
@@ -1967,10 +2001,14 @@ GdkScreen *
|
||||
_gdk_x11_display_screen_for_xrootwin (GdkDisplay *display,
|
||||
Window xrootwin)
|
||||
{
|
||||
GdkScreen *screen = gdk_display_get_default_screen (display);
|
||||
gint i;
|
||||
|
||||
if (GDK_SCREEN_XROOTWIN (screen) == xrootwin)
|
||||
return screen;
|
||||
for (i = 0; i < ScreenCount (GDK_X11_DISPLAY (display)->xdisplay); i++)
|
||||
{
|
||||
GdkScreen *screen = gdk_display_get_screen (display, i);
|
||||
if (GDK_SCREEN_XROOTWIN (screen) == xrootwin)
|
||||
return screen;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@@ -1992,8 +2030,8 @@ gdk_x11_display_get_xdisplay (GdkDisplay *display)
|
||||
return GDK_X11_DISPLAY (display)->xdisplay;
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_x11_display_make_default (GdkDisplay *display)
|
||||
void
|
||||
_gdk_x11_display_make_default (GdkDisplay *display)
|
||||
{
|
||||
GdkX11Display *display_x11 = GDK_X11_DISPLAY (display);
|
||||
const gchar *startup_id;
|
||||
@@ -2782,11 +2820,12 @@ gdk_x11_display_class_init (GdkX11DisplayClass * class)
|
||||
display_class->window_type = GDK_TYPE_X11_WINDOW;
|
||||
|
||||
display_class->get_name = gdk_x11_display_get_name;
|
||||
display_class->get_n_screens = gdk_x11_display_get_n_screens;
|
||||
display_class->get_screen = gdk_x11_display_get_screen;
|
||||
display_class->get_default_screen = gdk_x11_display_get_default_screen;
|
||||
display_class->beep = gdk_x11_display_beep;
|
||||
display_class->sync = gdk_x11_display_sync;
|
||||
display_class->flush = gdk_x11_display_flush;
|
||||
display_class->make_default = gdk_x11_display_make_default;
|
||||
display_class->has_pending = gdk_x11_display_has_pending;
|
||||
display_class->queue_events = _gdk_x11_display_queue_events;
|
||||
display_class->get_default_group = gdk_x11_display_get_default_group;
|
||||
|
||||
@@ -38,7 +38,8 @@ struct _GdkX11Display
|
||||
{
|
||||
GdkDisplay parent_instance;
|
||||
Display *xdisplay;
|
||||
GdkScreen *screen;
|
||||
GdkScreen *default_screen;
|
||||
GdkScreen **screens;
|
||||
|
||||
GSource *event_source;
|
||||
|
||||
|
||||
@@ -32,6 +32,9 @@ struct _GdkX11DisplayManager
|
||||
{
|
||||
GdkDisplayManager parent;
|
||||
|
||||
GdkDisplay *default_display;
|
||||
GSList *displays;
|
||||
|
||||
gboolean init_failed;
|
||||
};
|
||||
|
||||
@@ -72,6 +75,47 @@ g_initable_iface_init (GInitableIface *iface)
|
||||
}
|
||||
|
||||
|
||||
static GdkDisplay *
|
||||
gdk_x11_display_manager_open_display (GdkDisplayManager *manager,
|
||||
const gchar *name)
|
||||
{
|
||||
GdkX11DisplayManager *manager_x11 = GDK_X11_DISPLAY_MANAGER (manager);
|
||||
GdkDisplay *display;
|
||||
|
||||
display = _gdk_x11_display_open (name);
|
||||
if (display != NULL)
|
||||
{
|
||||
if (manager_x11->default_display == NULL)
|
||||
gdk_display_manager_set_default_display (manager, display);
|
||||
|
||||
g_signal_emit_by_name (manager, "display-opened", display);
|
||||
}
|
||||
|
||||
return display;
|
||||
}
|
||||
|
||||
static GSList *
|
||||
gdk_x11_display_manager_list_displays (GdkDisplayManager *manager)
|
||||
{
|
||||
return g_slist_copy (GDK_X11_DISPLAY_MANAGER (manager)->displays);
|
||||
}
|
||||
|
||||
static GdkDisplay *
|
||||
gdk_x11_display_manager_get_default_display (GdkDisplayManager *manager)
|
||||
{
|
||||
return GDK_X11_DISPLAY_MANAGER (manager)->default_display;
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_x11_display_manager_set_default_display (GdkDisplayManager *manager,
|
||||
GdkDisplay *display)
|
||||
{
|
||||
GDK_X11_DISPLAY_MANAGER (manager)->default_display = display;
|
||||
|
||||
if (display)
|
||||
_gdk_x11_display_make_default (display);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_x11_display_manager_init (GdkX11DisplayManager *manager)
|
||||
{
|
||||
@@ -90,6 +134,43 @@ static void
|
||||
gdk_x11_display_manager_class_init (GdkX11DisplayManagerClass *class)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (class);
|
||||
GdkDisplayManagerClass *manager_class = GDK_DISPLAY_MANAGER_CLASS (class);
|
||||
|
||||
object_class->finalize = gdk_x11_display_manager_finalize;
|
||||
|
||||
manager_class->open_display = gdk_x11_display_manager_open_display;
|
||||
manager_class->list_displays = gdk_x11_display_manager_list_displays;
|
||||
manager_class->set_default_display = gdk_x11_display_manager_set_default_display;
|
||||
manager_class->get_default_display = gdk_x11_display_manager_get_default_display;
|
||||
manager_class->atom_intern = _gdk_x11_display_manager_atom_intern;
|
||||
manager_class->get_atom_name = _gdk_x11_display_manager_get_atom_name;
|
||||
manager_class->lookup_keyval = _gdk_x11_display_manager_lookup_keyval;
|
||||
manager_class->get_keyval_name = _gdk_x11_display_manager_get_keyval_name;
|
||||
manager_class->keyval_convert_case = _gdk_x11_display_manager_keyval_convert_case;
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_x11_display_manager_add_display (GdkDisplayManager *manager,
|
||||
GdkDisplay *display)
|
||||
{
|
||||
GdkX11DisplayManager *manager_x11 = GDK_X11_DISPLAY_MANAGER (manager);
|
||||
|
||||
manager_x11->displays = g_slist_prepend (manager_x11->displays, display);
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_x11_display_manager_remove_display (GdkDisplayManager *manager,
|
||||
GdkDisplay *display)
|
||||
{
|
||||
GdkX11DisplayManager *manager_x11 = GDK_X11_DISPLAY_MANAGER (manager);
|
||||
|
||||
manager_x11->displays = g_slist_remove (manager_x11->displays, display);
|
||||
|
||||
if (manager_x11->default_display == display)
|
||||
{
|
||||
if (manager_x11->displays)
|
||||
gdk_display_manager_set_default_display (manager, manager_x11->displays->data);
|
||||
else
|
||||
gdk_display_manager_set_default_display (manager, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1382,6 +1382,63 @@ gdk_x11_keymap_translate_keyboard_state (GdkKeymap *keymap,
|
||||
return tmp_keyval != NoSymbol;
|
||||
}
|
||||
|
||||
/* Key handling not part of the keymap */
|
||||
gchar*
|
||||
_gdk_x11_display_manager_get_keyval_name (GdkDisplayManager *manager,
|
||||
guint keyval)
|
||||
{
|
||||
switch (keyval)
|
||||
{
|
||||
case GDK_KEY_Page_Up:
|
||||
return "Page_Up";
|
||||
case GDK_KEY_Page_Down:
|
||||
return "Page_Down";
|
||||
case GDK_KEY_KP_Page_Up:
|
||||
return "KP_Page_Up";
|
||||
case GDK_KEY_KP_Page_Down:
|
||||
return "KP_Page_Down";
|
||||
}
|
||||
|
||||
return XKeysymToString (keyval);
|
||||
}
|
||||
|
||||
guint
|
||||
_gdk_x11_display_manager_lookup_keyval (GdkDisplayManager *manager,
|
||||
const gchar *keyval_name)
|
||||
{
|
||||
g_return_val_if_fail (keyval_name != NULL, 0);
|
||||
|
||||
return XStringToKeysym (keyval_name);
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_x11_display_manager_keyval_convert_case (GdkDisplayManager *manager,
|
||||
guint symbol,
|
||||
guint *lower,
|
||||
guint *upper)
|
||||
{
|
||||
KeySym xlower = 0;
|
||||
KeySym xupper = 0;
|
||||
|
||||
/* Check for directly encoded 24-bit UCS characters: */
|
||||
if ((symbol & 0xff000000) == 0x01000000)
|
||||
{
|
||||
if (lower)
|
||||
*lower = gdk_unicode_to_keyval (g_unichar_tolower (symbol & 0x00ffffff));
|
||||
if (upper)
|
||||
*upper = gdk_unicode_to_keyval (g_unichar_toupper (symbol & 0x00ffffff));
|
||||
return;
|
||||
}
|
||||
|
||||
if (symbol)
|
||||
XConvertCase (symbol, &xlower, &xupper);
|
||||
|
||||
if (lower)
|
||||
*lower = xlower;
|
||||
if (upper)
|
||||
*upper = xupper;
|
||||
}
|
||||
|
||||
/**
|
||||
* gdk_x11_keymap_get_group_for_state:
|
||||
* @keymap: a #GdkX11Keymap
|
||||
|
||||
@@ -168,6 +168,7 @@ gboolean _gdk_x11_display_is_root_window (GdkDisplay *display,
|
||||
Window xroot_window);
|
||||
|
||||
GdkDisplay * _gdk_x11_display_open (const gchar *display_name);
|
||||
void _gdk_x11_display_make_default (GdkDisplay *display);
|
||||
void _gdk_x11_display_update_grab_info (GdkDisplay *display,
|
||||
GdkDevice *device,
|
||||
gint status);
|
||||
@@ -247,11 +248,24 @@ void _gdk_device_xi2_reset_scroll_valuators (GdkX11DeviceXI2 *device);
|
||||
|
||||
void _gdk_x11_event_translate_keyboard_string (GdkEventKey *event);
|
||||
|
||||
void _gdk_x11_display_manager_add_display (GdkDisplayManager *manager,
|
||||
GdkDisplay *display);
|
||||
void _gdk_x11_display_manager_remove_display (GdkDisplayManager *manager,
|
||||
GdkDisplay *display);
|
||||
|
||||
GdkAtom _gdk_x11_display_manager_atom_intern (GdkDisplayManager *manager,
|
||||
const gchar *atom_name,
|
||||
gboolean copy_name);
|
||||
gchar * _gdk_x11_display_manager_get_atom_name (GdkDisplayManager *manager,
|
||||
GdkAtom atom);
|
||||
guint _gdk_x11_display_manager_lookup_keyval (GdkDisplayManager *manager,
|
||||
const gchar *name);
|
||||
gchar * _gdk_x11_display_manager_get_keyval_name (GdkDisplayManager *manager,
|
||||
guint keyval);
|
||||
void _gdk_x11_display_manager_keyval_convert_case (GdkDisplayManager *manager,
|
||||
guint symbol,
|
||||
guint *lower,
|
||||
guint *upper);
|
||||
|
||||
GdkCursor *_gdk_x11_display_get_cursor_for_type (GdkDisplay *display,
|
||||
GdkCursorType type);
|
||||
|
||||
@@ -38,6 +38,44 @@
|
||||
#include <string.h>
|
||||
|
||||
|
||||
/**
|
||||
* SECTION:properties
|
||||
* @Short_description: Functions to manipulate properties on windows
|
||||
* @Title: Properties and Atoms
|
||||
*
|
||||
* Each window under X can have any number of associated
|
||||
* <firstterm>properties</firstterm> attached to it.
|
||||
* Properties are arbitrary chunks of data identified by
|
||||
* <firstterm>atom</firstterm>s. (An <firstterm>atom</firstterm>
|
||||
* is a numeric index into a string table on the X server. They are used
|
||||
* to transfer strings efficiently between clients without
|
||||
* having to transfer the entire string.) A property
|
||||
* has an associated type, which is also identified
|
||||
* using an atom.
|
||||
*
|
||||
* A property has an associated <firstterm>format</firstterm>,
|
||||
* an integer describing how many bits are in each unit
|
||||
* of data inside the property. It must be 8, 16, or 32.
|
||||
* When data is transferred between the server and client,
|
||||
* if they are of different endianesses it will be byteswapped
|
||||
* as necessary according to the format of the property.
|
||||
* Note that on the client side, properties of format 32
|
||||
* will be stored with one unit per <emphasis>long</emphasis>,
|
||||
* even if a long integer has more than 32 bits on the platform.
|
||||
* (This decision was apparently made for Xlib to maintain
|
||||
* compatibility with programs that assumed longs were 32
|
||||
* bits, at the expense of programs that knew better.)
|
||||
*
|
||||
* The functions in this section are used to add, remove
|
||||
* and change properties on windows, to convert atoms
|
||||
* to and from strings and to manipulate some types of
|
||||
* data commonly stored in X window properties.
|
||||
*/
|
||||
|
||||
|
||||
static GPtrArray *virtual_atom_array;
|
||||
static GHashTable *virtual_atom_hash;
|
||||
|
||||
static const gchar xatoms_string[] =
|
||||
/* These are all the standard predefined X atoms */
|
||||
"\0" /* leave a space for None, even though it is not a predefined atom */
|
||||
@@ -197,12 +235,14 @@ gdk_x11_atom_to_xatom_for_display (GdkDisplay *display,
|
||||
|
||||
if (!xatom)
|
||||
{
|
||||
char *name = gdk_atom_name (atom);
|
||||
char *name;
|
||||
|
||||
g_return_val_if_fail (ATOM_TO_INDEX (atom) < virtual_atom_array->len, None);
|
||||
|
||||
name = g_ptr_array_index (virtual_atom_array, ATOM_TO_INDEX (atom));
|
||||
|
||||
xatom = XInternAtom (GDK_DISPLAY_XDISPLAY (display), name, FALSE);
|
||||
insert_atom_pair (display, atom, xatom);
|
||||
|
||||
g_free (name);
|
||||
}
|
||||
|
||||
return xatom;
|
||||
@@ -337,6 +377,68 @@ gdk_x11_xatom_to_atom (Atom xatom)
|
||||
return gdk_x11_xatom_to_atom_for_display (gdk_display_get_default (), xatom);
|
||||
}
|
||||
|
||||
static void
|
||||
virtual_atom_check_init (void)
|
||||
{
|
||||
if (!virtual_atom_hash)
|
||||
{
|
||||
gint i;
|
||||
|
||||
virtual_atom_hash = g_hash_table_new (g_str_hash, g_str_equal);
|
||||
virtual_atom_array = g_ptr_array_new ();
|
||||
|
||||
for (i = 0; i < G_N_ELEMENTS (xatoms_offset); i++)
|
||||
{
|
||||
g_ptr_array_add (virtual_atom_array, (gchar *)(xatoms_string + xatoms_offset[i]));
|
||||
g_hash_table_insert (virtual_atom_hash, (gchar *)(xatoms_string + xatoms_offset[i]),
|
||||
GUINT_TO_POINTER (i));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GdkAtom
|
||||
_gdk_x11_display_manager_atom_intern (GdkDisplayManager *manager,
|
||||
const gchar *atom_name,
|
||||
gboolean dup)
|
||||
{
|
||||
GdkAtom result;
|
||||
|
||||
virtual_atom_check_init ();
|
||||
|
||||
result = GDK_POINTER_TO_ATOM (g_hash_table_lookup (virtual_atom_hash, atom_name));
|
||||
if (!result)
|
||||
{
|
||||
result = INDEX_TO_ATOM (virtual_atom_array->len);
|
||||
|
||||
g_ptr_array_add (virtual_atom_array, dup ? g_strdup (atom_name) : (gchar *)atom_name);
|
||||
g_hash_table_insert (virtual_atom_hash,
|
||||
g_ptr_array_index (virtual_atom_array,
|
||||
ATOM_TO_INDEX (result)),
|
||||
GDK_ATOM_TO_POINTER (result));
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static const gchar *
|
||||
get_atom_name (GdkAtom atom)
|
||||
{
|
||||
virtual_atom_check_init ();
|
||||
|
||||
if (ATOM_TO_INDEX (atom) < virtual_atom_array->len)
|
||||
return g_ptr_array_index (virtual_atom_array, ATOM_TO_INDEX (atom));
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
gchar *
|
||||
_gdk_x11_display_manager_get_atom_name (GdkDisplayManager *manager,
|
||||
GdkAtom atom)
|
||||
{
|
||||
return g_strdup (get_atom_name (atom));
|
||||
}
|
||||
|
||||
/**
|
||||
* gdk_x11_get_xatom_by_name_for_display:
|
||||
* @display: a #GdkDisplay
|
||||
@@ -417,7 +519,7 @@ gdk_x11_get_xatom_name_for_display (GdkDisplay *display,
|
||||
{
|
||||
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
|
||||
|
||||
return _gdk_atom_name_const (gdk_x11_xatom_to_atom_for_display (display, xatom));
|
||||
return get_atom_name (gdk_x11_xatom_to_atom_for_display (display, xatom));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -436,7 +538,7 @@ gdk_x11_get_xatom_name_for_display (GdkDisplay *display,
|
||||
const gchar *
|
||||
gdk_x11_get_xatom_name (Atom xatom)
|
||||
{
|
||||
return _gdk_atom_name_const (gdk_x11_xatom_to_atom (xatom));
|
||||
return get_atom_name (gdk_x11_xatom_to_atom (xatom));
|
||||
}
|
||||
|
||||
gboolean
|
||||
|
||||
@@ -154,6 +154,7 @@ G_DEFINE_TYPE (GdkWindowImplX11, gdk_window_impl_x11, GDK_TYPE_WINDOW_IMPL)
|
||||
static void
|
||||
gdk_window_impl_x11_init (GdkWindowImplX11 *impl)
|
||||
{
|
||||
impl->toplevel_window_type = -1;
|
||||
impl->device_cursor = g_hash_table_new_full (NULL, NULL,
|
||||
NULL, g_object_unref);
|
||||
}
|
||||
|
||||
@@ -68,6 +68,7 @@ struct _GdkWindowImplX11
|
||||
GdkCursor *cursor;
|
||||
GHashTable *device_cursor;
|
||||
|
||||
gint8 toplevel_window_type;
|
||||
guint no_bg : 1; /* Set when the window background is temporarily
|
||||
* unset during resizing and scaling */
|
||||
guint override_redirect : 1;
|
||||
|
||||
@@ -295,7 +295,6 @@ gtk_public_h_sources = \
|
||||
gtkpagesetup.h \
|
||||
gtkpaned.h \
|
||||
gtkpapersize.h \
|
||||
gtkplacessidebar.h \
|
||||
gtkplug.h \
|
||||
gtkprintcontext.h \
|
||||
gtkprintoperation.h \
|
||||
@@ -331,8 +330,6 @@ gtk_public_h_sources = \
|
||||
gtksocket.h \
|
||||
gtkspinbutton.h \
|
||||
gtkspinner.h \
|
||||
gtkstack.h \
|
||||
gtkstackswitcher.h \
|
||||
gtkstatusbar.h \
|
||||
gtkstatusicon.h \
|
||||
gtkstock.h \
|
||||
@@ -424,7 +421,6 @@ gtk_private_h_sources = \
|
||||
gtkbindingsprivate.h \
|
||||
gtkbitmaskprivate.h \
|
||||
gtkbitmaskprivateimpl.h \
|
||||
gtkbookmarksmanager.h \
|
||||
gtkborderimageprivate.h \
|
||||
gtkboxprivate.h \
|
||||
gtkbubblewindowprivate.h \
|
||||
@@ -504,7 +500,6 @@ gtk_private_h_sources = \
|
||||
gtkmenuprivate.h \
|
||||
gtkmenuitemprivate.h \
|
||||
gtkmenushellprivate.h \
|
||||
gtkmenutracker.h \
|
||||
gtkmnemonichash.h \
|
||||
gtkmodelmenuitem.h \
|
||||
gtkmodifierstyle.h \
|
||||
@@ -551,7 +546,6 @@ gtk_private_h_sources = \
|
||||
gtktextutil.h \
|
||||
gtkthemingbackgroundprivate.h \
|
||||
gtkthemingengineprivate.h \
|
||||
gtktrashmonitor.h \
|
||||
gtktoolpaletteprivate.h \
|
||||
gtktreedatalist.h \
|
||||
gtktreeprivate.h \
|
||||
@@ -626,7 +620,6 @@ gtk_base_c_sources = \
|
||||
gtkbbox.c \
|
||||
gtkbin.c \
|
||||
gtkbindings.c \
|
||||
gtkbookmarksmanager.c \
|
||||
gtkborder.c \
|
||||
gtkborderimage.c \
|
||||
gtkbox.c \
|
||||
@@ -738,7 +731,6 @@ gtk_base_c_sources = \
|
||||
gtkfontchooserutils.c \
|
||||
gtkfontchooserwidget.c \
|
||||
gtkframe.c \
|
||||
gtkgladecatalog.c \
|
||||
gtkgrid.c \
|
||||
gtkheaderbar.c \
|
||||
gtkhsla.c \
|
||||
@@ -770,11 +762,11 @@ gtk_base_c_sources = \
|
||||
gtkmenubutton.c \
|
||||
gtkmenuitem.c \
|
||||
gtkmenushell.c \
|
||||
gtkmenutracker.c \
|
||||
gtkmenutoolbutton.c \
|
||||
gtkmessagedialog.c \
|
||||
gtkmisc.c \
|
||||
gtkmnemonichash.c \
|
||||
gtkmodelmenu.c \
|
||||
gtkmodelmenuitem.c \
|
||||
gtkmodifierstyle.c \
|
||||
gtkmodules.c \
|
||||
@@ -789,7 +781,6 @@ gtk_base_c_sources = \
|
||||
gtkpango.c \
|
||||
gtkpapersize.c \
|
||||
gtkpathbar.c \
|
||||
gtkplacessidebar.c \
|
||||
gtkpressandhold.c \
|
||||
gtkprintcontext.c \
|
||||
gtkprintoperation.c \
|
||||
@@ -832,8 +823,6 @@ gtk_base_c_sources = \
|
||||
gtkshow.c \
|
||||
gtkspinbutton.c \
|
||||
gtkspinner.c \
|
||||
gtkstack.c \
|
||||
gtkstackswitcher.c \
|
||||
gtkstatusbar.c \
|
||||
gtkstatusicon.c \
|
||||
gtkstock.c \
|
||||
@@ -875,7 +864,6 @@ gtk_base_c_sources = \
|
||||
gtktoolpalette.c \
|
||||
gtktoolshell.c \
|
||||
gtktooltip.c \
|
||||
gtktrashmonitor.c \
|
||||
gtktreedatalist.c \
|
||||
gtktreednd.c \
|
||||
gtktreemenu.c \
|
||||
@@ -1105,38 +1093,6 @@ DND_CURSORS = \
|
||||
cursor_dnd_move.png \
|
||||
cursor_dnd_none.png
|
||||
|
||||
COMPOSITE_TEMPLATES = \
|
||||
gtkaboutdialog.ui \
|
||||
gtkappchooserdialog.ui \
|
||||
gtkappchooserwidget.ui \
|
||||
gtkassistant.ui \
|
||||
gtkcolorchooserdialog.ui \
|
||||
gtkcoloreditor.ui \
|
||||
gtkdialog.ui \
|
||||
gtkfilechooserbutton.ui \
|
||||
gtkfilechooserdefault.ui \
|
||||
gtkfilechooserdialog.ui \
|
||||
gtkfontbutton.ui \
|
||||
gtkfontchooserdialog.ui \
|
||||
gtkfontchooserwidget.ui \
|
||||
gtkinfobar.ui \
|
||||
gtklockbutton.ui \
|
||||
gtkmessagedialog.ui \
|
||||
gtkpagesetupunixdialog.ui \
|
||||
gtkpathbar.ui \
|
||||
gtkprintunixdialog.ui \
|
||||
gtkrecentchooserdefault.ui \
|
||||
gtkscalebutton.ui \
|
||||
gtkstatusbar.ui \
|
||||
gtkvolumebutton.ui
|
||||
|
||||
template_headers = $(COMPOSITE_TEMPLATES:.ui=.ui.h)
|
||||
|
||||
MAINTAINERCLEANFILES += $(template_headers)
|
||||
|
||||
%.ui.h: %.ui extract-strings$(EXEEXT)
|
||||
$(AM_V_GEN) ./extract-strings$(EXEEXT) $< > $@
|
||||
|
||||
#
|
||||
# rules to generate built sources
|
||||
#
|
||||
@@ -1181,7 +1137,7 @@ gtktypebuiltins.c: @REBUILD@ $(gtk_public_h_sources) $(deprecated_h_sources) gtk
|
||||
gtkresources.h: gtk.gresource.xml
|
||||
$(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) $(srcdir)/gtk.gresource.xml \
|
||||
--target=$@ --sourcedir=$(srcdir) --c-name _gtk --generate-header --manual-register
|
||||
gtkresources.c: gtk.gresource.xml gtk-default.css gtk-win32.css gtk-win32-xp.css gtk-win32-base.css gtk-win32-classic.css $(DND_CURSORS) $(COMPOSITE_TEMPLATES) $(template_headers)
|
||||
gtkresources.c: gtk.gresource.xml gtk-default.css gtk-win32.css gtk-win32-xp.css gtk-win32-base.css gtk-win32-classic.css $(DND_CURSORS)
|
||||
$(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) $(srcdir)/gtk.gresource.xml \
|
||||
--target=$@ --sourcedir=$(srcdir) --c-name _gtk --generate-source --manual-register
|
||||
|
||||
@@ -1407,11 +1363,6 @@ gtk_launch_LDADD = $(LDADDS)
|
||||
gtk_launch_SOURCES = gtk-launch.c
|
||||
endif
|
||||
|
||||
noinst_PROGRAMS = extract-strings
|
||||
|
||||
extract_strings_SOURCES = extract-strings.c
|
||||
extract_strings_LDADD = $(GLIB_LIBS)
|
||||
|
||||
.PHONY: files test test-debug
|
||||
|
||||
files:
|
||||
|
||||
@@ -342,8 +342,7 @@ _gtk_gradient_resolve_full (GtkGradient *gradient,
|
||||
provider,
|
||||
_gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_COLOR),
|
||||
GTK_CSS_DEPENDS_ON_COLOR,
|
||||
&stop_deps,
|
||||
NULL);
|
||||
&stop_deps);
|
||||
if (val)
|
||||
{
|
||||
rgba = *_gtk_css_rgba_value_get_rgba (val);
|
||||
|
||||
@@ -655,63 +655,44 @@ void _gtk_style_shade (const GdkColor *a,
|
||||
GdkColor *b,
|
||||
gdouble k);
|
||||
|
||||
GDK_DEPRECATED_IN_3_0_FOR(GtkStyleContext)
|
||||
gboolean gtk_style_has_context (GtkStyle *style);
|
||||
|
||||
GDK_DEPRECATED_IN_3_0
|
||||
void gtk_widget_style_attach (GtkWidget *widget);
|
||||
GDK_DEPRECATED_IN_3_0_FOR(GtkStyleContext)
|
||||
gboolean gtk_widget_has_rc_style (GtkWidget *widget);
|
||||
GDK_DEPRECATED_IN_3_0
|
||||
void gtk_widget_set_style (GtkWidget *widget,
|
||||
GtkStyle *style);
|
||||
GDK_DEPRECATED_IN_3_0
|
||||
void gtk_widget_ensure_style (GtkWidget *widget);
|
||||
GDK_DEPRECATED_IN_3_0_FOR(gtk_widget_get_style_context)
|
||||
GtkStyle * gtk_widget_get_style (GtkWidget *widget);
|
||||
GDK_DEPRECATED_IN_3_0_FOR(GtkStyleContext)
|
||||
void gtk_widget_modify_style (GtkWidget *widget,
|
||||
GtkRcStyle *style);
|
||||
GDK_DEPRECATED_IN_3_0_FOR(GtkStyleContext)
|
||||
GtkRcStyle *gtk_widget_get_modifier_style (GtkWidget *widget);
|
||||
GDK_DEPRECATED_IN_3_0_FOR(gtk_widget_override_color)
|
||||
void gtk_widget_modify_fg (GtkWidget *widget,
|
||||
GtkStateType state,
|
||||
const GdkColor *color);
|
||||
GDK_DEPRECATED_IN_3_0_FOR(gtk_widget_override_background)
|
||||
void gtk_widget_modify_bg (GtkWidget *widget,
|
||||
GtkStateType state,
|
||||
const GdkColor *color);
|
||||
GDK_DEPRECATED_IN_3_0
|
||||
void gtk_widget_modify_text (GtkWidget *widget,
|
||||
GtkStateType state,
|
||||
const GdkColor *color);
|
||||
GDK_DEPRECATED_IN_3_0
|
||||
void gtk_widget_modify_base (GtkWidget *widget,
|
||||
GtkStateType state,
|
||||
const GdkColor *color);
|
||||
GDK_DEPRECATED_IN_3_0
|
||||
void gtk_widget_modify_cursor (GtkWidget *widget,
|
||||
const GdkColor *primary,
|
||||
const GdkColor *secondary);
|
||||
GDK_DEPRECATED_IN_3_0_FOR(gtk_widget_override_font)
|
||||
void gtk_widget_modify_font (GtkWidget *widget,
|
||||
PangoFontDescription *font_desc);
|
||||
GDK_DEPRECATED_IN_3_0_FOR(gtk_widget_reset_style)
|
||||
void gtk_widget_reset_rc_styles (GtkWidget *widget);
|
||||
GDK_DEPRECATED_IN_3_0_FOR(gtk_style_context_new)
|
||||
GtkStyle* gtk_widget_get_default_style (void);
|
||||
GDK_DEPRECATED_IN_3_0_FOR(gtk_widget_get_path)
|
||||
void gtk_widget_path (GtkWidget *widget,
|
||||
guint *path_length,
|
||||
gchar **path,
|
||||
gchar **path_reversed);
|
||||
GDK_DEPRECATED_IN_3_0
|
||||
void gtk_widget_class_path (GtkWidget *widget,
|
||||
guint *path_length,
|
||||
gchar **path,
|
||||
gchar **path_reversed);
|
||||
GDK_DEPRECATED_IN_3_0_FOR(gtk_widget_render_icon_pixbuf)
|
||||
GdkPixbuf *gtk_widget_render_icon (GtkWidget *widget,
|
||||
const gchar *stock_id,
|
||||
GtkIconSize size,
|
||||
|
||||
@@ -307,7 +307,6 @@ gtk_symbolic_color_resolve (GtkSymbolicColor *color,
|
||||
GTK_STYLE_PROVIDER_PRIVATE (props),
|
||||
current,
|
||||
0,
|
||||
NULL,
|
||||
NULL);
|
||||
_gtk_css_value_unref (current);
|
||||
if (v == NULL)
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "gtkmenu.h"
|
||||
#include "gtkmenuprivate.h"
|
||||
#include "gtkmenuitemprivate.h"
|
||||
#include "gtkstylecontext.h"
|
||||
#include "gtktearoffmenuitem.h"
|
||||
@@ -167,7 +167,7 @@ gtk_tearoff_menu_item_get_preferred_height (GtkWidget *widget,
|
||||
*minimum = *natural = (border_width * 2) + padding.top + padding.bottom;
|
||||
|
||||
parent = gtk_widget_get_parent (widget);
|
||||
if (GTK_IS_MENU (parent) && gtk_menu_get_tearoff_state (GTK_MENU (parent)))
|
||||
if (GTK_IS_MENU (parent) && GTK_MENU (parent)->priv->torn_off)
|
||||
{
|
||||
*minimum += ARROW_SIZE;
|
||||
*natural += ARROW_SIZE;
|
||||
@@ -217,7 +217,7 @@ gtk_tearoff_menu_item_draw (GtkWidget *widget,
|
||||
}
|
||||
|
||||
parent = gtk_widget_get_parent (widget);
|
||||
if (GTK_IS_MENU (parent) && gtk_menu_get_tearoff_state (GTK_MENU (parent)))
|
||||
if (GTK_IS_MENU (parent) && GTK_MENU (parent)->priv->torn_off)
|
||||
{
|
||||
gint arrow_x;
|
||||
|
||||
@@ -292,7 +292,8 @@ gtk_tearoff_menu_item_activate (GtkMenuItem *menu_item)
|
||||
GtkMenu *menu = GTK_MENU (parent);
|
||||
|
||||
gtk_widget_queue_resize (GTK_WIDGET (menu_item));
|
||||
gtk_menu_set_tearoff_state (menu, !gtk_menu_get_tearoff_state (menu));
|
||||
gtk_menu_set_tearoff_state (GTK_MENU (parent),
|
||||
!menu->priv->torn_off);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,172 +0,0 @@
|
||||
/* GTK - The GIMP Toolkit
|
||||
* Copyright (C) 2013 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* 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, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
typedef struct {
|
||||
GString *output;
|
||||
gboolean translatable;
|
||||
gchar *context;
|
||||
gchar *comments;
|
||||
GString *text;
|
||||
} ParserData;
|
||||
|
||||
static void
|
||||
start_element_handler (GMarkupParseContext *contexts,
|
||||
const gchar *element_name,
|
||||
const gchar **attribute_names,
|
||||
const gchar **attribute_values,
|
||||
gpointer user_data,
|
||||
GError **error)
|
||||
{
|
||||
ParserData *data = user_data;
|
||||
|
||||
if (g_str_equal (element_name, "property"))
|
||||
{
|
||||
gboolean translatable;
|
||||
gchar *context;
|
||||
gchar *comments;
|
||||
|
||||
g_markup_collect_attributes (element_name,
|
||||
attribute_names,
|
||||
attribute_values,
|
||||
error,
|
||||
G_MARKUP_COLLECT_STRING, "name", NULL,
|
||||
G_MARKUP_COLLECT_TRISTATE, "translatable", &translatable,
|
||||
G_MARKUP_COLLECT_STRDUP|G_MARKUP_COLLECT_OPTIONAL, "context", &context,
|
||||
G_MARKUP_COLLECT_STRDUP|G_MARKUP_COLLECT_OPTIONAL, "comments", &comments,
|
||||
G_MARKUP_COLLECT_INVALID);
|
||||
|
||||
if (translatable == TRUE)
|
||||
{
|
||||
data->translatable = TRUE;
|
||||
data->context = context;
|
||||
data->comments = comments;
|
||||
data->text = g_string_new ("");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
end_element_handler (GMarkupParseContext *context,
|
||||
const gchar *element_name,
|
||||
gpointer user_data,
|
||||
GError **error)
|
||||
{
|
||||
ParserData *data = user_data;
|
||||
gchar **lines;
|
||||
gint i;
|
||||
|
||||
if (!data->translatable)
|
||||
return;
|
||||
|
||||
lines = g_strsplit (data->text->str, "\n", -1);
|
||||
|
||||
if (data->comments)
|
||||
g_string_append_printf (data->output, "\n/* %s */\n",
|
||||
data->comments);
|
||||
|
||||
if (data->context)
|
||||
g_string_append_printf (data->output, "C_(\"%s\", ",
|
||||
data->context);
|
||||
else
|
||||
g_string_append (data->output, "N_(");
|
||||
|
||||
for (i = 0; lines[i]; i++)
|
||||
g_string_append_printf (data->output, "%s\"%s%s\"%s",
|
||||
i > 0 ? " " : "",
|
||||
lines[i],
|
||||
lines[i+1] ? "\\n" : "",
|
||||
lines[i+1] ? "\n" : "");
|
||||
|
||||
g_string_append (data->output, ");\n");
|
||||
|
||||
g_strfreev (lines);
|
||||
|
||||
g_free (data->comments);
|
||||
g_free (data->context);
|
||||
g_string_free (data->text, TRUE);
|
||||
|
||||
data->comments = NULL;
|
||||
data->context = NULL;
|
||||
data->text = NULL;
|
||||
data->translatable = FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
text_handler (GMarkupParseContext *context,
|
||||
const gchar *text,
|
||||
gsize text_len,
|
||||
gpointer user_data,
|
||||
GError **error)
|
||||
{
|
||||
ParserData *data = user_data;
|
||||
|
||||
if (!data->translatable)
|
||||
return;
|
||||
|
||||
g_string_append_len (data->text, text, text_len);
|
||||
}
|
||||
|
||||
static const GMarkupParser parser = {
|
||||
start_element_handler,
|
||||
end_element_handler,
|
||||
text_handler,
|
||||
NULL,
|
||||
NULL
|
||||
};
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
gchar *contents;
|
||||
gsize length;
|
||||
GError *error;
|
||||
GMarkupParseContext *context;
|
||||
ParserData data;
|
||||
|
||||
if (argc < 2)
|
||||
{
|
||||
g_printerr ("Expect a filename\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
error = NULL;
|
||||
if (!g_file_get_contents (argv[1], &contents, &length, &error))
|
||||
{
|
||||
g_printerr ("%s\n", error->message);
|
||||
g_error_free (error);
|
||||
return 1;
|
||||
}
|
||||
|
||||
data.output = g_string_new ("");
|
||||
data.translatable = FALSE;
|
||||
|
||||
context = g_markup_parse_context_new (&parser, 0, &data, NULL);
|
||||
if (!g_markup_parse_context_parse (context, contents, length, &error))
|
||||
{
|
||||
g_markup_parse_context_free (context);
|
||||
g_free (contents);
|
||||
g_printerr ("%s\n", error->message);
|
||||
g_error_free (error);
|
||||
return 1;
|
||||
}
|
||||
|
||||
g_print ("%s", g_string_free (data.output, FALSE));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
The catalog in this directory defines some widgets that are private
|
||||
to GTK+ and is needed to edit .ui files defining composite classes
|
||||
in GTK+.
|
||||
|
||||
In order to edit any composite classes in GTK+, startup Glade
|
||||
in the following way, example:
|
||||
|
||||
cd /path/to/gtk+/
|
||||
GLADE_CATALOG_SEARCH_PATH=`pwd`/gtk/glade glade gtk/gtkfilechooserdefault.ui
|
||||
|
||||
Documentation for updating this catalog can be found here:
|
||||
https://developer.gnome.org/gladeui/stable/
|
||||
|
||||
Note also that when including private GTK+ widgets as components, it is
|
||||
important to call g_type_ensure () to register the type explicitly
|
||||
before calling gtk_container_init_template(), otherwise GtkBuilder will
|
||||
not be able to properly load the type.
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user