Compare commits

...

2 Commits

Author SHA1 Message Date
Niels De Graef
7efb315568 WIP 2018-11-19 14:19:44 +01:00
Niels De Graef
2dfcf8dcac CI: add uncrustify config.
Run in the repo's root directory with for example

```
$ uncrustify -c data/uncrustify.cfg src/**/*.c
```
2018-11-19 14:19:39 +01:00
192 changed files with 12615 additions and 9525 deletions

112
data/uncrustify.cfg Normal file
View File

@ -0,0 +1,112 @@
# Enorces he code style of Mutter (based on GNU)
code_width = 80
# indent using tabs
output_tab_size = 2
indent_columns = output_tab_size
indent_with_tabs = 0
indent_brace = 2
# indent case
indent_switch_case = 0
# indent_case_brace = 0
# newlines
newlines = lf
nl_after_semicolon = true
nl_start_of_file = remove
nl_end_of_file = force
nl_end_of_file_min = 1
# spaces
sp_return_paren = force # "return (1);" vs "return(1);"
sp_sizeof_paren = force # "sizeof (int)" vs "sizeof(int)"
sp_assign = force
sp_arith = force
sp_bool = force
sp_compare = force
sp_after_comma = force
sp_case_label = force
sp_else_brace = force
sp_brace_else = force
sp_func_call_paren = force # "foo (" vs "foo("
sp_func_proto_paren = force # "int foo ();" vs "int foo();"
sp_before_ptr_star = force
sp_after_ptr_star_qualifier = force # "const char * const" vs. "const char *const"
sp_after_ptr_star = remove
sp_between_ptr_star = remove # "**var" vs "* *var"
sp_inside_paren = remove # "( 1 )" vs "(1)"
sp_inside_fparen = remove # "( 1 )" vs "(1)" - functions
sp_inside_sparen = remove # "( 1 )" vs "(1)" - if/for/etc
sp_after_cast = force # "(int) a" vs "(int)a"
sp_func_call_user_paren = remove # For gettext, "_()" vs. "_ ()"
set func_call_user _ N_ C_ # Needed for sp_after_cast
sp_before_semi = remove
sp_paren_paren = remove # Space between (( and ))
eat_blanks_before_close_brace = true
eat_blanks_after_open_brace = true
# Style for curly braces
nl_assign_brace = add
nl_enum_brace = add
nl_union_brace = add
nl_struct_brace = add
nl_class_brace = add
nl_do_brace = add
nl_if_brace = add
nl_for_brace = add
nl_else_brace = add
nl_elseif_brace = add
nl_while_brace = add
nl_switch_brace = add
nl_fcall_brace = add
nl_fdef_brace = add
nl_brace_else = add
nl_brace_while = add
nl_case_colon_brace = add
nl_after_brace_open = true
# Function calls and parameters
nl_func_paren = remove
nl_func_def_paren = remove
nl_func_decl_start = remove
nl_func_def_start = remove
nl_func_decl_args = ignore
nl_func_def_args = ignore
nl_func_decl_args_multi_line = force
nl_func_def_args_multi_line = force
nl_func_decl_end = remove
nl_func_def_end = remove
# Code modifying options (non-whitespace)
mod_full_brace_function = force
mod_remove_extra_semicolon = true
# Align
align_func_params = true
align_single_line_func = true
align_var_def_star_style = 2
# one liners
nl_func_leave_one_liners = true
nl_enum_leave_one_liners = true
nl_assign_leave_one_liners = true
# Comments
cmt_cpp_to_c = true # "/* */" vs. "//"
cmt_convert_tab_to_spaces = true
#cmt_reflow_mode = 2 # Full reflow (seems doesn't work quite well, it doesn't reorder the comments)
cmt_width = 80 # Line width
cmt_star_cont = true # Whether to put a star on subsequent comment lines
cmt_sp_after_star_cont = 1 # The number of spaces to insert after the star on subsequent comment lines
cmt_c_nl_start = false # false/true
cmt_c_nl_end = true # false/true
# For multi-line comments with a '*' lead, remove leading spaces if the first and last lines of
# the comment are the same length. Default=True
cmt_multi_check_last = false
# Encoding
utf8_bom = remove
utf8_force = true

View File

@ -59,11 +59,11 @@ decode_vendor_and_product_identification (const uchar *edid, MonitorInfo *info)
int is_model_year; int is_model_year;
/* Manufacturer Code */ /* Manufacturer Code */
info->manufacturer_code[0] = get_bits (edid[0x08], 2, 6); info->manufacturer_code[0] = get_bits (edid[0x08], 2, 6);
info->manufacturer_code[1] = get_bits (edid[0x08], 0, 1) << 3; info->manufacturer_code[1] = get_bits (edid[0x08], 0, 1) << 3;
info->manufacturer_code[1] |= get_bits (edid[0x09], 5, 7); info->manufacturer_code[1] |= get_bits (edid[0x09], 5, 7);
info->manufacturer_code[2] = get_bits (edid[0x09], 0, 4); info->manufacturer_code[2] = get_bits (edid[0x09], 0, 4);
info->manufacturer_code[3] = '\0'; info->manufacturer_code[3] = '\0';
info->manufacturer_code[0] += 'A' - 1; info->manufacturer_code[0] += 'A' - 1;
info->manufacturer_code[1] += 'A' - 1; info->manufacturer_code[1] += 'A' - 1;
@ -128,14 +128,14 @@ decode_display_parameters (const uchar *edid, MonitorInfo *info)
int bits; int bits;
static const int bit_depth[8] = static const int bit_depth[8] =
{ {
-1, 6, 8, 10, 12, 14, 16, -1 -1, 6, 8, 10, 12, 14, 16, -1
}; };
static const Interface interfaces[6] = static const Interface interfaces[6] =
{ {
UNDEFINED, DVI, HDMI_A, HDMI_B, MDDI, DISPLAY_PORT UNDEFINED, DVI, HDMI_A, HDMI_B, MDDI, DISPLAY_PORT
}; };
bits = get_bits (edid[0x14], 4, 6); bits = get_bits (edid[0x14], 4, 6);
info->connector.digital.bits_per_primary = bit_depth[bits]; info->connector.digital.bits_per_primary = bit_depth[bits];
@ -152,12 +152,12 @@ decode_display_parameters (const uchar *edid, MonitorInfo *info)
int bits = get_bits (edid[0x14], 5, 6); int bits = get_bits (edid[0x14], 5, 6);
static const double levels[][3] = static const double levels[][3] =
{ {
{ 0.7, 0.3, 1.0 }, { 0.7, 0.3, 1.0 },
{ 0.714, 0.286, 1.0 }, { 0.714, 0.286, 1.0 },
{ 1.0, 0.4, 1.4 }, { 1.0, 0.4, 1.4 },
{ 0.7, 0.0, 0.7 }, { 0.7, 0.0, 0.7 },
}; };
info->connector.analog.video_signal_level = levels[bits][0]; info->connector.analog.video_signal_level = levels[bits][0];
info->connector.analog.sync_signal_level = levels[bits][1]; info->connector.analog.sync_signal_level = levels[bits][1];
@ -190,7 +190,7 @@ decode_display_parameters (const uchar *edid, MonitorInfo *info)
info->width_mm = -1; info->width_mm = -1;
info->height_mm = -1; info->height_mm = -1;
info->aspect_ratio = 100.0 / (edid[0x16] + 99); info->aspect_ratio = 100.0 / (edid[0x16] + 99);
info->aspect_ratio = 1/info->aspect_ratio; /* portrait */ info->aspect_ratio = 1 / info->aspect_ratio; /* portrait */
} }
else else
{ {
@ -221,9 +221,9 @@ decode_display_parameters (const uchar *edid, MonitorInfo *info)
{ {
int bits = get_bits (edid[0x18], 3, 4); int bits = get_bits (edid[0x18], 3, 4);
ColorType color_type[4] = ColorType color_type[4] =
{ {
MONOCHROME, RGB, OTHER_COLOR, UNDEFINED_COLOR MONOCHROME, RGB, OTHER_COLOR, UNDEFINED_COLOR
}; };
info->connector.analog.color_type = color_type[bits]; info->connector.analog.color_type = color_type[bits];
} }
@ -271,38 +271,38 @@ static int
decode_established_timings (const uchar *edid, MonitorInfo *info) decode_established_timings (const uchar *edid, MonitorInfo *info)
{ {
static const Timing established[][8] = static const Timing established[][8] =
{
{ {
{ { 800, 600, 60 },
{ 800, 600, 60 }, { 800, 600, 56 },
{ 800, 600, 56 }, { 640, 480, 75 },
{ 640, 480, 75 }, { 640, 480, 72 },
{ 640, 480, 72 }, { 640, 480, 67 },
{ 640, 480, 67 }, { 640, 480, 60 },
{ 640, 480, 60 }, { 720, 400, 88 },
{ 720, 400, 88 }, { 720, 400, 70 }
{ 720, 400, 70 } },
}, {
{ { 1280, 1024, 75 },
{ 1280, 1024, 75 }, { 1024, 768, 75 },
{ 1024, 768, 75 }, { 1024, 768, 70 },
{ 1024, 768, 70 }, { 1024, 768, 60 },
{ 1024, 768, 60 }, { 1024, 768, 87 },
{ 1024, 768, 87 }, { 832, 624, 75 },
{ 832, 624, 75 }, { 800, 600, 75 },
{ 800, 600, 75 }, { 800, 600, 72 }
{ 800, 600, 72 } },
}, {
{ { 0, 0, 0 },
{ 0, 0, 0 }, { 0, 0, 0 },
{ 0, 0, 0 }, { 0, 0, 0 },
{ 0, 0, 0 }, { 0, 0, 0 },
{ 0, 0, 0 }, { 0, 0, 0 },
{ 0, 0, 0 }, { 0, 0, 0 },
{ 0, 0, 0 }, { 0, 0, 0 },
{ 0, 0, 0 }, { 1152, 870, 75 }
{ 1152, 870, 75 } },
}, };
};
int i, j, idx; int i, j, idx;
@ -310,12 +310,12 @@ decode_established_timings (const uchar *edid, MonitorInfo *info)
for (i = 0; i < 3; ++i) for (i = 0; i < 3; ++i)
{ {
for (j = 0; j < 8; ++j) for (j = 0; j < 8; ++j)
{ {
int byte = edid[0x23 + i]; int byte = edid[0x23 + i];
if (get_bit (byte, j) && established[i][j].frequency != 0) if (get_bit (byte, j) && established[i][j].frequency != 0)
info->established[idx++] = established[i][j]; info->established[idx++] = established[i][j];
} }
} }
return TRUE; return TRUE;
} }
@ -331,22 +331,26 @@ decode_standard_timings (const uchar *edid, MonitorInfo *info)
int second = edid[0x27 + 2 * i]; int second = edid[0x27 + 2 * i];
if (first != 0x01 && second != 0x01) if (first != 0x01 && second != 0x01)
{ {
int w = 8 * (first + 31); int w = 8 * (first + 31);
int h = 0; int h = 0;
switch (get_bits (second, 6, 7)) switch (get_bits (second, 6, 7))
{ {
case 0x00: h = (w / 16) * 10; break; case 0x00: h = (w / 16) * 10;
case 0x01: h = (w / 4) * 3; break; break;
case 0x02: h = (w / 5) * 4; break; case 0x01: h = (w / 4) * 3;
case 0x03: h = (w / 16) * 9; break; break;
} case 0x02: h = (w / 5) * 4;
break;
case 0x03: h = (w / 16) * 9;
break;
}
info->standard[i].width = w; info->standard[i].width = w;
info->standard[i].height = h; info->standard[i].height = h;
info->standard[i].frequency = get_bits (second, 0, 5) + 60; info->standard[i].frequency = get_bits (second, 0, 5) + 60;
} }
} }
return TRUE; return TRUE;
@ -359,25 +363,25 @@ decode_lf_string (const uchar *s, int n_chars, char *result)
for (i = 0; i < n_chars; ++i) for (i = 0; i < n_chars; ++i)
{ {
if (s[i] == 0x0a) if (s[i] == 0x0a)
{ {
*result++ = '\0'; *result++ = '\0';
break; break;
} }
else if (s[i] == 0x00) else if (s[i] == 0x00)
{ {
/* Convert embedded 0's to spaces */ /* Convert embedded 0's to spaces */
*result++ = ' '; *result++ = ' ';
} }
else else
{ {
*result++ = s[i]; *result++ = s[i];
} }
} }
} }
static void static void
decode_display_descriptor (const uchar *desc, decode_display_descriptor (const uchar *desc,
MonitorInfo *info) MonitorInfo *info)
{ {
switch (desc[0x03]) switch (desc[0x03])
{ {
@ -414,16 +418,16 @@ decode_display_descriptor (const uchar *desc,
} }
static void static void
decode_detailed_timing (const uchar *timing, decode_detailed_timing (const uchar *timing,
DetailedTiming *detailed) DetailedTiming *detailed)
{ {
int bits; int bits;
StereoType stereo[] = StereoType stereo[] =
{ {
NO_STEREO, NO_STEREO, FIELD_RIGHT, FIELD_LEFT, NO_STEREO, NO_STEREO, FIELD_RIGHT, FIELD_LEFT,
TWO_WAY_RIGHT_ON_EVEN, TWO_WAY_LEFT_ON_EVEN, TWO_WAY_RIGHT_ON_EVEN, TWO_WAY_LEFT_ON_EVEN,
FOUR_WAY_INTERLEAVED, SIDE_BY_SIDE FOUR_WAY_INTERLEAVED, SIDE_BY_SIDE
}; };
detailed->pixel_clock = (timing[0x00] | timing[0x01] << 8) * 10000; detailed->pixel_clock = (timing[0x00] | timing[0x01] << 8) * 10000;
detailed->h_addr = timing[0x02] | ((timing[0x04] & 0xf0) << 4); detailed->h_addr = timing[0x02] | ((timing[0x04] & 0xf0) << 4);
@ -436,7 +440,7 @@ decode_detailed_timing (const uchar *timing,
get_bits (timing[0x0a], 4, 7) | get_bits (timing[0x0b], 2, 3) << 4; get_bits (timing[0x0a], 4, 7) | get_bits (timing[0x0b], 2, 3) << 4;
detailed->v_sync = detailed->v_sync =
get_bits (timing[0x0a], 0, 3) | get_bits (timing[0x0b], 0, 1) << 4; get_bits (timing[0x0a], 0, 3) | get_bits (timing[0x0b], 0, 1) << 4;
detailed->width_mm = timing[0x0c] | get_bits (timing[0x0e], 4, 7) << 8; detailed->width_mm = timing[0x0c] | get_bits (timing[0x0e], 4, 7) << 8;
detailed->height_mm = timing[0x0d] | get_bits (timing[0x0e], 0, 3) << 8; detailed->height_mm = timing[0x0d] | get_bits (timing[0x0e], 0, 3) << 8;
detailed->right_border = timing[0x0f]; detailed->right_border = timing[0x0f];
detailed->top_border = timing[0x10]; detailed->top_border = timing[0x10];
@ -456,15 +460,15 @@ decode_detailed_timing (const uchar *timing,
detailed->connector.digital.composite = !get_bit (bits, 3); detailed->connector.digital.composite = !get_bit (bits, 3);
if (detailed->connector.digital.composite) if (detailed->connector.digital.composite)
{ {
detailed->connector.digital.serrations = get_bit (bits, 2); detailed->connector.digital.serrations = get_bit (bits, 2);
detailed->connector.digital.negative_vsync = FALSE; detailed->connector.digital.negative_vsync = FALSE;
} }
else else
{ {
detailed->connector.digital.serrations = FALSE; detailed->connector.digital.serrations = FALSE;
detailed->connector.digital.negative_vsync = !get_bit (bits, 2); detailed->connector.digital.negative_vsync = !get_bit (bits, 2);
} }
detailed->connector.digital.negative_hsync = !get_bit (bits, 0); detailed->connector.digital.negative_hsync = !get_bit (bits, 0);
} }
@ -489,13 +493,14 @@ decode_descriptors (const uchar *edid, MonitorInfo *info)
int index = 0x36 + i * 18; int index = 0x36 + i * 18;
if (edid[index + 0] == 0x00 && edid[index + 1] == 0x00) if (edid[index + 0] == 0x00 && edid[index + 1] == 0x00)
{ {
decode_display_descriptor (edid + index, info); decode_display_descriptor (edid + index, info);
} }
else else
{ {
decode_detailed_timing (edid + index, &(info->detailed_timings[timing_idx++])); decode_detailed_timing (edid + index,
} &(info->detailed_timings[timing_idx++]));
}
} }
info->n_detailed_timings = timing_idx; info->n_detailed_timings = timing_idx;
@ -505,7 +510,7 @@ decode_descriptors (const uchar *edid, MonitorInfo *info)
static void static void
decode_check_sum (const uchar *edid, decode_check_sum (const uchar *edid,
MonitorInfo *info) MonitorInfo *info)
{ {
int i; int i;
uchar check = 0; uchar check = 0;

View File

@ -153,7 +153,8 @@ meta_backend_finalize (GObject *object)
#endif #endif
if (priv->sleep_signal_id) if (priv->sleep_signal_id)
g_dbus_connection_signal_unsubscribe (priv->system_bus, priv->sleep_signal_id); g_dbus_connection_signal_unsubscribe (priv->system_bus,
priv->sleep_signal_id);
if (priv->upower_watch_id) if (priv->upower_watch_id)
g_bus_unwatch_name (priv->upower_watch_id); g_bus_unwatch_name (priv->upower_watch_id);
g_cancellable_cancel (priv->cancellable); g_cancellable_cancel (priv->cancellable);
@ -206,7 +207,8 @@ meta_backend_monitors_changed (MetaBackend *backend)
MetaMonitorManager *monitor_manager = MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend); meta_backend_get_monitor_manager (backend);
ClutterDeviceManager *manager = clutter_device_manager_get_default (); ClutterDeviceManager *manager = clutter_device_manager_get_default ();
ClutterInputDevice *device = clutter_device_manager_get_core_device (manager, CLUTTER_POINTER_DEVICE); ClutterInputDevice *device = clutter_device_manager_get_core_device (manager,
CLUTTER_POINTER_DEVICE);
ClutterPoint point; ClutterPoint point;
meta_backend_sync_screen_size (backend); meta_backend_sync_screen_size (backend);
@ -277,7 +279,8 @@ create_device_monitor (MetaBackend *backend,
g_assert (g_hash_table_lookup (priv->device_monitors, &device_id) == NULL); g_assert (g_hash_table_lookup (priv->device_monitors, &device_id) == NULL);
idle_monitor = meta_backend_create_idle_monitor (backend, device_id); idle_monitor = meta_backend_create_idle_monitor (backend, device_id);
g_hash_table_insert (priv->device_monitors, &idle_monitor->device_id, idle_monitor); g_hash_table_insert (priv->device_monitors, &idle_monitor->device_id,
idle_monitor);
} }
static void static void
@ -313,8 +316,10 @@ on_device_added (ClutterDeviceManager *device_manager,
static inline gboolean static inline gboolean
device_is_slave_touchscreen (ClutterInputDevice *device) device_is_slave_touchscreen (ClutterInputDevice *device)
{ {
return (clutter_input_device_get_device_mode (device) != CLUTTER_INPUT_MODE_MASTER && return (clutter_input_device_get_device_mode (device) !=
clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE); CLUTTER_INPUT_MODE_MASTER &&
clutter_input_device_get_device_type (device) ==
CLUTTER_TOUCHSCREEN_DEVICE);
} }
static inline gboolean static inline gboolean
@ -328,10 +333,13 @@ check_has_pointing_device (ClutterDeviceManager *manager)
{ {
ClutterInputDevice *device = devices->data; ClutterInputDevice *device = devices->data;
if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER) if (clutter_input_device_get_device_mode (device) ==
CLUTTER_INPUT_MODE_MASTER)
continue; continue;
if (clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE || if (clutter_input_device_get_device_type (device) ==
clutter_input_device_get_device_type (device) == CLUTTER_KEYBOARD_DEVICE) CLUTTER_TOUCHSCREEN_DEVICE ||
clutter_input_device_get_device_type (device) ==
CLUTTER_KEYBOARD_DEVICE)
continue; continue;
return TRUE; return TRUE;
@ -351,8 +359,10 @@ check_has_slave_touchscreen (ClutterDeviceManager *manager)
{ {
ClutterInputDevice *device = devices->data; ClutterInputDevice *device = devices->data;
if (clutter_input_device_get_device_mode (device) != CLUTTER_INPUT_MODE_MASTER && if (clutter_input_device_get_device_mode (device) !=
clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE) CLUTTER_INPUT_MODE_MASTER &&
clutter_input_device_get_device_type (device) ==
CLUTTER_TOUCHSCREEN_DEVICE)
return TRUE; return TRUE;
} }
@ -458,7 +468,8 @@ meta_backend_real_post_init (MetaBackend *backend)
meta_backend_sync_screen_size (backend); meta_backend_sync_screen_size (backend);
priv->cursor_renderer = META_BACKEND_GET_CLASS (backend)->create_cursor_renderer (backend); priv->cursor_renderer =
META_BACKEND_GET_CLASS (backend)->create_cursor_renderer (backend);
priv->device_monitors = priv->device_monitors =
g_hash_table_new_full (g_int_hash, g_int_equal, g_hash_table_new_full (g_int_hash, g_int_equal,
@ -478,7 +489,8 @@ meta_backend_real_post_init (MetaBackend *backend)
#ifdef HAVE_REMOTE_DESKTOP #ifdef HAVE_REMOTE_DESKTOP
priv->remote_access_controller = priv->remote_access_controller =
g_object_new (META_TYPE_REMOTE_ACCESS_CONTROLLER, NULL); g_object_new (META_TYPE_REMOTE_ACCESS_CONTROLLER, NULL);
priv->dbus_session_watcher = g_object_new (META_TYPE_DBUS_SESSION_WATCHER, NULL); priv->dbus_session_watcher = g_object_new (META_TYPE_DBUS_SESSION_WATCHER,
NULL);
priv->screen_cast = meta_screen_cast_new (priv->dbus_session_watcher); priv->screen_cast = meta_screen_cast_new (priv->dbus_session_watcher);
priv->remote_desktop = meta_remote_desktop_new (priv->dbus_session_watcher); priv->remote_desktop = meta_remote_desktop_new (priv->dbus_session_watcher);
#endif /* HAVE_REMOTE_DESKTOP */ #endif /* HAVE_REMOTE_DESKTOP */
@ -521,12 +533,12 @@ meta_backend_real_select_stage_events (MetaBackend *backend)
} }
static gboolean static gboolean
meta_backend_real_get_relative_motion_deltas (MetaBackend *backend, meta_backend_real_get_relative_motion_deltas (MetaBackend *backend,
const ClutterEvent *event, const ClutterEvent *event,
double *dx, double *dx,
double *dy, double *dy,
double *dx_unaccel, double *dx_unaccel,
double *dy_unaccel) double *dy_unaccel)
{ {
return FALSE; return FALSE;
} }
@ -655,7 +667,7 @@ meta_backend_constructed (GObject *object)
MetaBackend *backend = META_BACKEND (object); MetaBackend *backend = META_BACKEND (object);
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
MetaBackendClass *backend_class = MetaBackendClass *backend_class =
META_BACKEND_GET_CLASS (backend); META_BACKEND_GET_CLASS (backend);
if (backend_class->is_lid_closed != meta_backend_real_is_lid_closed) if (backend_class->is_lid_closed != meta_backend_real_is_lid_closed)
return; return;
@ -683,7 +695,8 @@ meta_backend_class_init (MetaBackendClass *klass)
klass->grab_device = meta_backend_real_grab_device; klass->grab_device = meta_backend_real_grab_device;
klass->ungrab_device = meta_backend_real_ungrab_device; klass->ungrab_device = meta_backend_real_ungrab_device;
klass->select_stage_events = meta_backend_real_select_stage_events; klass->select_stage_events = meta_backend_real_select_stage_events;
klass->get_relative_motion_deltas = meta_backend_real_get_relative_motion_deltas; klass->get_relative_motion_deltas =
meta_backend_real_get_relative_motion_deltas;
klass->is_lid_closed = meta_backend_real_is_lid_closed; klass->is_lid_closed = meta_backend_real_is_lid_closed;
signals[KEYMAP_CHANGED] = signals[KEYMAP_CHANGED] =
@ -782,9 +795,9 @@ system_bus_gotten_cb (GObject *object,
} }
static gboolean static gboolean
meta_backend_initable_init (GInitable *initable, meta_backend_initable_init (GInitable *initable,
GCancellable *cancellable, GCancellable *cancellable,
GError **error) GError **error)
{ {
MetaBackend *backend = META_BACKEND (initable); MetaBackend *backend = META_BACKEND (initable);
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
@ -795,7 +808,8 @@ meta_backend_initable_init (GInitable *initable,
priv->egl = g_object_new (META_TYPE_EGL, NULL); priv->egl = g_object_new (META_TYPE_EGL, NULL);
#endif #endif
priv->orientation_manager = g_object_new (META_TYPE_ORIENTATION_MANAGER, NULL); priv->orientation_manager =
g_object_new (META_TYPE_ORIENTATION_MANAGER, NULL);
priv->monitor_manager = meta_backend_create_monitor_manager (backend, error); priv->monitor_manager = meta_backend_create_monitor_manager (backend, error);
if (!priv->monitor_manager) if (!priv->monitor_manager)
@ -967,7 +981,8 @@ meta_backend_grab_device (MetaBackend *backend,
int device_id, int device_id,
uint32_t timestamp) uint32_t timestamp)
{ {
return META_BACKEND_GET_CLASS (backend)->grab_device (backend, device_id, timestamp); return META_BACKEND_GET_CLASS (backend)->grab_device (backend, device_id,
timestamp);
} }
/** /**
@ -978,7 +993,8 @@ meta_backend_ungrab_device (MetaBackend *backend,
int device_id, int device_id,
uint32_t timestamp) uint32_t timestamp)
{ {
return META_BACKEND_GET_CLASS (backend)->ungrab_device (backend, device_id, timestamp); return META_BACKEND_GET_CLASS (backend)->ungrab_device (backend, device_id,
timestamp);
} }
/** /**
@ -1004,7 +1020,8 @@ meta_backend_set_keymap (MetaBackend *backend,
const char *variants, const char *variants,
const char *options) const char *options)
{ {
META_BACKEND_GET_CLASS (backend)->set_keymap (backend, layouts, variants, options); META_BACKEND_GET_CLASS (backend)->set_keymap (backend, layouts, variants,
options);
} }
/** /**
@ -1025,7 +1042,7 @@ meta_backend_get_keymap_layout_group (MetaBackend *backend)
void void
meta_backend_lock_layout_group (MetaBackend *backend, meta_backend_lock_layout_group (MetaBackend *backend,
guint idx) guint idx)
{ {
META_BACKEND_GET_CLASS (backend)->lock_layout_group (backend, idx); META_BACKEND_GET_CLASS (backend)->lock_layout_group (backend, idx);
} }
@ -1101,7 +1118,8 @@ meta_backend_update_last_device (MetaBackend *backend,
device = clutter_device_manager_get_device (manager, device_id); device = clutter_device_manager_get_device (manager, device_id);
if (!device || if (!device ||
clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER) clutter_input_device_get_device_mode (device) ==
CLUTTER_INPUT_MODE_MASTER)
return; return;
priv->current_device_id = device_id; priv->current_device_id = device_id;
@ -1116,12 +1134,12 @@ meta_backend_update_last_device (MetaBackend *backend,
} }
gboolean gboolean
meta_backend_get_relative_motion_deltas (MetaBackend *backend, meta_backend_get_relative_motion_deltas (MetaBackend *backend,
const ClutterEvent *event, const ClutterEvent *event,
double *dx, double *dx,
double *dy, double *dy,
double *dx_unaccel, double *dx_unaccel,
double *dy_unaccel) double *dy_unaccel)
{ {
MetaBackendClass *klass = META_BACKEND_GET_CLASS (backend); MetaBackendClass *klass = META_BACKEND_GET_CLASS (backend);
return klass->get_relative_motion_deltas (backend, return klass->get_relative_motion_deltas (backend,
@ -1163,8 +1181,8 @@ meta_backend_set_client_pointer_constraint (MetaBackend *backend,
*/ */
static gboolean static gboolean
event_prepare (GSource *source, event_prepare (GSource *source,
gint *timeout_) gint *timeout_)
{ {
*timeout_ = -1; *timeout_ = -1;
@ -1193,7 +1211,8 @@ event_dispatch (GSource *source,
return TRUE; return TRUE;
} }
static GSourceFuncs event_funcs = { static GSourceFuncs event_funcs =
{
event_prepare, event_prepare,
event_check, event_check,
event_dispatch event_dispatch

View File

@ -1,4 +1,5 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; c-basic-offset: 2; -*- */ /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; c-basic-offset: 2;
* -*- */
/** /**
* SECTION:barrier * SECTION:barrier
@ -26,7 +27,8 @@
G_DEFINE_TYPE_WITH_PRIVATE (MetaBarrier, meta_barrier, G_TYPE_OBJECT) G_DEFINE_TYPE_WITH_PRIVATE (MetaBarrier, meta_barrier, G_TYPE_OBJECT)
G_DEFINE_TYPE (MetaBarrierImpl, meta_barrier_impl, G_TYPE_OBJECT) G_DEFINE_TYPE (MetaBarrierImpl, meta_barrier_impl, G_TYPE_OBJECT)
enum { enum
{
PROP_0, PROP_0,
PROP_DISPLAY, PROP_DISPLAY,
@ -42,7 +44,8 @@ enum {
static GParamSpec *obj_props[PROP_LAST]; static GParamSpec *obj_props[PROP_LAST];
enum { enum
{
HIT, HIT,
LEFT, LEFT,
@ -209,35 +212,40 @@ meta_barrier_class_init (MetaBarrierClass *klass)
"Display", "Display",
"The display to construct the pointer barrier on", "The display to construct the pointer barrier on",
META_TYPE_DISPLAY, META_TYPE_DISPLAY,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
obj_props[PROP_X1] = obj_props[PROP_X1] =
g_param_spec_int ("x1", g_param_spec_int ("x1",
"X1", "X1",
"The first X coordinate of the barrier", "The first X coordinate of the barrier",
0, G_MAXSHORT, 0, 0, G_MAXSHORT, 0,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
obj_props[PROP_Y1] = obj_props[PROP_Y1] =
g_param_spec_int ("y1", g_param_spec_int ("y1",
"Y1", "Y1",
"The first Y coordinate of the barrier", "The first Y coordinate of the barrier",
0, G_MAXSHORT, 0, 0, G_MAXSHORT, 0,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
obj_props[PROP_X2] = obj_props[PROP_X2] =
g_param_spec_int ("x2", g_param_spec_int ("x2",
"X2", "X2",
"The second X coordinate of the barrier", "The second X coordinate of the barrier",
0, G_MAXSHORT, G_MAXSHORT, 0, G_MAXSHORT, G_MAXSHORT,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
obj_props[PROP_Y2] = obj_props[PROP_Y2] =
g_param_spec_int ("y2", g_param_spec_int ("y2",
"Y2", "Y2",
"The second Y coordinate of the barrier", "The second Y coordinate of the barrier",
0, G_MAXSHORT, G_MAXSHORT, 0, G_MAXSHORT, G_MAXSHORT,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
obj_props[PROP_DIRECTIONS] = obj_props[PROP_DIRECTIONS] =
g_param_spec_flags ("directions", g_param_spec_flags ("directions",
@ -245,7 +253,8 @@ meta_barrier_class_init (MetaBarrierClass *klass)
"A set of directions to let the pointer through", "A set of directions to let the pointer through",
META_TYPE_BARRIER_DIRECTION, META_TYPE_BARRIER_DIRECTION,
0, 0,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, PROP_LAST, obj_props); g_object_class_install_properties (object_class, PROP_LAST, obj_props);
@ -300,7 +309,8 @@ meta_barrier_destroy (MetaBarrier *barrier)
static void static void
meta_barrier_init (MetaBarrier *barrier) meta_barrier_init (MetaBarrier *barrier)
{ {
barrier->priv = G_TYPE_INSTANCE_GET_PRIVATE (barrier, META_TYPE_BARRIER, MetaBarrierPrivate); barrier->priv = G_TYPE_INSTANCE_GET_PRIVATE (barrier, META_TYPE_BARRIER,
MetaBarrierPrivate);
} }
void void
@ -336,7 +346,7 @@ meta_barrier_event_ref (MetaBarrierEvent *event)
g_return_val_if_fail (event != NULL, NULL); g_return_val_if_fail (event != NULL, NULL);
g_return_val_if_fail (event->ref_count > 0, NULL); g_return_val_if_fail (event->ref_count > 0, NULL);
g_atomic_int_inc ((volatile int *)&event->ref_count); g_atomic_int_inc ((volatile int *) &event->ref_count);
return event; return event;
} }
@ -346,7 +356,7 @@ meta_barrier_event_unref (MetaBarrierEvent *event)
g_return_if_fail (event != NULL); g_return_if_fail (event != NULL);
g_return_if_fail (event->ref_count > 0); g_return_if_fail (event->ref_count > 0);
if (g_atomic_int_dec_and_test ((volatile int *)&event->ref_count)) if (g_atomic_int_dec_and_test ((volatile int *) &event->ref_count))
g_slice_free (MetaBarrierEvent, event); g_slice_free (MetaBarrierEvent, event);
} }

View File

@ -26,7 +26,7 @@ G_DEFINE_TYPE (MetaCrtc, meta_crtc, G_TYPE_OBJECT)
G_DEFINE_TYPE (MetaCrtcMode, meta_crtc_mode, G_TYPE_OBJECT) G_DEFINE_TYPE (MetaCrtcMode, meta_crtc_mode, G_TYPE_OBJECT)
MetaGpu * MetaGpu *
meta_crtc_get_gpu (MetaCrtc *crtc) meta_crtc_get_gpu (MetaCrtc * crtc)
{ {
return crtc->gpu; return crtc->gpu;
} }

View File

@ -46,13 +46,15 @@ struct _MetaCursorRendererPrivate
}; };
typedef struct _MetaCursorRendererPrivate MetaCursorRendererPrivate; typedef struct _MetaCursorRendererPrivate MetaCursorRendererPrivate;
enum { enum
{
CURSOR_PAINTED, CURSOR_PAINTED,
LAST_SIGNAL LAST_SIGNAL
}; };
static guint signals[LAST_SIGNAL]; static guint signals[LAST_SIGNAL];
G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorRenderer, meta_cursor_renderer, G_TYPE_OBJECT); G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorRenderer, meta_cursor_renderer,
G_TYPE_OBJECT);
void void
meta_cursor_renderer_emit_painted (MetaCursorRenderer *renderer, meta_cursor_renderer_emit_painted (MetaCursorRenderer *renderer,
@ -65,7 +67,8 @@ static void
queue_redraw (MetaCursorRenderer *renderer, queue_redraw (MetaCursorRenderer *renderer,
MetaCursorSprite *cursor_sprite) MetaCursorSprite *cursor_sprite)
{ {
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer); MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (
renderer);
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
ClutterActor *stage = meta_backend_get_stage (backend); ClutterActor *stage = meta_backend_get_stage (backend);
CoglTexture *texture; CoglTexture *texture;
@ -117,7 +120,8 @@ static void
meta_cursor_renderer_finalize (GObject *object) meta_cursor_renderer_finalize (GObject *object)
{ {
MetaCursorRenderer *renderer = META_CURSOR_RENDERER (object); MetaCursorRenderer *renderer = META_CURSOR_RENDERER (object);
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer); MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (
renderer);
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
ClutterActor *stage = meta_backend_get_stage (backend); ClutterActor *stage = meta_backend_get_stage (backend);
@ -180,14 +184,16 @@ meta_cursor_renderer_calculate_rect (MetaCursorRenderer *renderer,
height = cogl_texture_get_height (texture); height = cogl_texture_get_height (texture);
return (ClutterRect) { return (ClutterRect) {
.origin = { .origin =
.x = priv->current_x - (hot_x * texture_scale), {
.y = priv->current_y - (hot_y * texture_scale) .x = priv->current_x - (hot_x * texture_scale),
}, .y = priv->current_y - (hot_y * texture_scale)
.size = { },
.width = width * texture_scale, .size =
.height = height * texture_scale {
} .width = width * texture_scale,
.height = height * texture_scale
}
}; };
} }
@ -195,7 +201,8 @@ static void
meta_cursor_renderer_update_cursor (MetaCursorRenderer *renderer, meta_cursor_renderer_update_cursor (MetaCursorRenderer *renderer,
MetaCursorSprite *cursor_sprite) MetaCursorSprite *cursor_sprite)
{ {
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer); MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (
renderer);
gboolean handled_by_backend; gboolean handled_by_backend;
gboolean should_redraw = FALSE; gboolean should_redraw = FALSE;
@ -230,7 +237,8 @@ void
meta_cursor_renderer_set_cursor (MetaCursorRenderer *renderer, meta_cursor_renderer_set_cursor (MetaCursorRenderer *renderer,
MetaCursorSprite *cursor_sprite) MetaCursorSprite *cursor_sprite)
{ {
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer); MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (
renderer);
if (priv->displayed_cursor == cursor_sprite) if (priv->displayed_cursor == cursor_sprite)
return; return;
@ -253,7 +261,8 @@ meta_cursor_renderer_set_position (MetaCursorRenderer *renderer,
float x, float x,
float y) float y)
{ {
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer); MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (
renderer);
g_assert (meta_is_wayland_compositor ()); g_assert (meta_is_wayland_compositor ());
@ -270,15 +279,16 @@ meta_cursor_renderer_get_position (MetaCursorRenderer *renderer)
meta_cursor_renderer_get_instance_private (renderer); meta_cursor_renderer_get_instance_private (renderer);
return (ClutterPoint) { return (ClutterPoint) {
.x = priv->current_x, .x = priv->current_x,
.y = priv->current_y .y = priv->current_y
}; };
} }
MetaCursorSprite * MetaCursorSprite *
meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer) meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer)
{ {
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer); MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (
renderer);
return priv->displayed_cursor; return priv->displayed_cursor;
} }

View File

@ -99,8 +99,8 @@ meta_cursor_sprite_xcursor_get_cursor (MetaCursorSpriteXcursor *sprite_xcursor)
} }
Cursor Cursor
meta_create_x_cursor (Display *xdisplay, meta_create_x_cursor (Display *xdisplay,
MetaCursor cursor) MetaCursor cursor)
{ {
return XcursorLibraryLoadCursor (xdisplay, translate_meta_cursor (cursor)); return XcursorLibraryLoadCursor (xdisplay, translate_meta_cursor (cursor));
} }
@ -160,8 +160,9 @@ load_from_current_xcursor_image (MetaCursorSpriteXcursor *sprite_xcursor)
} }
void void
meta_cursor_sprite_xcursor_set_theme_scale (MetaCursorSpriteXcursor *sprite_xcursor, meta_cursor_sprite_xcursor_set_theme_scale (
int theme_scale) MetaCursorSpriteXcursor *sprite_xcursor,
int theme_scale)
{ {
if (sprite_xcursor->theme_scale != theme_scale) if (sprite_xcursor->theme_scale != theme_scale)
sprite_xcursor->theme_dirty = TRUE; sprite_xcursor->theme_dirty = TRUE;
@ -178,7 +179,8 @@ meta_cursor_sprite_xcursor_is_animated (MetaCursorSprite *sprite)
} }
XcursorImage * XcursorImage *
meta_cursor_sprite_xcursor_get_current_image (MetaCursorSpriteXcursor *sprite_xcursor) meta_cursor_sprite_xcursor_get_current_image (
MetaCursorSpriteXcursor *sprite_xcursor)
{ {
return sprite_xcursor->xcursor_images->images[sprite_xcursor->current_frame]; return sprite_xcursor->xcursor_images->images[sprite_xcursor->current_frame];
} }

View File

@ -46,7 +46,8 @@
G_DEFINE_TYPE (MetaCursorTracker, meta_cursor_tracker, G_TYPE_OBJECT); G_DEFINE_TYPE (MetaCursorTracker, meta_cursor_tracker, G_TYPE_OBJECT);
enum { enum
{
CURSOR_CHANGED, CURSOR_CHANGED,
LAST_SIGNAL LAST_SIGNAL
}; };
@ -204,7 +205,7 @@ meta_cursor_tracker_handle_xevent (MetaCursorTracker *tracker,
if (xevent->xany.type != x11_display->xfixes_event_base + XFixesCursorNotify) if (xevent->xany.type != x11_display->xfixes_event_base + XFixesCursorNotify)
return FALSE; return FALSE;
notify_event = (XFixesCursorNotifyEvent *)xevent; notify_event = (XFixesCursorNotifyEvent *) xevent;
if (notify_event->subtype != XFixesDisplayCursorNotify) if (notify_event->subtype != XFixesDisplayCursorNotify)
return FALSE; return FALSE;
@ -337,9 +338,9 @@ meta_cursor_tracker_update_position (MetaCursorTracker *tracker,
} }
static void static void
get_pointer_position_gdk (int *x, get_pointer_position_gdk (int *x,
int *y, int *y,
int *mods) int *mods)
{ {
GdkSeat *gseat; GdkSeat *gseat;
GdkDevice *gdevice; GdkDevice *gdevice;
@ -352,20 +353,21 @@ get_pointer_position_gdk (int *x,
if (mods) if (mods)
gdk_device_get_state (gdevice, gdk_device_get_state (gdevice,
gdk_screen_get_root_window (gscreen), gdk_screen_get_root_window (gscreen),
NULL, (GdkModifierType*)mods); NULL, (GdkModifierType *) mods);
} }
static void static void
get_pointer_position_clutter (int *x, get_pointer_position_clutter (int *x,
int *y, int *y,
int *mods) int *mods)
{ {
ClutterDeviceManager *cmanager; ClutterDeviceManager *cmanager;
ClutterInputDevice *cdevice; ClutterInputDevice *cdevice;
ClutterPoint point; ClutterPoint point;
cmanager = clutter_device_manager_get_default (); cmanager = clutter_device_manager_get_default ();
cdevice = clutter_device_manager_get_core_device (cmanager, CLUTTER_POINTER_DEVICE); cdevice = clutter_device_manager_get_core_device (cmanager,
CLUTTER_POINTER_DEVICE);
clutter_input_device_get_coords (cdevice, NULL, &point); clutter_input_device_get_coords (cdevice, NULL, &point);
if (x) if (x)
@ -382,15 +384,17 @@ meta_cursor_tracker_get_pointer (MetaCursorTracker *tracker,
int *y, int *y,
ClutterModifierType *mods) ClutterModifierType *mods)
{ {
/* We can't use the clutter interface when not running as a wayland compositor, /* We can't use the clutter interface when not running as a wayland
because we need to query the server, rather than using the last cached value. * compositor,
OTOH, on wayland we can't use GDK, because that only sees the events * because we need to query the server, rather than using the last cached
we forward to xwayland. * value.
*/ * OTOH, on wayland we can't use GDK, because that only sees the events
* we forward to xwayland.
*/
if (meta_is_wayland_compositor ()) if (meta_is_wayland_compositor ())
get_pointer_position_clutter (x, y, (int*)mods); get_pointer_position_clutter (x, y, (int *) mods);
else else
get_pointer_position_gdk (x, y, (int*)mods); get_pointer_position_gdk (x, y, (int *) mods);
} }
void void

View File

@ -92,8 +92,9 @@ meta_dbus_session_client_destroy (MetaDbusSessionClient *client)
} }
static void static void
meta_dbus_session_watcher_destroy_client (MetaDbusSessionWatcher *session_watcher, meta_dbus_session_watcher_destroy_client (
MetaDbusSessionClient *client) MetaDbusSessionWatcher *session_watcher,
MetaDbusSessionClient *client)
{ {
g_hash_table_remove (session_watcher->clients, client->dbus_name); g_hash_table_remove (session_watcher->clients, client->dbus_name);
} }
@ -169,9 +170,10 @@ meta_dbus_session_watcher_get_client (MetaDbusSessionWatcher *session_watcher,
} }
void void
meta_dbus_session_watcher_watch_session (MetaDbusSessionWatcher *session_watcher, meta_dbus_session_watcher_watch_session (
const char *client_dbus_name, MetaDbusSessionWatcher *session_watcher,
MetaDbusSession *session) const char *client_dbus_name,
MetaDbusSession *session)
{ {
MetaDbusSessionClient *client; MetaDbusSessionClient *client;

View File

@ -62,7 +62,8 @@ struct _MetaEgl
PFNEGLSTREAMCONSUMEROUTPUTEXTPROC eglStreamConsumerOutputEXT; PFNEGLSTREAMCONSUMEROUTPUTEXTPROC eglStreamConsumerOutputEXT;
PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC eglStreamConsumerGLTextureExternalKHR; PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC
eglStreamConsumerGLTextureExternalKHR;
PFNEGLSTREAMCONSUMERACQUIREKHRPROC eglStreamConsumerAcquireKHR; PFNEGLSTREAMCONSUMERACQUIREKHRPROC eglStreamConsumerAcquireKHR;
PFNEGLSTREAMCONSUMERACQUIREATTRIBNVPROC eglStreamConsumerAcquireAttribNV; PFNEGLSTREAMCONSUMERACQUIREATTRIBNVPROC eglStreamConsumerAcquireAttribNV;
@ -73,7 +74,7 @@ struct _MetaEgl
G_DEFINE_TYPE (MetaEgl, meta_egl, G_TYPE_OBJECT) G_DEFINE_TYPE (MetaEgl, meta_egl, G_TYPE_OBJECT)
G_DEFINE_QUARK (-meta-egl-error-quark, meta_egl_error) G_DEFINE_QUARK (-meta - egl - error - quark, meta_egl_error)
static const char * static const char *
get_egl_error_str (EGLint error_number) get_egl_error_str (EGLint error_number)
@ -84,46 +85,58 @@ get_egl_error_str (EGLint error_number)
return "The last function succeeded without error."; return "The last function succeeded without error.";
break; break;
case EGL_NOT_INITIALIZED: case EGL_NOT_INITIALIZED:
return "EGL is not initialized, or could not be initialized, for the specified EGL display connection."; return
"EGL is not initialized, or could not be initialized, for the specified EGL display connection.";
break; break;
case EGL_BAD_ACCESS: case EGL_BAD_ACCESS:
return "EGL cannot access a requested resource (for example a context is bound in another thread)."; return
"EGL cannot access a requested resource (for example a context is bound in another thread).";
break; break;
case EGL_BAD_ALLOC: case EGL_BAD_ALLOC:
return "EGL failed to allocate resources for the requested operation."; return "EGL failed to allocate resources for the requested operation.";
break; break;
case EGL_BAD_ATTRIBUTE: case EGL_BAD_ATTRIBUTE:
return "An unrecognized attribute or attribute value was passed in the attribute list."; return
"An unrecognized attribute or attribute value was passed in the attribute list.";
break; break;
case EGL_BAD_CONTEXT: case EGL_BAD_CONTEXT:
return "An EGLContext argument does not name a valid EGL rendering context."; return
"An EGLContext argument does not name a valid EGL rendering context.";
break; break;
case EGL_BAD_CONFIG: case EGL_BAD_CONFIG:
return "An EGLConfig argument does not name a valid EGL frame buffer configuration."; return
"An EGLConfig argument does not name a valid EGL frame buffer configuration.";
break; break;
case EGL_BAD_CURRENT_SURFACE: case EGL_BAD_CURRENT_SURFACE:
return "The current surface of the calling thread is a window, pixel buffer or pixmap that is no longer valid."; return
"The current surface of the calling thread is a window, pixel buffer or pixmap that is no longer valid.";
break; break;
case EGL_BAD_DISPLAY: case EGL_BAD_DISPLAY:
return "An EGLDisplay argument does not name a valid EGL display connection."; return
"An EGLDisplay argument does not name a valid EGL display connection.";
break; break;
case EGL_BAD_SURFACE: case EGL_BAD_SURFACE:
return "An EGLSurface argument does not name a valid surface (window, pixel buffer or pixmap) configured for GL rendering."; return
"An EGLSurface argument does not name a valid surface (window, pixel buffer or pixmap) configured for GL rendering.";
break; break;
case EGL_BAD_MATCH: case EGL_BAD_MATCH:
return "Arguments are inconsistent (for example, a valid context requires buffers not supplied by a valid surface)."; return
"Arguments are inconsistent (for example, a valid context requires buffers not supplied by a valid surface).";
break; break;
case EGL_BAD_PARAMETER: case EGL_BAD_PARAMETER:
return "One or more argument values are invalid."; return "One or more argument values are invalid.";
break; break;
case EGL_BAD_NATIVE_PIXMAP: case EGL_BAD_NATIVE_PIXMAP:
return "A NativePixmapType argument does not refer to a valid native pixmap."; return
"A NativePixmapType argument does not refer to a valid native pixmap.";
break; break;
case EGL_BAD_NATIVE_WINDOW: case EGL_BAD_NATIVE_WINDOW:
return "A NativeWindowType argument does not refer to a valid native window."; return
"A NativeWindowType argument does not refer to a valid native window.";
break; break;
case EGL_CONTEXT_LOST: case EGL_CONTEXT_LOST:
return "A power management event has occurred. The application must destroy all contexts and reinitialise OpenGL ES state and objects to continue rendering. "; return
"A power management event has occurred. The application must destroy all contexts and reinitialise OpenGL ES state and objects to continue rendering. ";
break; break;
case EGL_BAD_STREAM_KHR: case EGL_BAD_STREAM_KHR:
return "An EGLStreamKHR argument does not name a valid EGL stream."; return "An EGLStreamKHR argument does not name a valid EGL stream.";
@ -135,9 +148,11 @@ get_egl_error_str (EGLint error_number)
return "An EGLDeviceEXT argument does not name a valid EGL device."; return "An EGLDeviceEXT argument does not name a valid EGL device.";
break; break;
case EGL_BAD_OUTPUT_LAYER_EXT: case EGL_BAD_OUTPUT_LAYER_EXT:
return "An EGLOutputLayerEXT argument does not name a valid EGL output layer."; return
"An EGLOutputLayerEXT argument does not name a valid EGL output layer.";
case EGL_RESOURCE_BUSY_EXT: case EGL_RESOURCE_BUSY_EXT:
return "The operation could not be completed on the requested resource because it is temporary unavailable."; return
"The operation could not be completed on the requested resource because it is temporary unavailable.";
default: default:
return "Unknown error"; return "Unknown error";
break; break;
@ -266,12 +281,12 @@ meta_egl_get_proc_address (MetaEgl *egl,
} }
gboolean gboolean
meta_egl_get_config_attrib (MetaEgl *egl, meta_egl_get_config_attrib (MetaEgl *egl,
EGLDisplay display, EGLDisplay display,
EGLConfig config, EGLConfig config,
EGLint attribute, EGLint attribute,
EGLint *value, EGLint *value,
GError **error) GError **error)
{ {
if (!eglGetConfigAttrib (display, if (!eglGetConfigAttrib (display,
config, config,
@ -286,11 +301,11 @@ meta_egl_get_config_attrib (MetaEgl *egl,
} }
EGLConfig * EGLConfig *
meta_egl_choose_all_configs (MetaEgl *egl, meta_egl_choose_all_configs (MetaEgl *egl,
EGLDisplay display, EGLDisplay display,
const EGLint *attrib_list, const EGLint *attrib_list,
EGLint *out_num_configs, EGLint *out_num_configs,
GError **error) GError **error)
{ {
EGLint num_configs; EGLint num_configs;
EGLConfig *configs; EGLConfig *configs;
@ -312,7 +327,8 @@ meta_egl_choose_all_configs (MetaEgl *egl,
configs = g_new0 (EGLConfig, num_configs); configs = g_new0 (EGLConfig, num_configs);
if (!eglChooseConfig (display, attrib_list, configs, num_configs, &num_matches)) if (!eglChooseConfig (display, attrib_list, configs, num_configs,
&num_matches))
{ {
g_free (configs); g_free (configs);
set_egl_error (error); set_egl_error (error);
@ -332,11 +348,11 @@ meta_egl_choose_all_configs (MetaEgl *egl,
} }
gboolean gboolean
meta_egl_choose_first_config (MetaEgl *egl, meta_egl_choose_first_config (MetaEgl *egl,
EGLDisplay display, EGLDisplay display,
const EGLint *attrib_list, const EGLint *attrib_list,
EGLConfig *chosen_config, EGLConfig *chosen_config,
GError **error) GError **error)
{ {
EGLint num_configs; EGLint num_configs;
EGLConfig *configs; EGLConfig *configs;
@ -358,7 +374,8 @@ meta_egl_choose_first_config (MetaEgl *egl,
configs = g_new0 (EGLConfig, num_configs); configs = g_new0 (EGLConfig, num_configs);
if (!eglChooseConfig (display, attrib_list, configs, num_configs, &num_matches)) if (!eglChooseConfig (display, attrib_list, configs, num_configs,
&num_matches))
{ {
g_free (configs); g_free (configs);
set_egl_error (error); set_egl_error (error);
@ -615,7 +632,7 @@ meta_egl_query_wayland_buffer (MetaEgl *egl,
GError **error) GError **error)
{ {
if (!is_egl_proc_valid (egl->eglQueryWaylandBufferWL, error)) if (!is_egl_proc_valid (egl->eglQueryWaylandBufferWL, error))
return FALSE; return FALSE;
if (!egl->eglQueryWaylandBufferWL (display, buffer, attribute, value)) if (!egl->eglQueryWaylandBufferWL (display, buffer, attribute, value))
{ {
@ -827,10 +844,10 @@ meta_egl_create_stream_attrib (MetaEgl *egl,
} }
EGLSurface EGLSurface
meta_egl_create_stream_producer_surface (MetaEgl *egl, meta_egl_create_stream_producer_surface (MetaEgl *egl,
EGLDisplay display, EGLDisplay display,
EGLConfig config, EGLConfig config,
EGLStreamKHR stream, EGLStreamKHR stream,
const EGLint *attrib_list, const EGLint *attrib_list,
GError **error) GError **error)
{ {
@ -944,7 +961,7 @@ meta_egl_query_dma_buf_formats (MetaEgl *egl,
return FALSE; return FALSE;
} }
return TRUE; return TRUE;
} }
gboolean gboolean
@ -968,7 +985,7 @@ meta_egl_query_dma_buf_modifiers (MetaEgl *egl,
return FALSE; return FALSE;
} }
return TRUE; return TRUE;
} }
#define GET_EGL_PROC_ADDR(proc) \ #define GET_EGL_PROC_ADDR(proc) \

View File

@ -42,7 +42,7 @@ struct _MetaGles3
G_DEFINE_TYPE (MetaGles3, meta_gles3, G_TYPE_OBJECT) G_DEFINE_TYPE (MetaGles3, meta_gles3, G_TYPE_OBJECT)
MetaGles3Table * MetaGles3Table *
meta_gles3_get_table (MetaGles3 *gles3) meta_gles3_get_table (MetaGles3 * gles3)
{ {
return &gles3->table; return &gles3->table;
} }
@ -72,15 +72,15 @@ get_gl_error_str (GLenum gl_error)
case GL_INVALID_ENUM: case GL_INVALID_ENUM:
return "An unacceptable value is specified for an enumerated argument."; return "An unacceptable value is specified for an enumerated argument.";
case GL_INVALID_VALUE: case GL_INVALID_VALUE:
return "A numeric argument is out of range."; return "A numeric argument is out of range.";
case GL_INVALID_OPERATION: case GL_INVALID_OPERATION:
return "The specified operation is not allowed in the current state."; return "The specified operation is not allowed in the current state.";
case GL_INVALID_FRAMEBUFFER_OPERATION: case GL_INVALID_FRAMEBUFFER_OPERATION:
return "The framebuffer object is not complete."; return "The framebuffer object is not complete.";
case GL_OUT_OF_MEMORY: case GL_OUT_OF_MEMORY:
return "There is not enough memory left to execute the command."; return "There is not enough memory left to execute the command.";
default: default:
return "Unknown error"; return "Unknown error";
} }
} }

View File

@ -65,8 +65,8 @@ meta_gpu_has_hotplug_mode_update (MetaGpu *gpu)
} }
gboolean gboolean
meta_gpu_read_current (MetaGpu *gpu, meta_gpu_read_current (MetaGpu *gpu,
GError **error) GError **error)
{ {
MetaGpuPrivate *priv = meta_gpu_get_instance_private (gpu); MetaGpuPrivate *priv = meta_gpu_get_instance_private (gpu);
gboolean ret; gboolean ret;
@ -131,7 +131,7 @@ meta_gpu_take_outputs (MetaGpu *gpu,
void void
meta_gpu_take_crtcs (MetaGpu *gpu, meta_gpu_take_crtcs (MetaGpu *gpu,
GList *crtcs) GList *crtcs)
{ {
MetaGpuPrivate *priv = meta_gpu_get_instance_private (gpu); MetaGpuPrivate *priv = meta_gpu_get_instance_private (gpu);

View File

@ -65,7 +65,8 @@ handle_reset_idletime (MetaDBusIdleMonitor *skeleton,
return TRUE; return TRUE;
} }
typedef struct { typedef struct
{
MetaDBusIdleMonitor *dbus_monitor; MetaDBusIdleMonitor *dbus_monitor;
MetaIdleMonitor *monitor; MetaIdleMonitor *monitor;
char *dbus_name; char *dbus_name;
@ -92,11 +93,14 @@ dbus_idle_callback (MetaIdleMonitor *monitor,
gpointer user_data) gpointer user_data)
{ {
DBusWatch *watch = user_data; DBusWatch *watch = user_data;
GDBusInterfaceSkeleton *skeleton = G_DBUS_INTERFACE_SKELETON (watch->dbus_monitor); GDBusInterfaceSkeleton *skeleton = G_DBUS_INTERFACE_SKELETON (
watch->dbus_monitor);
g_dbus_connection_emit_signal (g_dbus_interface_skeleton_get_connection (skeleton), g_dbus_connection_emit_signal (g_dbus_interface_skeleton_get_connection (
skeleton),
watch->dbus_name, watch->dbus_name,
g_dbus_interface_skeleton_get_object_path (skeleton), g_dbus_interface_skeleton_get_object_path (
skeleton),
"org.gnome.Mutter.IdleMonitor", "org.gnome.Mutter.IdleMonitor",
"WatchFired", "WatchFired",
g_variant_new ("(u)", watch_id), g_variant_new ("(u)", watch_id),
@ -123,8 +127,10 @@ make_dbus_watch (MetaDBusIdleMonitor *skeleton,
watch = g_slice_new (DBusWatch); watch = g_slice_new (DBusWatch);
watch->dbus_monitor = g_object_ref (skeleton); watch->dbus_monitor = g_object_ref (skeleton);
watch->monitor = g_object_ref (monitor); watch->monitor = g_object_ref (monitor);
watch->dbus_name = g_strdup (g_dbus_method_invocation_get_sender (invocation)); watch->dbus_name =
watch->name_watcher_id = g_bus_watch_name_on_connection (g_dbus_method_invocation_get_connection (invocation), g_strdup (g_dbus_method_invocation_get_sender (invocation));
watch->name_watcher_id = g_bus_watch_name_on_connection (g_dbus_method_invocation_get_connection (
invocation),
watch->dbus_name, watch->dbus_name,
G_BUS_NAME_WATCHER_FLAGS_NONE, G_BUS_NAME_WATCHER_FLAGS_NONE,
NULL, /* appeared */ NULL, /* appeared */
@ -144,9 +150,11 @@ handle_add_idle_watch (MetaDBusIdleMonitor *skeleton,
watch = make_dbus_watch (skeleton, invocation, monitor); watch = make_dbus_watch (skeleton, invocation, monitor);
watch->watch_id = meta_idle_monitor_add_idle_watch (monitor, interval, watch->watch_id = meta_idle_monitor_add_idle_watch (monitor, interval,
dbus_idle_callback, watch, destroy_dbus_watch); dbus_idle_callback, watch,
destroy_dbus_watch);
meta_dbus_idle_monitor_complete_add_idle_watch (skeleton, invocation, watch->watch_id); meta_dbus_idle_monitor_complete_add_idle_watch (skeleton, invocation,
watch->watch_id);
return TRUE; return TRUE;
} }
@ -160,10 +168,12 @@ handle_add_user_active_watch (MetaDBusIdleMonitor *skeleton,
watch = make_dbus_watch (skeleton, invocation, monitor); watch = make_dbus_watch (skeleton, invocation, monitor);
watch->watch_id = meta_idle_monitor_add_user_active_watch (monitor, watch->watch_id = meta_idle_monitor_add_user_active_watch (monitor,
dbus_idle_callback, watch, dbus_idle_callback,
watch,
destroy_dbus_watch); destroy_dbus_watch);
meta_dbus_idle_monitor_complete_add_user_active_watch (skeleton, invocation, watch->watch_id); meta_dbus_idle_monitor_complete_add_user_active_watch (skeleton, invocation,
watch->watch_id);
return TRUE; return TRUE;
} }
@ -192,7 +202,8 @@ create_monitor_skeleton (GDBusObjectManagerServer *manager,
g_signal_connect_object (skeleton, "handle-add-idle-watch", g_signal_connect_object (skeleton, "handle-add-idle-watch",
G_CALLBACK (handle_add_idle_watch), monitor, 0); G_CALLBACK (handle_add_idle_watch), monitor, 0);
g_signal_connect_object (skeleton, "handle-add-user-active-watch", g_signal_connect_object (skeleton, "handle-add-user-active-watch",
G_CALLBACK (handle_add_user_active_watch), monitor, 0); G_CALLBACK (handle_add_user_active_watch), monitor,
0);
g_signal_connect_object (skeleton, "handle-remove-watch", g_signal_connect_object (skeleton, "handle-remove-watch",
G_CALLBACK (handle_remove_watch), monitor, 0); G_CALLBACK (handle_remove_watch), monitor, 0);
g_signal_connect_object (skeleton, "handle-reset-idletime", g_signal_connect_object (skeleton, "handle-reset-idletime",
@ -203,7 +214,8 @@ create_monitor_skeleton (GDBusObjectManagerServer *manager,
object = meta_dbus_object_skeleton_new (path); object = meta_dbus_object_skeleton_new (path);
meta_dbus_object_skeleton_set_idle_monitor (object, skeleton); meta_dbus_object_skeleton_set_idle_monitor (object, skeleton);
g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object)); g_dbus_object_manager_server_export (manager,
G_DBUS_OBJECT_SKELETON (object));
g_object_unref (skeleton); g_object_unref (skeleton);
g_object_unref (object); g_object_unref (object);
@ -214,7 +226,6 @@ on_device_added (ClutterDeviceManager *device_manager,
ClutterInputDevice *device, ClutterInputDevice *device,
GDBusObjectManagerServer *manager) GDBusObjectManagerServer *manager)
{ {
MetaIdleMonitor *monitor; MetaIdleMonitor *monitor;
int device_id; int device_id;
char *path; char *path;
@ -254,8 +265,9 @@ on_bus_acquired (GDBusConnection *connection,
manager = g_dbus_object_manager_server_new ("/org/gnome/Mutter/IdleMonitor"); manager = g_dbus_object_manager_server_new ("/org/gnome/Mutter/IdleMonitor");
/* We never clear the core monitor, as that's supposed to cumulate idle times from /* We never clear the core monitor, as that's supposed to cumulate idle times
all devices */ * from
* all devices */
monitor = meta_idle_monitor_get_core (); monitor = meta_idle_monitor_get_core ();
path = g_strdup ("/org/gnome/Mutter/IdleMonitor/Core"); path = g_strdup ("/org/gnome/Mutter/IdleMonitor/Core");
create_monitor_skeleton (manager, monitor, path); create_monitor_skeleton (manager, monitor, path);

View File

@ -41,7 +41,7 @@
#include "meta/meta-idle-monitor.h" #include "meta/meta-idle-monitor.h"
#include "meta/util.h" #include "meta/util.h"
G_STATIC_ASSERT(sizeof(unsigned long) == sizeof(gpointer)); G_STATIC_ASSERT (sizeof (unsigned long) == sizeof (gpointer));
enum enum
{ {
@ -149,8 +149,10 @@ meta_idle_monitor_class_init (MetaIdleMonitorClass *klass)
"Device ID", "Device ID",
"The device to listen to idletime on", "The device to listen to idletime on",
0, 255, 0, 0, 255, 0,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE |
g_object_class_install_property (object_class, PROP_DEVICE_ID, obj_props[PROP_DEVICE_ID]); G_PARAM_CONSTRUCT_ONLY);
g_object_class_install_property (object_class, PROP_DEVICE_ID,
obj_props[PROP_DEVICE_ID]);
} }
static void static void
@ -213,15 +215,16 @@ update_inhibited (MetaIdleMonitor *monitor,
} }
static void static void
meta_idle_monitor_inhibited_actions_changed (GDBusProxy *session, meta_idle_monitor_inhibited_actions_changed (GDBusProxy *session,
GVariant *changed, GVariant *changed,
char **invalidated, char **invalidated,
gpointer user_data) gpointer user_data)
{ {
MetaIdleMonitor *monitor = user_data; MetaIdleMonitor *monitor = user_data;
GVariant *v; GVariant *v;
v = g_variant_lookup_value (changed, "InhibitedActions", G_VARIANT_TYPE_UINT32); v =
g_variant_lookup_value (changed, "InhibitedActions", G_VARIANT_TYPE_UINT32);
if (v) if (v)
{ {
gboolean inhibited; gboolean inhibited;
@ -311,9 +314,9 @@ get_next_watch_serial (void)
} }
static gboolean static gboolean
idle_monitor_dispatch_timeout (GSource *source, idle_monitor_dispatch_timeout (GSource *source,
GSourceFunc callback, GSourceFunc callback,
gpointer user_data) gpointer user_data)
{ {
MetaIdleMonitorWatch *watch = (MetaIdleMonitorWatch *) user_data; MetaIdleMonitorWatch *watch = (MetaIdleMonitorWatch *) user_data;
@ -323,7 +326,8 @@ idle_monitor_dispatch_timeout (GSource *source,
return TRUE; return TRUE;
} }
static GSourceFuncs idle_monitor_source_funcs = { static GSourceFuncs idle_monitor_source_funcs =
{
.prepare = NULL, .prepare = NULL,
.check = NULL, .check = NULL,
.dispatch = idle_monitor_dispatch_timeout, .dispatch = idle_monitor_dispatch_timeout,
@ -331,11 +335,11 @@ static GSourceFuncs idle_monitor_source_funcs = {
}; };
static MetaIdleMonitorWatch * static MetaIdleMonitorWatch *
make_watch (MetaIdleMonitor *monitor, make_watch (MetaIdleMonitor *monitor,
guint64 timeout_msec, guint64 timeout_msec,
MetaIdleMonitorWatchFunc callback, MetaIdleMonitorWatchFunc callback,
gpointer user_data, gpointer user_data,
GDestroyNotify notify) GDestroyNotify notify)
{ {
MetaIdleMonitorWatch *watch; MetaIdleMonitorWatch *watch;
@ -395,11 +399,11 @@ make_watch (MetaIdleMonitor *monitor,
* meta_idle_monitor_add_user_active_watch(). * meta_idle_monitor_add_user_active_watch().
*/ */
guint guint
meta_idle_monitor_add_idle_watch (MetaIdleMonitor *monitor, meta_idle_monitor_add_idle_watch (MetaIdleMonitor *monitor,
guint64 interval_msec, guint64 interval_msec,
MetaIdleMonitorWatchFunc callback, MetaIdleMonitorWatchFunc callback,
gpointer user_data, gpointer user_data,
GDestroyNotify notify) GDestroyNotify notify)
{ {
MetaIdleMonitorWatch *watch; MetaIdleMonitorWatch *watch;
@ -432,10 +436,10 @@ meta_idle_monitor_add_idle_watch (MetaIdleMonitor *monitor,
* meta_idle_monitor_add_idle_watch(), has triggered. * meta_idle_monitor_add_idle_watch(), has triggered.
*/ */
guint guint
meta_idle_monitor_add_user_active_watch (MetaIdleMonitor *monitor, meta_idle_monitor_add_user_active_watch (MetaIdleMonitor *monitor,
MetaIdleMonitorWatchFunc callback, MetaIdleMonitorWatchFunc callback,
gpointer user_data, gpointer user_data,
GDestroyNotify notify) GDestroyNotify notify)
{ {
MetaIdleMonitorWatch *watch; MetaIdleMonitorWatch *watch;
@ -461,7 +465,7 @@ meta_idle_monitor_add_user_active_watch (MetaIdleMonitor *monitor,
*/ */
void void
meta_idle_monitor_remove_watch (MetaIdleMonitor *monitor, meta_idle_monitor_remove_watch (MetaIdleMonitor *monitor,
guint id) guint id)
{ {
g_return_if_fail (META_IS_IDLE_MONITOR (monitor)); g_return_if_fail (META_IS_IDLE_MONITOR (monitor));

View File

@ -90,7 +90,8 @@ struct _MetaInputSettingsPrivate
GHashTable *two_finger_devices; GHashTable *two_finger_devices;
/* Pad ring/strip emission */ /* Pad ring/strip emission */
struct { struct
{
ClutterInputDevice *pad; ClutterInputDevice *pad;
MetaPadActionType action; MetaPadActionType action;
guint number; guint number;
@ -108,7 +109,8 @@ typedef void (*ConfigUintFunc) (MetaInputSettings *input_settings,
ClutterInputDevice *device, ClutterInputDevice *device,
guint value); guint value);
typedef enum { typedef enum
{
META_PAD_DIRECTION_NONE = -1, META_PAD_DIRECTION_NONE = -1,
META_PAD_DIRECTION_UP = 0, META_PAD_DIRECTION_UP = 0,
META_PAD_DIRECTION_DOWN, META_PAD_DIRECTION_DOWN,
@ -116,11 +118,12 @@ typedef enum {
META_PAD_DIRECTION_CCW, META_PAD_DIRECTION_CCW,
} MetaPadDirection; } MetaPadDirection;
G_DEFINE_TYPE_WITH_PRIVATE (MetaInputSettings, meta_input_settings, G_TYPE_OBJECT) G_DEFINE_TYPE_WITH_PRIVATE (MetaInputSettings, meta_input_settings,
G_TYPE_OBJECT)
static GSList * static GSList *
meta_input_settings_get_devices (MetaInputSettings *settings, meta_input_settings_get_devices (MetaInputSettings * settings,
ClutterInputDeviceType type) ClutterInputDeviceType type)
{ {
MetaInputSettingsPrivate *priv; MetaInputSettingsPrivate *priv;
const GSList *devices; const GSList *devices;
@ -134,7 +137,8 @@ meta_input_settings_get_devices (MetaInputSettings *settings,
ClutterInputDevice *device = devices->data; ClutterInputDevice *device = devices->data;
if (clutter_input_device_get_device_type (device) == type && if (clutter_input_device_get_device_type (device) == type &&
clutter_input_device_get_device_mode (device) != CLUTTER_INPUT_MODE_MASTER) clutter_input_device_get_device_mode (device) !=
CLUTTER_INPUT_MODE_MASTER)
list = g_slist_prepend (list, device); list = g_slist_prepend (list, device);
devices = devices->next; devices = devices->next;
@ -147,7 +151,8 @@ static void
meta_input_settings_dispose (GObject *object) meta_input_settings_dispose (GObject *object)
{ {
MetaInputSettings *settings = META_INPUT_SETTINGS (object); MetaInputSettings *settings = META_INPUT_SETTINGS (object);
MetaInputSettingsPrivate *priv = meta_input_settings_get_instance_private (settings); MetaInputSettingsPrivate *priv = meta_input_settings_get_instance_private (
settings);
g_clear_object (&priv->virtual_pad_keyboard); g_clear_object (&priv->virtual_pad_keyboard);
@ -189,10 +194,10 @@ settings_device_set_bool_setting (MetaInputSettings *input_settings,
} }
static void static void
settings_set_bool_setting (MetaInputSettings *input_settings, settings_set_bool_setting (MetaInputSettings *input_settings,
ClutterInputDeviceType type, ClutterInputDeviceType type,
ConfigBoolFunc func, ConfigBoolFunc func,
gboolean enabled) gboolean enabled)
{ {
GSList *devices, *d; GSList *devices, *d;
@ -214,10 +219,10 @@ settings_device_set_double_setting (MetaInputSettings *input_settings,
} }
static void static void
settings_set_double_setting (MetaInputSettings *input_settings, settings_set_double_setting (MetaInputSettings *input_settings,
ClutterInputDeviceType type, ClutterInputDeviceType type,
ConfigDoubleFunc func, ConfigDoubleFunc func,
gdouble value) gdouble value)
{ {
GSList *devices, *d; GSList *devices, *d;
@ -239,10 +244,10 @@ settings_device_set_uint_setting (MetaInputSettings *input_settings,
} }
static void static void
settings_set_uint_setting (MetaInputSettings *input_settings, settings_set_uint_setting (MetaInputSettings *input_settings,
ClutterInputDeviceType type, ClutterInputDeviceType type,
ConfigUintFunc func, ConfigUintFunc func,
guint value) guint value)
{ {
GSList *devices, *d; GSList *devices, *d;
@ -397,8 +402,8 @@ update_pointer_accel_profile (MetaInputSettings *input_settings,
} }
static GSettings * static GSettings *
get_settings_for_device_type (MetaInputSettings *input_settings, get_settings_for_device_type (MetaInputSettings *input_settings,
ClutterInputDeviceType type) ClutterInputDeviceType type)
{ {
MetaInputSettingsPrivate *priv; MetaInputSettingsPrivate *priv;
priv = meta_input_settings_get_instance_private (input_settings); priv = meta_input_settings_get_instance_private (input_settings);
@ -414,8 +419,8 @@ get_settings_for_device_type (MetaInputSettings *input_settings,
} }
static void static void
update_device_speed (MetaInputSettings *input_settings, update_device_speed (MetaInputSettings *input_settings,
ClutterInputDevice *device) ClutterInputDevice *device)
{ {
GSettings *settings; GSettings *settings;
ConfigDoubleFunc func; ConfigDoubleFunc func;
@ -426,27 +431,32 @@ update_device_speed (MetaInputSettings *input_settings,
if (device) if (device)
{ {
settings = get_settings_for_device_type (input_settings, settings = get_settings_for_device_type (input_settings,
clutter_input_device_get_device_type (device)); clutter_input_device_get_device_type (
device));
if (!settings) if (!settings)
return; return;
settings_device_set_double_setting (input_settings, device, func, settings_device_set_double_setting (input_settings, device, func,
g_settings_get_double (settings, key)); g_settings_get_double (settings,
key));
} }
else else
{ {
settings = get_settings_for_device_type (input_settings, CLUTTER_POINTER_DEVICE); settings = get_settings_for_device_type (input_settings,
CLUTTER_POINTER_DEVICE);
settings_set_double_setting (input_settings, CLUTTER_POINTER_DEVICE, func, settings_set_double_setting (input_settings, CLUTTER_POINTER_DEVICE, func,
g_settings_get_double (settings, key)); g_settings_get_double (settings, key));
settings = get_settings_for_device_type (input_settings, CLUTTER_TOUCHPAD_DEVICE); settings = get_settings_for_device_type (input_settings,
settings_set_double_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE, func, CLUTTER_TOUCHPAD_DEVICE);
settings_set_double_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE,
func,
g_settings_get_double (settings, key)); g_settings_get_double (settings, key));
} }
} }
static void static void
update_device_natural_scroll (MetaInputSettings *input_settings, update_device_natural_scroll (MetaInputSettings *input_settings,
ClutterInputDevice *device) ClutterInputDevice *device)
{ {
GSettings *settings; GSettings *settings;
ConfigBoolFunc func; ConfigBoolFunc func;
@ -457,7 +467,8 @@ update_device_natural_scroll (MetaInputSettings *input_settings,
if (device) if (device)
{ {
settings = get_settings_for_device_type (input_settings, settings = get_settings_for_device_type (input_settings,
clutter_input_device_get_device_type (device)); clutter_input_device_get_device_type (
device));
if (!settings) if (!settings)
return; return;
@ -466,10 +477,12 @@ update_device_natural_scroll (MetaInputSettings *input_settings,
} }
else else
{ {
settings = get_settings_for_device_type (input_settings, CLUTTER_POINTER_DEVICE); settings = get_settings_for_device_type (input_settings,
CLUTTER_POINTER_DEVICE);
settings_set_bool_setting (input_settings, CLUTTER_POINTER_DEVICE, func, settings_set_bool_setting (input_settings, CLUTTER_POINTER_DEVICE, func,
g_settings_get_boolean (settings, key)); g_settings_get_boolean (settings, key));
settings = get_settings_for_device_type (input_settings, CLUTTER_TOUCHPAD_DEVICE); settings = get_settings_for_device_type (input_settings,
CLUTTER_TOUCHPAD_DEVICE);
settings_set_bool_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE, func, settings_set_bool_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE, func,
g_settings_get_boolean (settings, key)); g_settings_get_boolean (settings, key));
} }
@ -494,9 +507,10 @@ update_touchpad_disable_while_typing (MetaInputSettings *input_settings,
enabled = g_settings_get_boolean (priv->touchpad_settings, key); enabled = g_settings_get_boolean (priv->touchpad_settings, key);
if (device) if (device)
{ {
settings = get_settings_for_device_type (input_settings, settings = get_settings_for_device_type (input_settings,
clutter_input_device_get_device_type (device)); clutter_input_device_get_device_type (
device));
if (!settings) if (!settings)
return; return;
@ -574,7 +588,7 @@ update_touchpad_tap_and_drag_enabled (MetaInputSettings *input_settings,
} }
static void static void
update_touchpad_edge_scroll (MetaInputSettings *input_settings, update_touchpad_edge_scroll (MetaInputSettings *input_settings,
ClutterInputDevice *device) ClutterInputDevice *device)
{ {
MetaInputSettingsClass *input_settings_class; MetaInputSettingsClass *input_settings_class;
@ -589,12 +603,16 @@ update_touchpad_edge_scroll (MetaInputSettings *input_settings,
priv = meta_input_settings_get_instance_private (input_settings); priv = meta_input_settings_get_instance_private (input_settings);
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings); input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
edge_scroll_enabled = g_settings_get_boolean (priv->touchpad_settings, "edge-scrolling-enabled"); edge_scroll_enabled = g_settings_get_boolean (priv->touchpad_settings,
two_finger_scroll_enabled = g_settings_get_boolean (priv->touchpad_settings, "two-finger-scrolling-enabled"); "edge-scrolling-enabled");
two_finger_scroll_available = g_hash_table_size (priv->two_finger_devices) > 0; two_finger_scroll_enabled = g_settings_get_boolean (priv->touchpad_settings,
"two-finger-scrolling-enabled");
two_finger_scroll_available = g_hash_table_size (priv->two_finger_devices) >
0;
/* If both are enabled we prefer two finger. */ /* If both are enabled we prefer two finger. */
if (edge_scroll_enabled && two_finger_scroll_enabled && two_finger_scroll_available) if (edge_scroll_enabled && two_finger_scroll_enabled &&
two_finger_scroll_available)
edge_scroll_enabled = FALSE; edge_scroll_enabled = FALSE;
if (device) if (device)
@ -612,7 +630,7 @@ update_touchpad_edge_scroll (MetaInputSettings *input_settings,
} }
static void static void
update_touchpad_two_finger_scroll (MetaInputSettings *input_settings, update_touchpad_two_finger_scroll (MetaInputSettings *input_settings,
ClutterInputDevice *device) ClutterInputDevice *device)
{ {
MetaInputSettingsClass *input_settings_class; MetaInputSettingsClass *input_settings_class;
@ -625,7 +643,8 @@ update_touchpad_two_finger_scroll (MetaInputSettings *input_settings,
priv = meta_input_settings_get_instance_private (input_settings); priv = meta_input_settings_get_instance_private (input_settings);
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings); input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
two_finger_scroll_enabled = g_settings_get_boolean (priv->touchpad_settings, "two-finger-scrolling-enabled"); two_finger_scroll_enabled = g_settings_get_boolean (priv->touchpad_settings,
"two-finger-scrolling-enabled");
/* Disable edge since they can't both be set. */ /* Disable edge since they can't both be set. */
if (two_finger_scroll_enabled) if (two_finger_scroll_enabled)
@ -650,7 +669,7 @@ update_touchpad_two_finger_scroll (MetaInputSettings *input_settings,
} }
static void static void
update_touchpad_click_method (MetaInputSettings *input_settings, update_touchpad_click_method (MetaInputSettings *input_settings,
ClutterInputDevice *device) ClutterInputDevice *device)
{ {
MetaInputSettingsClass *input_settings_class; MetaInputSettingsClass *input_settings_class;
@ -720,12 +739,14 @@ update_trackball_scroll_button (MetaInputSettings *input_settings,
priv = meta_input_settings_get_instance_private (input_settings); priv = meta_input_settings_get_instance_private (input_settings);
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings); input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
if (device && !input_settings_class->is_trackball_device (input_settings, device)) if (device &&
!input_settings_class->is_trackball_device (input_settings, device))
return; return;
/* This key is 'i' in the schema but it also specifies a minimum /* This key is 'i' in the schema but it also specifies a minimum
* range of 0 so the cast here is safe. */ * range of 0 so the cast here is safe. */
button = (guint) g_settings_get_int (priv->trackball_settings, "scroll-wheel-emulation-button"); button = (guint) g_settings_get_int (priv->trackball_settings,
"scroll-wheel-emulation-button");
if (device) if (device)
{ {
@ -741,8 +762,10 @@ update_trackball_scroll_button (MetaInputSettings *input_settings,
{ {
device = devices->data; device = devices->data;
if (input_settings_class->is_trackball_device (input_settings, device)) if (input_settings_class->is_trackball_device (input_settings,
input_settings_class->set_scroll_button (input_settings, device, button); device))
input_settings_class->set_scroll_button (input_settings, device,
button);
devices = devices->next; devices = devices->next;
} }
@ -868,7 +891,8 @@ update_tablet_keep_aspect (MetaInputSettings *input_settings,
device); device);
/* Keep aspect only makes sense in external tablets */ /* Keep aspect only makes sense in external tablets */
if (wacom_device && if (wacom_device &&
libwacom_get_integration_flags (wacom_device) != WACOM_DEVICE_INTEGRATED_NONE) libwacom_get_integration_flags (wacom_device) !=
WACOM_DEVICE_INTEGRATED_NONE)
return; return;
} }
#endif #endif
@ -905,14 +929,16 @@ update_device_display (MetaInputSettings *input_settings,
if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE && if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE &&
clutter_input_device_get_device_type (device) != CLUTTER_PEN_DEVICE && clutter_input_device_get_device_type (device) != CLUTTER_PEN_DEVICE &&
clutter_input_device_get_device_type (device) != CLUTTER_ERASER_DEVICE && clutter_input_device_get_device_type (device) != CLUTTER_ERASER_DEVICE &&
clutter_input_device_get_device_type (device) != CLUTTER_TOUCHSCREEN_DEVICE) clutter_input_device_get_device_type (device) !=
CLUTTER_TOUCHSCREEN_DEVICE)
return; return;
priv = meta_input_settings_get_instance_private (input_settings); priv = meta_input_settings_get_instance_private (input_settings);
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings); input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
/* If mapping is relative, the device can move on all displays */ /* If mapping is relative, the device can move on all displays */
if (clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE || if (clutter_input_device_get_device_type (device) ==
CLUTTER_TOUCHSCREEN_DEVICE ||
clutter_input_device_get_mapping_mode (device) == clutter_input_device_get_mapping_mode (device) ==
CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE) CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE)
meta_input_settings_find_monitor (input_settings, settings, device, meta_input_settings_find_monitor (input_settings, settings, device,
@ -949,7 +975,8 @@ update_tablet_mapping (MetaInputSettings *input_settings,
device); device);
/* Tablet mapping only makes sense on external tablets */ /* Tablet mapping only makes sense on external tablets */
if (wacom_device && if (wacom_device &&
(libwacom_get_integration_flags (wacom_device) != WACOM_DEVICE_INTEGRATED_NONE)) (libwacom_get_integration_flags (wacom_device) !=
WACOM_DEVICE_INTEGRATED_NONE))
return; return;
} }
#endif #endif
@ -990,7 +1017,8 @@ update_tablet_area (MetaInputSettings *input_settings,
/* Tablet area only makes sense on system/display integrated tablets */ /* Tablet area only makes sense on system/display integrated tablets */
if (wacom_device && if (wacom_device &&
(libwacom_get_integration_flags (wacom_device) & (libwacom_get_integration_flags (wacom_device) &
(WACOM_DEVICE_INTEGRATED_SYSTEM | WACOM_DEVICE_INTEGRATED_DISPLAY)) == 0) (WACOM_DEVICE_INTEGRATED_SYSTEM | WACOM_DEVICE_INTEGRATED_DISPLAY)) ==
0)
return; return;
} }
#endif #endif
@ -1031,7 +1059,8 @@ update_tablet_left_handed (MetaInputSettings *input_settings,
device); device);
/* Left handed mode only makes sense on external tablets */ /* Left handed mode only makes sense on external tablets */
if (wacom_device && if (wacom_device &&
(libwacom_get_integration_flags (wacom_device) != WACOM_DEVICE_INTEGRATED_NONE)) (libwacom_get_integration_flags (wacom_device) !=
WACOM_DEVICE_INTEGRATED_NONE))
return; return;
} }
#endif #endif
@ -1050,7 +1079,8 @@ meta_input_settings_changed_cb (GSettings *settings,
gpointer user_data) gpointer user_data)
{ {
MetaInputSettings *input_settings = META_INPUT_SETTINGS (user_data); MetaInputSettings *input_settings = META_INPUT_SETTINGS (user_data);
MetaInputSettingsPrivate *priv = meta_input_settings_get_instance_private (input_settings); MetaInputSettingsPrivate *priv = meta_input_settings_get_instance_private (
input_settings);
if (settings == priv->mouse_settings) if (settings == priv->mouse_settings)
{ {
@ -1075,7 +1105,7 @@ meta_input_settings_changed_cb (GSettings *settings,
update_touchpad_tap_enabled (input_settings, NULL); update_touchpad_tap_enabled (input_settings, NULL);
else if (strcmp (key, "tap-and-drag") == 0) else if (strcmp (key, "tap-and-drag") == 0)
update_touchpad_tap_and_drag_enabled (input_settings, NULL); update_touchpad_tap_and_drag_enabled (input_settings, NULL);
else if (strcmp(key, "disable-while-typing") == 0) else if (strcmp (key, "disable-while-typing") == 0)
update_touchpad_disable_while_typing (input_settings, NULL); update_touchpad_disable_while_typing (input_settings, NULL);
else if (strcmp (key, "send-events") == 0) else if (strcmp (key, "send-events") == 0)
update_touchpad_send_events (input_settings, NULL); update_touchpad_send_events (input_settings, NULL);
@ -1140,23 +1170,25 @@ apply_mappable_device_settings (MetaInputSettings *input_settings,
} }
} }
struct _a11y_settings_flags_pair { struct _a11y_settings_flags_pair
{
const char *name; const char *name;
ClutterKeyboardA11yFlags flag; ClutterKeyboardA11yFlags flag;
} settings_flags_pair[] = { } settings_flags_pair[] =
{ "enable", CLUTTER_A11Y_KEYBOARD_ENABLED }, {
{ "timeout-enable", CLUTTER_A11Y_TIMEOUT_ENABLED }, { "enable", CLUTTER_A11Y_KEYBOARD_ENABLED },
{ "mousekeys-enable", CLUTTER_A11Y_MOUSE_KEYS_ENABLED }, { "timeout-enable", CLUTTER_A11Y_TIMEOUT_ENABLED },
{ "slowkeys-enable", CLUTTER_A11Y_SLOW_KEYS_ENABLED }, { "mousekeys-enable", CLUTTER_A11Y_MOUSE_KEYS_ENABLED },
{ "slowkeys-beep-press", CLUTTER_A11Y_SLOW_KEYS_BEEP_PRESS }, { "slowkeys-enable", CLUTTER_A11Y_SLOW_KEYS_ENABLED },
{ "slowkeys-beep-accept", CLUTTER_A11Y_SLOW_KEYS_BEEP_ACCEPT }, { "slowkeys-beep-press", CLUTTER_A11Y_SLOW_KEYS_BEEP_PRESS },
{ "slowkeys-beep-reject", CLUTTER_A11Y_SLOW_KEYS_BEEP_REJECT }, { "slowkeys-beep-accept", CLUTTER_A11Y_SLOW_KEYS_BEEP_ACCEPT },
{ "bouncekeys-enable", CLUTTER_A11Y_BOUNCE_KEYS_ENABLED }, { "slowkeys-beep-reject", CLUTTER_A11Y_SLOW_KEYS_BEEP_REJECT },
{ "bouncekeys-beep-reject", CLUTTER_A11Y_BOUNCE_KEYS_BEEP_REJECT }, { "bouncekeys-enable", CLUTTER_A11Y_BOUNCE_KEYS_ENABLED },
{ "togglekeys-enable", CLUTTER_A11Y_TOGGLE_KEYS_ENABLED }, { "bouncekeys-beep-reject", CLUTTER_A11Y_BOUNCE_KEYS_BEEP_REJECT },
{ "stickykeys-enable", CLUTTER_A11Y_STICKY_KEYS_ENABLED }, { "togglekeys-enable", CLUTTER_A11Y_TOGGLE_KEYS_ENABLED },
{ "stickykeys-modifier-beep", CLUTTER_A11Y_STICKY_KEYS_BEEP }, { "stickykeys-enable", CLUTTER_A11Y_STICKY_KEYS_ENABLED },
{ "stickykeys-two-key-off", CLUTTER_A11Y_STICKY_KEYS_TWO_KEY_OFF }, { "stickykeys-modifier-beep", CLUTTER_A11Y_STICKY_KEYS_BEEP },
{ "stickykeys-two-key-off", CLUTTER_A11Y_STICKY_KEYS_TWO_KEY_OFF },
{ "feature-state-change-beep", CLUTTER_A11Y_FEATURE_STATE_CHANGE_BEEP }, { "feature-state-change-beep", CLUTTER_A11Y_FEATURE_STATE_CHANGE_BEEP },
}; };
@ -1164,19 +1196,22 @@ static void
load_keyboard_a11y_settings (MetaInputSettings *input_settings, load_keyboard_a11y_settings (MetaInputSettings *input_settings,
ClutterInputDevice *device) ClutterInputDevice *device)
{ {
MetaInputSettingsPrivate *priv = meta_input_settings_get_instance_private (input_settings); MetaInputSettingsPrivate *priv = meta_input_settings_get_instance_private (
input_settings);
ClutterKbdA11ySettings kbd_a11y_settings; ClutterKbdA11ySettings kbd_a11y_settings;
ClutterInputDevice *core_keyboard; ClutterInputDevice *core_keyboard;
guint i; guint i;
core_keyboard = clutter_device_manager_get_core_device (priv->device_manager, CLUTTER_KEYBOARD_DEVICE); core_keyboard = clutter_device_manager_get_core_device (priv->device_manager,
CLUTTER_KEYBOARD_DEVICE);
if (device && device != core_keyboard) if (device && device != core_keyboard)
return; return;
kbd_a11y_settings.controls = 0; kbd_a11y_settings.controls = 0;
for (i = 0; i < G_N_ELEMENTS (settings_flags_pair); i++) for (i = 0; i < G_N_ELEMENTS (settings_flags_pair); i++)
{ {
if (g_settings_get_boolean (priv->a11y_settings, settings_flags_pair[i].name)) if (g_settings_get_boolean (priv->a11y_settings,
settings_flags_pair[i].name))
kbd_a11y_settings.controls |= settings_flags_pair[i].flag; kbd_a11y_settings.controls |= settings_flags_pair[i].flag;
} }
@ -1186,14 +1221,18 @@ load_keyboard_a11y_settings (MetaInputSettings *input_settings,
"slowkeys-delay"); "slowkeys-delay");
kbd_a11y_settings.debounce_delay = g_settings_get_int (priv->a11y_settings, kbd_a11y_settings.debounce_delay = g_settings_get_int (priv->a11y_settings,
"bouncekeys-delay"); "bouncekeys-delay");
kbd_a11y_settings.mousekeys_init_delay = g_settings_get_int (priv->a11y_settings, kbd_a11y_settings.mousekeys_init_delay = g_settings_get_int (
"mousekeys-init-delay"); priv->a11y_settings,
kbd_a11y_settings.mousekeys_max_speed = g_settings_get_int (priv->a11y_settings, "mousekeys-init-delay");
"mousekeys-max-speed"); kbd_a11y_settings.mousekeys_max_speed = g_settings_get_int (
kbd_a11y_settings.mousekeys_accel_time = g_settings_get_int (priv->a11y_settings, priv->a11y_settings,
"mousekeys-accel-time"); "mousekeys-max-speed");
kbd_a11y_settings.mousekeys_accel_time = g_settings_get_int (
priv->a11y_settings,
"mousekeys-accel-time");
clutter_device_manager_set_kbd_a11y_settings (priv->device_manager, &kbd_a11y_settings); clutter_device_manager_set_kbd_a11y_settings (priv->device_manager,
&kbd_a11y_settings);
} }
static void static void
@ -1202,7 +1241,8 @@ on_keyboard_a11y_settings_changed (ClutterDeviceManager *device_manager,
ClutterKeyboardA11yFlags what_changed, ClutterKeyboardA11yFlags what_changed,
MetaInputSettings *input_settings) MetaInputSettings *input_settings)
{ {
MetaInputSettingsPrivate *priv = meta_input_settings_get_instance_private (input_settings); MetaInputSettingsPrivate *priv = meta_input_settings_get_instance_private (
input_settings);
guint i; guint i;
for (i = 0; i < G_N_ELEMENTS (settings_flags_pair); i++) for (i = 0; i < G_N_ELEMENTS (settings_flags_pair); i++)
@ -1210,7 +1250,8 @@ on_keyboard_a11y_settings_changed (ClutterDeviceManager *device_manager,
if (settings_flags_pair[i].flag & what_changed) if (settings_flags_pair[i].flag & what_changed)
g_settings_set_boolean (priv->a11y_settings, g_settings_set_boolean (priv->a11y_settings,
settings_flags_pair[i].name, settings_flags_pair[i].name,
(new_flags & settings_flags_pair[i].flag) ? TRUE : FALSE); (new_flags &
settings_flags_pair[i].flag) ? TRUE : FALSE);
} }
} }
@ -1278,13 +1319,15 @@ lookup_tool_settings (ClutterInputDeviceTool *tool,
if (serial == 0) if (serial == 0)
{ {
path = g_strdup_printf ("/org/gnome/desktop/peripherals/stylus/default-%s:%s/", path = g_strdup_printf (
clutter_input_device_get_vendor_id (device), "/org/gnome/desktop/peripherals/stylus/default-%s:%s/",
clutter_input_device_get_product_id (device)); clutter_input_device_get_vendor_id (device),
clutter_input_device_get_product_id (device));
} }
else else
{ {
path = g_strdup_printf ("/org/gnome/desktop/peripherals/stylus/%lx/", serial); path = g_strdup_printf ("/org/gnome/desktop/peripherals/stylus/%lx/",
serial);
} }
tool_settings = tool_settings =
@ -1336,7 +1379,8 @@ lookup_pad_action_settings (ClutterInputDevice *device,
} }
path = g_string_new (NULL); path = g_string_new (NULL);
g_string_append_printf (path, "/org/gnome/desktop/peripherals/tablets/%s:%s/%s%c", g_string_append_printf (path,
"/org/gnome/desktop/peripherals/tablets/%s:%s/%s%c",
vendor, product, action_type, action_label); vendor, product, action_type, action_label);
if (detail_type) if (detail_type)
@ -1347,8 +1391,9 @@ lookup_pad_action_settings (ClutterInputDevice *device,
g_string_append_c (path, '/'); g_string_append_c (path, '/');
settings = g_settings_new_with_path ("org.gnome.desktop.peripherals.tablet.pad-button", settings = g_settings_new_with_path (
path->str); "org.gnome.desktop.peripherals.tablet.pad-button",
path->str);
g_string_free (path, TRUE); g_string_free (path, TRUE);
return settings; return settings;
@ -1421,7 +1466,8 @@ check_add_mappable_device (MetaInputSettings *input_settings,
WacomError *error = libwacom_error_new (); WacomError *error = libwacom_error_new ();
info->wacom_device = libwacom_new_from_path (priv->wacom_db, info->wacom_device = libwacom_new_from_path (priv->wacom_db,
clutter_input_device_get_device_node (device), clutter_input_device_get_device_node (
device),
WFALLBACK_NONE, error); WFALLBACK_NONE, error);
if (!info->wacom_device) if (!info->wacom_device)
{ {
@ -1514,7 +1560,8 @@ update_stylus_pressure (MetaInputSettings *input_settings,
return; return;
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings); input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
input_settings_class->set_stylus_pressure (input_settings, device, tool, curve); input_settings_class->set_stylus_pressure (input_settings, device, tool,
curve);
} }
static void static void
@ -1576,7 +1623,8 @@ meta_input_settings_device_added (ClutterDeviceManager *device_manager,
ClutterInputDevice *device, ClutterInputDevice *device,
MetaInputSettings *input_settings) MetaInputSettings *input_settings)
{ {
if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER) if (clutter_input_device_get_device_mode (device) ==
CLUTTER_INPUT_MODE_MASTER)
return; return;
evaluate_two_finger_scrolling (input_settings, device); evaluate_two_finger_scrolling (input_settings, device);
@ -1674,7 +1722,8 @@ check_mappable_devices (MetaInputSettings *input_settings)
{ {
ClutterInputDevice *device = l->data; ClutterInputDevice *device = l->data;
if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER) if (clutter_input_device_get_device_mode (device) ==
CLUTTER_INPUT_MODE_MASTER)
continue; continue;
check_add_mappable_device (input_settings, device); check_add_mappable_device (input_settings, device);
@ -1687,7 +1736,8 @@ meta_input_settings_constructed (GObject *object)
MetaInputSettings *input_settings = META_INPUT_SETTINGS (object); MetaInputSettings *input_settings = META_INPUT_SETTINGS (object);
GSList *devices, *d; GSList *devices, *d;
devices = meta_input_settings_get_devices (input_settings, CLUTTER_TOUCHPAD_DEVICE); devices = meta_input_settings_get_devices (input_settings,
CLUTTER_TOUCHPAD_DEVICE);
for (d = devices; d; d = d->next) for (d = devices; d; d = d->next)
evaluate_two_finger_scrolling (input_settings, d->data); evaluate_two_finger_scrolling (input_settings, d->data);
@ -1728,22 +1778,26 @@ meta_input_settings_init (MetaInputSettings *settings)
g_signal_connect (priv->mouse_settings, "changed", g_signal_connect (priv->mouse_settings, "changed",
G_CALLBACK (meta_input_settings_changed_cb), settings); G_CALLBACK (meta_input_settings_changed_cb), settings);
priv->touchpad_settings = g_settings_new ("org.gnome.desktop.peripherals.touchpad"); priv->touchpad_settings = g_settings_new (
"org.gnome.desktop.peripherals.touchpad");
g_signal_connect (priv->touchpad_settings, "changed", g_signal_connect (priv->touchpad_settings, "changed",
G_CALLBACK (meta_input_settings_changed_cb), settings); G_CALLBACK (meta_input_settings_changed_cb), settings);
priv->trackball_settings = g_settings_new ("org.gnome.desktop.peripherals.trackball"); priv->trackball_settings = g_settings_new (
"org.gnome.desktop.peripherals.trackball");
g_signal_connect (priv->trackball_settings, "changed", g_signal_connect (priv->trackball_settings, "changed",
G_CALLBACK (meta_input_settings_changed_cb), settings); G_CALLBACK (meta_input_settings_changed_cb), settings);
priv->keyboard_settings = g_settings_new ("org.gnome.desktop.peripherals.keyboard"); priv->keyboard_settings = g_settings_new (
"org.gnome.desktop.peripherals.keyboard");
g_signal_connect (priv->keyboard_settings, "changed", g_signal_connect (priv->keyboard_settings, "changed",
G_CALLBACK (meta_input_settings_changed_cb), settings); G_CALLBACK (meta_input_settings_changed_cb), settings);
priv->gsd_settings = g_settings_new ("org.gnome.settings-daemon.peripherals.mouse"); priv->gsd_settings = g_settings_new (
"org.gnome.settings-daemon.peripherals.mouse");
g_settings_bind (priv->gsd_settings, "double-click", g_settings_bind (priv->gsd_settings, "double-click",
clutter_settings_get_default(), "double-click-time", clutter_settings_get_default (), "double-click-time",
G_SETTINGS_BIND_GET); G_SETTINGS_BIND_GET);
priv->a11y_settings = g_settings_new ("org.gnome.desktop.a11y.keyboard"); priv->a11y_settings = g_settings_new ("org.gnome.desktop.a11y.keyboard");
@ -1753,10 +1807,12 @@ meta_input_settings_init (MetaInputSettings *settings)
G_CALLBACK (on_keyboard_a11y_settings_changed), settings); G_CALLBACK (on_keyboard_a11y_settings_changed), settings);
priv->mappable_devices = priv->mappable_devices =
g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) device_mapping_info_free); g_hash_table_new_full (NULL, NULL, NULL,
(GDestroyNotify) device_mapping_info_free);
priv->current_tools = priv->current_tools =
g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) current_tool_info_free); g_hash_table_new_full (NULL, NULL, NULL,
(GDestroyNotify) current_tool_info_free);
priv->monitor_manager = g_object_ref (meta_monitor_manager_get ()); priv->monitor_manager = g_object_ref (meta_monitor_manager_get ());
g_signal_connect (priv->monitor_manager, "monitors-changed-internal", g_signal_connect (priv->monitor_manager, "monitors-changed-internal",
@ -1831,9 +1887,9 @@ meta_input_settings_get_tablet_mapping (MetaInputSettings *settings,
} }
static GDesktopPadButtonAction static GDesktopPadButtonAction
meta_input_settings_get_pad_button_action (MetaInputSettings *input_settings, meta_input_settings_get_pad_button_action (MetaInputSettings *input_settings,
ClutterInputDevice *pad, ClutterInputDevice *pad,
guint button) guint button)
{ {
GDesktopPadButtonAction action; GDesktopPadButtonAction action;
GSettings *settings; GSettings *settings;
@ -1853,7 +1909,7 @@ meta_input_settings_get_pad_button_action (MetaInputSettings *input_settings,
#ifdef HAVE_LIBWACOM #ifdef HAVE_LIBWACOM
WacomDevice * WacomDevice *
meta_input_settings_get_tablet_wacom_device (MetaInputSettings *settings, meta_input_settings_get_tablet_wacom_device (MetaInputSettings *settings,
ClutterInputDevice *device) ClutterInputDevice *device)
{ {
MetaInputSettingsPrivate *priv; MetaInputSettingsPrivate *priv;
@ -1917,8 +1973,10 @@ meta_input_settings_cycle_tablet_output (MetaInputSettings *input_settings,
g_return_if_fail (META_IS_INPUT_SETTINGS (input_settings)); g_return_if_fail (META_IS_INPUT_SETTINGS (input_settings));
g_return_if_fail (CLUTTER_IS_INPUT_DEVICE (device)); g_return_if_fail (CLUTTER_IS_INPUT_DEVICE (device));
g_return_if_fail (clutter_input_device_get_device_type (device) == CLUTTER_TABLET_DEVICE || g_return_if_fail (clutter_input_device_get_device_type (
clutter_input_device_get_device_type (device) == CLUTTER_PAD_DEVICE); device) == CLUTTER_TABLET_DEVICE ||
clutter_input_device_get_device_type (
device) == CLUTTER_PAD_DEVICE);
priv = meta_input_settings_get_instance_private (input_settings); priv = meta_input_settings_get_instance_private (input_settings);
info = g_hash_table_lookup (priv->mappable_devices, device); info = g_hash_table_lookup (priv->mappable_devices, device);
@ -1928,7 +1986,8 @@ meta_input_settings_cycle_tablet_output (MetaInputSettings *input_settings,
if (info->wacom_device) if (info->wacom_device)
{ {
/* Output rotation only makes sense on external tablets */ /* Output rotation only makes sense on external tablets */
if (libwacom_get_integration_flags (info->wacom_device) != WACOM_DEVICE_INTEGRATED_NONE) if (libwacom_get_integration_flags (info->wacom_device) !=
WACOM_DEVICE_INTEGRATED_NONE)
return; return;
pretty_name = libwacom_get_name (info->wacom_device); pretty_name = libwacom_get_name (info->wacom_device);
@ -1971,10 +2030,12 @@ emulate_modifiers (ClutterVirtualInputDevice *device,
ClutterKeyState state) ClutterKeyState state)
{ {
guint i; guint i;
struct { struct
{
ClutterModifierType mod; ClutterModifierType mod;
guint keyval; guint keyval;
} mod_map[] = { } mod_map[] =
{
{ CLUTTER_SHIFT_MASK, CLUTTER_KEY_Shift_L }, { CLUTTER_SHIFT_MASK, CLUTTER_KEY_Shift_L },
{ CLUTTER_CONTROL_MASK, CLUTTER_KEY_Control_L }, { CLUTTER_CONTROL_MASK, CLUTTER_KEY_Control_L },
{ CLUTTER_MOD1_MASK, CLUTTER_KEY_Meta_L } { CLUTTER_MOD1_MASK, CLUTTER_KEY_Meta_L }
@ -1992,9 +2053,9 @@ emulate_modifiers (ClutterVirtualInputDevice *device,
} }
static void static void
meta_input_settings_emulate_keybinding (MetaInputSettings *input_settings, meta_input_settings_emulate_keybinding (MetaInputSettings *input_settings,
const gchar *accel, const gchar *accel,
gboolean is_press) gboolean is_press)
{ {
MetaInputSettingsPrivate *priv; MetaInputSettingsPrivate *priv;
ClutterKeyState state; ClutterKeyState state;
@ -2039,14 +2100,16 @@ meta_input_settings_is_pad_button_grabbed (MetaInputSettings *input_settings,
g_return_val_if_fail (clutter_input_device_get_device_type (pad) == g_return_val_if_fail (clutter_input_device_get_device_type (pad) ==
CLUTTER_PAD_DEVICE, FALSE); CLUTTER_PAD_DEVICE, FALSE);
return (meta_input_settings_get_pad_button_action (input_settings, pad, button) != return (meta_input_settings_get_pad_button_action (input_settings, pad,
button) !=
G_DESKTOP_PAD_BUTTON_ACTION_NONE); G_DESKTOP_PAD_BUTTON_ACTION_NONE);
} }
static gboolean static gboolean
meta_input_settings_handle_pad_button (MetaInputSettings *input_settings, meta_input_settings_handle_pad_button (
ClutterInputDevice *pad, MetaInputSettings *input_settings,
const ClutterPadButtonEvent *event) ClutterInputDevice *pad,
const ClutterPadButtonEvent *event)
{ {
GDesktopPadButtonAction action; GDesktopPadButtonAction action;
gint button, group, mode; gint button, group, mode;
@ -2082,7 +2145,8 @@ meta_input_settings_handle_pad_button (MetaInputSettings *input_settin
info->group_modes[group] = mode; info->group_modes[group] = mode;
} }
action = meta_input_settings_get_pad_button_action (input_settings, pad, button); action = meta_input_settings_get_pad_button_action (input_settings, pad,
button);
switch (action) switch (action)
{ {
@ -2096,7 +2160,8 @@ meta_input_settings_handle_pad_button (MetaInputSettings *input_settin
return TRUE; return TRUE;
case G_DESKTOP_PAD_BUTTON_ACTION_KEYBINDING: case G_DESKTOP_PAD_BUTTON_ACTION_KEYBINDING:
settings = lookup_pad_action_settings (pad, META_PAD_ACTION_BUTTON, settings = lookup_pad_action_settings (pad, META_PAD_ACTION_BUTTON,
button, META_PAD_DIRECTION_NONE, -1); button, META_PAD_DIRECTION_NONE,
-1);
accel = g_settings_get_string (settings, "keybinding"); accel = g_settings_get_string (settings, "keybinding");
meta_input_settings_emulate_keybinding (input_settings, accel, is_press); meta_input_settings_emulate_keybinding (input_settings, accel, is_press);
g_object_unref (settings); g_object_unref (settings);
@ -2109,12 +2174,12 @@ meta_input_settings_handle_pad_button (MetaInputSettings *input_settin
} }
static gboolean static gboolean
meta_input_settings_handle_pad_action (MetaInputSettings *input_settings, meta_input_settings_handle_pad_action (MetaInputSettings *input_settings,
ClutterInputDevice *pad, ClutterInputDevice *pad,
MetaPadActionType action, MetaPadActionType action,
guint number, guint number,
MetaPadDirection direction, MetaPadDirection direction,
guint mode) guint mode)
{ {
GSettings *settings; GSettings *settings;
gboolean handled = FALSE; gboolean handled = FALSE;
@ -2137,9 +2202,10 @@ meta_input_settings_handle_pad_action (MetaInputSettings *input_settings
} }
static gboolean static gboolean
meta_input_settings_get_pad_action_direction (MetaInputSettings *input_settings, meta_input_settings_get_pad_action_direction (
const ClutterEvent *event, MetaInputSettings *input_settings,
MetaPadDirection *direction) const ClutterEvent *event,
MetaPadDirection *direction)
{ {
MetaInputSettingsPrivate *priv; MetaInputSettingsPrivate *priv;
ClutterInputDevice *pad = clutter_event_get_device (event); ClutterInputDevice *pad = clutter_event_get_device (event);
@ -2178,7 +2244,7 @@ meta_input_settings_get_pad_action_direction (MetaInputSettings *input_settings
value >= 0 && priv->last_pad_action_info.value >= 0) value >= 0 && priv->last_pad_action_info.value >= 0)
{ {
*direction = (value - priv->last_pad_action_info.value) > 0 ? *direction = (value - priv->last_pad_action_info.value) > 0 ?
inc_dir : dec_dir; inc_dir : dec_dir;
has_direction = TRUE; has_direction = TRUE;
} }
@ -2310,22 +2376,24 @@ meta_input_settings_get_button_label (MetaInputSettings *input_settings,
return g_strdup_printf (_("Mode Switch (Group %d)"), group); return g_strdup_printf (_("Mode Switch (Group %d)"), group);
} }
action = meta_input_settings_get_pad_button_action (input_settings, pad, button); action = meta_input_settings_get_pad_button_action (input_settings, pad,
button);
switch (action) switch (action)
{ {
case G_DESKTOP_PAD_BUTTON_ACTION_KEYBINDING: case G_DESKTOP_PAD_BUTTON_ACTION_KEYBINDING:
{ {
GSettings *settings; GSettings *settings;
gchar *accel; gchar *accel;
settings = lookup_pad_action_settings (pad, META_PAD_ACTION_BUTTON, settings = lookup_pad_action_settings (pad, META_PAD_ACTION_BUTTON,
button, META_PAD_DIRECTION_NONE, -1); button, META_PAD_DIRECTION_NONE,
accel = g_settings_get_string (settings, "keybinding"); -1);
g_object_unref (settings); accel = g_settings_get_string (settings, "keybinding");
g_object_unref (settings);
return accel; return accel;
} }
case G_DESKTOP_PAD_BUTTON_ACTION_SWITCH_MONITOR: case G_DESKTOP_PAD_BUTTON_ACTION_SWITCH_MONITOR:
/* TRANSLATORS: This string refers to an action, cycles drawing tablets' /* TRANSLATORS: This string refers to an action, cycles drawing tablets'
* mapping through the available outputs. * mapping through the available outputs.

View File

@ -30,8 +30,8 @@
G_DEFINE_TYPE (MetaLogicalMonitor, meta_logical_monitor, G_TYPE_OBJECT) G_DEFINE_TYPE (MetaLogicalMonitor, meta_logical_monitor, G_TYPE_OBJECT)
static MetaMonitor * static MetaMonitor *
get_first_monitor (MetaMonitorManager *monitor_manager, get_first_monitor (MetaMonitorManager * monitor_manager,
GList *monitor_configs) GList * monitor_configs)
{ {
MetaMonitorConfig *first_monitor_config; MetaMonitorConfig *first_monitor_config;
MetaMonitorSpec *first_monitor_spec; MetaMonitorSpec *first_monitor_spec;
@ -89,9 +89,9 @@ meta_logical_monitor_new (MetaMonitorManager *monitor_manager,
logical_monitor->is_presentation = TRUE; logical_monitor->is_presentation = TRUE;
g_list_foreach (monitor_configs, (GFunc) add_monitor_from_config, g_list_foreach (monitor_configs, (GFunc) add_monitor_from_config,
&(AddMonitorFromConfigData) { &(AddMonitorFromConfigData) {
.monitor_manager = monitor_manager, .monitor_manager = monitor_manager,
.logical_monitor = logical_monitor .logical_monitor = logical_monitor
}); });
return logical_monitor; return logical_monitor;
} }
@ -240,7 +240,8 @@ meta_logical_monitor_foreach_crtc (MetaLogicalMonitor *logical_monitor,
{ {
MetaMonitor *monitor = l->data; MetaMonitor *monitor = l->data;
MetaMonitorMode *mode; MetaMonitorMode *mode;
ForeachCrtcData data = { ForeachCrtcData data =
{
.logical_monitor = logical_monitor, .logical_monitor = logical_monitor,
.func = func, .func = func,
.user_data = user_data .user_data = user_data
@ -279,9 +280,9 @@ meta_logical_monitor_class_init (MetaLogicalMonitorClass *klass)
} }
gboolean gboolean
meta_logical_monitor_has_neighbor (MetaLogicalMonitor *logical_monitor, meta_logical_monitor_has_neighbor (MetaLogicalMonitor *logical_monitor,
MetaLogicalMonitor *neighbor, MetaLogicalMonitor *neighbor,
MetaDisplayDirection neighbor_direction) MetaDisplayDirection neighbor_direction)
{ {
switch (neighbor_direction) switch (neighbor_direction)
{ {

View File

@ -330,14 +330,15 @@ meta_monitor_config_manager_assign (MetaMonitorManager *manager,
static gboolean static gboolean
is_lid_closed (MetaMonitorManager *monitor_manager) is_lid_closed (MetaMonitorManager *monitor_manager)
{ {
MetaBackend *backend; MetaBackend *backend;
backend = meta_monitor_manager_get_backend (monitor_manager); backend = meta_monitor_manager_get_backend (monitor_manager);
return meta_backend_is_lid_closed (backend); return meta_backend_is_lid_closed (backend);
} }
MetaMonitorsConfigKey * MetaMonitorsConfigKey *
meta_create_monitors_config_key_for_current_state (MetaMonitorManager *monitor_manager) meta_create_monitors_config_key_for_current_state (
MetaMonitorManager *monitor_manager)
{ {
MetaMonitorsConfigKey *config_key; MetaMonitorsConfigKey *config_key;
GList *l; GList *l;
@ -399,7 +400,8 @@ meta_monitor_config_manager_get_stored (MetaMonitorConfigManager *config_manager
g_warning ("Failed to finish monitors config migration: %s", g_warning ("Failed to finish monitors config migration: %s",
error->message); error->message);
g_error_free (error); g_error_free (error);
meta_monitor_config_store_remove (config_manager->config_store, config); meta_monitor_config_store_remove (config_manager->config_store,
config);
return NULL; return NULL;
} }
} }
@ -414,8 +416,9 @@ typedef enum _MonitorMatchRule
} MonitorMatchRule; } MonitorMatchRule;
static MetaMonitor * static MetaMonitor *
find_monitor_with_highest_preferred_resolution (MetaMonitorManager *monitor_manager, find_monitor_with_highest_preferred_resolution (
MonitorMatchRule match_rule) MetaMonitorManager *monitor_manager,
MonitorMatchRule match_rule)
{ {
GList *monitors; GList *monitors;
GList *l; GList *l;
@ -517,12 +520,13 @@ create_monitor_config (MetaMonitor *monitor,
} }
static MetaLogicalMonitorConfig * static MetaLogicalMonitorConfig *
create_preferred_logical_monitor_config (MetaMonitorManager *monitor_manager, create_preferred_logical_monitor_config (
MetaMonitor *monitor, MetaMonitorManager *monitor_manager,
int x, MetaMonitor *monitor,
int y, int x,
MetaLogicalMonitorConfig *primary_logical_monitor_config, int y,
MetaLogicalMonitorLayoutMode layout_mode) MetaLogicalMonitorConfig *primary_logical_monitor_config,
MetaLogicalMonitorLayoutMode layout_mode)
{ {
MetaMonitorMode *mode; MetaMonitorMode *mode;
int width, height; int width, height;
@ -570,7 +574,8 @@ create_preferred_logical_monitor_config (MetaMonitorManager *monitor_ma
} }
MetaMonitorsConfig * MetaMonitorsConfig *
meta_monitor_config_manager_create_linear (MetaMonitorConfigManager *config_manager) meta_monitor_config_manager_create_linear (
MetaMonitorConfigManager *config_manager)
{ {
MetaMonitorManager *monitor_manager = config_manager->monitor_manager; MetaMonitorManager *monitor_manager = config_manager->monitor_manager;
GList *logical_monitor_configs; GList *logical_monitor_configs;
@ -630,7 +635,8 @@ meta_monitor_config_manager_create_linear (MetaMonitorConfigManager *config_mana
} }
MetaMonitorsConfig * MetaMonitorsConfig *
meta_monitor_config_manager_create_fallback (MetaMonitorConfigManager *config_manager) meta_monitor_config_manager_create_fallback (
MetaMonitorConfigManager *config_manager)
{ {
MetaMonitorManager *monitor_manager = config_manager->monitor_manager; MetaMonitorManager *monitor_manager = config_manager->monitor_manager;
MetaMonitor *primary_monitor; MetaMonitor *primary_monitor;
@ -661,7 +667,8 @@ meta_monitor_config_manager_create_fallback (MetaMonitorConfigManager *config_ma
} }
MetaMonitorsConfig * MetaMonitorsConfig *
meta_monitor_config_manager_create_suggested (MetaMonitorConfigManager *config_manager) meta_monitor_config_manager_create_suggested (
MetaMonitorConfigManager *config_manager)
{ {
MetaMonitorManager *monitor_manager = config_manager->monitor_manager; MetaMonitorManager *monitor_manager = config_manager->monitor_manager;
MetaLogicalMonitorConfig *primary_logical_monitor_config = NULL; MetaLogicalMonitorConfig *primary_logical_monitor_config = NULL;
@ -717,7 +724,8 @@ meta_monitor_config_manager_create_suggested (MetaMonitorConfigManager *config_m
if (meta_rectangle_overlaps_with_region (region, if (meta_rectangle_overlaps_with_region (region,
&logical_monitor_config->layout)) &logical_monitor_config->layout))
{ {
g_warning ("Suggested monitor config has overlapping region, rejecting"); g_warning (
"Suggested monitor config has overlapping region, rejecting");
g_list_free (region); g_list_free (region);
g_list_free_full (logical_monitor_configs, g_list_free_full (logical_monitor_configs,
(GDestroyNotify) meta_logical_monitor_config_free); (GDestroyNotify) meta_logical_monitor_config_free);
@ -751,19 +759,23 @@ create_for_builtin_display_rotation (MetaMonitorConfigManager *config_manager,
MetaMonitorConfig *monitor_config; MetaMonitorConfig *monitor_config;
MetaMonitorConfig *current_monitor_config; MetaMonitorConfig *current_monitor_config;
if (!meta_monitor_manager_get_is_builtin_display_on (config_manager->monitor_manager)) if (!meta_monitor_manager_get_is_builtin_display_on (config_manager->
monitor_manager))
return NULL; return NULL;
if (!config_manager->current_config) if (!config_manager->current_config)
return NULL; return NULL;
if (g_list_length (config_manager->current_config->logical_monitor_configs) != 1) if (g_list_length (config_manager->current_config->logical_monitor_configs) !=
1)
return NULL; return NULL;
current_logical_monitor_config = config_manager->current_config->logical_monitor_configs->data; current_logical_monitor_config =
config_manager->current_config->logical_monitor_configs->data;
if (rotate) if (rotate)
transform = (current_logical_monitor_config->transform + 1) % META_MONITOR_TRANSFORM_FLIPPED; transform = (current_logical_monitor_config->transform + 1) %
META_MONITOR_TRANSFORM_FLIPPED;
else else
{ {
/* /*
@ -785,24 +797,33 @@ create_for_builtin_display_rotation (MetaMonitorConfigManager *config_manager,
if (g_list_length (current_logical_monitor_config->monitor_configs) != 1) if (g_list_length (current_logical_monitor_config->monitor_configs) != 1)
return NULL; return NULL;
current_monitor_config = current_logical_monitor_config->monitor_configs->data; current_monitor_config =
current_logical_monitor_config->monitor_configs->data;
monitor_config = g_new0 (MetaMonitorConfig, 1); monitor_config = g_new0 (MetaMonitorConfig, 1);
*monitor_config = (MetaMonitorConfig) { *monitor_config = (MetaMonitorConfig) {
.monitor_spec = meta_monitor_spec_clone (current_monitor_config->monitor_spec), .monitor_spec = meta_monitor_spec_clone (
.mode_spec = g_memdup (current_monitor_config->mode_spec, sizeof (MetaMonitorModeSpec)), current_monitor_config->monitor_spec),
.mode_spec =
g_memdup (current_monitor_config->mode_spec,
sizeof (MetaMonitorModeSpec)),
.enable_underscanning = current_monitor_config->enable_underscanning .enable_underscanning = current_monitor_config->enable_underscanning
}; };
logical_monitor_config = g_memdup (current_logical_monitor_config, sizeof (MetaLogicalMonitorConfig)); logical_monitor_config =
logical_monitor_config->monitor_configs = g_list_append (NULL, monitor_config); g_memdup (current_logical_monitor_config,
sizeof (MetaLogicalMonitorConfig));
logical_monitor_config->monitor_configs =
g_list_append (NULL, monitor_config);
logical_monitor_config->transform = transform; logical_monitor_config->transform = transform;
if (meta_monitor_transform_is_rotated (current_logical_monitor_config->transform) != if (meta_monitor_transform_is_rotated (current_logical_monitor_config->
transform) !=
meta_monitor_transform_is_rotated (logical_monitor_config->transform)) meta_monitor_transform_is_rotated (logical_monitor_config->transform))
{ {
int temp = logical_monitor_config->layout.width; int temp = logical_monitor_config->layout.width;
logical_monitor_config->layout.width = logical_monitor_config->layout.height; logical_monitor_config->layout.width =
logical_monitor_config->layout.height;
logical_monitor_config->layout.height = temp; logical_monitor_config->layout.height = temp;
} }
@ -815,16 +836,19 @@ create_for_builtin_display_rotation (MetaMonitorConfigManager *config_manager,
} }
MetaMonitorsConfig * MetaMonitorsConfig *
meta_monitor_config_manager_create_for_orientation (MetaMonitorConfigManager *config_manager, meta_monitor_config_manager_create_for_orientation (
MetaMonitorTransform transform) MetaMonitorConfigManager *config_manager,
MetaMonitorTransform transform)
{ {
return create_for_builtin_display_rotation (config_manager, FALSE, transform); return create_for_builtin_display_rotation (config_manager, FALSE, transform);
} }
MetaMonitorsConfig * MetaMonitorsConfig *
meta_monitor_config_manager_create_for_rotate_monitor (MetaMonitorConfigManager *config_manager) meta_monitor_config_manager_create_for_rotate_monitor (
MetaMonitorConfigManager *config_manager)
{ {
return create_for_builtin_display_rotation (config_manager, TRUE, META_MONITOR_TRANSFORM_NORMAL); return create_for_builtin_display_rotation (config_manager, TRUE,
META_MONITOR_TRANSFORM_NORMAL);
} }
static MetaMonitorsConfig * static MetaMonitorsConfig *
@ -914,9 +938,11 @@ create_for_switch_config_all_mirror (MetaMonitorConfigManager *config_manager)
if (!mode) if (!mode)
continue; continue;
scale = meta_monitor_manager_calculate_monitor_mode_scale (monitor_manager, monitor, mode); scale = meta_monitor_manager_calculate_monitor_mode_scale (
monitor_manager, monitor, mode);
best_scale = MAX (best_scale, scale); best_scale = MAX (best_scale, scale);
monitor_configs = g_list_prepend (monitor_configs, create_monitor_config (monitor, mode)); monitor_configs =
g_list_prepend (monitor_configs, create_monitor_config (monitor, mode));
} }
logical_monitor_config = g_new0 (MetaLogicalMonitorConfig, 1); logical_monitor_config = g_new0 (MetaLogicalMonitorConfig, 1);
@ -1013,8 +1039,9 @@ create_for_switch_config_builtin (MetaMonitorConfigManager *config_manager)
} }
MetaMonitorsConfig * MetaMonitorsConfig *
meta_monitor_config_manager_create_for_switch_config (MetaMonitorConfigManager *config_manager, meta_monitor_config_manager_create_for_switch_config (
MetaMonitorSwitchConfigType config_type) MetaMonitorConfigManager *config_manager,
MetaMonitorSwitchConfigType config_type)
{ {
MetaMonitorManager *monitor_manager = config_manager->monitor_manager; MetaMonitorManager *monitor_manager = config_manager->monitor_manager;
MetaMonitorsConfig *config; MetaMonitorsConfig *config;
@ -1049,8 +1076,9 @@ meta_monitor_config_manager_create_for_switch_config (MetaMonitorConfigManager
} }
void void
meta_monitor_config_manager_set_current (MetaMonitorConfigManager *config_manager, meta_monitor_config_manager_set_current (
MetaMonitorsConfig *config) MetaMonitorConfigManager *config_manager,
MetaMonitorsConfig *config)
{ {
if (config_manager->current_config) if (config_manager->current_config)
{ {
@ -1065,7 +1093,8 @@ meta_monitor_config_manager_set_current (MetaMonitorConfigManager *config_manage
} }
void void
meta_monitor_config_manager_save_current (MetaMonitorConfigManager *config_manager) meta_monitor_config_manager_save_current (
MetaMonitorConfigManager *config_manager)
{ {
g_return_if_fail (config_manager->current_config); g_return_if_fail (config_manager->current_config);
@ -1074,27 +1103,32 @@ meta_monitor_config_manager_save_current (MetaMonitorConfigManager *config_manag
} }
MetaMonitorsConfig * MetaMonitorsConfig *
meta_monitor_config_manager_get_current (MetaMonitorConfigManager *config_manager) meta_monitor_config_manager_get_current (
MetaMonitorConfigManager *config_manager)
{ {
return config_manager->current_config; return config_manager->current_config;
} }
MetaMonitorsConfig * MetaMonitorsConfig *
meta_monitor_config_manager_pop_previous (MetaMonitorConfigManager *config_manager) meta_monitor_config_manager_pop_previous (
MetaMonitorConfigManager *config_manager)
{ {
return g_queue_pop_head (&config_manager->config_history); return g_queue_pop_head (&config_manager->config_history);
} }
MetaMonitorsConfig * MetaMonitorsConfig *
meta_monitor_config_manager_get_previous (MetaMonitorConfigManager *config_manager) meta_monitor_config_manager_get_previous (
MetaMonitorConfigManager *config_manager)
{ {
return g_queue_peek_head (&config_manager->config_history); return g_queue_peek_head (&config_manager->config_history);
} }
void void
meta_monitor_config_manager_clear_history (MetaMonitorConfigManager *config_manager) meta_monitor_config_manager_clear_history (
MetaMonitorConfigManager *config_manager)
{ {
g_queue_foreach (&config_manager->config_history, (GFunc) g_object_unref, NULL); g_queue_foreach (&config_manager->config_history, (GFunc) g_object_unref,
NULL);
g_queue_clear (&config_manager->config_history); g_queue_clear (&config_manager->config_history);
} }
@ -1133,7 +1167,8 @@ meta_monitor_config_free (MetaMonitorConfig *monitor_config)
} }
void void
meta_logical_monitor_config_free (MetaLogicalMonitorConfig *logical_monitor_config) meta_logical_monitor_config_free (
MetaLogicalMonitorConfig *logical_monitor_config)
{ {
g_list_free_full (logical_monitor_config->monitor_configs, g_list_free_full (logical_monitor_config->monitor_configs,
(GDestroyNotify) meta_monitor_config_free); (GDestroyNotify) meta_monitor_config_free);
@ -1244,17 +1279,18 @@ meta_monitors_config_get_switch_config (MetaMonitorsConfig *config)
} }
void void
meta_monitors_config_set_switch_config (MetaMonitorsConfig *config, meta_monitors_config_set_switch_config (MetaMonitorsConfig *config,
MetaMonitorSwitchConfigType switch_config) MetaMonitorSwitchConfigType switch_config)
{ {
config->switch_config = switch_config; config->switch_config = switch_config;
} }
MetaMonitorsConfig * MetaMonitorsConfig *
meta_monitors_config_new_full (GList *logical_monitor_configs, meta_monitors_config_new_full (
GList *disabled_monitor_specs, GList *logical_monitor_configs,
MetaLogicalMonitorLayoutMode layout_mode, GList *disabled_monitor_specs,
MetaMonitorsConfigFlag flags) MetaLogicalMonitorLayoutMode layout_mode,
MetaMonitorsConfigFlag flags)
{ {
MetaMonitorsConfig *config; MetaMonitorsConfig *config;
@ -1271,10 +1307,10 @@ meta_monitors_config_new_full (GList *logical_monitor_con
} }
MetaMonitorsConfig * MetaMonitorsConfig *
meta_monitors_config_new (MetaMonitorManager *monitor_manager, meta_monitors_config_new (MetaMonitorManager *monitor_manager,
GList *logical_monitor_configs, GList *logical_monitor_configs,
MetaLogicalMonitorLayoutMode layout_mode, MetaLogicalMonitorLayoutMode layout_mode,
MetaMonitorsConfigFlag flags) MetaMonitorsConfigFlag flags)
{ {
GList *disabled_monitor_specs = NULL; GList *disabled_monitor_specs = NULL;
GList *monitors; GList *monitors;
@ -1400,10 +1436,11 @@ meta_verify_monitor_config (MetaMonitorConfig *monitor_config,
} }
gboolean gboolean
meta_verify_logical_monitor_config (MetaLogicalMonitorConfig *logical_monitor_config, meta_verify_logical_monitor_config (
MetaLogicalMonitorLayoutMode layout_mode, MetaLogicalMonitorConfig *logical_monitor_config,
MetaMonitorManager *monitor_manager, MetaLogicalMonitorLayoutMode layout_mode,
GError **error) MetaMonitorManager *monitor_manager,
GError **error)
{ {
GList *l; GList *l;
int expected_mode_width = 0; int expected_mode_width = 0;
@ -1494,8 +1531,9 @@ has_adjecent_neighbour (MetaMonitorsConfig *config,
} }
gboolean gboolean
meta_logical_monitor_configs_have_monitor (GList *logical_monitor_configs, meta_logical_monitor_configs_have_monitor (
MetaMonitorSpec *monitor_spec) GList *logical_monitor_configs,
MetaMonitorSpec *monitor_spec)
{ {
GList *l; GList *l;
@ -1521,8 +1559,9 @@ static gboolean
meta_monitors_config_is_monitor_enabled (MetaMonitorsConfig *config, meta_monitors_config_is_monitor_enabled (MetaMonitorsConfig *config,
MetaMonitorSpec *monitor_spec) MetaMonitorSpec *monitor_spec)
{ {
return meta_logical_monitor_configs_have_monitor (config->logical_monitor_configs, return meta_logical_monitor_configs_have_monitor (
monitor_spec); config->logical_monitor_configs,
monitor_spec);
} }
gboolean gboolean

View File

@ -24,7 +24,8 @@
*/ */
/* /*
* Portions of this file are derived from gnome-desktop/libgnome-desktop/gnome-rr-config.c * Portions of this file are derived from
*gnome-desktop/libgnome-desktop/gnome-rr-config.c
* *
* Copyright 2007, 2008, Red Hat, Inc. * Copyright 2007, 2008, Red Hat, Inc.
* Copyright 2010 Giovanni Campagna * Copyright 2010 Giovanni Campagna
@ -44,10 +45,11 @@
#include "backends/meta-monitor-manager-private.h" #include "backends/meta-monitor-manager-private.h"
#include "meta/boxes.h" #include "meta/boxes.h"
#define META_MONITORS_CONFIG_MIGRATION_ERROR (meta_monitors_config_migration_error_quark ()) #define META_MONITORS_CONFIG_MIGRATION_ERROR ( \
meta_monitors_config_migration_error_quark ())
static GQuark meta_monitors_config_migration_error_quark (void); static GQuark meta_monitors_config_migration_error_quark (void);
G_DEFINE_QUARK (meta-monitors-config-migration-error-quark, G_DEFINE_QUARK (meta - monitors - config - migration - error - quark,
meta_monitors_config_migration_error) meta_monitors_config_migration_error)
enum _MetaConfigMigrationError enum _MetaConfigMigrationError
@ -198,125 +200,125 @@ handle_start_element (GMarkupParseContext *context,
switch (parser->state) switch (parser->state)
{ {
case STATE_INITIAL: case STATE_INITIAL:
{ {
char *version; char *version;
if (strcmp (element_name, "monitors") != 0) if (strcmp (element_name, "monitors") != 0)
{ {
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT,
"Invalid document element %s", element_name); "Invalid document element %s", element_name);
return;
}
if (!g_markup_collect_attributes (element_name,
attribute_names,
attribute_values,
error,
G_MARKUP_COLLECT_STRING,
"version", &version,
G_MARKUP_COLLECT_INVALID))
return; return;
}
if (strcmp (version, "1") != 0) if (!g_markup_collect_attributes (element_name,
{ attribute_names,
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, attribute_values,
"Invalid or unsupported version %s", version); error,
return; G_MARKUP_COLLECT_STRING,
} "version", &version,
G_MARKUP_COLLECT_INVALID))
parser->state = STATE_MONITORS;
return; return;
}
if (strcmp (version, "1") != 0)
{
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
"Invalid or unsupported version %s", version);
return;
}
parser->state = STATE_MONITORS;
return;
}
case STATE_MONITORS: case STATE_MONITORS:
{ {
if (strcmp (element_name, "configuration") != 0) if (strcmp (element_name, "configuration") != 0)
{ {
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT,
"Invalid toplevel element %s", element_name); "Invalid toplevel element %s", element_name);
return; return;
} }
parser->key_array = g_array_new (FALSE, FALSE, parser->key_array = g_array_new (FALSE, FALSE,
sizeof (MetaOutputKey)); sizeof (MetaOutputKey));
parser->output_array = g_array_new (FALSE, FALSE, parser->output_array = g_array_new (FALSE, FALSE,
sizeof (MetaOutputConfig)); sizeof (MetaOutputConfig));
parser->state = STATE_CONFIGURATION; parser->state = STATE_CONFIGURATION;
return; return;
} }
case STATE_CONFIGURATION: case STATE_CONFIGURATION:
{ {
if (strcmp (element_name, "clone") == 0 && if (strcmp (element_name, "clone") == 0 &&
parser->unknown_count == 0) parser->unknown_count == 0)
{ {
parser->state = STATE_CLONE; parser->state = STATE_CLONE;
} }
else if (strcmp (element_name, "output") == 0 && else if (strcmp (element_name, "output") == 0 &&
parser->unknown_count == 0) parser->unknown_count == 0)
{ {
char *name; char *name;
if (!g_markup_collect_attributes (element_name, if (!g_markup_collect_attributes (element_name,
attribute_names, attribute_names,
attribute_values, attribute_values,
error, error,
G_MARKUP_COLLECT_STRING, G_MARKUP_COLLECT_STRING,
"name", &name, "name", &name,
G_MARKUP_COLLECT_INVALID)) G_MARKUP_COLLECT_INVALID))
return; return;
memset (&parser->key, 0, sizeof (MetaOutputKey)); memset (&parser->key, 0, sizeof (MetaOutputKey));
memset (&parser->output, 0, sizeof (MetaOutputConfig)); memset (&parser->output, 0, sizeof (MetaOutputConfig));
parser->key.connector = g_strdup (name); parser->key.connector = g_strdup (name);
parser->state = STATE_OUTPUT; parser->state = STATE_OUTPUT;
} }
else else
{ {
parser->unknown_count++; parser->unknown_count++;
} }
return; return;
} }
case STATE_OUTPUT: case STATE_OUTPUT:
{ {
if ((strcmp (element_name, "vendor") == 0 || if ((strcmp (element_name, "vendor") == 0 ||
strcmp (element_name, "product") == 0 || strcmp (element_name, "product") == 0 ||
strcmp (element_name, "serial") == 0 || strcmp (element_name, "serial") == 0 ||
strcmp (element_name, "width") == 0 || strcmp (element_name, "width") == 0 ||
strcmp (element_name, "height") == 0 || strcmp (element_name, "height") == 0 ||
strcmp (element_name, "rate") == 0 || strcmp (element_name, "rate") == 0 ||
strcmp (element_name, "x") == 0 || strcmp (element_name, "x") == 0 ||
strcmp (element_name, "y") == 0 || strcmp (element_name, "y") == 0 ||
strcmp (element_name, "rotation") == 0 || strcmp (element_name, "rotation") == 0 ||
strcmp (element_name, "reflect_x") == 0 || strcmp (element_name, "reflect_x") == 0 ||
strcmp (element_name, "reflect_y") == 0 || strcmp (element_name, "reflect_y") == 0 ||
strcmp (element_name, "primary") == 0 || strcmp (element_name, "primary") == 0 ||
strcmp (element_name, "presentation") == 0 || strcmp (element_name, "presentation") == 0 ||
strcmp (element_name, "underscanning") == 0) && strcmp (element_name, "underscanning") == 0) &&
parser->unknown_count == 0) parser->unknown_count == 0)
{ {
parser->state = STATE_OUTPUT_FIELD; parser->state = STATE_OUTPUT_FIELD;
parser->output_field = g_strdup (element_name); parser->output_field = g_strdup (element_name);
} }
else else
{ {
parser->unknown_count++; parser->unknown_count++;
} }
return; return;
} }
case STATE_CLONE: case STATE_CLONE:
case STATE_OUTPUT_FIELD: case STATE_OUTPUT_FIELD:
{ {
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
"Unexpected element %s", element_name); "Unexpected element %s", element_name);
return; return;
} }
default: default:
g_assert_not_reached (); g_assert_not_reached ();
@ -334,92 +336,92 @@ handle_end_element (GMarkupParseContext *context,
switch (parser->state) switch (parser->state)
{ {
case STATE_MONITORS: case STATE_MONITORS:
{ {
parser->state = STATE_INITIAL; parser->state = STATE_INITIAL;
return; return;
} }
case STATE_CONFIGURATION: case STATE_CONFIGURATION:
{ {
if (strcmp (element_name, "configuration") == 0 && if (strcmp (element_name, "configuration") == 0 &&
parser->unknown_count == 0) parser->unknown_count == 0)
{ {
MetaLegacyMonitorsConfig *config = legacy_config_new (); MetaLegacyMonitorsConfig *config = legacy_config_new ();
g_assert (parser->key_array->len == parser->output_array->len); g_assert (parser->key_array->len == parser->output_array->len);
config->n_outputs = parser->key_array->len; config->n_outputs = parser->key_array->len;
config->keys = (void*)g_array_free (parser->key_array, FALSE); config->keys = (void *) g_array_free (parser->key_array, FALSE);
config->outputs = (void*)g_array_free (parser->output_array, FALSE); config->outputs = (void *) g_array_free (parser->output_array, FALSE);
g_hash_table_replace (parser->configs, config, config); g_hash_table_replace (parser->configs, config, config);
parser->key_array = NULL; parser->key_array = NULL;
parser->output_array = NULL; parser->output_array = NULL;
parser->state = STATE_MONITORS; parser->state = STATE_MONITORS;
} }
else else
{ {
parser->unknown_count--; parser->unknown_count--;
g_assert (parser->unknown_count >= 0); g_assert (parser->unknown_count >= 0);
} }
return; return;
} }
case STATE_OUTPUT: case STATE_OUTPUT:
{ {
if (strcmp (element_name, "output") == 0 && parser->unknown_count == 0) if (strcmp (element_name, "output") == 0 && parser->unknown_count == 0)
{ {
if (parser->key.vendor == NULL || if (parser->key.vendor == NULL ||
parser->key.product == NULL || parser->key.product == NULL ||
parser->key.serial == NULL) parser->key.serial == NULL)
{ {
/* Disconnected output, ignore */ /* Disconnected output, ignore */
free_output_key (&parser->key); free_output_key (&parser->key);
} }
else else
{ {
if (parser->output.rect.width == 0 || if (parser->output.rect.width == 0 ||
parser->output.rect.height == 0) parser->output.rect.height == 0)
parser->output.enabled = FALSE; parser->output.enabled = FALSE;
else else
parser->output.enabled = TRUE; parser->output.enabled = TRUE;
g_array_append_val (parser->key_array, parser->key); g_array_append_val (parser->key_array, parser->key);
g_array_append_val (parser->output_array, parser->output); g_array_append_val (parser->output_array, parser->output);
} }
memset (&parser->key, 0, sizeof (MetaOutputKey)); memset (&parser->key, 0, sizeof (MetaOutputKey));
memset (&parser->output, 0, sizeof (MetaOutputConfig)); memset (&parser->output, 0, sizeof (MetaOutputConfig));
parser->state = STATE_CONFIGURATION; parser->state = STATE_CONFIGURATION;
} }
else else
{ {
parser->unknown_count--; parser->unknown_count--;
g_assert (parser->unknown_count >= 0); g_assert (parser->unknown_count >= 0);
} }
return; return;
} }
case STATE_CLONE: case STATE_CLONE:
{ {
parser->state = STATE_CONFIGURATION; parser->state = STATE_CONFIGURATION;
return; return;
} }
case STATE_OUTPUT_FIELD: case STATE_OUTPUT_FIELD:
{ {
g_free (parser->output_field); g_free (parser->output_field);
parser->output_field = NULL; parser->output_field = NULL;
parser->state = STATE_OUTPUT; parser->state = STATE_OUTPUT;
return; return;
} }
case STATE_INITIAL: case STATE_INITIAL:
default: default:
@ -451,10 +453,10 @@ read_int (const char *text,
} }
static void static void
read_float (const char *text, read_float (const char *text,
gsize text_len, gsize text_len,
gfloat *field, gfloat *field,
GError **error) GError **error)
{ {
char buf[64]; char buf[64];
gfloat v; gfloat v;
@ -474,9 +476,9 @@ read_float (const char *text,
} }
static gboolean static gboolean
read_bool (const char *text, read_bool (const char *text,
gsize text_len, gsize text_len,
GError **error) GError **error)
{ {
if (strncmp (text, "no", text_len) == 0) if (strncmp (text, "no", text_len) == 0)
return FALSE; return FALSE;
@ -484,7 +486,7 @@ read_bool (const char *text,
return TRUE; return TRUE;
else else
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
"Invalid boolean value %.*s", (int)text_len, text); "Invalid boolean value %.*s", (int) text_len, text);
return FALSE; return FALSE;
} }
@ -514,101 +516,101 @@ handle_text (GMarkupParseContext *context,
switch (parser->state) switch (parser->state)
{ {
case STATE_MONITORS: case STATE_MONITORS:
{ {
if (!is_all_whitespace (text, text_len)) if (!is_all_whitespace (text, text_len))
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
"Unexpected content at this point"); "Unexpected content at this point");
return; return;
} }
case STATE_CONFIGURATION: case STATE_CONFIGURATION:
{ {
if (parser->unknown_count == 0) if (parser->unknown_count == 0)
{ {
if (!is_all_whitespace (text, text_len)) if (!is_all_whitespace (text, text_len))
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
"Unexpected content at this point"); "Unexpected content at this point");
} }
else else
{ {
/* Handling unknown element, ignore */ /* Handling unknown element, ignore */
} }
return; return;
} }
case STATE_OUTPUT: case STATE_OUTPUT:
{ {
if (parser->unknown_count == 0) if (parser->unknown_count == 0)
{ {
if (!is_all_whitespace (text, text_len)) if (!is_all_whitespace (text, text_len))
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
"Unexpected content at this point"); "Unexpected content at this point");
} }
else else
{ {
/* Handling unknown element, ignore */ /* Handling unknown element, ignore */
} }
return; return;
} }
case STATE_CLONE: case STATE_CLONE:
{ {
/* Ignore the clone flag */ /* Ignore the clone flag */
return; return;
} }
case STATE_OUTPUT_FIELD: case STATE_OUTPUT_FIELD:
{ {
if (strcmp (parser->output_field, "vendor") == 0) if (strcmp (parser->output_field, "vendor") == 0)
parser->key.vendor = g_strndup (text, text_len); parser->key.vendor = g_strndup (text, text_len);
else if (strcmp (parser->output_field, "product") == 0) else if (strcmp (parser->output_field, "product") == 0)
parser->key.product = g_strndup (text, text_len); parser->key.product = g_strndup (text, text_len);
else if (strcmp (parser->output_field, "serial") == 0) else if (strcmp (parser->output_field, "serial") == 0)
parser->key.serial = g_strndup (text, text_len); parser->key.serial = g_strndup (text, text_len);
else if (strcmp (parser->output_field, "width") == 0) else if (strcmp (parser->output_field, "width") == 0)
read_int (text, text_len, &parser->output.rect.width, error); read_int (text, text_len, &parser->output.rect.width, error);
else if (strcmp (parser->output_field, "height") == 0) else if (strcmp (parser->output_field, "height") == 0)
read_int (text, text_len, &parser->output.rect.height, error); read_int (text, text_len, &parser->output.rect.height, error);
else if (strcmp (parser->output_field, "rate") == 0) else if (strcmp (parser->output_field, "rate") == 0)
read_float (text, text_len, &parser->output.refresh_rate, error); read_float (text, text_len, &parser->output.refresh_rate, error);
else if (strcmp (parser->output_field, "x") == 0) else if (strcmp (parser->output_field, "x") == 0)
read_int (text, text_len, &parser->output.rect.x, error); read_int (text, text_len, &parser->output.rect.x, error);
else if (strcmp (parser->output_field, "y") == 0) else if (strcmp (parser->output_field, "y") == 0)
read_int (text, text_len, &parser->output.rect.y, error); read_int (text, text_len, &parser->output.rect.y, error);
else if (strcmp (parser->output_field, "rotation") == 0) else if (strcmp (parser->output_field, "rotation") == 0)
{ {
if (strncmp (text, "normal", text_len) == 0) if (strncmp (text, "normal", text_len) == 0)
parser->output.transform = META_MONITOR_TRANSFORM_NORMAL; parser->output.transform = META_MONITOR_TRANSFORM_NORMAL;
else if (strncmp (text, "left", text_len) == 0) else if (strncmp (text, "left", text_len) == 0)
parser->output.transform = META_MONITOR_TRANSFORM_90; parser->output.transform = META_MONITOR_TRANSFORM_90;
else if (strncmp (text, "upside_down", text_len) == 0) else if (strncmp (text, "upside_down", text_len) == 0)
parser->output.transform = META_MONITOR_TRANSFORM_180; parser->output.transform = META_MONITOR_TRANSFORM_180;
else if (strncmp (text, "right", text_len) == 0) else if (strncmp (text, "right", text_len) == 0)
parser->output.transform = META_MONITOR_TRANSFORM_270; parser->output.transform = META_MONITOR_TRANSFORM_270;
else else
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
"Invalid rotation type %.*s", (int)text_len, text); "Invalid rotation type %.*s", (int) text_len, text);
} }
else if (strcmp (parser->output_field, "reflect_x") == 0) else if (strcmp (parser->output_field, "reflect_x") == 0)
parser->output.transform += read_bool (text, text_len, error) ? parser->output.transform += read_bool (text, text_len, error) ?
META_MONITOR_TRANSFORM_FLIPPED : 0; META_MONITOR_TRANSFORM_FLIPPED : 0;
else if (strcmp (parser->output_field, "reflect_y") == 0) else if (strcmp (parser->output_field, "reflect_y") == 0)
{ {
if (read_bool (text, text_len, error)) if (read_bool (text, text_len, error))
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
"Y reflection is not supported"); "Y reflection is not supported");
} }
else if (strcmp (parser->output_field, "primary") == 0) else if (strcmp (parser->output_field, "primary") == 0)
parser->output.is_primary = read_bool (text, text_len, error); parser->output.is_primary = read_bool (text, text_len, error);
else if (strcmp (parser->output_field, "presentation") == 0) else if (strcmp (parser->output_field, "presentation") == 0)
parser->output.is_presentation = read_bool (text, text_len, error); parser->output.is_presentation = read_bool (text, text_len, error);
else if (strcmp (parser->output_field, "underscanning") == 0) else if (strcmp (parser->output_field, "underscanning") == 0)
parser->output.is_underscanning = read_bool (text, text_len, error); parser->output.is_underscanning = read_bool (text, text_len, error);
else else
g_assert_not_reached (); g_assert_not_reached ();
return; return;
} }
case STATE_INITIAL: case STATE_INITIAL:
default: default:
@ -616,7 +618,8 @@ handle_text (GMarkupParseContext *context,
} }
} }
static const GMarkupParser config_parser = { static const GMarkupParser config_parser =
{
.start_element = handle_start_element, .start_element = handle_start_element,
.end_element = handle_end_element, .end_element = handle_end_element,
.text = handle_text, .text = handle_text,

File diff suppressed because it is too large Load Diff

View File

@ -62,7 +62,8 @@ typedef struct _MetaOutputDummy
float scale; float scale;
} MetaOutputDummy; } MetaOutputDummy;
G_DEFINE_TYPE (MetaMonitorManagerDummy, meta_monitor_manager_dummy, META_TYPE_MONITOR_MANAGER); G_DEFINE_TYPE (MetaMonitorManagerDummy, meta_monitor_manager_dummy,
META_TYPE_MONITOR_MANAGER);
struct _MetaGpuDummy struct _MetaGpuDummy
{ {
@ -106,7 +107,8 @@ append_monitor (MetaMonitorManager *manager,
{ {
MetaMonitorManagerDummy *manager_dummy = META_MONITOR_MANAGER_DUMMY (manager); MetaMonitorManagerDummy *manager_dummy = META_MONITOR_MANAGER_DUMMY (manager);
MetaGpu *gpu = manager_dummy->gpu; MetaGpu *gpu = manager_dummy->gpu;
CrtcModeSpec mode_specs[] = { CrtcModeSpec mode_specs[] =
{
{ {
.width = 800, .width = 800,
.height = 600, .height = 600,
@ -195,7 +197,8 @@ append_tiled_monitor (MetaMonitorManager *manager,
{ {
MetaMonitorManagerDummy *manager_dummy = META_MONITOR_MANAGER_DUMMY (manager); MetaMonitorManagerDummy *manager_dummy = META_MONITOR_MANAGER_DUMMY (manager);
MetaGpu *gpu = manager_dummy->gpu; MetaGpu *gpu = manager_dummy->gpu;
CrtcModeSpec mode_specs[] = { CrtcModeSpec mode_specs[] =
{
{ {
.width = 800, .width = 800,
.height = 600, .height = 600,
@ -483,7 +486,7 @@ apply_crtc_assignments (MetaMonitorManager *manager,
for (j = 0; j < crtc_info->outputs->len; j++) for (j = 0; j < crtc_info->outputs->len; j++)
{ {
output = ((MetaOutput**)crtc_info->outputs->pdata)[j]; output = ((MetaOutput **) crtc_info->outputs->pdata)[j];
output->is_dirty = TRUE; output->is_dirty = TRUE;
meta_output_assign_crtc (output, crtc); meta_output_assign_crtc (output, crtc);
@ -566,10 +569,11 @@ update_screen_size (MetaMonitorManager *manager,
} }
static gboolean static gboolean
meta_monitor_manager_dummy_apply_monitors_config (MetaMonitorManager *manager, meta_monitor_manager_dummy_apply_monitors_config (
MetaMonitorsConfig *config, MetaMonitorManager *manager,
MetaMonitorsConfigMethod method, MetaMonitorsConfig *config,
GError **error) MetaMonitorsConfigMethod method,
GError **error)
{ {
GPtrArray *crtc_infos; GPtrArray *crtc_infos;
GPtrArray *output_infos; GPtrArray *output_infos;
@ -621,9 +625,10 @@ meta_monitor_manager_dummy_is_transform_handled (MetaMonitorManager *manager,
} }
static float static float
meta_monitor_manager_dummy_calculate_monitor_mode_scale (MetaMonitorManager *manager, meta_monitor_manager_dummy_calculate_monitor_mode_scale (
MetaMonitor *monitor, MetaMonitorManager *manager,
MetaMonitorMode *monitor_mode) MetaMonitor *monitor,
MetaMonitorMode *monitor_mode)
{ {
MetaOutput *output; MetaOutput *output;
MetaOutputDummy *output_dummy; MetaOutputDummy *output_dummy;
@ -635,11 +640,12 @@ meta_monitor_manager_dummy_calculate_monitor_mode_scale (MetaMonitorManager *man
} }
static float * static float *
meta_monitor_manager_dummy_calculate_supported_scales (MetaMonitorManager *manager, meta_monitor_manager_dummy_calculate_supported_scales (
MetaLogicalMonitorLayoutMode layout_mode, MetaMonitorManager *manager,
MetaMonitor *monitor, MetaLogicalMonitorLayoutMode layout_mode,
MetaMonitorMode *monitor_mode, MetaMonitor *monitor,
int *n_supported_scales) MetaMonitorMode *monitor_mode,
int *n_supported_scales)
{ {
MetaMonitorScalesConstraint constraints = MetaMonitorScalesConstraint constraints =
META_MONITOR_SCALES_CONSTRAINT_NONE; META_MONITOR_SCALES_CONSTRAINT_NONE;
@ -718,14 +724,21 @@ meta_monitor_manager_dummy_class_init (MetaMonitorManagerDummyClass *klass)
{ {
MetaMonitorManagerClass *manager_class = META_MONITOR_MANAGER_CLASS (klass); MetaMonitorManagerClass *manager_class = META_MONITOR_MANAGER_CLASS (klass);
manager_class->ensure_initial_config = meta_monitor_manager_dummy_ensure_initial_config; manager_class->ensure_initial_config =
manager_class->apply_monitors_config = meta_monitor_manager_dummy_apply_monitors_config; meta_monitor_manager_dummy_ensure_initial_config;
manager_class->is_transform_handled = meta_monitor_manager_dummy_is_transform_handled; manager_class->apply_monitors_config =
manager_class->calculate_monitor_mode_scale = meta_monitor_manager_dummy_calculate_monitor_mode_scale; meta_monitor_manager_dummy_apply_monitors_config;
manager_class->calculate_supported_scales = meta_monitor_manager_dummy_calculate_supported_scales; manager_class->is_transform_handled =
meta_monitor_manager_dummy_is_transform_handled;
manager_class->calculate_monitor_mode_scale =
meta_monitor_manager_dummy_calculate_monitor_mode_scale;
manager_class->calculate_supported_scales =
meta_monitor_manager_dummy_calculate_supported_scales;
manager_class->get_capabilities = meta_monitor_manager_dummy_get_capabilities; manager_class->get_capabilities = meta_monitor_manager_dummy_get_capabilities;
manager_class->get_max_screen_size = meta_monitor_manager_dummy_get_max_screen_size; manager_class->get_max_screen_size =
manager_class->get_default_layout_mode = meta_monitor_manager_dummy_get_default_layout_mode; meta_monitor_manager_dummy_get_max_screen_size;
manager_class->get_default_layout_mode =
meta_monitor_manager_dummy_get_default_layout_mode;
} }
static void static void
@ -748,8 +761,8 @@ meta_monitor_manager_dummy_init (MetaMonitorManagerDummy *manager_dummy)
} }
static gboolean static gboolean
meta_gpu_dummy_read_current (MetaGpu *gpu, meta_gpu_dummy_read_current (MetaGpu *gpu,
GError **error) GError **error)
{ {
MetaMonitorManager *manager = meta_gpu_get_monitor_manager (gpu); MetaMonitorManager *manager = meta_gpu_get_monitor_manager (gpu);

View File

@ -58,30 +58,36 @@ enum
static GParamSpec *obj_props[PROP_LAST]; static GParamSpec *obj_props[PROP_LAST];
enum { enum
{
MONITORS_CHANGED_INTERNAL, MONITORS_CHANGED_INTERNAL,
CONFIRM_DISPLAY_CHANGE, CONFIRM_DISPLAY_CHANGE,
SIGNALS_LAST SIGNALS_LAST
}; };
/* Array index matches MetaMonitorTransform */ /* Array index matches MetaMonitorTransform */
static gfloat transform_matrices[][6] = { static gfloat transform_matrices[][6] =
{ 1, 0, 0, 0, 1, 0 }, /* normal */ {
{ 0, -1, 1, 1, 0, 0 }, /* 90° */ { 1, 0, 0, 0, 1, 0 }, /* normal */
{ -1, 0, 1, 0, -1, 1 }, /* 180° */ { 0, -1, 1, 1, 0, 0 }, /* 90° */
{ 0, 1, 0, -1, 0, 1 }, /* 270° */ { -1, 0, 1, 0, -1, 1 }, /* 180° */
{ -1, 0, 1, 0, 1, 0 }, /* normal flipped */ { 0, 1, 0, -1, 0, 1 }, /* 270° */
{ 0, 1, 0, 1, 0, 0 }, /* 90° flipped */ { -1, 0, 1, 0, 1, 0 }, /* normal flipped */
{ 1, 0, 0, 0, -1, 1 }, /* 180° flipped */ { 0, 1, 0, 1, 0, 0 }, /* 90° flipped */
{ 0, -1, 1, -1, 0, 1 }, /* 270° flipped */ { 1, 0, 0, 0, -1, 1 }, /* 180° flipped */
{ 0, -1, 1, -1, 0, 1 }, /* 270° flipped */
}; };
static int signals[SIGNALS_LAST]; static int signals[SIGNALS_LAST];
static void meta_monitor_manager_display_config_init (MetaDBusDisplayConfigIface *iface); static void meta_monitor_manager_display_config_init (
MetaDBusDisplayConfigIface *iface);
G_DEFINE_ABSTRACT_TYPE_WITH_CODE (MetaMonitorManager, meta_monitor_manager, META_DBUS_TYPE_DISPLAY_CONFIG_SKELETON, G_DEFINE_ABSTRACT_TYPE_WITH_CODE (MetaMonitorManager, meta_monitor_manager,
G_IMPLEMENT_INTERFACE (META_DBUS_TYPE_DISPLAY_CONFIG, meta_monitor_manager_display_config_init)); META_DBUS_TYPE_DISPLAY_CONFIG_SKELETON,
G_IMPLEMENT_INTERFACE (
META_DBUS_TYPE_DISPLAY_CONFIG,
meta_monitor_manager_display_config_init));
static void initialize_dbus_interface (MetaMonitorManager *manager); static void initialize_dbus_interface (MetaMonitorManager *manager);
@ -234,8 +240,9 @@ derive_scale_from_config (MetaMonitorManager *manager,
} }
static void static void
meta_monitor_manager_rebuild_logical_monitors_derived (MetaMonitorManager *manager, meta_monitor_manager_rebuild_logical_monitors_derived (
MetaMonitorsConfig *config) MetaMonitorManager *manager,
MetaMonitorsConfig *config)
{ {
GList *logical_monitors = NULL; GList *logical_monitors = NULL;
GList *l; GList *l;
@ -320,7 +327,8 @@ power_save_mode_changed (MetaMonitorManager *manager,
gpointer user_data) gpointer user_data)
{ {
MetaMonitorManagerClass *klass; MetaMonitorManagerClass *klass;
int mode = meta_dbus_display_config_get_power_save_mode (META_DBUS_DISPLAY_CONFIG (manager)); int mode = meta_dbus_display_config_get_power_save_mode (META_DBUS_DISPLAY_CONFIG (
manager));
if (mode == META_POWER_SAVE_UNSUPPORTED) if (mode == META_POWER_SAVE_UNSUPPORTED)
return; return;
@ -328,7 +336,9 @@ power_save_mode_changed (MetaMonitorManager *manager,
/* If DPMS is unsupported, force the property back. */ /* If DPMS is unsupported, force the property back. */
if (manager->power_save_mode == META_POWER_SAVE_UNSUPPORTED) if (manager->power_save_mode == META_POWER_SAVE_UNSUPPORTED)
{ {
meta_dbus_display_config_set_power_save_mode (META_DBUS_DISPLAY_CONFIG (manager), META_POWER_SAVE_UNSUPPORTED); meta_dbus_display_config_set_power_save_mode (META_DBUS_DISPLAY_CONFIG (
manager),
META_POWER_SAVE_UNSUPPORTED);
return; return;
} }
@ -374,11 +384,12 @@ meta_monitor_manager_calculate_monitor_mode_scale (MetaMonitorManager *manager,
} }
float * float *
meta_monitor_manager_calculate_supported_scales (MetaMonitorManager *manager, meta_monitor_manager_calculate_supported_scales (
MetaLogicalMonitorLayoutMode layout_mode, MetaMonitorManager *manager,
MetaMonitor *monitor, MetaLogicalMonitorLayoutMode layout_mode,
MetaMonitorMode *monitor_mode, MetaMonitor *monitor,
int *n_supported_scales) MetaMonitorMode *monitor_mode,
int *n_supported_scales)
{ {
MetaMonitorManagerClass *manager_class = MetaMonitorManagerClass *manager_class =
META_MONITOR_MANAGER_GET_CLASS (manager); META_MONITOR_MANAGER_GET_CLASS (manager);
@ -516,7 +527,8 @@ meta_monitor_manager_ensure_configured (MetaMonitorManager *manager)
} }
} }
config = meta_monitor_config_manager_create_suggested (manager->config_manager); config =
meta_monitor_config_manager_create_suggested (manager->config_manager);
if (config) if (config)
{ {
if (!meta_monitor_manager_apply_monitors_config (manager, if (!meta_monitor_manager_apply_monitors_config (manager,
@ -561,8 +573,9 @@ meta_monitor_manager_ensure_configured (MetaMonitorManager *manager)
} }
config = config =
meta_monitor_config_manager_create_for_switch_config (manager->config_manager, meta_monitor_config_manager_create_for_switch_config (
META_MONITOR_SWITCH_CONFIG_ALL_LINEAR); manager->config_manager,
META_MONITOR_SWITCH_CONFIG_ALL_LINEAR);
if (config) if (config)
{ {
if (!meta_monitor_manager_apply_monitors_config (manager, if (!meta_monitor_manager_apply_monitors_config (manager,
@ -581,7 +594,8 @@ meta_monitor_manager_ensure_configured (MetaMonitorManager *manager)
} }
} }
config = meta_monitor_config_manager_create_fallback (manager->config_manager); config =
meta_monitor_config_manager_create_fallback (manager->config_manager);
if (config) if (config)
{ {
if (!meta_monitor_manager_apply_monitors_config (manager, if (!meta_monitor_manager_apply_monitors_config (manager,
@ -836,11 +850,11 @@ meta_monitor_manager_class_init (MetaMonitorManagerClass *klass)
signals[CONFIRM_DISPLAY_CHANGE] = signals[CONFIRM_DISPLAY_CHANGE] =
g_signal_new ("confirm-display-change", g_signal_new ("confirm-display-change",
G_TYPE_FROM_CLASS (object_class), G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, 0,
NULL, NULL, NULL, NULL, NULL, NULL,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
obj_props[PROP_BACKEND] = obj_props[PROP_BACKEND] =
g_param_spec_object ("backend", g_param_spec_object ("backend",
@ -853,10 +867,11 @@ meta_monitor_manager_class_init (MetaMonitorManagerClass *klass)
g_object_class_install_properties (object_class, PROP_LAST, obj_props); g_object_class_install_properties (object_class, PROP_LAST, obj_props);
} }
static const double known_diagonals[] = { static const double known_diagonals[] =
12.1, {
13.3, 12.1,
15.6 13.3,
15.6
}; };
static char * static char *
@ -868,7 +883,7 @@ diagonal_to_str (double d)
{ {
double delta; double delta;
delta = fabs(known_diagonals[i] - d); delta = fabs (known_diagonals[i] - d);
if (delta < 0.1) if (delta < 0.1)
return g_strdup_printf ("%0.1lf\"", known_diagonals[i]); return g_strdup_printf ("%0.1lf\"", known_diagonals[i]);
} }
@ -884,7 +899,7 @@ make_display_name (MetaMonitorManager *manager,
g_autofree char *vendor_name = NULL; g_autofree char *vendor_name = NULL;
if (meta_output_is_laptop (output)) if (meta_output_is_laptop (output))
return g_strdup (_("Built-in display")); return g_strdup (_("Built-in display"));
if (output->width_mm > 0 && output->height_mm > 0) if (output->width_mm > 0 && output->height_mm > 0)
{ {
@ -952,8 +967,8 @@ get_connector_type_name (MetaConnectorType connector_type)
} }
static GList * static GList *
combine_gpu_lists (MetaMonitorManager *manager, combine_gpu_lists (MetaMonitorManager *manager,
GList * (*list_getter) (MetaGpu *gpu)) GList * (*list_getter)(MetaGpu *gpu))
{ {
GList *list = NULL; GList *list = NULL;
GList *l; GList *l;
@ -973,7 +988,8 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
GDBusMethodInvocation *invocation) GDBusMethodInvocation *invocation)
{ {
MetaMonitorManager *manager = META_MONITOR_MANAGER (skeleton); MetaMonitorManager *manager = META_MONITOR_MANAGER (skeleton);
MetaMonitorManagerClass *manager_class = META_MONITOR_MANAGER_GET_CLASS (skeleton); MetaMonitorManagerClass *manager_class = META_MONITOR_MANAGER_GET_CLASS (
skeleton);
GList *combined_modes; GList *combined_modes;
GList *combined_outputs; GList *combined_outputs;
GList *combined_crtcs; GList *combined_crtcs;
@ -988,7 +1004,8 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
combined_crtcs = combine_gpu_lists (manager, meta_gpu_get_crtcs); combined_crtcs = combine_gpu_lists (manager, meta_gpu_get_crtcs);
g_variant_builder_init (&crtc_builder, G_VARIANT_TYPE ("a(uxiiiiiuaua{sv})")); g_variant_builder_init (&crtc_builder, G_VARIANT_TYPE ("a(uxiiiiiuaua{sv})"));
g_variant_builder_init (&output_builder, G_VARIANT_TYPE ("a(uxiausauaua{sv})")); g_variant_builder_init (&output_builder,
G_VARIANT_TYPE ("a(uxiausauaua{sv})"));
g_variant_builder_init (&mode_builder, G_VARIANT_TYPE ("a(uxuudu)")); g_variant_builder_init (&mode_builder, G_VARIANT_TYPE ("a(uxuudu)"));
for (l = combined_crtcs, i = 0; l; l = l->next, i++) for (l = combined_crtcs, i = 0; l; l = l->next, i++)
@ -1008,13 +1025,13 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
current_mode_index = -1; current_mode_index = -1;
g_variant_builder_add (&crtc_builder, "(uxiiiiiuaua{sv})", g_variant_builder_add (&crtc_builder, "(uxiiiiiuaua{sv})",
i, /* ID */ i, /* ID */
(gint64)crtc->crtc_id, (gint64) crtc->crtc_id,
(int)crtc->rect.x, (int) crtc->rect.x,
(int)crtc->rect.y, (int) crtc->rect.y,
(int)crtc->rect.width, (int) crtc->rect.width,
(int)crtc->rect.height, (int) crtc->rect.height,
current_mode_index, current_mode_index,
(guint32)crtc->transform, (guint32) crtc->transform,
&transforms, &transforms,
NULL /* properties */); NULL /* properties */);
} }
@ -1069,22 +1086,28 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
g_variant_builder_add (&properties, "{sv}", "height-mm", g_variant_builder_add (&properties, "{sv}", "height-mm",
g_variant_new_int32 (output->height_mm)); g_variant_new_int32 (output->height_mm));
g_variant_builder_add (&properties, "{sv}", "display-name", g_variant_builder_add (&properties, "{sv}", "display-name",
g_variant_new_take_string (make_display_name (manager, output))); g_variant_new_take_string (make_display_name (
manager, output)));
g_variant_builder_add (&properties, "{sv}", "backlight", g_variant_builder_add (&properties, "{sv}", "backlight",
g_variant_new_int32 (output->backlight)); g_variant_new_int32 (output->backlight));
g_variant_builder_add (&properties, "{sv}", "min-backlight-step", g_variant_builder_add (&properties, "{sv}", "min-backlight-step",
g_variant_new_int32 ((output->backlight_max - output->backlight_min) ? g_variant_new_int32 ((output->backlight_max -
100 / (output->backlight_max - output->backlight_min) : -1)); output->backlight_min) ?
100 /
(output->backlight_max -
output->backlight_min) : -1));
g_variant_builder_add (&properties, "{sv}", "primary", g_variant_builder_add (&properties, "{sv}", "primary",
g_variant_new_boolean (output->is_primary)); g_variant_new_boolean (output->is_primary));
g_variant_builder_add (&properties, "{sv}", "presentation", g_variant_builder_add (&properties, "{sv}", "presentation",
g_variant_new_boolean (output->is_presentation)); g_variant_new_boolean (output->is_presentation));
g_variant_builder_add (&properties, "{sv}", "connector-type", g_variant_builder_add (&properties, "{sv}", "connector-type",
g_variant_new_string (get_connector_type_name (output->connector_type))); g_variant_new_string (get_connector_type_name (
output->connector_type)));
g_variant_builder_add (&properties, "{sv}", "underscanning", g_variant_builder_add (&properties, "{sv}", "underscanning",
g_variant_new_boolean (output->is_underscanning)); g_variant_new_boolean (output->is_underscanning));
g_variant_builder_add (&properties, "{sv}", "supports-underscanning", g_variant_builder_add (&properties, "{sv}", "supports-underscanning",
g_variant_new_boolean (output->supports_underscanning)); g_variant_new_boolean (output->
supports_underscanning));
edid_file = manager_class->get_edid_file (manager, output); edid_file = manager_class->get_edid_file (manager, output);
if (edid_file) if (edid_file)
@ -1099,7 +1122,8 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
if (edid) if (edid)
{ {
g_variant_builder_add (&properties, "{sv}", "edid", g_variant_builder_add (&properties, "{sv}", "edid",
g_variant_new_from_bytes (G_VARIANT_TYPE ("ay"), g_variant_new_from_bytes (G_VARIANT_TYPE (
"ay"),
edid, TRUE)); edid, TRUE));
g_bytes_unref (edid); g_bytes_unref (edid);
} }
@ -1123,7 +1147,7 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
crtc_index = crtc ? g_list_index (combined_crtcs, crtc) : -1; crtc_index = crtc ? g_list_index (combined_crtcs, crtc) : -1;
g_variant_builder_add (&output_builder, "(uxiausauaua{sv})", g_variant_builder_add (&output_builder, "(uxiausauaua{sv})",
i, /* ID */ i, /* ID */
(gint64)output->winsys_id, (gint64) output->winsys_id,
crtc_index, crtc_index,
&crtcs, &crtcs,
output->name, output->name,
@ -1138,11 +1162,11 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
g_variant_builder_add (&mode_builder, "(uxuudu)", g_variant_builder_add (&mode_builder, "(uxuudu)",
i, /* ID */ i, /* ID */
(gint64)mode->mode_id, (gint64) mode->mode_id,
(guint32)mode->width, (guint32) mode->width,
(guint32)mode->height, (guint32) mode->height,
(double)mode->refresh_rate, (double) mode->refresh_rate,
(guint32)mode->flags); (guint32) mode->flags);
} }
if (!meta_monitor_manager_get_max_screen_size (manager, if (!meta_monitor_manager_get_max_screen_size (manager,
@ -1157,9 +1181,12 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
meta_dbus_display_config_complete_get_resources (skeleton, meta_dbus_display_config_complete_get_resources (skeleton,
invocation, invocation,
manager->serial, manager->serial,
g_variant_builder_end (&crtc_builder), g_variant_builder_end (&
g_variant_builder_end (&output_builder), crtc_builder),
g_variant_builder_end (&mode_builder), g_variant_builder_end (&
output_builder),
g_variant_builder_end (&
mode_builder),
max_screen_width, max_screen_width,
max_screen_height); max_screen_height);
@ -1231,9 +1258,10 @@ cancel_persistent_confirmation (MetaMonitorManager *manager)
static void static void
request_persistent_confirmation (MetaMonitorManager *manager) request_persistent_confirmation (MetaMonitorManager *manager)
{ {
manager->persistent_timeout_id = g_timeout_add_seconds (meta_monitor_manager_get_display_configuration_timeout (), manager->persistent_timeout_id = g_timeout_add_seconds (
save_config_timeout, meta_monitor_manager_get_display_configuration_timeout (),
manager); save_config_timeout,
manager);
g_source_set_name_by_id (manager->persistent_timeout_id, g_source_set_name_by_id (manager->persistent_timeout_id,
"[mutter] save_config_timeout"); "[mutter] save_config_timeout");
@ -1633,7 +1661,6 @@ create_monitor_config_from_variant (MetaMonitorManager *manager,
GVariant *monitor_config_variant, GVariant *monitor_config_variant,
GError **error) GError **error)
{ {
MetaMonitorConfig *monitor_config = NULL; MetaMonitorConfig *monitor_config = NULL;
g_autofree char *connector = NULL; g_autofree char *connector = NULL;
g_autofree char *mode_id = NULL; g_autofree char *mode_id = NULL;
@ -1665,7 +1692,8 @@ create_monitor_config_from_variant (MetaMonitorManager *manager,
return NULL; return NULL;
} }
g_variant_lookup (properties_variant, "underscanning", "b", &enable_underscanning); g_variant_lookup (properties_variant, "underscanning", "b",
&enable_underscanning);
monitor_spec = meta_monitor_spec_clone (meta_monitor_get_spec (monitor)); monitor_spec = meta_monitor_spec_clone (meta_monitor_get_spec (monitor));
@ -1781,10 +1809,11 @@ derive_logical_monitor_size (MetaMonitorConfig *monitor_config,
} }
static MetaLogicalMonitorConfig * static MetaLogicalMonitorConfig *
create_logical_monitor_config_from_variant (MetaMonitorManager *manager, create_logical_monitor_config_from_variant (
GVariant *logical_monitor_config_variant, MetaMonitorManager *manager,
MetaLogicalMonitorLayoutMode layout_mode, GVariant *logical_monitor_config_variant,
GError **error) MetaLogicalMonitorLayoutMode layout_mode,
GError **error)
{ {
MetaLogicalMonitorConfig *logical_monitor_config; MetaLogicalMonitorConfig *logical_monitor_config;
int x, y, width, height; int x, y, width, height;
@ -1854,7 +1883,8 @@ create_logical_monitor_config_from_variant (MetaMonitorManager *manager
logical_monitor_config = g_new0 (MetaLogicalMonitorConfig, 1); logical_monitor_config = g_new0 (MetaLogicalMonitorConfig, 1);
*logical_monitor_config = (MetaLogicalMonitorConfig) { *logical_monitor_config = (MetaLogicalMonitorConfig) {
.layout = { .layout =
{
.x = x, .x = x,
.y = y, .y = y,
.width = width, .width = width,
@ -1896,12 +1926,13 @@ is_valid_layout_mode (MetaLogicalMonitorLayoutMode layout_mode)
} }
static gboolean static gboolean
meta_monitor_manager_handle_apply_monitors_config (MetaDBusDisplayConfig *skeleton, meta_monitor_manager_handle_apply_monitors_config (
GDBusMethodInvocation *invocation, MetaDBusDisplayConfig *skeleton,
guint serial, GDBusMethodInvocation *invocation,
guint method, guint serial,
GVariant *logical_monitor_configs_variant, guint method,
GVariant *properties_variant) GVariant *logical_monitor_configs_variant,
GVariant *properties_variant)
{ {
MetaMonitorManager *manager = META_MONITOR_MANAGER (skeleton); MetaMonitorManager *manager = META_MONITOR_MANAGER (skeleton);
MetaMonitorManagerCapability capabilities; MetaMonitorManagerCapability capabilities;
@ -2030,7 +2061,8 @@ meta_monitor_manager_handle_apply_monitors_config (MetaDBusDisplayConfig *skelet
if (method == META_MONITORS_CONFIG_METHOD_PERSISTENT) if (method == META_MONITORS_CONFIG_METHOD_PERSISTENT)
request_persistent_confirmation (manager); request_persistent_confirmation (manager);
meta_dbus_display_config_complete_apply_monitors_config (skeleton, invocation); meta_dbus_display_config_complete_apply_monitors_config (skeleton,
invocation);
return TRUE; return TRUE;
} }
@ -2113,9 +2145,11 @@ meta_monitor_manager_handle_change_backlight (MetaDBusDisplayConfig *skeleton,
return TRUE; return TRUE;
} }
META_MONITOR_MANAGER_GET_CLASS (manager)->change_backlight (manager, output, value); META_MONITOR_MANAGER_GET_CLASS (manager)->change_backlight (manager, output,
value);
meta_dbus_display_config_complete_change_backlight (skeleton, invocation, output->backlight); meta_dbus_display_config_complete_change_backlight (skeleton, invocation,
output->backlight);
return TRUE; return TRUE;
} }
@ -2230,9 +2264,9 @@ meta_monitor_manager_handle_set_crtc_gamma (MetaDBusDisplayConfig *skeleton,
blue_bytes = g_variant_get_data_as_bytes (blue_v); blue_bytes = g_variant_get_data_as_bytes (blue_v);
size = g_bytes_get_size (red_bytes) / sizeof (unsigned short); size = g_bytes_get_size (red_bytes) / sizeof (unsigned short);
red = (unsigned short*) g_bytes_get_data (red_bytes, &dummy); red = (unsigned short *) g_bytes_get_data (red_bytes, &dummy);
green = (unsigned short*) g_bytes_get_data (green_bytes, &dummy); green = (unsigned short *) g_bytes_get_data (green_bytes, &dummy);
blue = (unsigned short*) g_bytes_get_data (blue_bytes, &dummy); blue = (unsigned short *) g_bytes_get_data (blue_bytes, &dummy);
klass = META_MONITOR_MANAGER_GET_CLASS (manager); klass = META_MONITOR_MANAGER_GET_CLASS (manager);
if (klass->set_crtc_gamma) if (klass->set_crtc_gamma)
@ -2253,8 +2287,10 @@ meta_monitor_manager_display_config_init (MetaDBusDisplayConfigIface *iface)
iface->handle_change_backlight = meta_monitor_manager_handle_change_backlight; iface->handle_change_backlight = meta_monitor_manager_handle_change_backlight;
iface->handle_get_crtc_gamma = meta_monitor_manager_handle_get_crtc_gamma; iface->handle_get_crtc_gamma = meta_monitor_manager_handle_get_crtc_gamma;
iface->handle_set_crtc_gamma = meta_monitor_manager_handle_set_crtc_gamma; iface->handle_set_crtc_gamma = meta_monitor_manager_handle_set_crtc_gamma;
iface->handle_get_current_state = meta_monitor_manager_handle_get_current_state; iface->handle_get_current_state =
iface->handle_apply_monitors_config = meta_monitor_manager_handle_apply_monitors_config; meta_monitor_manager_handle_get_current_state;
iface->handle_apply_monitors_config =
meta_monitor_manager_handle_apply_monitors_config;
} }
static void static void
@ -2329,10 +2365,12 @@ meta_monitor_manager_get_logical_monitors (MetaMonitorManager *manager)
} }
MetaLogicalMonitor * MetaLogicalMonitor *
meta_monitor_manager_get_logical_monitor_from_number (MetaMonitorManager *manager, meta_monitor_manager_get_logical_monitor_from_number (
int number) MetaMonitorManager *manager,
int number)
{ {
g_return_val_if_fail ((unsigned int) number < g_list_length (manager->logical_monitors), NULL); g_return_val_if_fail ((unsigned int) number <
g_list_length (manager->logical_monitors), NULL);
return g_list_nth (manager->logical_monitors, number)->data; return g_list_nth (manager->logical_monitors, number)->data;
} }
@ -2345,7 +2383,7 @@ meta_monitor_manager_get_primary_logical_monitor (MetaMonitorManager *manager)
static MetaMonitor * static MetaMonitor *
find_monitor (MetaMonitorManager *monitor_manager, find_monitor (MetaMonitorManager *monitor_manager,
gboolean (*match_func) (MetaMonitor *monitor)) gboolean (*match_func)(MetaMonitor *monitor))
{ {
GList *monitors; GList *monitors;
GList *l; GList *l;
@ -2784,7 +2822,8 @@ meta_output_parse_edid (MetaOutput *output,
output->product[0] == '\0') output->product[0] == '\0')
{ {
g_clear_pointer (&output->product, g_free); g_clear_pointer (&output->product, g_free);
output->product = g_strdup_printf ("0x%04x", (unsigned) parsed_edid->product_code); output->product = g_strdup_printf ("0x%04x",
(unsigned) parsed_edid->product_code);
} }
output->serial = g_strndup (parsed_edid->dsc_serial_number, 14); output->serial = g_strndup (parsed_edid->dsc_serial_number, 14);
@ -2792,13 +2831,14 @@ meta_output_parse_edid (MetaOutput *output,
output->serial[0] == '\0') output->serial[0] == '\0')
{ {
g_clear_pointer (&output->serial, g_free); g_clear_pointer (&output->serial, g_free);
output->serial = g_strdup_printf ("0x%08x", parsed_edid->serial_number); output->serial =
g_strdup_printf ("0x%08x", parsed_edid->serial_number);
} }
g_free (parsed_edid); g_free (parsed_edid);
} }
out: out:
if (!output->vendor) if (!output->vendor)
output->vendor = g_strdup ("unknown"); output->vendor = g_strdup ("unknown");
if (!output->product) if (!output->product)
@ -2837,7 +2877,7 @@ calculate_viewport_matrix (MetaMonitorManager *manager,
x = (float) logical_monitor->rect.x / manager->screen_width; x = (float) logical_monitor->rect.x / manager->screen_width;
y = (float) logical_monitor->rect.y / manager->screen_height; y = (float) logical_monitor->rect.y / manager->screen_height;
width = (float) logical_monitor->rect.width / manager->screen_width; width = (float) logical_monitor->rect.width / manager->screen_width;
height = (float) logical_monitor->rect.height / manager->screen_height; height = (float) logical_monitor->rect.height / manager->screen_height;
viewport[0] = width; viewport[0] = width;
@ -2852,8 +2892,8 @@ calculate_viewport_matrix (MetaMonitorManager *manager,
static inline void static inline void
multiply_matrix (float a[6], multiply_matrix (float a[6],
float b[6], float b[6],
float res[6]) float res[6])
{ {
res[0] = a[0] * b[0] + a[1] * b[3]; res[0] = a[0] * b[0] + a[1] * b[3];
res[1] = a[0] * b[1] + a[1] * b[4]; res[1] = a[0] * b[1] + a[1] * b[4];
@ -2928,7 +2968,8 @@ meta_monitor_manager_rotate_monitor (MetaMonitorManager *manager)
{ {
GError *error = NULL; GError *error = NULL;
MetaMonitorsConfig *config = MetaMonitorsConfig *config =
meta_monitor_config_manager_create_for_rotate_monitor (manager->config_manager); meta_monitor_config_manager_create_for_rotate_monitor (
manager->config_manager);
if (!config) if (!config)
return; return;
@ -2946,8 +2987,8 @@ meta_monitor_manager_rotate_monitor (MetaMonitorManager *manager)
} }
void void
meta_monitor_manager_switch_config (MetaMonitorManager *manager, meta_monitor_manager_switch_config (MetaMonitorManager *manager,
MetaMonitorSwitchConfigType config_type) MetaMonitorSwitchConfigType config_type)
{ {
GError *error = NULL; GError *error = NULL;
MetaMonitorsConfig *config; MetaMonitorsConfig *config;
@ -2955,8 +2996,9 @@ meta_monitor_manager_switch_config (MetaMonitorManager *manager,
g_return_if_fail (config_type != META_MONITOR_SWITCH_CONFIG_UNKNOWN); g_return_if_fail (config_type != META_MONITOR_SWITCH_CONFIG_UNKNOWN);
config = config =
meta_monitor_config_manager_create_for_switch_config (manager->config_manager, meta_monitor_config_manager_create_for_switch_config (
config_type); manager->config_manager,
config_type);
if (!config) if (!config)
return; return;

View File

@ -123,7 +123,8 @@ gboolean
meta_monitor_spec_equals (MetaMonitorSpec *monitor_spec, meta_monitor_spec_equals (MetaMonitorSpec *monitor_spec,
MetaMonitorSpec *other_monitor_spec) MetaMonitorSpec *other_monitor_spec)
{ {
return (g_str_equal (monitor_spec->connector, other_monitor_spec->connector) && return (g_str_equal (monitor_spec->connector,
other_monitor_spec->connector) &&
g_str_equal (monitor_spec->vendor, other_monitor_spec->vendor) && g_str_equal (monitor_spec->vendor, other_monitor_spec->vendor) &&
g_str_equal (monitor_spec->product, other_monitor_spec->product) && g_str_equal (monitor_spec->product, other_monitor_spec->product) &&
g_str_equal (monitor_spec->serial, other_monitor_spec->serial)); g_str_equal (monitor_spec->serial, other_monitor_spec->serial));
@ -353,8 +354,8 @@ meta_monitor_get_connector_type (MetaMonitor *monitor)
} }
MetaMonitorTransform MetaMonitorTransform
meta_monitor_logical_to_crtc_transform (MetaMonitor *monitor, meta_monitor_logical_to_crtc_transform (MetaMonitor *monitor,
MetaMonitorTransform transform) MetaMonitorTransform transform)
{ {
MetaOutput *output = meta_monitor_get_main_output (monitor); MetaOutput *output = meta_monitor_get_main_output (monitor);
MetaMonitorTransform new_transform; MetaMonitorTransform new_transform;
@ -368,8 +369,8 @@ meta_monitor_logical_to_crtc_transform (MetaMonitor *monitor,
} }
MetaMonitorTransform MetaMonitorTransform
meta_monitor_crtc_to_logical_transform (MetaMonitor *monitor, meta_monitor_crtc_to_logical_transform (MetaMonitor *monitor,
MetaMonitorTransform transform) MetaMonitorTransform transform)
{ {
MetaOutput *output = meta_monitor_get_main_output (monitor); MetaOutput *output = meta_monitor_get_main_output (monitor);
MetaMonitorTransform new_transform; MetaMonitorTransform new_transform;
@ -483,10 +484,10 @@ meta_monitor_create_spec (MetaMonitor *monitor,
} }
return (MetaMonitorModeSpec) { return (MetaMonitorModeSpec) {
.width = width, .width = width,
.height = height, .height = height,
.refresh_rate = crtc_mode->refresh_rate, .refresh_rate = crtc_mode->refresh_rate,
.flags = crtc_mode->flags & HANDLED_CRTC_MODE_FLAGS .flags = crtc_mode->flags & HANDLED_CRTC_MODE_FLAGS
}; };
} }
@ -638,7 +639,8 @@ meta_monitor_normal_class_init (MetaMonitorNormalClass *klass)
monitor_class->get_main_output = meta_monitor_normal_get_main_output; monitor_class->get_main_output = meta_monitor_normal_get_main_output;
monitor_class->derive_layout = meta_monitor_normal_derive_layout; monitor_class->derive_layout = meta_monitor_normal_derive_layout;
monitor_class->calculate_crtc_pos = meta_monitor_normal_calculate_crtc_pos; monitor_class->calculate_crtc_pos = meta_monitor_normal_calculate_crtc_pos;
monitor_class->get_suggested_position = meta_monitor_normal_get_suggested_position; monitor_class->get_suggested_position =
meta_monitor_normal_get_suggested_position;
} }
uint32_t uint32_t
@ -702,37 +704,45 @@ calculate_tile_coordinate (MetaMonitor *monitor,
{ {
case META_MONITOR_TRANSFORM_NORMAL: case META_MONITOR_TRANSFORM_NORMAL:
case META_MONITOR_TRANSFORM_FLIPPED: case META_MONITOR_TRANSFORM_FLIPPED:
if (other_output->tile_info.loc_v_tile == output->tile_info.loc_v_tile && if (other_output->tile_info.loc_v_tile ==
output->tile_info.loc_v_tile &&
other_output->tile_info.loc_h_tile < output->tile_info.loc_h_tile) other_output->tile_info.loc_h_tile < output->tile_info.loc_h_tile)
x += other_output->tile_info.tile_w; x += other_output->tile_info.tile_w;
if (other_output->tile_info.loc_h_tile == output->tile_info.loc_h_tile && if (other_output->tile_info.loc_h_tile ==
output->tile_info.loc_h_tile &&
other_output->tile_info.loc_v_tile < output->tile_info.loc_v_tile) other_output->tile_info.loc_v_tile < output->tile_info.loc_v_tile)
y += other_output->tile_info.tile_h; y += other_output->tile_info.tile_h;
break; break;
case META_MONITOR_TRANSFORM_180: case META_MONITOR_TRANSFORM_180:
case META_MONITOR_TRANSFORM_FLIPPED_180: case META_MONITOR_TRANSFORM_FLIPPED_180:
if (other_output->tile_info.loc_v_tile == output->tile_info.loc_v_tile && if (other_output->tile_info.loc_v_tile ==
output->tile_info.loc_v_tile &&
other_output->tile_info.loc_h_tile > output->tile_info.loc_h_tile) other_output->tile_info.loc_h_tile > output->tile_info.loc_h_tile)
x += other_output->tile_info.tile_w; x += other_output->tile_info.tile_w;
if (other_output->tile_info.loc_h_tile == output->tile_info.loc_h_tile && if (other_output->tile_info.loc_h_tile ==
output->tile_info.loc_h_tile &&
other_output->tile_info.loc_v_tile > output->tile_info.loc_v_tile) other_output->tile_info.loc_v_tile > output->tile_info.loc_v_tile)
y += other_output->tile_info.tile_h; y += other_output->tile_info.tile_h;
break; break;
case META_MONITOR_TRANSFORM_270: case META_MONITOR_TRANSFORM_270:
case META_MONITOR_TRANSFORM_FLIPPED_270: case META_MONITOR_TRANSFORM_FLIPPED_270:
if (other_output->tile_info.loc_v_tile == output->tile_info.loc_v_tile && if (other_output->tile_info.loc_v_tile ==
output->tile_info.loc_v_tile &&
other_output->tile_info.loc_h_tile < output->tile_info.loc_h_tile) other_output->tile_info.loc_h_tile < output->tile_info.loc_h_tile)
y += other_output->tile_info.tile_w; y += other_output->tile_info.tile_w;
if (other_output->tile_info.loc_h_tile == output->tile_info.loc_h_tile && if (other_output->tile_info.loc_h_tile ==
output->tile_info.loc_h_tile &&
other_output->tile_info.loc_v_tile < output->tile_info.loc_v_tile) other_output->tile_info.loc_v_tile < output->tile_info.loc_v_tile)
x += other_output->tile_info.tile_h; x += other_output->tile_info.tile_h;
break; break;
case META_MONITOR_TRANSFORM_90: case META_MONITOR_TRANSFORM_90:
case META_MONITOR_TRANSFORM_FLIPPED_90: case META_MONITOR_TRANSFORM_FLIPPED_90:
if (other_output->tile_info.loc_v_tile == output->tile_info.loc_v_tile && if (other_output->tile_info.loc_v_tile ==
output->tile_info.loc_v_tile &&
other_output->tile_info.loc_h_tile > output->tile_info.loc_h_tile) other_output->tile_info.loc_h_tile > output->tile_info.loc_h_tile)
y += other_output->tile_info.tile_w; y += other_output->tile_info.tile_w;
if (other_output->tile_info.loc_h_tile == output->tile_info.loc_h_tile && if (other_output->tile_info.loc_h_tile ==
output->tile_info.loc_h_tile &&
other_output->tile_info.loc_v_tile > output->tile_info.loc_v_tile) other_output->tile_info.loc_v_tile > output->tile_info.loc_v_tile)
x += other_output->tile_info.tile_h; x += other_output->tile_info.tile_h;
break; break;
@ -1318,7 +1328,8 @@ meta_monitor_tiled_class_init (MetaMonitorTiledClass *klass)
monitor_class->get_main_output = meta_monitor_tiled_get_main_output; monitor_class->get_main_output = meta_monitor_tiled_get_main_output;
monitor_class->derive_layout = meta_monitor_tiled_derive_layout; monitor_class->derive_layout = meta_monitor_tiled_derive_layout;
monitor_class->calculate_crtc_pos = meta_monitor_tiled_calculate_crtc_pos; monitor_class->calculate_crtc_pos = meta_monitor_tiled_calculate_crtc_pos;
monitor_class->get_suggested_position = meta_monitor_tiled_get_suggested_position; monitor_class->get_suggested_position =
meta_monitor_tiled_get_suggested_position;
} }
static void static void
@ -1368,7 +1379,8 @@ meta_monitor_mode_spec_equals (MetaMonitorModeSpec *monitor_mode_spec,
return (monitor_mode_spec->width == other_monitor_mode_spec->width && return (monitor_mode_spec->width == other_monitor_mode_spec->width &&
monitor_mode_spec->height == other_monitor_mode_spec->height && monitor_mode_spec->height == other_monitor_mode_spec->height &&
ABS (monitor_mode_spec->refresh_rate - ABS (monitor_mode_spec->refresh_rate -
other_monitor_mode_spec->refresh_rate) < MAXIMUM_REFRESH_RATE_DIFF && other_monitor_mode_spec->refresh_rate) <
MAXIMUM_REFRESH_RATE_DIFF &&
monitor_mode_spec->flags == other_monitor_mode_spec->flags); monitor_mode_spec->flags == other_monitor_mode_spec->flags);
} }
@ -1485,7 +1497,8 @@ meta_monitor_calculate_crtc_pos (MetaMonitor *monitor,
*/ */
#define HIDPI_MIN_HEIGHT 1200 #define HIDPI_MIN_HEIGHT 1200
/* From http://en.wikipedia.org/wiki/4K_resolution#Resolutions_of_common_formats */ /* From http://en.wikipedia.org/wiki/4K_resolution#Resolutions_of_common_formats
* */
#define SMALLEST_4K_WIDTH 3656 #define SMALLEST_4K_WIDTH 3656
static float static float
@ -1612,7 +1625,6 @@ get_closest_scale_factor_for_resolution (float width,
do do
{ {
for (j = 0; j < 2; j++) for (j = 0; j < 2; j++)
{ {
float current_scale; float current_scale;

View File

@ -88,10 +88,13 @@ read_iio_proxy (MetaOrientationManager *self)
if (has_accel) if (has_accel)
{ {
v = g_dbus_proxy_get_cached_property (self->iio_proxy, "AccelerometerOrientation"); v = g_dbus_proxy_get_cached_property (self->iio_proxy,
"AccelerometerOrientation");
if (v) if (v)
{ {
self->curr_orientation = orientation_from_string (g_variant_get_string (v, NULL)); self->curr_orientation = orientation_from_string (g_variant_get_string (
v,
NULL));
g_variant_unref (v); g_variant_unref (v);
} }
} }

View File

@ -30,7 +30,7 @@ typedef struct _MetaOutputPrivate
G_DEFINE_TYPE_WITH_PRIVATE (MetaOutput, meta_output, G_TYPE_OBJECT) G_DEFINE_TYPE_WITH_PRIVATE (MetaOutput, meta_output, G_TYPE_OBJECT)
MetaGpu * MetaGpu *
meta_output_get_gpu (MetaOutput *output) meta_output_get_gpu (MetaOutput * output)
{ {
return output->gpu; return output->gpu;
} }

View File

@ -46,8 +46,8 @@ meta_pointer_constraint_constrain (MetaPointerConstraint *constraint,
guint32 time, guint32 time,
float prev_x, float prev_x,
float prev_y, float prev_y,
float *x, float *x,
float *y) float *y)
{ {
META_POINTER_CONSTRAINT_GET_CLASS (constraint)->constrain (constraint, META_POINTER_CONSTRAINT_GET_CLASS (constraint)->constrain (constraint,
device, device,

View File

@ -87,8 +87,9 @@ meta_remote_access_handle_notify_stopped (MetaRemoteAccessHandle *handle)
} }
void void
meta_remote_access_controller_notify_new_handle (MetaRemoteAccessController *controller, meta_remote_access_controller_notify_new_handle (
MetaRemoteAccessHandle *handle) MetaRemoteAccessController *controller,
MetaRemoteAccessHandle *handle)
{ {
g_signal_emit (controller, controller_signals[CONTROLLER_NEW_HANDLE], 0, g_signal_emit (controller, controller_signals[CONTROLLER_NEW_HANDLE], 0,
handle); handle);

View File

@ -38,7 +38,8 @@
#include "meta-dbus-remote-desktop.h" #include "meta-dbus-remote-desktop.h"
#define META_REMOTE_DESKTOP_SESSION_DBUS_PATH "/org/gnome/Mutter/RemoteDesktop/Session" #define META_REMOTE_DESKTOP_SESSION_DBUS_PATH \
"/org/gnome/Mutter/RemoteDesktop/Session"
enum _MetaRemoteDesktopNotifyAxisFlags enum _MetaRemoteDesktopNotifyAxisFlags
{ {
@ -65,7 +66,8 @@ struct _MetaRemoteDesktopSession
}; };
static void static void
meta_remote_desktop_session_init_iface (MetaDBusRemoteDesktopSessionIface *iface); meta_remote_desktop_session_init_iface (
MetaDBusRemoteDesktopSessionIface *iface);
static void static void
meta_dbus_session_init_iface (MetaDbusSessionInterface *iface); meta_dbus_session_init_iface (MetaDbusSessionInterface *iface);
@ -73,8 +75,9 @@ meta_dbus_session_init_iface (MetaDbusSessionInterface *iface);
G_DEFINE_TYPE_WITH_CODE (MetaRemoteDesktopSession, G_DEFINE_TYPE_WITH_CODE (MetaRemoteDesktopSession,
meta_remote_desktop_session, meta_remote_desktop_session,
META_DBUS_TYPE_REMOTE_DESKTOP_SESSION_SKELETON, META_DBUS_TYPE_REMOTE_DESKTOP_SESSION_SKELETON,
G_IMPLEMENT_INTERFACE (META_DBUS_TYPE_REMOTE_DESKTOP_SESSION, G_IMPLEMENT_INTERFACE (
meta_remote_desktop_session_init_iface) META_DBUS_TYPE_REMOTE_DESKTOP_SESSION,
meta_remote_desktop_session_init_iface)
G_IMPLEMENT_INTERFACE (META_TYPE_DBUS_SESSION, G_IMPLEMENT_INTERFACE (META_TYPE_DBUS_SESSION,
meta_dbus_session_init_iface)) meta_dbus_session_init_iface))
@ -90,7 +93,7 @@ G_DEFINE_TYPE (MetaRemoteDesktopSessionHandle,
META_TYPE_REMOTE_ACCESS_HANDLE) META_TYPE_REMOTE_ACCESS_HANDLE)
static MetaRemoteDesktopSessionHandle * static MetaRemoteDesktopSessionHandle *
meta_remote_desktop_session_handle_new (MetaRemoteDesktopSession *session); meta_remote_desktop_session_handle_new (MetaRemoteDesktopSession * session);
static gboolean static gboolean
meta_remote_desktop_session_is_running (MetaRemoteDesktopSession *session) meta_remote_desktop_session_is_running (MetaRemoteDesktopSession *session)
@ -107,7 +110,8 @@ init_remote_access_handle (MetaRemoteDesktopSession *session)
session->handle = meta_remote_desktop_session_handle_new (session); session->handle = meta_remote_desktop_session_handle_new (session);
remote_access_controller = meta_backend_get_remote_access_controller (backend); remote_access_controller =
meta_backend_get_remote_access_controller (backend);
remote_access_handle = META_REMOTE_ACCESS_HANDLE (session->handle); remote_access_handle = META_REMOTE_ACCESS_HANDLE (session->handle);
meta_remote_access_controller_notify_new_handle (remote_access_controller, meta_remote_access_controller_notify_new_handle (remote_access_controller,
remote_access_handle); remote_access_handle);
@ -197,9 +201,10 @@ on_screen_cast_session_closed (MetaScreenCastSession *screen_cast_session,
} }
gboolean gboolean
meta_remote_desktop_session_register_screen_cast (MetaRemoteDesktopSession *session, meta_remote_desktop_session_register_screen_cast (
MetaScreenCastSession *screen_cast_session, MetaRemoteDesktopSession *session,
GError **error) MetaScreenCastSession *screen_cast_session,
GError **error)
{ {
if (session->screen_cast_session) if (session->screen_cast_session)
{ {
@ -219,9 +224,9 @@ meta_remote_desktop_session_register_screen_cast (MetaRemoteDesktopSession *ses
} }
MetaRemoteDesktopSession * MetaRemoteDesktopSession *
meta_remote_desktop_session_new (MetaRemoteDesktop *remote_desktop, meta_remote_desktop_session_new (MetaRemoteDesktop *remote_desktop,
const char *peer_name, const char *peer_name,
GError **error) GError **error)
{ {
GDBusInterfaceSkeleton *interface_skeleton; GDBusInterfaceSkeleton *interface_skeleton;
MetaRemoteDesktopSession *session; MetaRemoteDesktopSession *session;
@ -452,11 +457,12 @@ handle_notify_pointer_axis (MetaDBusRemoteDesktopSession *skeleton,
CLUTTER_SCROLL_FINISHED_VERTICAL); CLUTTER_SCROLL_FINISHED_VERTICAL);
} }
clutter_virtual_input_device_notify_scroll_continuous (session->virtual_pointer, clutter_virtual_input_device_notify_scroll_continuous (
CLUTTER_CURRENT_TIME, session->virtual_pointer,
dx, dy, CLUTTER_CURRENT_TIME,
CLUTTER_SCROLL_SOURCE_FINGER, dx, dy,
finish_flags); CLUTTER_SCROLL_SOURCE_FINGER,
finish_flags);
meta_dbus_remote_desktop_session_complete_notify_pointer_axis (skeleton, meta_dbus_remote_desktop_session_complete_notify_pointer_axis (skeleton,
invocation); invocation);
@ -522,13 +528,15 @@ handle_notify_pointer_axis_discrete (MetaDBusRemoteDesktopSession *skeleton,
direction = discrete_steps_to_scroll_direction (axis, steps); direction = discrete_steps_to_scroll_direction (axis, steps);
for (step_count = 0; step_count < abs (steps); step_count++) for (step_count = 0; step_count < abs (steps); step_count++)
clutter_virtual_input_device_notify_discrete_scroll (session->virtual_pointer, clutter_virtual_input_device_notify_discrete_scroll (
CLUTTER_CURRENT_TIME, session->virtual_pointer,
direction, CLUTTER_CURRENT_TIME,
CLUTTER_SCROLL_SOURCE_WHEEL); direction,
CLUTTER_SCROLL_SOURCE_WHEEL);
meta_dbus_remote_desktop_session_complete_notify_pointer_axis_discrete (skeleton, meta_dbus_remote_desktop_session_complete_notify_pointer_axis_discrete (
invocation); skeleton,
invocation);
return TRUE; return TRUE;
} }
@ -553,8 +561,9 @@ handle_notify_pointer_motion_relative (MetaDBusRemoteDesktopSession *skeleton,
CLUTTER_CURRENT_TIME, CLUTTER_CURRENT_TIME,
dx, dy); dx, dy);
meta_dbus_remote_desktop_session_complete_notify_pointer_motion_relative (skeleton, meta_dbus_remote_desktop_session_complete_notify_pointer_motion_relative (
invocation); skeleton,
invocation);
return TRUE; return TRUE;
} }
@ -602,8 +611,9 @@ handle_notify_pointer_motion_absolute (MetaDBusRemoteDesktopSession *skeleton,
CLUTTER_CURRENT_TIME, CLUTTER_CURRENT_TIME,
abs_x, abs_y); abs_x, abs_y);
meta_dbus_remote_desktop_session_complete_notify_pointer_motion_absolute (skeleton, meta_dbus_remote_desktop_session_complete_notify_pointer_motion_absolute (
invocation); skeleton,
invocation);
return TRUE; return TRUE;
} }
@ -699,10 +709,11 @@ handle_notify_touch_motion (MetaDBusRemoteDesktopSession *skeleton,
meta_screen_cast_stream_transform_position (stream, x, y, &abs_x, &abs_y); meta_screen_cast_stream_transform_position (stream, x, y, &abs_x, &abs_y);
clutter_virtual_input_device_notify_touch_motion (session->virtual_touchscreen, clutter_virtual_input_device_notify_touch_motion (
CLUTTER_CURRENT_TIME, session->virtual_touchscreen,
slot, CLUTTER_CURRENT_TIME,
abs_x, abs_y); slot,
abs_x, abs_y);
meta_dbus_remote_desktop_session_complete_notify_touch_motion (skeleton, meta_dbus_remote_desktop_session_complete_notify_touch_motion (skeleton,
invocation); invocation);
@ -712,8 +723,8 @@ handle_notify_touch_motion (MetaDBusRemoteDesktopSession *skeleton,
static gboolean static gboolean
handle_notify_touch_up (MetaDBusRemoteDesktopSession *skeleton, handle_notify_touch_up (MetaDBusRemoteDesktopSession *skeleton,
GDBusMethodInvocation *invocation, GDBusMethodInvocation *invocation,
unsigned int slot) unsigned int slot)
{ {
MetaRemoteDesktopSession *session = META_REMOTE_DESKTOP_SESSION (skeleton); MetaRemoteDesktopSession *session = META_REMOTE_DESKTOP_SESSION (skeleton);
@ -726,8 +737,8 @@ handle_notify_touch_up (MetaDBusRemoteDesktopSession *skeleton,
} }
clutter_virtual_input_device_notify_touch_up (session->virtual_touchscreen, clutter_virtual_input_device_notify_touch_up (session->virtual_touchscreen,
CLUTTER_CURRENT_TIME, CLUTTER_CURRENT_TIME,
slot); slot);
meta_dbus_remote_desktop_session_complete_notify_touch_up (skeleton, meta_dbus_remote_desktop_session_complete_notify_touch_up (skeleton,
invocation); invocation);
@ -744,9 +755,12 @@ meta_remote_desktop_session_init_iface (MetaDBusRemoteDesktopSessionIface *iface
iface->handle_notify_keyboard_keysym = handle_notify_keyboard_keysym; iface->handle_notify_keyboard_keysym = handle_notify_keyboard_keysym;
iface->handle_notify_pointer_button = handle_notify_pointer_button; iface->handle_notify_pointer_button = handle_notify_pointer_button;
iface->handle_notify_pointer_axis = handle_notify_pointer_axis; iface->handle_notify_pointer_axis = handle_notify_pointer_axis;
iface->handle_notify_pointer_axis_discrete = handle_notify_pointer_axis_discrete; iface->handle_notify_pointer_axis_discrete =
iface->handle_notify_pointer_motion_relative = handle_notify_pointer_motion_relative; handle_notify_pointer_axis_discrete;
iface->handle_notify_pointer_motion_absolute = handle_notify_pointer_motion_absolute; iface->handle_notify_pointer_motion_relative =
handle_notify_pointer_motion_relative;
iface->handle_notify_pointer_motion_absolute =
handle_notify_pointer_motion_absolute;
iface->handle_notify_touch_down = handle_notify_touch_down; iface->handle_notify_touch_down = handle_notify_touch_down;
iface->handle_notify_touch_motion = handle_notify_touch_motion; iface->handle_notify_touch_motion = handle_notify_touch_motion;
iface->handle_notify_touch_up = handle_notify_touch_up; iface->handle_notify_touch_up = handle_notify_touch_up;
@ -783,7 +797,7 @@ static void
meta_remote_desktop_session_init (MetaRemoteDesktopSession *session) meta_remote_desktop_session_init (MetaRemoteDesktopSession *session)
{ {
MetaDBusRemoteDesktopSession *skeleton = MetaDBusRemoteDesktopSession *skeleton =
META_DBUS_REMOTE_DESKTOP_SESSION (session); META_DBUS_REMOTE_DESKTOP_SESSION (session);
GRand *rand; GRand *rand;
static unsigned int global_session_number = 0; static unsigned int global_session_number = 0;
@ -791,7 +805,8 @@ meta_remote_desktop_session_init (MetaRemoteDesktopSession *session)
session->session_id = meta_generate_random_id (rand, 32); session->session_id = meta_generate_random_id (rand, 32);
g_rand_free (rand); g_rand_free (rand);
meta_dbus_remote_desktop_session_set_session_id (skeleton, session->session_id); meta_dbus_remote_desktop_session_set_session_id (skeleton,
session->session_id);
session->object_path = session->object_path =
g_strdup_printf (META_REMOTE_DESKTOP_SESSION_DBUS_PATH "/u%u", g_strdup_printf (META_REMOTE_DESKTOP_SESSION_DBUS_PATH "/u%u",
@ -801,7 +816,6 @@ meta_remote_desktop_session_init (MetaRemoteDesktopSession *session)
static void static void
meta_remote_desktop_session_class_init (MetaRemoteDesktopSessionClass *klass) meta_remote_desktop_session_class_init (MetaRemoteDesktopSessionClass *klass)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->finalize = meta_remote_desktop_session_finalize; object_class->finalize = meta_remote_desktop_session_finalize;
@ -836,7 +850,8 @@ meta_remote_desktop_session_handle_init (MetaRemoteDesktopSessionHandle *handle)
} }
static void static void
meta_remote_desktop_session_handle_class_init (MetaRemoteDesktopSessionHandleClass *klass) meta_remote_desktop_session_handle_class_init (
MetaRemoteDesktopSessionHandleClass *klass)
{ {
MetaRemoteAccessHandleClass *remote_access_handle_class = MetaRemoteAccessHandleClass *remote_access_handle_class =
META_REMOTE_ACCESS_HANDLE_CLASS (klass); META_REMOTE_ACCESS_HANDLE_CLASS (klass);

View File

@ -46,7 +46,7 @@ G_DEFINE_TYPE (MetaRendererView, meta_renderer_view,
CLUTTER_TYPE_STAGE_VIEW_COGL) CLUTTER_TYPE_STAGE_VIEW_COGL)
MetaLogicalMonitor * MetaLogicalMonitor *
meta_renderer_view_get_logical_monitor (MetaRendererView *view) meta_renderer_view_get_logical_monitor (MetaRendererView * view)
{ {
return view->logical_monitor; return view->logical_monitor;
} }
@ -113,14 +113,15 @@ meta_renderer_view_setup_offscreen_blit_pipeline (ClutterStageView *view,
} }
static void static void
meta_renderer_view_set_transform (MetaRendererView *view, meta_renderer_view_set_transform (MetaRendererView *view,
MetaMonitorTransform transform) MetaMonitorTransform transform)
{ {
if (view->transform == transform) if (view->transform == transform)
return; return;
view->transform = transform; view->transform = transform;
clutter_stage_view_invalidate_offscreen_blit_pipeline (CLUTTER_STAGE_VIEW (view)); clutter_stage_view_invalidate_offscreen_blit_pipeline (CLUTTER_STAGE_VIEW (
view));
} }
static void static void

View File

@ -38,7 +38,7 @@ typedef struct _MetaRendererPrivate
G_DEFINE_TYPE_WITH_PRIVATE (MetaRenderer, meta_renderer, G_TYPE_OBJECT) G_DEFINE_TYPE_WITH_PRIVATE (MetaRenderer, meta_renderer, G_TYPE_OBJECT)
CoglRenderer * CoglRenderer *
meta_renderer_create_cogl_renderer (MetaRenderer *renderer) meta_renderer_create_cogl_renderer (MetaRenderer * renderer)
{ {
return META_RENDERER_GET_CLASS (renderer)->create_cogl_renderer (renderer); return META_RENDERER_GET_CLASS (renderer)->create_cogl_renderer (renderer);
} }

View File

@ -43,7 +43,7 @@ G_DEFINE_TYPE (MetaScreenCastMonitorStreamSrc,
META_TYPE_SCREEN_CAST_STREAM_SRC) META_TYPE_SCREEN_CAST_STREAM_SRC)
static ClutterStage * static ClutterStage *
get_stage (MetaScreenCastMonitorStreamSrc *monitor_src) get_stage (MetaScreenCastMonitorStreamSrc * monitor_src)
{ {
MetaScreenCastStreamSrc *src; MetaScreenCastStreamSrc *src;
MetaScreenCastStream *stream; MetaScreenCastStream *stream;
@ -146,8 +146,9 @@ meta_screen_cast_monitor_stream_src_record_frame (MetaScreenCastStreamSrc *src,
} }
MetaScreenCastMonitorStreamSrc * MetaScreenCastMonitorStreamSrc *
meta_screen_cast_monitor_stream_src_new (MetaScreenCastMonitorStream *monitor_stream, meta_screen_cast_monitor_stream_src_new (
GError **error) MetaScreenCastMonitorStream *monitor_stream,
GError **error)
{ {
return g_initable_new (META_TYPE_SCREEN_CAST_MONITOR_STREAM_SRC, NULL, error, return g_initable_new (META_TYPE_SCREEN_CAST_MONITOR_STREAM_SRC, NULL, error,
"stream", monitor_stream, "stream", monitor_stream,
@ -155,12 +156,14 @@ meta_screen_cast_monitor_stream_src_new (MetaScreenCastMonitorStream *monitor_s
} }
static void static void
meta_screen_cast_monitor_stream_src_init (MetaScreenCastMonitorStreamSrc *monitor_src) meta_screen_cast_monitor_stream_src_init (
MetaScreenCastMonitorStreamSrc *monitor_src)
{ {
} }
static void static void
meta_screen_cast_monitor_stream_src_class_init (MetaScreenCastMonitorStreamSrcClass *klass) meta_screen_cast_monitor_stream_src_class_init (
MetaScreenCastMonitorStreamSrcClass *klass)
{ {
MetaScreenCastStreamSrcClass *src_class = MetaScreenCastStreamSrcClass *src_class =
META_SCREEN_CAST_STREAM_SRC_CLASS (klass); META_SCREEN_CAST_STREAM_SRC_CLASS (klass);

View File

@ -93,23 +93,25 @@ on_monitors_changed (MetaMonitorManager *monitor_manager,
} }
ClutterStage * ClutterStage *
meta_screen_cast_monitor_stream_get_stage (MetaScreenCastMonitorStream *monitor_stream) meta_screen_cast_monitor_stream_get_stage (
MetaScreenCastMonitorStream *monitor_stream)
{ {
return monitor_stream->stage; return monitor_stream->stage;
} }
MetaMonitor * MetaMonitor *
meta_screen_cast_monitor_stream_get_monitor (MetaScreenCastMonitorStream *monitor_stream) meta_screen_cast_monitor_stream_get_monitor (
MetaScreenCastMonitorStream *monitor_stream)
{ {
return monitor_stream->monitor; return monitor_stream->monitor;
} }
MetaScreenCastMonitorStream * MetaScreenCastMonitorStream *
meta_screen_cast_monitor_stream_new (GDBusConnection *connection, meta_screen_cast_monitor_stream_new (GDBusConnection *connection,
MetaMonitorManager *monitor_manager, MetaMonitorManager *monitor_manager,
MetaMonitor *monitor, MetaMonitor *monitor,
ClutterStage *stage, ClutterStage *stage,
GError **error) GError **error)
{ {
MetaScreenCastMonitorStream *monitor_stream; MetaScreenCastMonitorStream *monitor_stream;
@ -138,8 +140,8 @@ meta_screen_cast_monitor_stream_new (GDBusConnection *connection,
} }
static MetaScreenCastStreamSrc * static MetaScreenCastStreamSrc *
meta_screen_cast_monitor_stream_create_src (MetaScreenCastStream *stream, meta_screen_cast_monitor_stream_create_src (MetaScreenCastStream *stream,
GError **error) GError **error)
{ {
MetaScreenCastMonitorStream *monitor_stream = MetaScreenCastMonitorStream *monitor_stream =
META_SCREEN_CAST_MONITOR_STREAM (stream); META_SCREEN_CAST_MONITOR_STREAM (stream);
@ -177,11 +179,12 @@ meta_screen_cast_monitor_stream_set_parameters (MetaScreenCastStream *stream,
} }
static void static void
meta_screen_cast_monitor_stream_transform_position (MetaScreenCastStream *stream, meta_screen_cast_monitor_stream_transform_position (
double stream_x, MetaScreenCastStream *stream,
double stream_y, double stream_x,
double *x, double stream_y,
double *y) double *x,
double *y)
{ {
MetaScreenCastMonitorStream *monitor_stream = MetaScreenCastMonitorStream *monitor_stream =
META_SCREEN_CAST_MONITOR_STREAM (stream); META_SCREEN_CAST_MONITOR_STREAM (stream);
@ -208,7 +211,8 @@ meta_screen_cast_monitor_stream_set_property (GObject *object,
{ {
case PROP_MONITOR: case PROP_MONITOR:
g_set_object (&monitor_stream->monitor, g_value_get_object (value)); g_set_object (&monitor_stream->monitor, g_value_get_object (value));
logical_monitor = meta_monitor_get_logical_monitor (monitor_stream->monitor); logical_monitor = meta_monitor_get_logical_monitor (
monitor_stream->monitor);
g_set_object (&monitor_stream->logical_monitor, logical_monitor); g_set_object (&monitor_stream->logical_monitor, logical_monitor);
break; break;
default: default:
@ -244,16 +248,19 @@ meta_screen_cast_monitor_stream_finalize (GObject *object)
g_clear_object (&monitor_stream->monitor); g_clear_object (&monitor_stream->monitor);
g_clear_object (&monitor_stream->logical_monitor); g_clear_object (&monitor_stream->logical_monitor);
G_OBJECT_CLASS (meta_screen_cast_monitor_stream_parent_class)->finalize (object); G_OBJECT_CLASS (meta_screen_cast_monitor_stream_parent_class)->finalize (
object);
} }
static void static void
meta_screen_cast_monitor_stream_init (MetaScreenCastMonitorStream *monitor_stream) meta_screen_cast_monitor_stream_init (
MetaScreenCastMonitorStream *monitor_stream)
{ {
} }
static void static void
meta_screen_cast_monitor_stream_class_init (MetaScreenCastMonitorStreamClass *klass) meta_screen_cast_monitor_stream_class_init (
MetaScreenCastMonitorStreamClass *klass)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass);
MetaScreenCastStreamClass *stream_class = MetaScreenCastStreamClass *stream_class =
@ -265,7 +272,8 @@ meta_screen_cast_monitor_stream_class_init (MetaScreenCastMonitorStreamClass *kl
stream_class->create_src = meta_screen_cast_monitor_stream_create_src; stream_class->create_src = meta_screen_cast_monitor_stream_create_src;
stream_class->set_parameters = meta_screen_cast_monitor_stream_set_parameters; stream_class->set_parameters = meta_screen_cast_monitor_stream_set_parameters;
stream_class->transform_position = meta_screen_cast_monitor_stream_transform_position; stream_class->transform_position =
meta_screen_cast_monitor_stream_transform_position;
g_object_class_install_property (object_class, g_object_class_install_property (object_class,
PROP_MONITOR, PROP_MONITOR,

View File

@ -30,7 +30,8 @@
#include "backends/meta-screen-cast-stream.h" #include "backends/meta-screen-cast-stream.h"
#include "backends/meta-remote-access-controller-private.h" #include "backends/meta-remote-access-controller-private.h"
#define META_SCREEN_CAST_SESSION_DBUS_PATH "/org/gnome/Mutter/ScreenCast/Session" #define META_SCREEN_CAST_SESSION_DBUS_PATH \
"/org/gnome/Mutter/ScreenCast/Session"
struct _MetaScreenCastSession struct _MetaScreenCastSession
{ {
@ -55,8 +56,9 @@ meta_dbus_session_init_iface (MetaDbusSessionInterface *iface);
G_DEFINE_TYPE_WITH_CODE (MetaScreenCastSession, G_DEFINE_TYPE_WITH_CODE (MetaScreenCastSession,
meta_screen_cast_session, meta_screen_cast_session,
META_DBUS_TYPE_SCREEN_CAST_SESSION_SKELETON, META_DBUS_TYPE_SCREEN_CAST_SESSION_SKELETON,
G_IMPLEMENT_INTERFACE (META_DBUS_TYPE_SCREEN_CAST_SESSION, G_IMPLEMENT_INTERFACE (
meta_screen_cast_session_init_iface) META_DBUS_TYPE_SCREEN_CAST_SESSION,
meta_screen_cast_session_init_iface)
G_IMPLEMENT_INTERFACE (META_TYPE_DBUS_SESSION, G_IMPLEMENT_INTERFACE (META_TYPE_DBUS_SESSION,
meta_dbus_session_init_iface)) meta_dbus_session_init_iface))
@ -72,7 +74,7 @@ G_DEFINE_TYPE (MetaScreenCastSessionHandle,
META_TYPE_REMOTE_ACCESS_HANDLE) META_TYPE_REMOTE_ACCESS_HANDLE)
static MetaScreenCastSessionHandle * static MetaScreenCastSessionHandle *
meta_screen_cast_session_handle_new (MetaScreenCastSession *session); meta_screen_cast_session_handle_new (MetaScreenCastSession * session);
static void static void
init_remote_access_handle (MetaScreenCastSession *session) init_remote_access_handle (MetaScreenCastSession *session)
@ -83,15 +85,16 @@ init_remote_access_handle (MetaScreenCastSession *session)
session->handle = meta_screen_cast_session_handle_new (session); session->handle = meta_screen_cast_session_handle_new (session);
remote_access_controller = meta_backend_get_remote_access_controller (backend); remote_access_controller =
meta_backend_get_remote_access_controller (backend);
remote_access_handle = META_REMOTE_ACCESS_HANDLE (session->handle); remote_access_handle = META_REMOTE_ACCESS_HANDLE (session->handle);
meta_remote_access_controller_notify_new_handle (remote_access_controller, meta_remote_access_controller_notify_new_handle (remote_access_controller,
remote_access_handle); remote_access_handle);
} }
gboolean gboolean
meta_screen_cast_session_start (MetaScreenCastSession *session, meta_screen_cast_session_start (MetaScreenCastSession *session,
GError **error) GError **error)
{ {
GList *l; GList *l;
@ -370,10 +373,10 @@ meta_dbus_session_init_iface (MetaDbusSessionInterface *iface)
} }
MetaScreenCastSession * MetaScreenCastSession *
meta_screen_cast_session_new (MetaScreenCast *screen_cast, meta_screen_cast_session_new (MetaScreenCast *screen_cast,
MetaScreenCastSessionType session_type, MetaScreenCastSessionType session_type,
const char *peer_name, const char *peer_name,
GError **error) GError **error)
{ {
GDBusInterfaceSkeleton *interface_skeleton; GDBusInterfaceSkeleton *interface_skeleton;
MetaScreenCastSession *session; MetaScreenCastSession *session;
@ -452,7 +455,8 @@ meta_screen_cast_session_handle_init (MetaScreenCastSessionHandle *handle)
} }
static void static void
meta_screen_cast_session_handle_class_init (MetaScreenCastSessionHandleClass *klass) meta_screen_cast_session_handle_class_init (
MetaScreenCastSessionHandleClass *klass)
{ {
MetaRemoteAccessHandleClass *remote_access_handle_class = MetaRemoteAccessHandleClass *remote_access_handle_class =
META_REMOTE_ACCESS_HANDLE_CLASS (klass); META_REMOTE_ACCESS_HANDLE_CLASS (klass);

View File

@ -38,7 +38,8 @@
#include "meta/boxes.h" #include "meta/boxes.h"
#define PRIVATE_OWNER_FROM_FIELD(TypeName, field_ptr, field_name) \ #define PRIVATE_OWNER_FROM_FIELD(TypeName, field_ptr, field_name) \
(TypeName *)((guint8 *)(field_ptr) - G_PRIVATE_OFFSET (TypeName, field_name)) (TypeName *) ((guint8 *) (field_ptr) - \
G_PRIVATE_OFFSET (TypeName, field_name))
enum enum
{ {
@ -163,7 +164,8 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
} }
else if (spa_buffer->datas[0].type == priv->pipewire_type->data.MemFd) else if (spa_buffer->datas[0].type == priv->pipewire_type->data.MemFd)
{ {
map = mmap (NULL, spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset, map = mmap (NULL,
spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset,
PROT_READ | PROT_WRITE, MAP_SHARED, PROT_READ | PROT_WRITE, MAP_SHARED,
spa_buffer->datas[0].fd, 0); spa_buffer->datas[0].fd, 0);
if (map == MAP_FAILED) if (map == MAP_FAILED)
@ -230,10 +232,10 @@ meta_screen_cast_stream_src_notify_closed (MetaScreenCastStreamSrc *src)
} }
static void static void
on_stream_state_changed (void *data, on_stream_state_changed (void *data,
enum pw_stream_state old, enum pw_stream_state old,
enum pw_stream_state state, enum pw_stream_state state,
const char *error_message) const char *error_message)
{ {
MetaScreenCastStreamSrc *src = data; MetaScreenCastStreamSrc *src = data;
MetaScreenCastStreamSrcPrivate *priv = MetaScreenCastStreamSrcPrivate *priv =
@ -307,15 +309,16 @@ on_stream_format_changed (void *data,
params, G_N_ELEMENTS (params)); params, G_N_ELEMENTS (params));
} }
static const struct pw_stream_events stream_events = { static const struct pw_stream_events stream_events =
{
PW_VERSION_STREAM_EVENTS, PW_VERSION_STREAM_EVENTS,
.state_changed = on_stream_state_changed, .state_changed = on_stream_state_changed,
.format_changed = on_stream_format_changed, .format_changed = on_stream_format_changed,
}; };
static struct pw_stream * static struct pw_stream *
create_pipewire_stream (MetaScreenCastStreamSrc *src, create_pipewire_stream (MetaScreenCastStreamSrc *src,
GError **error) GError **error)
{ {
MetaScreenCastStreamSrcPrivate *priv = MetaScreenCastStreamSrcPrivate *priv =
meta_screen_cast_stream_src_get_instance_private (src); meta_screen_cast_stream_src_get_instance_private (src);
@ -360,8 +363,8 @@ create_pipewire_stream (MetaScreenCastStreamSrc *src,
":", spa_type->format_video.size, "R", &SPA_RECTANGLE (width, height), ":", spa_type->format_video.size, "R", &SPA_RECTANGLE (width, height),
":", spa_type->format_video.framerate, "F", &SPA_FRACTION (0, 1), ":", spa_type->format_video.framerate, "F", &SPA_FRACTION (0, 1),
":", spa_type->format_video.max_framerate, "Fru", &max_framerate, ":", spa_type->format_video.max_framerate, "Fru", &max_framerate,
PROP_RANGE (&min_framerate, PROP_RANGE (&min_framerate,
&max_framerate)); &max_framerate));
pw_stream_add_listener (pipewire_stream, pw_stream_add_listener (pipewire_stream,
&priv->pipewire_stream_listener, &priv->pipewire_stream_listener,
@ -385,10 +388,10 @@ create_pipewire_stream (MetaScreenCastStreamSrc *src,
} }
static void static void
on_state_changed (void *data, on_state_changed (void *data,
enum pw_remote_state old, enum pw_remote_state old,
enum pw_remote_state state, enum pw_remote_state state,
const char *error_message) const char *error_message)
{ {
MetaScreenCastStreamSrc *src = data; MetaScreenCastStreamSrc *src = data;
MetaScreenCastStreamSrcPrivate *priv = MetaScreenCastStreamSrcPrivate *priv =
@ -430,9 +433,9 @@ pipewire_loop_source_prepare (GSource *base,
} }
static gboolean static gboolean
pipewire_loop_source_dispatch (GSource *source, pipewire_loop_source_dispatch (GSource *source,
GSourceFunc callback, GSourceFunc callback,
gpointer user_data) gpointer user_data)
{ {
MetaPipeWireSource *pipewire_source = (MetaPipeWireSource *) source; MetaPipeWireSource *pipewire_source = (MetaPipeWireSource *) source;
int result; int result;
@ -496,15 +499,16 @@ create_pipewire_source (void)
return pipewire_source; return pipewire_source;
} }
static const struct pw_remote_events remote_events = { static const struct pw_remote_events remote_events =
{
PW_VERSION_REMOTE_EVENTS, PW_VERSION_REMOTE_EVENTS,
.state_changed = on_state_changed, .state_changed = on_state_changed,
}; };
static gboolean static gboolean
meta_screen_cast_stream_src_initable_init (GInitable *initable, meta_screen_cast_stream_src_initable_init (GInitable *initable,
GCancellable *cancellable, GCancellable *cancellable,
GError **error) GError **error)
{ {
MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (initable); MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (initable);
MetaScreenCastStreamSrcPrivate *priv = MetaScreenCastStreamSrcPrivate *priv =
@ -600,7 +604,7 @@ meta_screen_cast_stream_src_set_property (GObject *object,
{ {
case PROP_STREAM: case PROP_STREAM:
priv->stream = g_value_get_object (value); priv->stream = g_value_get_object (value);
break;; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
} }

View File

@ -61,8 +61,8 @@ G_DEFINE_TYPE_WITH_CODE (MetaScreenCastStream,
G_ADD_PRIVATE (MetaScreenCastStream)) G_ADD_PRIVATE (MetaScreenCastStream))
static MetaScreenCastStreamSrc * static MetaScreenCastStreamSrc *
meta_screen_cast_stream_create_src (MetaScreenCastStream *stream, meta_screen_cast_stream_create_src (MetaScreenCastStream * stream,
GError **error) GError * *error)
{ {
return META_SCREEN_CAST_STREAM_GET_CLASS (stream)->create_src (stream, return META_SCREEN_CAST_STREAM_GET_CLASS (stream)->create_src (stream,
error); error);
@ -98,8 +98,8 @@ on_stream_src_ready (MetaScreenCastStreamSrc *src,
} }
gboolean gboolean
meta_screen_cast_stream_start (MetaScreenCastStream *stream, meta_screen_cast_stream_start (MetaScreenCastStream *stream,
GError **error) GError **error)
{ {
MetaScreenCastStreamPrivate *priv = MetaScreenCastStreamPrivate *priv =
meta_screen_cast_stream_get_instance_private (stream); meta_screen_cast_stream_get_instance_private (stream);
@ -206,9 +206,9 @@ meta_screen_cast_stream_finalize (GObject *object)
} }
static gboolean static gboolean
meta_screen_cast_stream_initable_init (GInitable *initable, meta_screen_cast_stream_initable_init (GInitable *initable,
GCancellable *cancellable, GCancellable *cancellable,
GError **error) GError **error)
{ {
MetaScreenCastStream *stream = META_SCREEN_CAST_STREAM (initable); MetaScreenCastStream *stream = META_SCREEN_CAST_STREAM (initable);
MetaDBusScreenCastStream *skeleton = META_DBUS_SCREEN_CAST_STREAM (stream); MetaDBusScreenCastStream *skeleton = META_DBUS_SCREEN_CAST_STREAM (stream);

View File

@ -54,7 +54,7 @@ G_DEFINE_TYPE_WITH_CODE (MetaScreenCast, meta_screen_cast,
meta_screen_cast_init_iface)) meta_screen_cast_init_iface))
GDBusConnection * GDBusConnection *
meta_screen_cast_get_connection (MetaScreenCast *screen_cast) meta_screen_cast_get_connection (MetaScreenCast * screen_cast)
{ {
GDBusInterfaceSkeleton *interface_skeleton = GDBusInterfaceSkeleton *interface_skeleton =
G_DBUS_INTERFACE_SKELETON (screen_cast); G_DBUS_INTERFACE_SKELETON (screen_cast);
@ -63,9 +63,9 @@ meta_screen_cast_get_connection (MetaScreenCast *screen_cast)
} }
static gboolean static gboolean
register_remote_desktop_screen_cast_session (MetaScreenCastSession *session, register_remote_desktop_screen_cast_session (MetaScreenCastSession *session,
const char *remote_desktop_session_id, const char *remote_desktop_session_id,
GError **error) GError **error)
{ {
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
MetaRemoteDesktop *remote_desktop = meta_backend_get_remote_desktop (backend); MetaRemoteDesktop *remote_desktop = meta_backend_get_remote_desktop (backend);

View File

@ -381,7 +381,6 @@ wayland_settings_changed (GSettings *wayland_settings,
gchar *key, gchar *key,
MetaSettings *settings) MetaSettings *settings)
{ {
if (g_str_equal (key, "xwayland-allow-grabs")) if (g_str_equal (key, "xwayland-allow-grabs"))
{ {
update_xwayland_allow_grabs (settings); update_xwayland_allow_grabs (settings);
@ -393,16 +392,16 @@ wayland_settings_changed (GSettings *wayland_settings,
} }
void void
meta_settings_get_xwayland_grab_patterns (MetaSettings *settings, meta_settings_get_xwayland_grab_patterns (MetaSettings *settings,
GPtrArray **whitelist_patterns, GPtrArray **whitelist_patterns,
GPtrArray **blacklist_patterns) GPtrArray **blacklist_patterns)
{ {
*whitelist_patterns = settings->xwayland_grab_whitelist_patterns; *whitelist_patterns = settings->xwayland_grab_whitelist_patterns;
*blacklist_patterns = settings->xwayland_grab_blacklist_patterns; *blacklist_patterns = settings->xwayland_grab_blacklist_patterns;
} }
gboolean gboolean
meta_settings_are_xwayland_grabs_allowed (MetaSettings *settings) meta_settings_are_xwayland_grabs_allowed (MetaSettings *settings)
{ {
return (settings->xwayland_allow_grabs); return (settings->xwayland_allow_grabs);
} }

View File

@ -30,7 +30,8 @@
#include "meta/meta-monitor-manager.h" #include "meta/meta-monitor-manager.h"
#include "meta/util.h" #include "meta/util.h"
struct _MetaOverlay { struct _MetaOverlay
{
gboolean enabled; gboolean enabled;
CoglPipeline *pipeline; CoglPipeline *pipeline;
@ -55,7 +56,8 @@ static MetaOverlay *
meta_overlay_new (void) meta_overlay_new (void)
{ {
MetaOverlay *overlay; MetaOverlay *overlay;
CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ()); CoglContext *ctx = clutter_backend_get_cogl_context (
clutter_get_default_backend ());
overlay = g_slice_new0 (MetaOverlay); overlay = g_slice_new0 (MetaOverlay);
overlay->pipeline = cogl_pipeline_new (ctx); overlay->pipeline = cogl_pipeline_new (ctx);

View File

@ -82,7 +82,7 @@ escape_dbus_component (const gchar *name)
g_string_append_len (op, first_ok, ptr - first_ok); g_string_append_len (op, first_ok, ptr - first_ok);
} }
/* escape the unsafe character */ /* escape the unsafe character */
g_string_append_printf (op, "_%02x", (unsigned char)(*ptr)); g_string_append_printf (op, "_%02x", (unsigned char) (*ptr));
/* restart after it */ /* restart after it */
first_ok = ptr + 1; first_ok = ptr + 1;
} }

View File

@ -64,7 +64,8 @@ static GInitableIface *initable_parent_iface;
static void static void
initable_iface_init (GInitableIface *initable_iface); initable_iface_init (GInitableIface *initable_iface);
G_DEFINE_TYPE_WITH_CODE (MetaBackendNative, meta_backend_native, META_TYPE_BACKEND, G_DEFINE_TYPE_WITH_CODE (MetaBackendNative, meta_backend_native,
META_TYPE_BACKEND,
G_ADD_PRIVATE (MetaBackendNative) G_ADD_PRIVATE (MetaBackendNative)
G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
initable_iface_init)) initable_iface_init))
@ -73,7 +74,8 @@ static void
meta_backend_native_finalize (GObject *object) meta_backend_native_finalize (GObject *object)
{ {
MetaBackendNative *native = META_BACKEND_NATIVE (object); MetaBackendNative *native = META_BACKEND_NATIVE (object);
MetaBackendNativePrivate *priv = meta_backend_native_get_instance_private (native); MetaBackendNativePrivate *priv = meta_backend_native_get_instance_private (
native);
meta_launcher_free (priv->launcher); meta_launcher_free (priv->launcher);
@ -216,24 +218,40 @@ relative_motion_across_outputs (MetaMonitorManager *monitor_manager,
MetaVector2 intersection; MetaVector2 intersection;
motion = (MetaLine2) { motion = (MetaLine2) {
.a = { x, y }, .a = { x, y },
.b = { x + (dx * cur->scale), y + (dy * cur->scale) } .b = { x + (dx * cur->scale), y + (dy * cur->scale) }
}; };
left = (MetaLine2) { left = (MetaLine2) {
{ cur->rect.x, cur->rect.y }, {
{ cur->rect.x, cur->rect.y + cur->rect.height } cur->rect.x, cur->rect.y
},
{
cur->rect.x, cur->rect.y + cur->rect.height
}
}; };
right = (MetaLine2) { right = (MetaLine2) {
{ cur->rect.x + cur->rect.width, cur->rect.y }, {
{ cur->rect.x + cur->rect.width, cur->rect.y + cur->rect.height } cur->rect.x + cur->rect.width, cur->rect.y
},
{
cur->rect.x + cur->rect.width, cur->rect.y + cur->rect.height
}
}; };
top = (MetaLine2) { top = (MetaLine2) {
{ cur->rect.x, cur->rect.y }, {
{ cur->rect.x + cur->rect.width, cur->rect.y } cur->rect.x, cur->rect.y
},
{
cur->rect.x + cur->rect.width, cur->rect.y
}
}; };
bottom = (MetaLine2) { bottom = (MetaLine2) {
{ cur->rect.x, cur->rect.y + cur->rect.height }, {
{ cur->rect.x + cur->rect.width, cur->rect.y + cur->rect.height } cur->rect.x, cur->rect.y + cur->rect.height
},
{
cur->rect.x + cur->rect.width, cur->rect.y + cur->rect.height
}
}; };
if (direction != META_DISPLAY_RIGHT && if (direction != META_DISPLAY_RIGHT &&
@ -284,17 +302,20 @@ relative_motion_filter (ClutterInputDevice *device,
if (meta_is_stage_views_scaled ()) if (meta_is_stage_views_scaled ())
return; return;
logical_monitor = meta_monitor_manager_get_logical_monitor_at (monitor_manager, logical_monitor = meta_monitor_manager_get_logical_monitor_at (
x, y); monitor_manager,
x, y);
if (!logical_monitor) if (!logical_monitor)
return; return;
new_dx = (*dx) * logical_monitor->scale; new_dx = (*dx) * logical_monitor->scale;
new_dy = (*dy) * logical_monitor->scale; new_dy = (*dy) * logical_monitor->scale;
dest_logical_monitor = meta_monitor_manager_get_logical_monitor_at (monitor_manager, dest_logical_monitor = meta_monitor_manager_get_logical_monitor_at (
x + new_dx, monitor_manager,
y + new_dy); x + new_dx,
y +
new_dy);
if (dest_logical_monitor && if (dest_logical_monitor &&
dest_logical_monitor != logical_monitor) dest_logical_monitor != logical_monitor)
{ {
@ -324,10 +345,12 @@ meta_backend_native_post_init (MetaBackend *backend)
META_BACKEND_CLASS (meta_backend_native_parent_class)->post_init (backend); META_BACKEND_CLASS (meta_backend_native_parent_class)->post_init (backend);
clutter_evdev_set_pointer_constrain_callback (manager, pointer_constrain_callback, clutter_evdev_set_pointer_constrain_callback (manager,
pointer_constrain_callback,
NULL, NULL); NULL, NULL);
clutter_evdev_set_relative_motion_filter (manager, relative_motion_filter, clutter_evdev_set_relative_motion_filter (manager, relative_motion_filter,
meta_backend_get_monitor_manager (backend)); meta_backend_get_monitor_manager (
backend));
} }
static MetaMonitorManager * static MetaMonitorManager *
@ -374,7 +397,8 @@ meta_backend_native_warp_pointer (MetaBackend *backend,
int y) int y)
{ {
ClutterDeviceManager *manager = clutter_device_manager_get_default (); ClutterDeviceManager *manager = clutter_device_manager_get_default ();
ClutterInputDevice *device = clutter_device_manager_get_core_device (manager, CLUTTER_POINTER_DEVICE); ClutterInputDevice *device = clutter_device_manager_get_core_device (manager,
CLUTTER_POINTER_DEVICE);
MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend); MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
/* XXX */ /* XXX */
@ -417,7 +441,8 @@ meta_backend_native_set_keymap (MetaBackend *backend,
names.options = options; names.options = options;
context = xkb_context_new (XKB_CONTEXT_NO_FLAGS); context = xkb_context_new (XKB_CONTEXT_NO_FLAGS);
keymap = xkb_keymap_new_from_names (context, &names, XKB_KEYMAP_COMPILE_NO_FLAGS); keymap = xkb_keymap_new_from_names (context, &names,
XKB_KEYMAP_COMPILE_NO_FLAGS);
xkb_context_unref (context); xkb_context_unref (context);
clutter_evdev_set_keyboard_map (manager, keymap); clutter_evdev_set_keyboard_map (manager, keymap);
@ -466,12 +491,12 @@ meta_backend_native_set_numlock (MetaBackend *backend,
} }
static gboolean static gboolean
meta_backend_native_get_relative_motion_deltas (MetaBackend *backend, meta_backend_native_get_relative_motion_deltas (MetaBackend *backend,
const ClutterEvent *event, const ClutterEvent *event,
double *dx, double *dx,
double *dy, double *dy,
double *dx_unaccel, double *dx_unaccel,
double *dy_unaccel) double *dy_unaccel)
{ {
return clutter_evdev_event_get_relative_motion (event, return clutter_evdev_event_get_relative_motion (event,
dx, dy, dx, dy,
@ -493,9 +518,9 @@ meta_backend_native_update_screen_size (MetaBackend *backend,
} }
static gboolean static gboolean
meta_backend_native_initable_init (GInitable *initable, meta_backend_native_initable_init (GInitable *initable,
GCancellable *cancellable, GCancellable *cancellable,
GError **error) GError **error)
{ {
if (!meta_is_stage_views_enabled ()) if (!meta_is_stage_views_enabled ())
{ {
@ -523,24 +548,31 @@ meta_backend_native_class_init (MetaBackendNativeClass *klass)
object_class->finalize = meta_backend_native_finalize; object_class->finalize = meta_backend_native_finalize;
backend_class->create_clutter_backend = meta_backend_native_create_clutter_backend; backend_class->create_clutter_backend =
meta_backend_native_create_clutter_backend;
backend_class->post_init = meta_backend_native_post_init; backend_class->post_init = meta_backend_native_post_init;
backend_class->create_monitor_manager = meta_backend_native_create_monitor_manager; backend_class->create_monitor_manager =
backend_class->create_cursor_renderer = meta_backend_native_create_cursor_renderer; meta_backend_native_create_monitor_manager;
backend_class->create_cursor_renderer =
meta_backend_native_create_cursor_renderer;
backend_class->create_renderer = meta_backend_native_create_renderer; backend_class->create_renderer = meta_backend_native_create_renderer;
backend_class->create_input_settings = meta_backend_native_create_input_settings; backend_class->create_input_settings =
meta_backend_native_create_input_settings;
backend_class->warp_pointer = meta_backend_native_warp_pointer; backend_class->warp_pointer = meta_backend_native_warp_pointer;
backend_class->get_current_logical_monitor = meta_backend_native_get_current_logical_monitor; backend_class->get_current_logical_monitor =
meta_backend_native_get_current_logical_monitor;
backend_class->set_keymap = meta_backend_native_set_keymap; backend_class->set_keymap = meta_backend_native_set_keymap;
backend_class->get_keymap = meta_backend_native_get_keymap; backend_class->get_keymap = meta_backend_native_get_keymap;
backend_class->get_keymap_layout_group = meta_backend_native_get_keymap_layout_group; backend_class->get_keymap_layout_group =
meta_backend_native_get_keymap_layout_group;
backend_class->lock_layout_group = meta_backend_native_lock_layout_group; backend_class->lock_layout_group = meta_backend_native_lock_layout_group;
backend_class->get_relative_motion_deltas = meta_backend_native_get_relative_motion_deltas; backend_class->get_relative_motion_deltas =
meta_backend_native_get_relative_motion_deltas;
backend_class->update_screen_size = meta_backend_native_update_screen_size; backend_class->update_screen_size = meta_backend_native_update_screen_size;
backend_class->set_numlock = meta_backend_native_set_numlock; backend_class->set_numlock = meta_backend_native_set_numlock;
} }
@ -548,7 +580,8 @@ meta_backend_native_class_init (MetaBackendNativeClass *klass)
static void static void
meta_backend_native_init (MetaBackendNative *native) meta_backend_native_init (MetaBackendNative *native)
{ {
MetaBackendNativePrivate *priv = meta_backend_native_get_instance_private (native); MetaBackendNativePrivate *priv = meta_backend_native_get_instance_private (
native);
GError *error = NULL; GError *error = NULL;
priv->launcher = meta_launcher_new (&error); priv->launcher = meta_launcher_new (&error);
@ -607,7 +640,8 @@ meta_activate_session (void)
return TRUE; return TRUE;
MetaBackendNative *native = META_BACKEND_NATIVE (backend); MetaBackendNative *native = META_BACKEND_NATIVE (backend);
MetaBackendNativePrivate *priv = meta_backend_native_get_instance_private (native); MetaBackendNativePrivate *priv = meta_backend_native_get_instance_private (
native);
if (!meta_launcher_activate_session (priv->launcher, &error)) if (!meta_launcher_activate_session (priv->launcher, &error))
{ {

View File

@ -46,7 +46,8 @@ struct _MetaBarrierManagerNative
GHashTable *barriers; GHashTable *barriers;
}; };
typedef enum { typedef enum
{
/* The barrier is active and responsive to pointer motion. */ /* The barrier is active and responsive to pointer motion. */
META_BARRIER_STATE_ACTIVE, META_BARRIER_STATE_ACTIVE,
@ -67,14 +68,14 @@ typedef enum {
struct _MetaBarrierImplNativePrivate struct _MetaBarrierImplNativePrivate
{ {
MetaBarrier *barrier; MetaBarrier *barrier;
MetaBarrierManagerNative *manager; MetaBarrierManagerNative *manager;
gboolean is_active; gboolean is_active;
MetaBarrierState state; MetaBarrierState state;
int trigger_serial; int trigger_serial;
guint32 last_event_time; guint32 last_event_time;
MetaBarrierDirection blocked_dir; MetaBarrierDirection blocked_dir;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (MetaBarrierImplNative, meta_barrier_impl_native, G_DEFINE_TYPE_WITH_PRIVATE (MetaBarrierImplNative, meta_barrier_impl_native,
@ -213,12 +214,15 @@ maybe_release_barriers (MetaBarrierManagerNative *manager,
float x, float x,
float y) float y)
{ {
MetaLine2 motion = { MetaLine2 motion =
.a = { {
.a =
{
.x = prev_x, .x = prev_x,
.y = prev_y, .y = prev_y,
}, },
.b = { .b =
{
.x = x, .x = x,
.y = y, .y = y,
}, },
@ -233,14 +237,14 @@ typedef struct _MetaClosestBarrierData
{ {
struct struct
{ {
MetaLine2 motion; MetaLine2 motion;
MetaBarrierDirection directions; MetaBarrierDirection directions;
} in; } in;
struct struct
{ {
float closest_distance_2; float closest_distance_2;
MetaBarrierImplNative *barrier_impl; MetaBarrierImplNative *barrier_impl;
} out; } out;
} MetaClosestBarrierData; } MetaClosestBarrierData;
@ -282,7 +286,7 @@ update_closest_barrier (gpointer key,
* barrier. */ * barrier. */
dx = intersection.x - data->in.motion.a.x; dx = intersection.x - data->in.motion.a.x;
dy = intersection.y - data->in.motion.a.y; dy = intersection.y - data->in.motion.a.y;
distance_2 = dx*dx + dy*dy; distance_2 = dx * dx + dy * dy;
if (data->out.barrier_impl == NULL || if (data->out.barrier_impl == NULL ||
distance_2 < data->out.closest_distance_2) distance_2 < data->out.closest_distance_2)
{ {
@ -303,13 +307,17 @@ get_closest_barrier (MetaBarrierManagerNative *manager,
MetaClosestBarrierData closest_barrier_data; MetaClosestBarrierData closest_barrier_data;
closest_barrier_data = (MetaClosestBarrierData) { closest_barrier_data = (MetaClosestBarrierData) {
.in = { .in =
.motion = { {
.a = { .motion =
{
.a =
{
.x = prev_x, .x = prev_x,
.y = prev_y, .y = prev_y,
}, },
.b = { .b =
{
.x = x, .x = x,
.y = y, .y = y,
}, },
@ -335,13 +343,13 @@ get_closest_barrier (MetaBarrierManagerNative *manager,
typedef struct _MetaBarrierEventData typedef struct _MetaBarrierEventData
{ {
guint32 time; guint32 time;
float prev_x; float prev_x;
float prev_y; float prev_y;
float x; float x;
float y; float y;
float dx; float dx;
float dy; float dy;
} MetaBarrierEventData; } MetaBarrierEventData;
static void static void
@ -372,7 +380,7 @@ emit_barrier_event (MetaBarrierImplNative *self,
case META_BARRIER_STATE_LEFT: case META_BARRIER_STATE_LEFT:
priv->state = META_BARRIER_STATE_ACTIVE; priv->state = META_BARRIER_STATE_ACTIVE;
/* Intentional fall-through. */ /* Intentional fall-through. */
case META_BARRIER_STATE_HELD: case META_BARRIER_STATE_HELD:
event->dt = time - priv->last_event_time; event->dt = time - priv->last_event_time;
@ -411,7 +419,8 @@ maybe_emit_barrier_event (gpointer key, gpointer value, gpointer user_data)
meta_barrier_impl_native_get_instance_private (self); meta_barrier_impl_native_get_instance_private (self);
MetaBarrierEventData *data = user_data; MetaBarrierEventData *data = user_data;
switch (priv->state) { switch (priv->state)
{
case META_BARRIER_STATE_ACTIVE: case META_BARRIER_STATE_ACTIVE:
break; break;
case META_BARRIER_STATE_HIT: case META_BARRIER_STATE_HIT:
@ -433,9 +442,9 @@ maybe_emit_barrier_event (gpointer key, gpointer value, gpointer user_data)
/* Clamp (x, y) to the barrier and remove clamped direction from motion_dir. */ /* Clamp (x, y) to the barrier and remove clamped direction from motion_dir. */
static void static void
clamp_to_barrier (MetaBarrierImplNative *self, clamp_to_barrier (MetaBarrierImplNative *self,
MetaBarrierDirection *motion_dir, MetaBarrierDirection *motion_dir,
float *x, float *x,
float *y) float *y)
{ {
MetaBarrierImplNativePrivate *priv = MetaBarrierImplNativePrivate *priv =
meta_barrier_impl_native_get_instance_private (self); meta_barrier_impl_native_get_instance_private (self);

View File

@ -46,7 +46,7 @@ G_DEFINE_TYPE (MetaClutterBackendNative, meta_clutter_backend_native,
CLUTTER_TYPE_BACKEND_EGL_NATIVE) CLUTTER_TYPE_BACKEND_EGL_NATIVE)
MetaStageNative * MetaStageNative *
meta_clutter_backend_native_get_stage_native (ClutterBackend *backend) meta_clutter_backend_native_get_stage_native (ClutterBackend * backend)
{ {
MetaClutterBackendNative *clutter_backend_native = MetaClutterBackendNative *clutter_backend_native =
META_CLUTTER_BACKEND_NATIVE (backend); META_CLUTTER_BACKEND_NATIVE (backend);
@ -55,8 +55,8 @@ meta_clutter_backend_native_get_stage_native (ClutterBackend *backend)
} }
static CoglRenderer * static CoglRenderer *
meta_clutter_backend_native_get_renderer (ClutterBackend *clutter_backend, meta_clutter_backend_native_get_renderer (ClutterBackend *clutter_backend,
GError **error) GError **error)
{ {
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
MetaRenderer *renderer = meta_backend_get_renderer (backend); MetaRenderer *renderer = meta_backend_get_renderer (backend);
@ -65,9 +65,9 @@ meta_clutter_backend_native_get_renderer (ClutterBackend *clutter_backend,
} }
static ClutterStageWindow * static ClutterStageWindow *
meta_clutter_backend_native_create_stage (ClutterBackend *backend, meta_clutter_backend_native_create_stage (ClutterBackend *backend,
ClutterStage *wrapper, ClutterStage *wrapper,
GError **error) GError **error)
{ {
MetaClutterBackendNative *clutter_backend_native = MetaClutterBackendNative *clutter_backend_native =
META_CLUTTER_BACKEND_NATIVE (backend); META_CLUTTER_BACKEND_NATIVE (backend);
@ -82,7 +82,7 @@ meta_clutter_backend_native_create_stage (ClutterBackend *backend,
} }
static void static void
meta_clutter_backend_native_bell_notify (ClutterBackend *backend) meta_clutter_backend_native_bell_notify (ClutterBackend *backend)
{ {
MetaDisplay *display = meta_get_display (); MetaDisplay *display = meta_get_display ();
@ -90,7 +90,8 @@ meta_clutter_backend_native_bell_notify (ClutterBackend *backend)
} }
static void static void
meta_clutter_backend_native_init (MetaClutterBackendNative *clutter_backend_nativen) meta_clutter_backend_native_init (
MetaClutterBackendNative *clutter_backend_nativen)
{ {
} }
@ -99,7 +100,9 @@ meta_clutter_backend_native_class_init (MetaClutterBackendNativeClass *klass)
{ {
ClutterBackendClass *clutter_backend_class = CLUTTER_BACKEND_CLASS (klass); ClutterBackendClass *clutter_backend_class = CLUTTER_BACKEND_CLASS (klass);
clutter_backend_class->get_renderer = meta_clutter_backend_native_get_renderer; clutter_backend_class->get_renderer =
clutter_backend_class->create_stage = meta_clutter_backend_native_create_stage; meta_clutter_backend_native_get_renderer;
clutter_backend_class->create_stage =
meta_clutter_backend_native_create_stage;
clutter_backend_class->bell_notify = meta_clutter_backend_native_bell_notify; clutter_backend_class->bell_notify = meta_clutter_backend_native_bell_notify;
} }

View File

@ -48,8 +48,8 @@ typedef struct _MetaCrtcKms
} MetaCrtcKms; } MetaCrtcKms;
gboolean gboolean
meta_crtc_kms_is_transform_handled (MetaCrtc *crtc, meta_crtc_kms_is_transform_handled (MetaCrtc *crtc,
MetaMonitorTransform transform) MetaMonitorTransform transform)
{ {
MetaCrtcKms *crtc_kms = crtc->driver_private; MetaCrtcKms *crtc_kms = crtc->driver_private;
@ -132,7 +132,6 @@ meta_crtc_kms_set_underscan (MetaCrtc *crtc,
DRM_MODE_OBJECT_CRTC, DRM_MODE_OBJECT_CRTC,
crtc_kms->underscan_vborder_prop_id, value); crtc_kms->underscan_vborder_prop_id, value);
} }
} }
else else
{ {
@ -143,10 +142,10 @@ meta_crtc_kms_set_underscan (MetaCrtc *crtc,
} }
static int static int
find_property_index (MetaGpu *gpu, find_property_index (MetaGpu *gpu,
drmModeObjectPropertiesPtr props, drmModeObjectPropertiesPtr props,
const char *prop_name, const char *prop_name,
drmModePropertyPtr *out_prop) drmModePropertyPtr *out_prop)
{ {
MetaGpuKms *gpu_kms = META_GPU_KMS (gpu); MetaGpuKms *gpu_kms = META_GPU_KMS (gpu);
int kms_fd; int kms_fd;
@ -429,9 +428,9 @@ meta_crtc_destroy_notify (MetaCrtc *crtc)
} }
MetaCrtc * MetaCrtc *
meta_create_kms_crtc (MetaGpuKms *gpu_kms, meta_create_kms_crtc (MetaGpuKms *gpu_kms,
drmModeCrtc *drm_crtc, drmModeCrtc *drm_crtc,
unsigned int crtc_index) unsigned int crtc_index)
{ {
MetaGpu *gpu = META_GPU (gpu_kms); MetaGpu *gpu = META_GPU (gpu_kms);
MetaCrtc *crtc; MetaCrtc *crtc;
@ -448,7 +447,7 @@ meta_create_kms_crtc (MetaGpuKms *gpu_kms,
crtc->is_dirty = FALSE; crtc->is_dirty = FALSE;
crtc->transform = META_MONITOR_TRANSFORM_NORMAL; crtc->transform = META_MONITOR_TRANSFORM_NORMAL;
crtc->all_transforms = meta_is_stage_views_enabled () ? crtc->all_transforms = meta_is_stage_views_enabled () ?
ALL_TRANSFORMS_MASK : META_MONITOR_TRANSFORM_NORMAL; ALL_TRANSFORMS_MASK : META_MONITOR_TRANSFORM_NORMAL;
if (drm_crtc->mode_valid) if (drm_crtc->mode_valid)
{ {

View File

@ -116,7 +116,9 @@ typedef struct _MetaCursorNativePrivate
static GQuark quark_cursor_renderer_native_gpu_data = 0; static GQuark quark_cursor_renderer_native_gpu_data = 0;
G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorRendererNative, meta_cursor_renderer_native, META_TYPE_CURSOR_RENDERER); G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorRendererNative,
meta_cursor_renderer_native,
META_TYPE_CURSOR_RENDERER);
static void static void
realize_cursor_sprite (MetaCursorRenderer *renderer, realize_cursor_sprite (MetaCursorRenderer *renderer,
@ -172,7 +174,8 @@ meta_cursor_renderer_native_finalize (GObject *object)
} }
static guint static guint
get_pending_cursor_sprite_gbm_bo_index (MetaCursorNativeGpuState *cursor_gpu_state) get_pending_cursor_sprite_gbm_bo_index (
MetaCursorNativeGpuState *cursor_gpu_state)
{ {
return (cursor_gpu_state->active_bo + 1) % HW_CURSOR_BUFFER_COUNT; return (cursor_gpu_state->active_bo + 1) % HW_CURSOR_BUFFER_COUNT;
} }
@ -333,11 +336,13 @@ update_monitor_crtc_cursor (MetaMonitor *monitor,
} }
scaled_crtc_rect = (ClutterRect) { scaled_crtc_rect = (ClutterRect) {
.origin = { .origin =
{
.x = crtc_x / scale, .x = crtc_x / scale,
.y = crtc_y / scale .y = crtc_y / scale
}, },
.size = { .size =
{
.width = crtc_width / scale, .width = crtc_width / scale,
.height = crtc_height / scale .height = crtc_height / scale
}, },
@ -395,7 +400,9 @@ update_hw_cursor (MetaCursorRendererNative *native,
if (cursor_sprite) if (cursor_sprite)
rect = meta_cursor_renderer_calculate_rect (renderer, cursor_sprite); rect = meta_cursor_renderer_calculate_rect (renderer, cursor_sprite);
else else
rect = (ClutterRect) { 0 }; rect = (ClutterRect) {
0
};
logical_monitors = logical_monitors =
meta_monitor_manager_get_logical_monitors (monitor_manager); meta_monitor_manager_get_logical_monitors (monitor_manager);
@ -410,7 +417,8 @@ update_hw_cursor (MetaCursorRendererNative *native,
.in_cursor_renderer_native = native, .in_cursor_renderer_native = native,
.in_logical_monitor = logical_monitor, .in_logical_monitor = logical_monitor,
.in_local_cursor_rect = (ClutterRect) { .in_local_cursor_rect = (ClutterRect) {
.origin = { .origin =
{
.x = rect.origin.x - logical_monitor->rect.x, .x = rect.origin.x - logical_monitor->rect.x,
.y = rect.origin.y - logical_monitor->rect.y .y = rect.origin.y - logical_monitor->rect.y
}, },
@ -512,7 +520,8 @@ cursor_over_transformed_logical_monitor (MetaCursorRenderer *renderer,
transform = meta_logical_monitor_get_transform (logical_monitor); transform = meta_logical_monitor_get_transform (logical_monitor);
/* Get transform corrected for LCD panel-orientation. */ /* Get transform corrected for LCD panel-orientation. */
transform = meta_monitor_logical_to_crtc_transform (monitor, transform); transform =
meta_monitor_logical_to_crtc_transform (monitor, transform);
if (transform != META_MONITOR_TRANSFORM_NORMAL) if (transform != META_MONITOR_TRANSFORM_NORMAL)
return TRUE; return TRUE;
} }
@ -544,7 +553,7 @@ can_draw_cursor_unscaled (MetaCursorRenderer *renderer,
gboolean has_visible_crtc_sprite = FALSE; gboolean has_visible_crtc_sprite = FALSE;
if (!meta_is_stage_views_scaled ()) if (!meta_is_stage_views_scaled ())
return meta_cursor_sprite_get_texture_scale (cursor_sprite) == 1.0; return meta_cursor_sprite_get_texture_scale (cursor_sprite) == 1.0;
logical_monitors = logical_monitors =
meta_monitor_manager_get_logical_monitors (monitor_manager); meta_monitor_manager_get_logical_monitors (monitor_manager);
@ -856,7 +865,7 @@ load_cursor_sprite_gbm_buffer_for_gpu (MetaCursorRendererNative *native,
if (width > cursor_width || height > cursor_height) if (width > cursor_width || height > cursor_height)
{ {
meta_warning ("Invalid theme cursor size (must be at most %ux%u)\n", meta_warning ("Invalid theme cursor size (must be at most %ux%u)\n",
(unsigned int)cursor_width, (unsigned int)cursor_height); (unsigned int) cursor_width, (unsigned int) cursor_height);
return; return;
} }
@ -876,7 +885,7 @@ load_cursor_sprite_gbm_buffer_for_gpu (MetaCursorRendererNative *native,
return; return;
} }
memset (buf, 0, sizeof(buf)); memset (buf, 0, sizeof (buf));
for (i = 0; i < height; i++) for (i = 0; i < height; i++)
memcpy (buf + i * 4 * cursor_width, pixels + i * rowstride, width * 4); memcpy (buf + i * 4 * cursor_width, pixels + i * rowstride, width * 4);
if (gbm_bo_write (bo, buf, cursor_width * cursor_height * 4) != 0) if (gbm_bo_write (bo, buf, cursor_width * cursor_height * 4) != 0)
@ -1015,7 +1024,8 @@ realize_cursor_sprite_from_wl_buffer_for_gpu (MetaCursorRenderer *renderer,
if (width != cursor_width || height != cursor_height) if (width != cursor_width || height != cursor_height)
{ {
meta_warning ("Invalid cursor size (must be 64x64), falling back to software (GL) cursors\n"); meta_warning (
"Invalid cursor size (must be 64x64), falling back to software (GL) cursors\n");
return; return;
} }

View File

@ -85,9 +85,9 @@ kms_event_check (GSource *source)
} }
static gboolean static gboolean
kms_event_dispatch (GSource *source, kms_event_dispatch (GSource *source,
GSourceFunc callback, GSourceFunc callback,
gpointer user_data) gpointer user_data)
{ {
MetaKmsSource *kms_source = (MetaKmsSource *) source; MetaKmsSource *kms_source = (MetaKmsSource *) source;
@ -96,17 +96,18 @@ kms_event_dispatch (GSource *source,
return G_SOURCE_CONTINUE; return G_SOURCE_CONTINUE;
} }
static GSourceFuncs kms_event_funcs = { static GSourceFuncs kms_event_funcs =
{
NULL, NULL,
kms_event_check, kms_event_check,
kms_event_dispatch kms_event_dispatch
}; };
static void static void
get_crtc_drm_connectors (MetaGpu *gpu, get_crtc_drm_connectors (MetaGpu *gpu,
MetaCrtc *crtc, MetaCrtc *crtc,
uint32_t **connectors, uint32_t **connectors,
unsigned int *n_connectors) unsigned int *n_connectors)
{ {
GArray *connectors_array = g_array_new (FALSE, FALSE, sizeof (uint32_t)); GArray *connectors_array = g_array_new (FALSE, FALSE, sizeof (uint32_t));
GList *l; GList *l;
@ -169,7 +170,8 @@ static void
invoke_flip_closure (GClosure *flip_closure, invoke_flip_closure (GClosure *flip_closure,
MetaGpuKms *gpu_kms) MetaGpuKms *gpu_kms)
{ {
GValue params[] = { GValue params[] =
{
G_VALUE_INIT, G_VALUE_INIT,
G_VALUE_INIT G_VALUE_INIT
}; };
@ -232,7 +234,8 @@ meta_gpu_kms_wrap_flip_closure (MetaGpuKms *gpu_kms,
} }
void void
meta_gpu_kms_flip_closure_container_free (MetaGpuKmsFlipClosureContainer *closure_container) meta_gpu_kms_flip_closure_container_free (
MetaGpuKmsFlipClosureContainer *closure_container)
{ {
g_free (closure_container); g_free (closure_container);
} }
@ -301,11 +304,11 @@ meta_gpu_kms_flip_crtc (MetaGpuKms *gpu_kms,
} }
static void static void
page_flip_handler (int fd, page_flip_handler (int fd,
unsigned int frame, unsigned int frame,
unsigned int sec, unsigned int sec,
unsigned int usec, unsigned int usec,
void *user_data) void *user_data)
{ {
MetaGpuKmsFlipClosureContainer *closure_container = user_data; MetaGpuKmsFlipClosureContainer *closure_container = user_data;
GClosure *flip_closure = closure_container->flip_closure; GClosure *flip_closure = closure_container->flip_closure;
@ -601,7 +604,8 @@ init_modes (MetaGpuKms *gpu_kms,
/* /*
* Gather all modes on all connected connectors. * Gather all modes on all connected connectors.
*/ */
modes_table = g_hash_table_new (drm_mode_hash, (GEqualFunc) meta_drm_mode_equal); modes_table = g_hash_table_new (drm_mode_hash,
(GEqualFunc) meta_drm_mode_equal);
for (i = 0; i < gpu_kms->n_connectors; i++) for (i = 0; i < gpu_kms->n_connectors; i++)
{ {
drmModeConnector *drm_connector; drmModeConnector *drm_connector;
@ -733,9 +737,9 @@ init_outputs (MetaGpuKms *gpu_kms,
} }
static gboolean static gboolean
meta_kms_resources_init (MetaKmsResources *resources, meta_kms_resources_init (MetaKmsResources *resources,
int fd, int fd,
GError **error) GError **error)
{ {
drmModeRes *drm_resources; drmModeRes *drm_resources;
@ -775,8 +779,8 @@ meta_kms_resources_release (MetaKmsResources *resources)
} }
static gboolean static gboolean
meta_gpu_kms_read_current (MetaGpu *gpu, meta_gpu_kms_read_current (MetaGpu *gpu,
GError **error) GError **error)
{ {
MetaGpuKms *gpu_kms = META_GPU_KMS (gpu); MetaGpuKms *gpu_kms = META_GPU_KMS (gpu);
MetaMonitorManager *monitor_manager = MetaMonitorManager *monitor_manager =
@ -788,8 +792,9 @@ meta_gpu_kms_read_current (MetaGpu *gpu,
{ {
if (!gpu_kms->resources_init_failed_before) if (!gpu_kms->resources_init_failed_before)
{ {
g_warning ("meta_kms_resources_init failed: %s, assuming we have no outputs", g_warning (
local_error->message); "meta_kms_resources_init failed: %s, assuming we have no outputs",
local_error->message);
gpu_kms->resources_init_failed_before = TRUE; gpu_kms->resources_init_failed_before = TRUE;
} }
return TRUE; return TRUE;
@ -801,9 +806,9 @@ meta_gpu_kms_read_current (MetaGpu *gpu,
monitor_manager->power_save_mode = META_POWER_SAVE_ON; monitor_manager->power_save_mode = META_POWER_SAVE_ON;
/* Note: we must not free the public structures (output, crtc, monitor /* Note: we must not free the public structures (output, crtc, monitor
mode and monitor info) here, they must be kept alive until the API * mode and monitor info) here, they must be kept alive until the API
users are done with them after we emit monitors-changed, and thus * users are done with them after we emit monitors-changed, and thus
are freed by the platform-independent layer. */ * are freed by the platform-independent layer. */
free_resources (gpu_kms); free_resources (gpu_kms);
init_connectors (gpu_kms, resources.resources); init_connectors (gpu_kms, resources.resources);
@ -823,9 +828,9 @@ meta_gpu_kms_can_have_outputs (MetaGpuKms *gpu_kms)
} }
MetaGpuKms * MetaGpuKms *
meta_gpu_kms_new (MetaMonitorManagerKms *monitor_manager_kms, meta_gpu_kms_new (MetaMonitorManagerKms *monitor_manager_kms,
const char *kms_file_path, const char *kms_file_path,
GError **error) GError **error)
{ {
MetaMonitorManager *monitor_manager = MetaMonitorManager *monitor_manager =
META_MONITOR_MANAGER (monitor_manager_kms); META_MONITOR_MANAGER (monitor_manager_kms);

View File

@ -31,12 +31,13 @@
#include "backends/native/meta-input-settings-native.h" #include "backends/native/meta-input-settings-native.h"
#include "clutter/evdev/clutter-evdev.h" #include "clutter/evdev/clutter-evdev.h"
G_DEFINE_TYPE (MetaInputSettingsNative, meta_input_settings_native, META_TYPE_INPUT_SETTINGS) G_DEFINE_TYPE (MetaInputSettingsNative, meta_input_settings_native,
META_TYPE_INPUT_SETTINGS)
static void static void
meta_input_settings_native_set_send_events (MetaInputSettings *settings, meta_input_settings_native_set_send_events (MetaInputSettings *settings,
ClutterInputDevice *device, ClutterInputDevice *device,
GDesktopDeviceSendEvents mode) GDesktopDeviceSendEvents mode)
{ {
enum libinput_config_send_events_mode libinput_mode; enum libinput_config_send_events_mode libinput_mode;
struct libinput_device *libinput_device; struct libinput_device *libinput_device;
@ -122,9 +123,10 @@ meta_input_settings_native_set_tap_enabled (MetaInputSettings *settings,
} }
static void static void
meta_input_settings_native_set_tap_and_drag_enabled (MetaInputSettings *settings, meta_input_settings_native_set_tap_and_drag_enabled (
ClutterInputDevice *device, MetaInputSettings *settings,
gboolean enabled) ClutterInputDevice *device,
gboolean enabled)
{ {
struct libinput_device *libinput_device; struct libinput_device *libinput_device;
@ -140,9 +142,10 @@ meta_input_settings_native_set_tap_and_drag_enabled (MetaInputSettings *setting
} }
static void static void
meta_input_settings_native_set_disable_while_typing (MetaInputSettings *settings, meta_input_settings_native_set_disable_while_typing (
ClutterInputDevice *device, MetaInputSettings *settings,
gboolean enabled) ClutterInputDevice *device,
gboolean enabled)
{ {
struct libinput_device *libinput_device; struct libinput_device *libinput_device;
@ -175,8 +178,8 @@ meta_input_settings_native_set_invert_scroll (MetaInputSettings *settings,
} }
static gboolean static gboolean
device_set_scroll_method (struct libinput_device *libinput_device, device_set_scroll_method (struct libinput_device *libinput_device,
enum libinput_config_scroll_method method) enum libinput_config_scroll_method method)
{ {
enum libinput_config_status status = enum libinput_config_status status =
libinput_device_config_scroll_set_method (libinput_device, method); libinput_device_config_scroll_set_method (libinput_device, method);
@ -184,8 +187,8 @@ device_set_scroll_method (struct libinput_device *libinput_device,
} }
static gboolean static gboolean
device_set_click_method (struct libinput_device *libinput_device, device_set_click_method (struct libinput_device *libinput_device,
enum libinput_config_click_method method) enum libinput_config_click_method method)
{ {
enum libinput_config_status status = enum libinput_config_status status =
libinput_device_config_click_set_method (libinput_device, method); libinput_device_config_click_set_method (libinput_device, method);
@ -193,16 +196,18 @@ device_set_click_method (struct libinput_device *libinput_device,
} }
static void static void
meta_input_settings_native_set_edge_scroll (MetaInputSettings *settings, meta_input_settings_native_set_edge_scroll (MetaInputSettings *settings,
ClutterInputDevice *device, ClutterInputDevice *device,
gboolean edge_scrolling_enabled) gboolean edge_scrolling_enabled)
{ {
struct libinput_device *libinput_device; struct libinput_device *libinput_device;
enum libinput_config_scroll_method current, method; enum libinput_config_scroll_method current, method;
libinput_device = clutter_evdev_input_device_get_libinput_device (device); libinput_device = clutter_evdev_input_device_get_libinput_device (device);
method = edge_scrolling_enabled ? LIBINPUT_CONFIG_SCROLL_EDGE : LIBINPUT_CONFIG_SCROLL_NO_SCROLL; method =
edge_scrolling_enabled ? LIBINPUT_CONFIG_SCROLL_EDGE :
LIBINPUT_CONFIG_SCROLL_NO_SCROLL;
current = libinput_device_config_scroll_get_method (libinput_device); current = libinput_device_config_scroll_get_method (libinput_device);
current &= ~LIBINPUT_CONFIG_SCROLL_EDGE; current &= ~LIBINPUT_CONFIG_SCROLL_EDGE;
@ -210,16 +215,18 @@ meta_input_settings_native_set_edge_scroll (MetaInputSettings *settin
} }
static void static void
meta_input_settings_native_set_two_finger_scroll (MetaInputSettings *settings, meta_input_settings_native_set_two_finger_scroll (MetaInputSettings *settings,
ClutterInputDevice *device, ClutterInputDevice *device,
gboolean two_finger_scroll_enabled) gboolean two_finger_scroll_enabled)
{ {
struct libinput_device *libinput_device; struct libinput_device *libinput_device;
enum libinput_config_scroll_method current, method; enum libinput_config_scroll_method current, method;
libinput_device = clutter_evdev_input_device_get_libinput_device (device); libinput_device = clutter_evdev_input_device_get_libinput_device (device);
method = two_finger_scroll_enabled ? LIBINPUT_CONFIG_SCROLL_2FG : LIBINPUT_CONFIG_SCROLL_NO_SCROLL; method =
two_finger_scroll_enabled ? LIBINPUT_CONFIG_SCROLL_2FG :
LIBINPUT_CONFIG_SCROLL_NO_SCROLL;
current = libinput_device_config_scroll_get_method (libinput_device); current = libinput_device_config_scroll_get_method (libinput_device);
current &= ~LIBINPUT_CONFIG_SCROLL_2FG; current &= ~LIBINPUT_CONFIG_SCROLL_2FG;
@ -236,7 +243,8 @@ meta_input_settings_native_has_two_finger_scroll (MetaInputSettings *settings,
if (!libinput_device) if (!libinput_device)
return FALSE; return FALSE;
return libinput_device_config_scroll_get_methods (libinput_device) & LIBINPUT_CONFIG_SCROLL_2FG; return libinput_device_config_scroll_get_methods (libinput_device) &
LIBINPUT_CONFIG_SCROLL_2FG;
} }
static void static void
@ -275,9 +283,10 @@ meta_input_settings_native_set_scroll_button (MetaInputSettings *settings,
} }
static void static void
meta_input_settings_native_set_click_method (MetaInputSettings *settings, meta_input_settings_native_set_click_method (
ClutterInputDevice *device, MetaInputSettings *settings,
GDesktopTouchpadClickMethod mode) ClutterInputDevice *device,
GDesktopTouchpadClickMethod mode)
{ {
enum libinput_config_click_method click_method = 0; enum libinput_config_click_method click_method = 0;
struct libinput_device *libinput_device; struct libinput_device *libinput_device;
@ -289,7 +298,8 @@ meta_input_settings_native_set_click_method (MetaInputSettings *settin
switch (mode) switch (mode)
{ {
case G_DESKTOP_TOUCHPAD_CLICK_METHOD_DEFAULT: case G_DESKTOP_TOUCHPAD_CLICK_METHOD_DEFAULT:
click_method = libinput_device_config_click_get_default_method (libinput_device); click_method = libinput_device_config_click_get_default_method (
libinput_device);
break; break;
case G_DESKTOP_TOUCHPAD_CLICK_METHOD_NONE: case G_DESKTOP_TOUCHPAD_CLICK_METHOD_NONE:
click_method = LIBINPUT_CONFIG_CLICK_METHOD_NONE; click_method = LIBINPUT_CONFIG_CLICK_METHOD_NONE;
@ -303,7 +313,7 @@ meta_input_settings_native_set_click_method (MetaInputSettings *settin
default: default:
g_assert_not_reached (); g_assert_not_reached ();
return; return;
} }
device_set_click_method (libinput_device, click_method); device_set_click_method (libinput_device, click_method);
} }
@ -405,9 +415,10 @@ meta_input_settings_native_is_trackball_device (MetaInputSettings *settings,
} }
static void static void
meta_input_settings_native_set_mouse_accel_profile (MetaInputSettings *settings, meta_input_settings_native_set_mouse_accel_profile (
ClutterInputDevice *device, MetaInputSettings *settings,
GDesktopPointerAccelProfile profile) ClutterInputDevice *device,
GDesktopPointerAccelProfile profile)
{ {
if (!is_mouse_device (device)) if (!is_mouse_device (device))
return; return;
@ -416,9 +427,10 @@ meta_input_settings_native_set_mouse_accel_profile (MetaInputSettings *
} }
static void static void
meta_input_settings_native_set_trackball_accel_profile (MetaInputSettings *settings, meta_input_settings_native_set_trackball_accel_profile (
ClutterInputDevice *device, MetaInputSettings *settings,
GDesktopPointerAccelProfile profile) ClutterInputDevice *device,
GDesktopPointerAccelProfile profile)
{ {
if (!meta_input_settings_native_is_trackball_device (settings, device)) if (!meta_input_settings_native_is_trackball_device (settings, device))
return; return;
@ -427,9 +439,9 @@ meta_input_settings_native_set_trackball_accel_profile (MetaInputSettings
} }
static void static void
meta_input_settings_native_set_tablet_mapping (MetaInputSettings *settings, meta_input_settings_native_set_tablet_mapping (MetaInputSettings *settings,
ClutterInputDevice *device, ClutterInputDevice *device,
GDesktopTabletMapping mapping) GDesktopTabletMapping mapping)
{ {
ClutterInputDeviceMapping dev_mapping; ClutterInputDeviceMapping dev_mapping;
@ -467,9 +479,9 @@ meta_input_settings_native_set_tablet_keep_aspect (MetaInputSettings *settings,
backend = meta_get_backend (); backend = meta_get_backend ();
monitor_manager = meta_backend_get_monitor_manager (backend); monitor_manager = meta_backend_get_monitor_manager (backend);
meta_monitor_manager_get_screen_size (monitor_manager, meta_monitor_manager_get_screen_size (monitor_manager,
&width, &width,
&height); &height);
} }
aspect_ratio = (double) width / height; aspect_ratio = (double) width / height;
@ -497,8 +509,11 @@ meta_input_settings_native_set_tablet_area (MetaInputSettings *settings,
offset_x = -padding_left * scale_x; offset_x = -padding_left * scale_x;
offset_y = -padding_top * scale_y; offset_y = -padding_top * scale_y;
gfloat matrix[6] = { scale_x, 0., offset_x, gfloat matrix[6] =
0., scale_y, offset_y }; {
scale_x, 0., offset_x,
0., scale_y, offset_y
};
libinput_device = clutter_evdev_input_device_get_libinput_device (device); libinput_device = clutter_evdev_input_device_get_libinput_device (device);
if (!libinput_device || if (!libinput_device ||
@ -509,10 +524,11 @@ meta_input_settings_native_set_tablet_area (MetaInputSettings *settings,
} }
static void static void
meta_input_settings_native_set_stylus_pressure (MetaInputSettings *settings, meta_input_settings_native_set_stylus_pressure (
ClutterInputDevice *device, MetaInputSettings *settings,
ClutterInputDeviceTool *tool, ClutterInputDevice *device,
const gint curve[4]) ClutterInputDeviceTool *tool,
const gint curve[4])
{ {
gdouble pressure_curve[4]; gdouble pressure_curve[4];
@ -544,16 +560,18 @@ action_to_evcode (GDesktopStylusButtonAction action)
} }
static void static void
meta_input_settings_native_set_stylus_button_map (MetaInputSettings *settings, meta_input_settings_native_set_stylus_button_map (
ClutterInputDevice *device, MetaInputSettings *settings,
ClutterInputDeviceTool *tool, ClutterInputDevice *device,
GDesktopStylusButtonAction primary, ClutterInputDeviceTool *tool,
GDesktopStylusButtonAction secondary, GDesktopStylusButtonAction primary,
GDesktopStylusButtonAction tertiary) GDesktopStylusButtonAction secondary,
GDesktopStylusButtonAction tertiary)
{ {
clutter_evdev_input_device_tool_set_button_code (tool, CLUTTER_BUTTON_MIDDLE, clutter_evdev_input_device_tool_set_button_code (tool, CLUTTER_BUTTON_MIDDLE,
action_to_evcode (primary)); action_to_evcode (primary));
clutter_evdev_input_device_tool_set_button_code (tool, CLUTTER_BUTTON_SECONDARY, clutter_evdev_input_device_tool_set_button_code (tool,
CLUTTER_BUTTON_SECONDARY,
action_to_evcode (secondary)); action_to_evcode (secondary));
clutter_evdev_input_device_tool_set_button_code (tool, 8, /* Back */ clutter_evdev_input_device_tool_set_button_code (tool, 8, /* Back */
action_to_evcode (tertiary)); action_to_evcode (tertiary));
@ -562,34 +580,55 @@ meta_input_settings_native_set_stylus_button_map (MetaInputSettings *se
static void static void
meta_input_settings_native_class_init (MetaInputSettingsNativeClass *klass) meta_input_settings_native_class_init (MetaInputSettingsNativeClass *klass)
{ {
MetaInputSettingsClass *input_settings_class = META_INPUT_SETTINGS_CLASS (klass); MetaInputSettingsClass *input_settings_class = META_INPUT_SETTINGS_CLASS (
klass);
input_settings_class->set_send_events = meta_input_settings_native_set_send_events; input_settings_class->set_send_events =
meta_input_settings_native_set_send_events;
input_settings_class->set_matrix = meta_input_settings_native_set_matrix; input_settings_class->set_matrix = meta_input_settings_native_set_matrix;
input_settings_class->set_speed = meta_input_settings_native_set_speed; input_settings_class->set_speed = meta_input_settings_native_set_speed;
input_settings_class->set_left_handed = meta_input_settings_native_set_left_handed; input_settings_class->set_left_handed =
input_settings_class->set_tap_enabled = meta_input_settings_native_set_tap_enabled; meta_input_settings_native_set_left_handed;
input_settings_class->set_tap_and_drag_enabled = meta_input_settings_native_set_tap_and_drag_enabled; input_settings_class->set_tap_enabled =
input_settings_class->set_invert_scroll = meta_input_settings_native_set_invert_scroll; meta_input_settings_native_set_tap_enabled;
input_settings_class->set_edge_scroll = meta_input_settings_native_set_edge_scroll; input_settings_class->set_tap_and_drag_enabled =
input_settings_class->set_two_finger_scroll = meta_input_settings_native_set_two_finger_scroll; meta_input_settings_native_set_tap_and_drag_enabled;
input_settings_class->set_scroll_button = meta_input_settings_native_set_scroll_button; input_settings_class->set_invert_scroll =
input_settings_class->set_click_method = meta_input_settings_native_set_click_method; meta_input_settings_native_set_invert_scroll;
input_settings_class->set_keyboard_repeat = meta_input_settings_native_set_keyboard_repeat; input_settings_class->set_edge_scroll =
input_settings_class->set_disable_while_typing = meta_input_settings_native_set_disable_while_typing; meta_input_settings_native_set_edge_scroll;
input_settings_class->set_two_finger_scroll =
meta_input_settings_native_set_two_finger_scroll;
input_settings_class->set_scroll_button =
meta_input_settings_native_set_scroll_button;
input_settings_class->set_click_method =
meta_input_settings_native_set_click_method;
input_settings_class->set_keyboard_repeat =
meta_input_settings_native_set_keyboard_repeat;
input_settings_class->set_disable_while_typing =
meta_input_settings_native_set_disable_while_typing;
input_settings_class->set_tablet_mapping = meta_input_settings_native_set_tablet_mapping; input_settings_class->set_tablet_mapping =
input_settings_class->set_tablet_keep_aspect = meta_input_settings_native_set_tablet_keep_aspect; meta_input_settings_native_set_tablet_mapping;
input_settings_class->set_tablet_area = meta_input_settings_native_set_tablet_area; input_settings_class->set_tablet_keep_aspect =
meta_input_settings_native_set_tablet_keep_aspect;
input_settings_class->set_tablet_area =
meta_input_settings_native_set_tablet_area;
input_settings_class->set_mouse_accel_profile = meta_input_settings_native_set_mouse_accel_profile; input_settings_class->set_mouse_accel_profile =
input_settings_class->set_trackball_accel_profile = meta_input_settings_native_set_trackball_accel_profile; meta_input_settings_native_set_mouse_accel_profile;
input_settings_class->set_trackball_accel_profile =
meta_input_settings_native_set_trackball_accel_profile;
input_settings_class->set_stylus_pressure = meta_input_settings_native_set_stylus_pressure; input_settings_class->set_stylus_pressure =
input_settings_class->set_stylus_button_map = meta_input_settings_native_set_stylus_button_map; meta_input_settings_native_set_stylus_pressure;
input_settings_class->set_stylus_button_map =
meta_input_settings_native_set_stylus_button_map;
input_settings_class->has_two_finger_scroll = meta_input_settings_native_has_two_finger_scroll; input_settings_class->has_two_finger_scroll =
input_settings_class->is_trackball_device = meta_input_settings_native_is_trackball_device; meta_input_settings_native_has_two_finger_scroll;
input_settings_class->is_trackball_device =
meta_input_settings_native_is_trackball_device;
} }
static void static void

View File

@ -60,10 +60,13 @@ meta_launcher_get_seat_id (MetaLauncher *launcher)
} }
static gboolean static gboolean
find_systemd_session (gchar **session_id, find_systemd_session (gchar **session_id,
GError **error) GError **error)
{ {
const gchar * const graphical_session_types[] = { "wayland", "x11", "mir", NULL }; const gchar * const graphical_session_types[] =
{
"wayland", "x11", "mir", NULL
};
const gchar * const active_states[] = { "active", "online", NULL }; const gchar * const active_states[] = { "active", "online", NULL };
g_autofree gchar *class = NULL; g_autofree gchar *class = NULL;
g_autofree gchar *local_session_id = NULL; g_autofree gchar *local_session_id = NULL;
@ -116,43 +119,43 @@ find_systemd_session (gchar **session_id,
return FALSE; return FALSE;
} }
if (n_sessions == 0) if (n_sessions == 0)
{ {
g_set_error (error, g_set_error (error,
G_IO_ERROR, G_IO_ERROR,
G_IO_ERROR_NOT_FOUND, G_IO_ERROR_NOT_FOUND,
"User %d has no sessions", "User %d has no sessions",
getuid ()); getuid ());
return FALSE; return FALSE;
} }
for (int i = 0; i < n_sessions; ++i) for (int i = 0; i < n_sessions; ++i)
{ {
saved_errno = sd_session_get_class (sessions[i], &class); saved_errno = sd_session_get_class (sessions[i], &class);
if (saved_errno < 0) if (saved_errno < 0)
{ {
g_warning ("Couldn't get class for session '%d': %s", g_warning ("Couldn't get class for session '%d': %s",
i, i,
g_strerror (-saved_errno)); g_strerror (-saved_errno));
continue; continue;
} }
if (g_strcmp0 (class, "greeter") == 0) if (g_strcmp0 (class, "greeter") == 0)
{ {
local_session_id = g_strdup (sessions[i]); local_session_id = g_strdup (sessions[i]);
break; break;
} }
} }
if (!local_session_id) if (!local_session_id)
{ {
g_set_error (error, g_set_error (error,
G_IO_ERROR, G_IO_ERROR,
G_IO_ERROR_NOT_FOUND, G_IO_ERROR_NOT_FOUND,
"Couldn't find a session or a greeter session for user %d", "Couldn't find a session or a greeter session for user %d",
getuid ()); getuid ());
return FALSE; return FALSE;
} }
} }
else else
{ {
@ -191,29 +194,29 @@ find_systemd_session (gchar **session_id,
return FALSE; return FALSE;
} }
/* and display sessions can be 'closing' if they are logged out but /* and display sessions can be 'closing' if they are logged out but
* some processes are lingering; we shouldn't consider these */ * some processes are lingering; we shouldn't consider these */
saved_errno = sd_session_get_state (local_session_id, &state); saved_errno = sd_session_get_state (local_session_id, &state);
if (saved_errno < 0) if (saved_errno < 0)
{ {
g_set_error (error, g_set_error (error,
G_IO_ERROR, G_IO_ERROR,
G_IO_ERROR_NOT_FOUND, G_IO_ERROR_NOT_FOUND,
"Couldn't get state for session '%s': %s", "Couldn't get state for session '%s': %s",
local_session_id, local_session_id,
g_strerror (-saved_errno)); g_strerror (-saved_errno));
return FALSE; return FALSE;
} }
if (!g_strv_contains (active_states, state)) if (!g_strv_contains (active_states, state))
{ {
g_set_error (error, g_set_error (error,
G_IO_ERROR, G_IO_ERROR,
G_IO_ERROR_NOT_FOUND, G_IO_ERROR_NOT_FOUND,
"Session '%s' is not active", "Session '%s' is not active",
local_session_id); local_session_id);
return FALSE; return FALSE;
} }
*session_id = g_steal_pointer (&local_session_id); *session_id = g_steal_pointer (&local_session_id);
@ -231,11 +234,13 @@ get_session_proxy (GCancellable *cancellable,
if (!find_systemd_session (&session_id, &local_error)) if (!find_systemd_session (&session_id, &local_error))
{ {
g_propagate_prefixed_error (error, local_error, "Could not get session ID: "); g_propagate_prefixed_error (error, local_error,
"Could not get session ID: ");
return NULL; return NULL;
} }
proxy_path = get_escaped_dbus_path ("/org/freedesktop/login1/session", session_id); proxy_path = get_escaped_dbus_path ("/org/freedesktop/login1/session",
session_id);
session_proxy = login1_session_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, session_proxy = login1_session_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START, G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
@ -243,7 +248,7 @@ get_session_proxy (GCancellable *cancellable,
proxy_path, proxy_path,
cancellable, error); cancellable, error);
if (!session_proxy) if (!session_proxy)
g_prefix_error(error, "Could not get session proxy: "); g_prefix_error (error, "Could not get session proxy: ");
return session_proxy; return session_proxy;
} }
@ -258,7 +263,7 @@ get_seat_proxy (GCancellable *cancellable,
"/org/freedesktop/login1/seat/self", "/org/freedesktop/login1/seat/self",
cancellable, error); cancellable, error);
if (!seat) if (!seat)
g_prefix_error(error, "Could not get seat proxy: "); g_prefix_error (error, "Could not get seat proxy: ");
return seat; return seat;
} }
@ -377,10 +382,10 @@ out:
} }
static int static int
on_evdev_device_open (const char *path, on_evdev_device_open (const char *path,
int flags, int flags,
gpointer user_data, gpointer user_data,
GError **error) GError **error)
{ {
MetaLauncher *self = user_data; MetaLauncher *self = user_data;
@ -433,7 +438,8 @@ sync_active (MetaLauncher *self)
{ {
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
MetaBackendNative *backend_native = META_BACKEND_NATIVE (backend); MetaBackendNative *backend_native = META_BACKEND_NATIVE (backend);
gboolean active = login1_session_get_active (LOGIN1_SESSION (self->session_proxy)); gboolean active =
login1_session_get_active (LOGIN1_SESSION (self->session_proxy));
if (active == self->session_active) if (active == self->session_active)
return; return;
@ -465,7 +471,8 @@ get_seat_id (GError **error)
if (!find_systemd_session (&session_id, &local_error)) if (!find_systemd_session (&session_id, &local_error))
{ {
g_propagate_prefixed_error (error, local_error, "Could not get session ID: "); g_propagate_prefixed_error (error, local_error,
"Could not get session ID: ");
return NULL; return NULL;
} }
@ -495,7 +502,8 @@ meta_launcher_new (GError **error)
if (!session_proxy) if (!session_proxy)
goto fail; goto fail;
if (!login1_session_call_take_control_sync (session_proxy, FALSE, NULL, error)) if (!login1_session_call_take_control_sync (session_proxy, FALSE, NULL,
error))
{ {
g_prefix_error (error, "Could not take control: "); g_prefix_error (error, "Could not take control: ");
goto fail; goto fail;
@ -524,11 +532,12 @@ meta_launcher_new (GError **error)
on_evdev_device_close, on_evdev_device_close,
self); self);
g_signal_connect (self->session_proxy, "notify::active", G_CALLBACK (on_active_changed), self); g_signal_connect (self->session_proxy, "notify::active",
G_CALLBACK (on_active_changed), self);
return self; return self;
fail: fail:
if (have_control) if (have_control)
login1_session_call_release_control_sync (session_proxy, NULL, NULL); login1_session_call_release_control_sync (session_proxy, NULL, NULL);
return NULL; return NULL;
@ -545,8 +554,8 @@ meta_launcher_free (MetaLauncher *self)
} }
gboolean gboolean
meta_launcher_activate_session (MetaLauncher *launcher, meta_launcher_activate_session (MetaLauncher *launcher,
GError **error) GError **error)
{ {
if (!login1_session_call_activate_sync (launcher->session_proxy, NULL, error)) if (!login1_session_call_activate_sync (launcher->session_proxy, NULL, error))
return FALSE; return FALSE;
@ -556,9 +565,10 @@ meta_launcher_activate_session (MetaLauncher *launcher,
} }
gboolean gboolean
meta_launcher_activate_vt (MetaLauncher *launcher, meta_launcher_activate_vt (MetaLauncher *launcher,
signed char vt, signed char vt,
GError **error) GError **error)
{ {
return login1_seat_call_switch_to_sync (launcher->seat_proxy, vt, NULL, error); return login1_seat_call_switch_to_sync (launcher->seat_proxy, vt, NULL,
error);
} }

View File

@ -82,8 +82,8 @@ G_DEFINE_TYPE_WITH_CODE (MetaMonitorManagerKms, meta_monitor_manager_kms,
initable_iface_init)) initable_iface_init))
static GBytes * static GBytes *
meta_monitor_manager_kms_read_edid (MetaMonitorManager *manager, meta_monitor_manager_kms_read_edid (MetaMonitorManager * manager,
MetaOutput *output) MetaOutput * output)
{ {
return meta_output_kms_read_edid (output); return meta_output_kms_read_edid (output);
} }
@ -95,22 +95,23 @@ meta_monitor_manager_kms_set_power_save_mode (MetaMonitorManager *manager,
uint64_t state; uint64_t state;
GList *l; GList *l;
switch (mode) { switch (mode)
case META_POWER_SAVE_ON: {
state = DRM_MODE_DPMS_ON; case META_POWER_SAVE_ON:
break; state = DRM_MODE_DPMS_ON;
case META_POWER_SAVE_STANDBY: break;
state = DRM_MODE_DPMS_STANDBY; case META_POWER_SAVE_STANDBY:
break; state = DRM_MODE_DPMS_STANDBY;
case META_POWER_SAVE_SUSPEND: break;
state = DRM_MODE_DPMS_SUSPEND; case META_POWER_SAVE_SUSPEND:
break; state = DRM_MODE_DPMS_SUSPEND;
case META_POWER_SAVE_OFF: break;
state = DRM_MODE_DPMS_OFF; case META_POWER_SAVE_OFF:
break; state = DRM_MODE_DPMS_OFF;
default: break;
return; default:
} return;
}
for (l = manager->gpus; l; l = l->next) for (l = manager->gpus; l; l = l->next)
{ {
@ -132,10 +133,10 @@ meta_monitor_manager_kms_ensure_initial_config (MetaMonitorManager *manager)
static void static void
apply_crtc_assignments (MetaMonitorManager *manager, apply_crtc_assignments (MetaMonitorManager *manager,
MetaCrtcInfo **crtcs, MetaCrtcInfo **crtcs,
unsigned int n_crtcs, unsigned int n_crtcs,
MetaOutputInfo **outputs, MetaOutputInfo **outputs,
unsigned int n_outputs) unsigned int n_outputs)
{ {
unsigned i; unsigned i;
GList *l; GList *l;
@ -193,7 +194,7 @@ apply_crtc_assignments (MetaMonitorManager *manager,
meta_crtc_kms_apply_transform (crtc); meta_crtc_kms_apply_transform (crtc);
} }
/* Disable CRTCs not mentioned in the list (they have is_dirty == FALSE, /* Disable CRTCs not mentioned in the list (they have is_dirty == FALSE,
because they weren't seen in the first loop) */ * because they weren't seen in the first loop) */
for (l = manager->gpus; l; l = l->next) for (l = manager->gpus; l; l = l->next)
{ {
MetaGpu *gpu = l->data; MetaGpu *gpu = l->data;
@ -283,10 +284,11 @@ update_screen_size (MetaMonitorManager *manager,
} }
static gboolean static gboolean
meta_monitor_manager_kms_apply_monitors_config (MetaMonitorManager *manager, meta_monitor_manager_kms_apply_monitors_config (
MetaMonitorsConfig *config, MetaMonitorManager *manager,
MetaMonitorsConfigMethod method, MetaMonitorsConfig *config,
GError **error) MetaMonitorsConfigMethod method,
GError **error)
{ {
GPtrArray *crtc_infos; GPtrArray *crtc_infos;
GPtrArray *output_infos; GPtrArray *output_infos;
@ -327,12 +329,12 @@ meta_monitor_manager_kms_apply_monitors_config (MetaMonitorManager *manager
} }
static void static void
meta_monitor_manager_kms_get_crtc_gamma (MetaMonitorManager *manager, meta_monitor_manager_kms_get_crtc_gamma (MetaMonitorManager *manager,
MetaCrtc *crtc, MetaCrtc *crtc,
gsize *size, gsize *size,
unsigned short **red, unsigned short **red,
unsigned short **green, unsigned short **green,
unsigned short **blue) unsigned short **blue)
{ {
MetaGpu *gpu = meta_crtc_get_gpu (crtc); MetaGpu *gpu = meta_crtc_get_gpu (crtc);
int kms_fd = meta_gpu_kms_get_fd (META_GPU_KMS (gpu)); int kms_fd = meta_gpu_kms_get_fd (META_GPU_KMS (gpu));
@ -387,7 +389,8 @@ on_uevent (GUdevClient *client,
} }
static void static void
meta_monitor_manager_kms_connect_uevent_handler (MetaMonitorManagerKms *manager_kms) meta_monitor_manager_kms_connect_uevent_handler (
MetaMonitorManagerKms *manager_kms)
{ {
manager_kms->uevent_handler_id = g_signal_connect (manager_kms->udev, manager_kms->uevent_handler_id = g_signal_connect (manager_kms->udev,
"uevent", "uevent",
@ -396,7 +399,8 @@ meta_monitor_manager_kms_connect_uevent_handler (MetaMonitorManagerKms *manager_
} }
static void static void
meta_monitor_manager_kms_disconnect_uevent_handler (MetaMonitorManagerKms *manager_kms) meta_monitor_manager_kms_disconnect_uevent_handler (
MetaMonitorManagerKms *manager_kms)
{ {
g_signal_handler_disconnect (manager_kms->udev, g_signal_handler_disconnect (manager_kms->udev,
manager_kms->uevent_handler_id); manager_kms->uevent_handler_id);
@ -427,19 +431,21 @@ meta_monitor_manager_kms_is_transform_handled (MetaMonitorManager *manager,
} }
static float static float
meta_monitor_manager_kms_calculate_monitor_mode_scale (MetaMonitorManager *manager, meta_monitor_manager_kms_calculate_monitor_mode_scale (
MetaMonitor *monitor, MetaMonitorManager *manager,
MetaMonitorMode *monitor_mode) MetaMonitor *monitor,
MetaMonitorMode *monitor_mode)
{ {
return meta_monitor_calculate_mode_scale (monitor, monitor_mode); return meta_monitor_calculate_mode_scale (monitor, monitor_mode);
} }
static float * static float *
meta_monitor_manager_kms_calculate_supported_scales (MetaMonitorManager *manager, meta_monitor_manager_kms_calculate_supported_scales (
MetaLogicalMonitorLayoutMode layout_mode, MetaMonitorManager *manager,
MetaMonitor *monitor, MetaLogicalMonitorLayoutMode layout_mode,
MetaMonitorMode *monitor_mode, MetaMonitor *monitor,
int *n_supported_scales) MetaMonitorMode *monitor_mode,
int *n_supported_scales)
{ {
MetaMonitorScalesConstraint constraints = MetaMonitorScalesConstraint constraints =
META_MONITOR_SCALES_CONSTRAINT_NONE; META_MONITOR_SCALES_CONSTRAINT_NONE;
@ -742,15 +748,23 @@ meta_monitor_manager_kms_class_init (MetaMonitorManagerKmsClass *klass)
object_class->dispose = meta_monitor_manager_kms_dispose; object_class->dispose = meta_monitor_manager_kms_dispose;
manager_class->read_edid = meta_monitor_manager_kms_read_edid; manager_class->read_edid = meta_monitor_manager_kms_read_edid;
manager_class->ensure_initial_config = meta_monitor_manager_kms_ensure_initial_config; manager_class->ensure_initial_config =
manager_class->apply_monitors_config = meta_monitor_manager_kms_apply_monitors_config; meta_monitor_manager_kms_ensure_initial_config;
manager_class->set_power_save_mode = meta_monitor_manager_kms_set_power_save_mode; manager_class->apply_monitors_config =
meta_monitor_manager_kms_apply_monitors_config;
manager_class->set_power_save_mode =
meta_monitor_manager_kms_set_power_save_mode;
manager_class->get_crtc_gamma = meta_monitor_manager_kms_get_crtc_gamma; manager_class->get_crtc_gamma = meta_monitor_manager_kms_get_crtc_gamma;
manager_class->set_crtc_gamma = meta_monitor_manager_kms_set_crtc_gamma; manager_class->set_crtc_gamma = meta_monitor_manager_kms_set_crtc_gamma;
manager_class->is_transform_handled = meta_monitor_manager_kms_is_transform_handled; manager_class->is_transform_handled =
manager_class->calculate_monitor_mode_scale = meta_monitor_manager_kms_calculate_monitor_mode_scale; meta_monitor_manager_kms_is_transform_handled;
manager_class->calculate_supported_scales = meta_monitor_manager_kms_calculate_supported_scales; manager_class->calculate_monitor_mode_scale =
meta_monitor_manager_kms_calculate_monitor_mode_scale;
manager_class->calculate_supported_scales =
meta_monitor_manager_kms_calculate_supported_scales;
manager_class->get_capabilities = meta_monitor_manager_kms_get_capabilities; manager_class->get_capabilities = meta_monitor_manager_kms_get_capabilities;
manager_class->get_max_screen_size = meta_monitor_manager_kms_get_max_screen_size; manager_class->get_max_screen_size =
manager_class->get_default_layout_mode = meta_monitor_manager_kms_get_default_layout_mode; meta_monitor_manager_kms_get_max_screen_size;
manager_class->get_default_layout_mode =
meta_monitor_manager_kms_get_default_layout_mode;
} }

View File

@ -182,7 +182,7 @@ output_get_tile_info (MetaGpuKms *gpu_kms,
{ {
int ret; int ret;
ret = sscanf ((char *)tile_blob->data, "%d:%d:%d:%d:%d:%d:%d:%d", ret = sscanf ((char *) tile_blob->data, "%d:%d:%d:%d:%d:%d:%d:%d",
&output->tile_info.group_id, &output->tile_info.group_id,
&output->tile_info.flags, &output->tile_info.flags,
&output->tile_info.max_h_tiles, &output->tile_info.max_h_tiles,
@ -259,8 +259,8 @@ handle_panel_orientation (MetaOutput *output,
} }
static void static void
find_connector_properties (MetaGpuKms *gpu_kms, find_connector_properties (MetaGpuKms *gpu_kms,
MetaOutput *output) MetaOutput *output)
{ {
MetaOutputKms *output_kms = output->driver_private; MetaOutputKms *output_kms = output->driver_private;
drmModeConnector *connector = output_kms->connector; drmModeConnector *connector = output_kms->connector;
@ -311,7 +311,8 @@ find_connector_properties (MetaGpuKms *gpu_kms,
static char * static char *
make_output_name (drmModeConnector *connector) make_output_name (drmModeConnector *connector)
{ {
static const char * const connector_type_names[] = { static const char * const connector_type_names[] =
{
"None", "None",
"VGA", "VGA",
"DVI-I", "DVI-I",
@ -442,9 +443,9 @@ compare_modes (const void *one,
} }
static gboolean static gboolean
init_output_modes (MetaOutput *output, init_output_modes (MetaOutput *output,
MetaGpuKms *gpu_kms, MetaGpuKms *gpu_kms,
GError **error) GError **error)
{ {
MetaOutputKms *output_kms = output->driver_private; MetaOutputKms *output_kms = output->driver_private;
unsigned int i; unsigned int i;
@ -488,11 +489,11 @@ init_output_modes (MetaOutput *output,
} }
MetaOutput * MetaOutput *
meta_create_kms_output (MetaGpuKms *gpu_kms, meta_create_kms_output (MetaGpuKms *gpu_kms,
drmModeConnector *connector, drmModeConnector *connector,
MetaKmsResources *resources, MetaKmsResources *resources,
MetaOutput *old_output, MetaOutput *old_output,
GError **error) GError **error)
{ {
MetaGpu *gpu = META_GPU (gpu_kms); MetaGpu *gpu = META_GPU (gpu_kms);
MetaOutput *output; MetaOutput *output;
@ -570,17 +571,17 @@ meta_create_kms_output (MetaGpuKms *gpu_kms,
continue; continue;
/* We only list CRTCs as supported if they are supported by all encoders /* We only list CRTCs as supported if they are supported by all encoders
for this connectors. * for this connectors.
*
This is what xf86-video-modesetting does (see drmmode_output_init()) * This is what xf86-video-modesetting does (see drmmode_output_init())
*/ */
crtc_mask &= output_kms->encoders[i]->possible_crtcs; crtc_mask &= output_kms->encoders[i]->possible_crtcs;
if (output_kms->encoders[i]->encoder_id == connector->encoder_id) if (output_kms->encoders[i]->encoder_id == connector->encoder_id)
output_kms->current_encoder = output_kms->encoders[i]; output_kms->current_encoder = output_kms->encoders[i];
} }
crtcs = g_array_new (FALSE, FALSE, sizeof (MetaCrtc*)); crtcs = g_array_new (FALSE, FALSE, sizeof (MetaCrtc *));
for (l = meta_gpu_get_crtcs (gpu), i = 0; l; l = l->next, i++) for (l = meta_gpu_get_crtcs (gpu), i = 0; l; l = l->next, i++)
{ {
@ -593,7 +594,7 @@ meta_create_kms_output (MetaGpuKms *gpu_kms,
} }
output->n_possible_crtcs = crtcs->len; output->n_possible_crtcs = crtcs->len;
output->possible_crtcs = (void*)g_array_free (crtcs, FALSE); output->possible_crtcs = (void *) g_array_free (crtcs, FALSE);
if (output_kms->current_encoder && output_kms->current_encoder->crtc_id != 0) if (output_kms->current_encoder && output_kms->current_encoder->crtc_id != 0)
{ {
@ -654,14 +655,16 @@ meta_create_kms_output (MetaGpuKms *gpu_kms,
output_get_tile_info (gpu_kms, output); output_get_tile_info (gpu_kms, output);
/* FIXME: backlight is a very driver specific thing unfortunately, /* FIXME: backlight is a very driver specific thing unfortunately,
every DDX does its own thing, and the dumb KMS API does not include it. * every DDX does its own thing, and the dumb KMS API does not include it.
*
For example, xf86-video-intel has a list of paths to probe in /sys/class/backlight * For example, xf86-video-intel has a list of paths to probe in
(one for each major HW maker, and then some). * /sys/class/backlight
We can't do the same because we're not root. * (one for each major HW maker, and then some).
It might be best to leave backlight out of the story and rely on the setuid * We can't do the same because we're not root.
helper in gnome-settings-daemon. * It might be best to leave backlight out of the story and rely on the
*/ * setuid
* helper in gnome-settings-daemon.
*/
output->backlight_min = 0; output->backlight_min = 0;
output->backlight_max = 0; output->backlight_max = 0;
output->backlight = -1; output->backlight = -1;

View File

@ -46,18 +46,18 @@
#endif #endif
static EGLImageKHR static EGLImageKHR
create_egl_image (MetaEgl *egl, create_egl_image (MetaEgl *egl,
EGLDisplay egl_display, EGLDisplay egl_display,
EGLContext egl_context, EGLContext egl_context,
unsigned int width, unsigned int width,
unsigned int height, unsigned int height,
uint32_t n_planes, uint32_t n_planes,
uint32_t *strides, uint32_t *strides,
uint32_t *offsets, uint32_t *offsets,
uint64_t *modifiers, uint64_t *modifiers,
uint32_t format, uint32_t format,
int fd, int fd,
GError **error) GError **error)
{ {
EGLint attribs[37]; EGLint attribs[37];
int atti = 0; int atti = 0;
@ -141,10 +141,10 @@ create_egl_image (MetaEgl *egl,
} }
static void static void
paint_egl_image (MetaGles3 *gles3, paint_egl_image (MetaGles3 *gles3,
EGLImageKHR egl_image, EGLImageKHR egl_image,
int width, int width,
int height) int height)
{ {
GLuint texture; GLuint texture;
GLuint framebuffer; GLuint framebuffer;
@ -169,8 +169,9 @@ paint_egl_image (MetaGles3 *gles3,
GLBAS (gles3, glTexParameteri, (GL_TEXTURE_2D, GL_TEXTURE_WRAP_R_OES, GLBAS (gles3, glTexParameteri, (GL_TEXTURE_2D, GL_TEXTURE_WRAP_R_OES,
GL_CLAMP_TO_EDGE)); GL_CLAMP_TO_EDGE));
GLBAS (gles3, glFramebufferTexture2D, (GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GLBAS (gles3, glFramebufferTexture2D,
GL_TEXTURE_2D, texture, 0)); (GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D, texture, 0));
GLBAS (gles3, glBindFramebuffer, (GL_READ_FRAMEBUFFER, framebuffer)); GLBAS (gles3, glBindFramebuffer, (GL_READ_FRAMEBUFFER, framebuffer));
GLBAS (gles3, glBlitFramebuffer, (0, height, width, 0, GLBAS (gles3, glBlitFramebuffer, (0, height, width, 0,
@ -180,13 +181,13 @@ paint_egl_image (MetaGles3 *gles3,
} }
gboolean gboolean
meta_renderer_native_gles3_blit_shared_bo (MetaEgl *egl, meta_renderer_native_gles3_blit_shared_bo (MetaEgl *egl,
MetaGles3 *gles3, MetaGles3 *gles3,
EGLDisplay egl_display, EGLDisplay egl_display,
EGLContext egl_context, EGLContext egl_context,
EGLSurface egl_surface, EGLSurface egl_surface,
struct gbm_bo *shared_bo, struct gbm_bo *shared_bo,
GError **error) GError **error)
{ {
int shared_bo_fd; int shared_bo_fd;
unsigned int width; unsigned int width;

View File

@ -90,12 +90,14 @@ typedef struct _MetaRendererNativeGpuData
{ {
MetaRendererNative *renderer_native; MetaRendererNative *renderer_native;
struct { struct
{
struct gbm_device *device; struct gbm_device *device;
} gbm; } gbm;
#ifdef HAVE_EGL_DEVICE #ifdef HAVE_EGL_DEVICE
struct { struct
{
EGLDeviceEXT device; EGLDeviceEXT device;
gboolean no_egl_output_drm_flip_event; gboolean no_egl_output_drm_flip_event;
@ -109,7 +111,8 @@ typedef struct _MetaRendererNativeGpuData
/* /*
* Fields used for blitting iGPU framebuffer content onto dGPU framebuffers. * Fields used for blitting iGPU framebuffer content onto dGPU framebuffers.
*/ */
struct { struct
{
MetaSharedFramebufferCopyMode copy_mode; MetaSharedFramebufferCopyMode copy_mode;
/* For GPU blit mode */ /* For GPU blit mode */
@ -136,7 +139,8 @@ typedef struct _MetaOnscreenNativeSecondaryGpuState
EGLSurface egl_surface; EGLSurface egl_surface;
struct { struct
{
struct gbm_surface *surface; struct gbm_surface *surface;
uint32_t current_fb_id; uint32_t current_fb_id;
uint32_t next_fb_id; uint32_t next_fb_id;
@ -144,7 +148,8 @@ typedef struct _MetaOnscreenNativeSecondaryGpuState
struct gbm_bo *next_bo; struct gbm_bo *next_bo;
} gbm; } gbm;
struct { struct
{
MetaDumbBuffer *dumb_fb; MetaDumbBuffer *dumb_fb;
MetaDumbBuffer dumb_fbs[2]; MetaDumbBuffer dumb_fbs[2];
} cpu; } cpu;
@ -160,7 +165,8 @@ typedef struct _MetaOnscreenNative
GHashTable *secondary_gpu_states; GHashTable *secondary_gpu_states;
struct { struct
{
struct gbm_surface *surface; struct gbm_surface *surface;
uint32_t current_fb_id; uint32_t current_fb_id;
uint32_t next_fb_id; uint32_t next_fb_id;
@ -169,7 +175,8 @@ typedef struct _MetaOnscreenNative
} gbm; } gbm;
#ifdef HAVE_EGL_DEVICE #ifdef HAVE_EGL_DEVICE
struct { struct
{
EGLStreamKHR stream; EGLStreamKHR stream;
MetaDumbBuffer dumb_fb; MetaDumbBuffer dumb_fb;
@ -465,7 +472,8 @@ get_supported_egl_modifiers (CoglOnscreen *onscreen,
num_modifiers); num_modifiers);
ret = meta_egl_query_dma_buf_modifiers (egl, renderer_gpu_data->egl_display, ret = meta_egl_query_dma_buf_modifiers (egl, renderer_gpu_data->egl_display,
format, num_modifiers, format, num_modifiers,
(EGLuint64KHR *) modifiers->data, NULL, (EGLuint64KHR *) modifiers->data,
NULL,
&num_modifiers, &error); &num_modifiers, &error);
if (!ret) if (!ret)
@ -556,11 +564,12 @@ get_supported_modifiers (CoglOnscreen *onscreen,
} }
static gboolean static gboolean
init_secondary_gpu_state_gpu_copy_mode (MetaRendererNative *renderer_native, init_secondary_gpu_state_gpu_copy_mode (
CoglOnscreen *onscreen, MetaRendererNative *renderer_native,
MetaRendererNativeGpuData *renderer_gpu_data, CoglOnscreen *onscreen,
MetaGpuKms *gpu_kms, MetaRendererNativeGpuData *renderer_gpu_data,
GError **error) MetaGpuKms *gpu_kms,
GError **error)
{ {
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglOnscreenEGL *onscreen_egl = onscreen->winsys; CoglOnscreenEGL *onscreen_egl = onscreen->winsys;
@ -614,7 +623,8 @@ init_secondary_gpu_state_gpu_copy_mode (MetaRendererNative *renderer_nat
} }
static void static void
secondary_gpu_state_free (MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state) secondary_gpu_state_free (
MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state)
{ {
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
MetaEgl *egl = meta_backend_get_egl (backend); MetaEgl *egl = meta_backend_get_egl (backend);
@ -648,11 +658,12 @@ secondary_gpu_state_free (MetaOnscreenNativeSecondaryGpuState *secondary_gpu_sta
} }
static gboolean static gboolean
init_secondary_gpu_state_cpu_copy_mode (MetaRendererNative *renderer_native, init_secondary_gpu_state_cpu_copy_mode (
CoglOnscreen *onscreen, MetaRendererNative *renderer_native,
MetaRendererNativeGpuData *renderer_gpu_data, CoglOnscreen *onscreen,
MetaGpuKms *gpu_kms, MetaRendererNativeGpuData *renderer_gpu_data,
GError **error) MetaGpuKms *gpu_kms,
GError **error)
{ {
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglOnscreenEGL *onscreen_egl = onscreen->winsys; CoglOnscreenEGL *onscreen_egl = onscreen->winsys;
@ -691,10 +702,10 @@ init_secondary_gpu_state_cpu_copy_mode (MetaRendererNative *renderer_nat
} }
static gboolean static gboolean
init_secondary_gpu_state (MetaRendererNative *renderer_native, init_secondary_gpu_state (MetaRendererNative *renderer_native,
CoglOnscreen *onscreen, CoglOnscreen *onscreen,
MetaGpuKms *gpu_kms, MetaGpuKms *gpu_kms,
GError **error) GError **error)
{ {
MetaRendererNativeGpuData *renderer_gpu_data; MetaRendererNativeGpuData *renderer_gpu_data;
@ -746,7 +757,8 @@ flush_pending_swap_notify (CoglFramebuffer *framebuffer)
CoglFrameInfo *info; CoglFrameInfo *info;
while ((info = g_queue_peek_head (&onscreen->pending_frame_infos)) && while ((info = g_queue_peek_head (&onscreen->pending_frame_infos)) &&
info->global_frame_counter <= onscreen_native->pending_swap_notify_frame_count) info->global_frame_counter <=
onscreen_native->pending_swap_notify_frame_count)
{ {
_cogl_onscreen_notify_frame_sync (onscreen, info); _cogl_onscreen_notify_frame_sync (onscreen, info);
_cogl_onscreen_notify_complete (onscreen, info); _cogl_onscreen_notify_complete (onscreen, info);
@ -846,7 +858,7 @@ free_current_bo (CoglOnscreen *onscreen)
static void static void
meta_onscreen_native_queue_swap_notify (CoglOnscreen *onscreen) meta_onscreen_native_queue_swap_notify (CoglOnscreen *onscreen)
{ {
CoglOnscreenEGL *onscreen_egl = onscreen->winsys; CoglOnscreenEGL *onscreen_egl = onscreen->winsys;
MetaOnscreenNative *onscreen_native = onscreen_egl->platform; MetaOnscreenNative *onscreen_native = onscreen_egl->platform;
MetaRendererNative *renderer_native = onscreen_native->renderer_native; MetaRendererNative *renderer_native = onscreen_native->renderer_native;
@ -913,9 +925,10 @@ fail:
} }
static int static int
meta_renderer_native_add_egl_config_attributes (CoglDisplay *cogl_display, meta_renderer_native_add_egl_config_attributes (
CoglFramebufferConfig *config, CoglDisplay *cogl_display,
EGLint *attributes) CoglFramebufferConfig *config,
EGLint *attributes)
{ {
CoglRendererEGL *cogl_renderer_egl = cogl_display->renderer->winsys; CoglRendererEGL *cogl_renderer_egl = cogl_display->renderer->winsys;
MetaRendererNativeGpuData *renderer_gpu_data = cogl_renderer_egl->platform; MetaRendererNativeGpuData *renderer_gpu_data = cogl_renderer_egl->platform;
@ -939,12 +952,12 @@ meta_renderer_native_add_egl_config_attributes (CoglDisplay *cogl_disp
} }
static gboolean static gboolean
choose_egl_config_from_gbm_format (MetaEgl *egl, choose_egl_config_from_gbm_format (MetaEgl *egl,
EGLDisplay egl_display, EGLDisplay egl_display,
const EGLint *attributes, const EGLint *attributes,
uint32_t gbm_format, uint32_t gbm_format,
EGLConfig *out_config, EGLConfig *out_config,
GError **error) GError **error)
{ {
EGLConfig *egl_configs; EGLConfig *egl_configs;
EGLint n_configs; EGLint n_configs;
@ -986,10 +999,10 @@ choose_egl_config_from_gbm_format (MetaEgl *egl,
} }
static gboolean static gboolean
meta_renderer_native_choose_egl_config (CoglDisplay *cogl_display, meta_renderer_native_choose_egl_config (CoglDisplay *cogl_display,
EGLint *attributes, EGLint *attributes,
EGLConfig *out_config, EGLConfig *out_config,
GError **error) GError **error)
{ {
CoglRenderer *cogl_renderer = cogl_display->renderer; CoglRenderer *cogl_renderer = cogl_display->renderer;
CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys; CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
@ -1051,7 +1064,8 @@ create_dummy_pbuffer_surface (EGLDisplay egl_display,
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
MetaEgl *egl = meta_backend_get_egl (backend); MetaEgl *egl = meta_backend_get_egl (backend);
EGLConfig pbuffer_config; EGLConfig pbuffer_config;
static const EGLint pbuffer_config_attribs[] = { static const EGLint pbuffer_config_attribs[] =
{
EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
EGL_RED_SIZE, 1, EGL_RED_SIZE, 1,
EGL_GREEN_SIZE, 1, EGL_GREEN_SIZE, 1,
@ -1060,7 +1074,8 @@ create_dummy_pbuffer_surface (EGLDisplay egl_display,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_NONE EGL_NONE
}; };
static const EGLint pbuffer_attribs[] = { static const EGLint pbuffer_attribs[] =
{
EGL_WIDTH, 16, EGL_WIDTH, 16,
EGL_HEIGHT, 16, EGL_HEIGHT, 16,
EGL_NONE EGL_NONE
@ -1098,8 +1113,8 @@ meta_renderer_native_egl_context_created (CoglDisplay *cogl_display,
cogl_display_egl->egl_context)) cogl_display_egl->egl_context))
{ {
_cogl_set_error (error, COGL_WINSYS_ERROR, _cogl_set_error (error, COGL_WINSYS_ERROR,
COGL_WINSYS_ERROR_CREATE_CONTEXT, COGL_WINSYS_ERROR_CREATE_CONTEXT,
"Failed to make context current"); "Failed to make context current");
return FALSE; return FALSE;
} }
@ -1140,7 +1155,7 @@ swap_secondary_drm_fb (MetaGpuKms *gpu_kms,
static void static void
meta_onscreen_native_swap_drm_fb (CoglOnscreen *onscreen) meta_onscreen_native_swap_drm_fb (CoglOnscreen *onscreen)
{ {
CoglOnscreenEGL *onscreen_egl = onscreen->winsys; CoglOnscreenEGL *onscreen_egl = onscreen->winsys;
MetaOnscreenNative *onscreen_native = onscreen_egl->platform; MetaOnscreenNative *onscreen_native = onscreen_egl->platform;
free_current_bo (onscreen); free_current_bo (onscreen);
@ -1165,7 +1180,7 @@ on_crtc_flipped (GClosure *closure,
CoglFramebuffer *framebuffer = CoglFramebuffer *framebuffer =
clutter_stage_view_get_onscreen (stage_view); clutter_stage_view_get_onscreen (stage_view);
CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer); CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer);
CoglOnscreenEGL *onscreen_egl = onscreen->winsys; CoglOnscreenEGL *onscreen_egl = onscreen->winsys;
MetaOnscreenNative *onscreen_native = onscreen_egl->platform; MetaOnscreenNative *onscreen_native = onscreen_egl->platform;
MetaRendererNative *renderer_native = onscreen_native->renderer_native; MetaRendererNative *renderer_native = onscreen_native->renderer_native;
MetaGpuKms *render_gpu = onscreen_native->render_gpu; MetaGpuKms *render_gpu = onscreen_native->render_gpu;
@ -1237,7 +1252,7 @@ flip_closure_destroyed (MetaRendererView *view)
CoglFramebuffer *framebuffer = CoglFramebuffer *framebuffer =
clutter_stage_view_get_onscreen (stage_view); clutter_stage_view_get_onscreen (stage_view);
CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer); CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer);
CoglOnscreenEGL *onscreen_egl = onscreen->winsys; CoglOnscreenEGL *onscreen_egl = onscreen->winsys;
MetaOnscreenNative *onscreen_native = onscreen_egl->platform; MetaOnscreenNative *onscreen_native = onscreen_egl->platform;
MetaRendererNative *renderer_native = onscreen_native->renderer_native; MetaRendererNative *renderer_native = onscreen_native->renderer_native;
MetaGpuKms *render_gpu = onscreen_native->render_gpu; MetaGpuKms *render_gpu = onscreen_native->render_gpu;
@ -1467,7 +1482,8 @@ meta_onscreen_native_set_crtc_modes (CoglOnscreen *onscreen)
logical_monitor = meta_renderer_view_get_logical_monitor (view); logical_monitor = meta_renderer_view_get_logical_monitor (view);
if (logical_monitor) if (logical_monitor)
{ {
SetCrtcFbData data = { SetCrtcFbData data =
{
.render_gpu = render_gpu, .render_gpu = render_gpu,
.onscreen = onscreen, .onscreen = onscreen,
.fb_id = fb_id .fb_id = fb_id
@ -1550,7 +1566,8 @@ meta_onscreen_native_flip_crtcs (CoglOnscreen *onscreen)
logical_monitor = meta_renderer_view_get_logical_monitor (view); logical_monitor = meta_renderer_view_get_logical_monitor (view);
if (logical_monitor) if (logical_monitor)
{ {
FlipCrtcData data = { FlipCrtcData data =
{
.onscreen = onscreen, .onscreen = onscreen,
.flip_closure = flip_closure, .flip_closure = flip_closure,
}; };
@ -1749,8 +1766,10 @@ copy_shared_framebuffer_gpu (CoglOnscreen *onscreen,
if (!meta_renderer_native_gles3_blit_shared_bo (egl, if (!meta_renderer_native_gles3_blit_shared_bo (egl,
renderer_native->gles3, renderer_native->gles3,
renderer_gpu_data->egl_display, renderer_gpu_data->egl_display,
renderer_gpu_data->secondary.egl_context, renderer_gpu_data->secondary.
secondary_gpu_state->egl_surface, egl_context,
secondary_gpu_state->
egl_surface,
onscreen_native->gbm.next_bo, onscreen_native->gbm.next_bo,
&error)) &error))
{ {
@ -1946,7 +1965,8 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
onscreen_native->pending_set_crtc = FALSE; onscreen_native->pending_set_crtc = FALSE;
} }
onscreen_native->pending_queue_swap_notify_frame_count = renderer_native->frame_counter; onscreen_native->pending_queue_swap_notify_frame_count =
renderer_native->frame_counter;
meta_onscreen_native_flip_crtcs (onscreen); meta_onscreen_native_flip_crtcs (onscreen);
/* /*
@ -2013,8 +2033,9 @@ should_surface_be_sharable (CoglOnscreen *onscreen)
MetaMonitor *monitor = l->data; MetaMonitor *monitor = l->data;
MetaGpuKms *gpu_kms = META_GPU_KMS (meta_monitor_get_gpu (monitor)); MetaGpuKms *gpu_kms = META_GPU_KMS (meta_monitor_get_gpu (monitor));
if (renderer_gpu_data != meta_renderer_native_get_gpu_data (renderer_native, if (renderer_gpu_data !=
gpu_kms)) meta_renderer_native_get_gpu_data (renderer_native,
gpu_kms))
return TRUE; return TRUE;
} }
@ -2135,12 +2156,14 @@ meta_renderer_native_create_surface_egl_device (CoglOnscreen *onscreen,
EGLint num_layers; EGLint num_layers;
EGLOutputLayerEXT output_layer; EGLOutputLayerEXT output_layer;
EGLAttrib output_attribs[3]; EGLAttrib output_attribs[3];
EGLint stream_attribs[] = { EGLint stream_attribs[] =
{
EGL_STREAM_FIFO_LENGTH_KHR, 1, EGL_STREAM_FIFO_LENGTH_KHR, 1,
EGL_CONSUMER_AUTO_ACQUIRE_EXT, EGL_FALSE, EGL_CONSUMER_AUTO_ACQUIRE_EXT, EGL_FALSE,
EGL_NONE EGL_NONE
}; };
EGLint stream_producer_attribs[] = { EGLint stream_producer_attribs[] =
{
EGL_WIDTH, width, EGL_WIDTH, width,
EGL_HEIGHT, height, EGL_HEIGHT, height,
EGL_NONE EGL_NONE
@ -2210,12 +2233,12 @@ meta_renderer_native_create_surface_egl_device (CoglOnscreen *onscreen,
#endif /* HAVE_EGL_DEVICE */ #endif /* HAVE_EGL_DEVICE */
static gboolean static gboolean
init_dumb_fb (MetaDumbBuffer *dumb_fb, init_dumb_fb (MetaDumbBuffer *dumb_fb,
MetaGpuKms *gpu_kms, MetaGpuKms *gpu_kms,
int width, int width,
int height, int height,
uint32_t format, uint32_t format,
GError **error) GError **error)
{ {
struct drm_mode_create_dumb create_arg; struct drm_mode_create_dumb create_arg;
struct drm_mode_destroy_dumb destroy_arg; struct drm_mode_destroy_dumb destroy_arg;
@ -2529,7 +2552,8 @@ meta_renderer_native_release_onscreen (CoglOnscreen *onscreen)
} }
static const CoglWinsysEGLVtable static const CoglWinsysEGLVtable
_cogl_winsys_egl_vtable = { _cogl_winsys_egl_vtable =
{
.add_config_attributes = meta_renderer_native_add_egl_config_attributes, .add_config_attributes = meta_renderer_native_add_egl_config_attributes,
.choose_config = meta_renderer_native_choose_egl_config, .choose_config = meta_renderer_native_choose_egl_config,
.display_setup = meta_renderer_native_setup_egl_display, .display_setup = meta_renderer_native_setup_egl_display,
@ -2589,14 +2613,14 @@ meta_renderer_native_queue_modes_reset (MetaRendererNative *renderer_native)
} }
static CoglOnscreen * static CoglOnscreen *
meta_renderer_native_create_onscreen (MetaRendererNative *renderer_native, meta_renderer_native_create_onscreen (MetaRendererNative *renderer_native,
MetaGpuKms *render_gpu, MetaGpuKms *render_gpu,
MetaLogicalMonitor *logical_monitor, MetaLogicalMonitor *logical_monitor,
CoglContext *context, CoglContext *context,
MetaMonitorTransform transform, MetaMonitorTransform transform,
gint view_width, gint view_width,
gint view_height, gint view_height,
GError **error) GError **error)
{ {
CoglOnscreen *onscreen; CoglOnscreen *onscreen;
CoglOnscreenEGL *onscreen_egl; CoglOnscreenEGL *onscreen_egl;
@ -2657,12 +2681,12 @@ meta_renderer_native_create_onscreen (MetaRendererNative *renderer_native,
} }
static CoglOffscreen * static CoglOffscreen *
meta_renderer_native_create_offscreen (MetaRendererNative *renderer, meta_renderer_native_create_offscreen (MetaRendererNative *renderer,
CoglContext *context, CoglContext *context,
MetaMonitorTransform transform, MetaMonitorTransform transform,
gint view_width, gint view_width,
gint view_height, gint view_height,
GError **error) GError **error)
{ {
CoglOffscreen *fb; CoglOffscreen *fb;
CoglTexture2D *tex; CoglTexture2D *tex;
@ -2696,7 +2720,7 @@ get_native_cogl_winsys_vtable (CoglRenderer *cogl_renderer)
if (!vtable_inited) if (!vtable_inited)
{ {
/* The this winsys is a subclass of the EGL winsys so we /* The this winsys is a subclass of the EGL winsys so we
start by copying its vtable */ * start by copying its vtable */
parent_vtable = _cogl_winsys_egl_get_vtable (); parent_vtable = _cogl_winsys_egl_get_vtable ();
vtable = *parent_vtable; vtable = *parent_vtable;
@ -2963,7 +2987,8 @@ create_secondary_egl_config (MetaEgl *egl,
EGLConfig *egl_config, EGLConfig *egl_config,
GError **error) GError **error)
{ {
EGLint attributes[] = { EGLint attributes[] =
{
EGL_RED_SIZE, 1, EGL_RED_SIZE, 1,
EGL_GREEN_SIZE, 1, EGL_GREEN_SIZE, 1,
EGL_BLUE_SIZE, 1, EGL_BLUE_SIZE, 1,
@ -3002,7 +3027,8 @@ create_secondary_egl_context (MetaEgl *egl,
EGLConfig egl_config, EGLConfig egl_config,
GError **error) GError **error)
{ {
EGLint attributes[] = { EGLint attributes[] =
{
EGL_CONTEXT_CLIENT_VERSION, 3, EGL_CONTEXT_CLIENT_VERSION, 3,
EGL_NONE EGL_NONE
}; };
@ -3041,7 +3067,8 @@ init_secondary_gpu_data_gpu (MetaRendererNativeGpuData *renderer_gpu_data,
&egl_config, error)) &egl_config, error))
return FALSE; return FALSE;
egl_context = create_secondary_egl_context (egl, egl_display, egl_config, error); egl_context = create_secondary_egl_context (egl, egl_display, egl_config,
error);
if (egl_context == EGL_NO_CONTEXT) if (egl_context == EGL_NO_CONTEXT)
return FALSE; return FALSE;
@ -3075,7 +3102,8 @@ init_secondary_gpu_data_gpu (MetaRendererNativeGpuData *renderer_gpu_data,
renderer_gpu_data->secondary.egl_context = egl_context; renderer_gpu_data->secondary.egl_context = egl_context;
renderer_gpu_data->secondary.egl_config = egl_config; renderer_gpu_data->secondary.egl_config = egl_config;
renderer_gpu_data->secondary.copy_mode = META_SHARED_FRAMEBUFFER_COPY_MODE_GPU; renderer_gpu_data->secondary.copy_mode =
META_SHARED_FRAMEBUFFER_COPY_MODE_GPU;
return TRUE; return TRUE;
} }
@ -3083,7 +3111,8 @@ init_secondary_gpu_data_gpu (MetaRendererNativeGpuData *renderer_gpu_data,
static void static void
init_secondary_gpu_data_cpu (MetaRendererNativeGpuData *renderer_gpu_data) init_secondary_gpu_data_cpu (MetaRendererNativeGpuData *renderer_gpu_data)
{ {
renderer_gpu_data->secondary.copy_mode = META_SHARED_FRAMEBUFFER_COPY_MODE_CPU; renderer_gpu_data->secondary.copy_mode =
META_SHARED_FRAMEBUFFER_COPY_MODE_CPU;
} }
static void static void
@ -3094,17 +3123,18 @@ init_secondary_gpu_data (MetaRendererNativeGpuData *renderer_gpu_data)
if (init_secondary_gpu_data_gpu (renderer_gpu_data, &error)) if (init_secondary_gpu_data_gpu (renderer_gpu_data, &error))
return; return;
g_warning ("Failed to initialize accelerated iGPU/dGPU framebuffer sharing: %s", g_warning (
error->message); "Failed to initialize accelerated iGPU/dGPU framebuffer sharing: %s",
error->message);
g_error_free (error); g_error_free (error);
init_secondary_gpu_data_cpu (renderer_gpu_data); init_secondary_gpu_data_cpu (renderer_gpu_data);
} }
static MetaRendererNativeGpuData * static MetaRendererNativeGpuData *
create_renderer_gpu_data_gbm (MetaRendererNative *renderer_native, create_renderer_gpu_data_gbm (MetaRendererNative *renderer_native,
MetaGpuKms *gpu_kms, MetaGpuKms *gpu_kms,
GError **error) GError **error)
{ {
MetaMonitorManagerKms *monitor_manager_kms; MetaMonitorManagerKms *monitor_manager_kms;
MetaEgl *egl = meta_renderer_native_get_egl (renderer_native); MetaEgl *egl = meta_renderer_native_get_egl (renderer_native);
@ -3187,9 +3217,9 @@ get_drm_device_file (MetaEgl *egl,
} }
static EGLDeviceEXT static EGLDeviceEXT
find_egl_device (MetaRendererNative *renderer_native, find_egl_device (MetaRendererNative *renderer_native,
MetaGpuKms *gpu_kms, MetaGpuKms *gpu_kms,
GError **error) GError **error)
{ {
MetaEgl *egl = meta_renderer_native_get_egl (renderer_native); MetaEgl *egl = meta_renderer_native_get_egl (renderer_native);
char **missing_extensions; char **missing_extensions;
@ -3262,14 +3292,15 @@ find_egl_device (MetaRendererNative *renderer_native,
} }
static EGLDisplay static EGLDisplay
get_egl_device_display (MetaRendererNative *renderer_native, get_egl_device_display (MetaRendererNative *renderer_native,
MetaGpuKms *gpu_kms, MetaGpuKms *gpu_kms,
EGLDeviceEXT egl_device, EGLDeviceEXT egl_device,
GError **error) GError **error)
{ {
MetaEgl *egl = meta_renderer_native_get_egl (renderer_native); MetaEgl *egl = meta_renderer_native_get_egl (renderer_native);
int kms_fd = meta_gpu_kms_get_fd (gpu_kms); int kms_fd = meta_gpu_kms_get_fd (gpu_kms);
EGLint platform_attribs[] = { EGLint platform_attribs[] =
{
EGL_DRM_MASTER_FD_EXT, kms_fd, EGL_DRM_MASTER_FD_EXT, kms_fd,
EGL_NONE EGL_NONE
}; };
@ -3281,9 +3312,9 @@ get_egl_device_display (MetaRendererNative *renderer_native,
} }
static MetaRendererNativeGpuData * static MetaRendererNativeGpuData *
create_renderer_gpu_data_egl_device (MetaRendererNative *renderer_native, create_renderer_gpu_data_egl_device (MetaRendererNative *renderer_native,
MetaGpuKms *gpu_kms, MetaGpuKms *gpu_kms,
GError **error) GError **error)
{ {
MetaMonitorManagerKms *monitor_manager_kms = MetaMonitorManagerKms *monitor_manager_kms =
renderer_native->monitor_manager_kms; renderer_native->monitor_manager_kms;
@ -3294,7 +3325,7 @@ create_renderer_gpu_data_egl_device (MetaRendererNative *renderer_native,
EGLDisplay egl_display; EGLDisplay egl_display;
MetaRendererNativeGpuData *renderer_gpu_data; MetaRendererNativeGpuData *renderer_gpu_data;
if (!meta_is_stage_views_enabled()) if (!meta_is_stage_views_enabled ())
{ {
g_set_error (error, G_IO_ERROR, g_set_error (error, G_IO_ERROR,
G_IO_ERROR_FAILED, G_IO_ERROR_FAILED,
@ -3358,9 +3389,10 @@ create_renderer_gpu_data_egl_device (MetaRendererNative *renderer_native,
#endif /* HAVE_EGL_DEVICE */ #endif /* HAVE_EGL_DEVICE */
static MetaRendererNativeGpuData * static MetaRendererNativeGpuData *
meta_renderer_native_create_renderer_gpu_data (MetaRendererNative *renderer_native, meta_renderer_native_create_renderer_gpu_data (
MetaGpuKms *gpu_kms, MetaRendererNative *renderer_native,
GError **error) MetaGpuKms *gpu_kms,
GError **error)
{ {
MetaRendererNativeGpuData *renderer_gpu_data; MetaRendererNativeGpuData *renderer_gpu_data;
GError *gbm_error = NULL; GError *gbm_error = NULL;
@ -3403,7 +3435,7 @@ meta_renderer_native_create_renderer_gpu_data (MetaRendererNative *renderer_nat
#ifdef HAVE_EGL_DEVICE #ifdef HAVE_EGL_DEVICE
, egl_device_error->message , egl_device_error->message
#endif #endif
); );
g_error_free (gbm_error); g_error_free (gbm_error);
#ifdef HAVE_EGL_DEVICE #ifdef HAVE_EGL_DEVICE
@ -3414,9 +3446,9 @@ meta_renderer_native_create_renderer_gpu_data (MetaRendererNative *renderer_nat
} }
static gboolean static gboolean
meta_renderer_native_initable_init (GInitable *initable, meta_renderer_native_initable_init (GInitable *initable,
GCancellable *cancellable, GCancellable *cancellable,
GError **error) GError **error)
{ {
MetaRendererNative *renderer_native = META_RENDERER_NATIVE (initable); MetaRendererNative *renderer_native = META_RENDERER_NATIVE (initable);
MetaMonitorManagerKms *monitor_manager_kms = MetaMonitorManagerKms *monitor_manager_kms =
@ -3500,7 +3532,8 @@ meta_renderer_native_class_init (MetaRendererNativeClass *klass)
object_class->finalize = meta_renderer_native_finalize; object_class->finalize = meta_renderer_native_finalize;
object_class->constructed = meta_renderer_native_constructed; object_class->constructed = meta_renderer_native_constructed;
renderer_class->create_cogl_renderer = meta_renderer_native_create_cogl_renderer; renderer_class->create_cogl_renderer =
meta_renderer_native_create_cogl_renderer;
renderer_class->create_view = meta_renderer_native_create_view; renderer_class->create_view = meta_renderer_native_create_view;
obj_props[PROP_MONITOR_MANAGER] = obj_props[PROP_MONITOR_MANAGER] =

View File

@ -32,7 +32,7 @@
#include "meta/meta-monitor-manager.h" #include "meta/meta-monitor-manager.h"
#include "meta/util.h" #include "meta/util.h"
static GQuark quark_view_frame_closure = 0; static GQuark quark_view_frame_closure = 0;
struct _MetaStageNative struct _MetaStageNative
{ {

View File

@ -53,7 +53,10 @@ take_touch_grab (MetaBackend *backend)
MetaBackendX11 *x11 = META_BACKEND_X11 (backend); MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
Display *xdisplay = meta_backend_x11_get_xdisplay (x11); Display *xdisplay = meta_backend_x11_get_xdisplay (x11);
unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 }; unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
XIEventMask mask = { META_VIRTUAL_CORE_POINTER_ID, sizeof (mask_bits), mask_bits }; XIEventMask mask =
{
META_VIRTUAL_CORE_POINTER_ID, sizeof (mask_bits), mask_bits
};
XIGrabModifiers mods = { XIAnyModifier, 0 }; XIGrabModifiers mods = { XIAnyModifier, 0 };
XISetMask (mask.mask, XI_TouchBegin); XISetMask (mask.mask, XI_TouchBegin);
@ -154,12 +157,12 @@ meta_backend_x11_cm_select_stage_events (MetaBackend *backend)
} }
static void static void
get_xkbrf_var_defs (Display *xdisplay, get_xkbrf_var_defs (Display *xdisplay,
const char *layouts, const char *layouts,
const char *variants, const char *variants,
const char *options, const char *options,
char **rules_p, char **rules_p,
XkbRF_VarDefsRec *var_defs) XkbRF_VarDefsRec *var_defs)
{ {
char *rules = NULL; char *rules = NULL;
@ -182,7 +185,7 @@ get_xkbrf_var_defs (Display *xdisplay,
var_defs->options = strdup (options); var_defs->options = strdup (options);
/* Sometimes, the property is a file path, and sometimes it's /* Sometimes, the property is a file path, and sometimes it's
not. Normalize it so it's always a file path. */ * not. Normalize it so it's always a file path. */
if (rules[0] == '/') if (rules[0] == '/')
*rules_p = g_strdup (rules); *rules_p = g_strdup (rules);
else else
@ -270,7 +273,8 @@ apply_keymap (MetaBackendX11 *x11)
XkbComponentNamesRec xkb_comp_names = { 0 }; XkbComponentNamesRec xkb_comp_names = { 0 };
XkbRF_GetComponents (xkb_rules, &xkb_var_defs, &xkb_comp_names); XkbRF_GetComponents (xkb_rules, &xkb_var_defs, &xkb_comp_names);
upload_xkb_description (xdisplay, rules_file_path, &xkb_var_defs, &xkb_comp_names); upload_xkb_description (xdisplay, rules_file_path, &xkb_var_defs,
&xkb_comp_names);
free_xkb_component_names (&xkb_comp_names); free_xkb_component_names (&xkb_comp_names);
XkbRF_Free (xkb_rules, True); XkbRF_Free (xkb_rules, True);
@ -399,16 +403,21 @@ meta_backend_x11_cm_class_init (MetaBackendX11CmClass *klass)
backend_class->post_init = meta_backend_x11_cm_post_init; backend_class->post_init = meta_backend_x11_cm_post_init;
backend_class->create_renderer = meta_backend_x11_cm_create_renderer; backend_class->create_renderer = meta_backend_x11_cm_create_renderer;
backend_class->create_monitor_manager = meta_backend_x11_cm_create_monitor_manager; backend_class->create_monitor_manager =
backend_class->create_cursor_renderer = meta_backend_x11_cm_create_cursor_renderer; meta_backend_x11_cm_create_monitor_manager;
backend_class->create_input_settings = meta_backend_x11_cm_create_input_settings; backend_class->create_cursor_renderer =
meta_backend_x11_cm_create_cursor_renderer;
backend_class->create_input_settings =
meta_backend_x11_cm_create_input_settings;
backend_class->update_screen_size = meta_backend_x11_cm_update_screen_size; backend_class->update_screen_size = meta_backend_x11_cm_update_screen_size;
backend_class->select_stage_events = meta_backend_x11_cm_select_stage_events; backend_class->select_stage_events = meta_backend_x11_cm_select_stage_events;
backend_class->lock_layout_group = meta_backend_x11_cm_lock_layout_group; backend_class->lock_layout_group = meta_backend_x11_cm_lock_layout_group;
backend_class->set_keymap = meta_backend_x11_cm_set_keymap; backend_class->set_keymap = meta_backend_x11_cm_set_keymap;
backend_x11_class->handle_host_xevent = meta_backend_x11_cm_handle_host_xevent; backend_x11_class->handle_host_xevent =
backend_x11_class->translate_device_event = meta_backend_x11_cm_translate_device_event; meta_backend_x11_cm_handle_host_xevent;
backend_x11_class->translate_crossing_event = meta_backend_x11_cm_translate_crossing_event; backend_x11_class->translate_device_event =
meta_backend_x11_cm_translate_device_event;
backend_x11_class->translate_crossing_event =
meta_backend_x11_cm_translate_crossing_event;
} }

View File

@ -102,8 +102,8 @@ meta_cursor_sprite_xfixes_set_property (GObject *object,
} }
MetaCursorSpriteXfixes * MetaCursorSpriteXfixes *
meta_cursor_sprite_xfixes_new (MetaDisplay *display, meta_cursor_sprite_xfixes_new (MetaDisplay *display,
GError **error) GError **error)
{ {
return g_initable_new (META_TYPE_CURSOR_SPRITE_XFIXES, return g_initable_new (META_TYPE_CURSOR_SPRITE_XFIXES,
NULL, error, NULL, error,
@ -112,9 +112,9 @@ meta_cursor_sprite_xfixes_new (MetaDisplay *display,
} }
static gboolean static gboolean
meta_cursor_sprite_xfixes_initable_init (GInitable *initable, meta_cursor_sprite_xfixes_initable_init (GInitable *initable,
GCancellable *cancellable, GCancellable *cancellable,
GError **error) GError **error)
{ {
MetaCursorSpriteXfixes *sprite_xfixes = MetaCursorSpriteXfixes *sprite_xfixes =
META_CURSOR_SPRITE_XFIXES (initable); META_CURSOR_SPRITE_XFIXES (initable);
@ -172,12 +172,12 @@ meta_cursor_sprite_xfixes_initable_init (GInitable *initable,
clutter_backend = clutter_get_default_backend (); clutter_backend = clutter_get_default_backend ();
cogl_context = clutter_backend_get_cogl_context (clutter_backend); cogl_context = clutter_backend_get_cogl_context (clutter_backend);
texture = cogl_texture_2d_new_from_data (cogl_context, texture = cogl_texture_2d_new_from_data (cogl_context,
cursor_image->width, cursor_image->width,
cursor_image->height, cursor_image->height,
CLUTTER_CAIRO_FORMAT_ARGB32, CLUTTER_CAIRO_FORMAT_ARGB32,
cursor_image->width * 4, /* stride */ cursor_image->width * 4, /* stride */
cursor_data, cursor_data,
error); error);
if (free_cursor_data) if (free_cursor_data)
g_free (cursor_data); g_free (cursor_data);

View File

@ -329,7 +329,8 @@ handle_host_xevent (MetaBackend *backend,
if (meta_plugin_manager_xevent_filter (compositor->plugin_mgr, event)) if (meta_plugin_manager_xevent_filter (compositor->plugin_mgr, event))
bypass_clutter = TRUE; bypass_clutter = TRUE;
if (meta_dnd_handle_xdnd_event (backend, compositor, priv->xdisplay, event)) if (meta_dnd_handle_xdnd_event (backend, compositor, priv->xdisplay,
event))
bypass_clutter = TRUE; bypass_clutter = TRUE;
} }
} }
@ -383,7 +384,8 @@ handle_host_xevent (MetaBackend *backend,
XFreeEventData (priv->xdisplay, &event->xcookie); XFreeEventData (priv->xdisplay, &event->xcookie);
} }
typedef struct { typedef struct
{
GSource base; GSource base;
GPollFD event_poll_fd; GPollFD event_poll_fd;
MetaBackend *backend; MetaBackend *backend;
@ -415,9 +417,9 @@ x_event_source_check (GSource *source)
} }
static gboolean static gboolean
x_event_source_dispatch (GSource *source, x_event_source_dispatch (GSource *source,
GSourceFunc callback, GSourceFunc callback,
gpointer user_data) gpointer user_data)
{ {
XEventSource *x_source = (XEventSource *) source; XEventSource *x_source = (XEventSource *) source;
MetaBackend *backend = x_source->backend; MetaBackend *backend = x_source->backend;
@ -436,7 +438,8 @@ x_event_source_dispatch (GSource *source,
return TRUE; return TRUE;
} }
static GSourceFuncs x_event_funcs = { static GSourceFuncs x_event_funcs =
{
x_event_source_prepare, x_event_source_prepare,
x_event_source_check, x_event_source_check,
x_event_source_dispatch, x_event_source_dispatch,
@ -482,7 +485,8 @@ meta_backend_x11_post_init (MetaBackend *backend)
priv->source = x_event_source_new (backend); priv->source = x_event_source_new (backend);
if (!XSyncQueryExtension (priv->xdisplay, &priv->xsync_event_base, &priv->xsync_error_base) || if (!XSyncQueryExtension (priv->xdisplay, &priv->xsync_event_base,
&priv->xsync_error_base) ||
!XSyncInitialize (priv->xdisplay, &major, &minor)) !XSyncInitialize (priv->xdisplay, &major, &minor))
meta_fatal ("Could not initialize XSync"); meta_fatal ("Could not initialize XSync");
@ -498,7 +502,8 @@ meta_backend_x11_post_init (MetaBackend *backend)
&priv->xinput_error_base, &priv->xinput_error_base,
&priv->xinput_event_base)) &priv->xinput_event_base))
{ {
major = 2; minor = 3; major = 2;
minor = 3;
if (XIQueryVersion (priv->xdisplay, &major, &minor) == Success) if (XIQueryVersion (priv->xdisplay, &major, &minor) == Success)
{ {
int version = (major * 10) + minor; int version = (major * 10) + minor;
@ -508,7 +513,8 @@ meta_backend_x11_post_init (MetaBackend *backend)
} }
if (!has_xi) if (!has_xi)
meta_fatal ("X server doesn't have the XInput extension, version 2.2 or newer\n"); meta_fatal (
"X server doesn't have the XInput extension, version 2.2 or newer\n");
if (!xkb_x11_setup_xkb_extension (priv->xcb, if (!xkb_x11_setup_xkb_extension (priv->xcb,
XKB_X11_MIN_MAJOR_XKB_VERSION, XKB_X11_MIN_MAJOR_XKB_VERSION,
@ -517,8 +523,9 @@ meta_backend_x11_post_init (MetaBackend *backend)
NULL, NULL, NULL, NULL,
&priv->xkb_event_base, &priv->xkb_event_base,
&priv->xkb_error_base)) &priv->xkb_error_base))
meta_fatal ("X server doesn't have the XKB extension, version %d.%d or newer\n", meta_fatal (
XKB_X11_MIN_MAJOR_XKB_VERSION, XKB_X11_MIN_MINOR_XKB_VERSION); "X server doesn't have the XKB extension, version %d.%d or newer\n",
XKB_X11_MIN_MAJOR_XKB_VERSION, XKB_X11_MIN_MINOR_XKB_VERSION);
META_BACKEND_CLASS (meta_backend_x11_parent_class)->post_init (backend); META_BACKEND_CLASS (meta_backend_x11_parent_class)->post_init (backend);
@ -634,10 +641,12 @@ meta_backend_x11_get_keymap (MetaBackend *backend)
struct xkb_context *context = xkb_context_new (XKB_CONTEXT_NO_FLAGS); struct xkb_context *context = xkb_context_new (XKB_CONTEXT_NO_FLAGS);
priv->keymap = xkb_x11_keymap_new_from_device (context, priv->keymap = xkb_x11_keymap_new_from_device (context,
priv->xcb, priv->xcb,
xkb_x11_get_core_keyboard_device_id (priv->xcb), xkb_x11_get_core_keyboard_device_id (
priv->xcb),
XKB_KEYMAP_COMPILE_NO_FLAGS); XKB_KEYMAP_COMPILE_NO_FLAGS);
if (priv->keymap == NULL) if (priv->keymap == NULL)
priv->keymap = xkb_keymap_new_from_names (context, NULL, XKB_KEYMAP_COMPILE_NO_FLAGS); priv->keymap = xkb_keymap_new_from_names (context, NULL,
XKB_KEYMAP_COMPILE_NO_FLAGS);
xkb_context_unref (context); xkb_context_unref (context);
} }
@ -663,7 +672,7 @@ meta_backend_x11_set_numlock (MetaBackend *backend,
void void
meta_backend_x11_handle_event (MetaBackendX11 *x11, meta_backend_x11_handle_event (MetaBackendX11 *x11,
XEvent *xevent) XEvent *xevent)
{ {
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11); MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
@ -762,14 +771,17 @@ meta_backend_x11_class_init (MetaBackendX11Class *klass)
GObjectClass *object_class = G_OBJECT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->finalize = meta_backend_x11_finalize; object_class->finalize = meta_backend_x11_finalize;
backend_class->create_clutter_backend = meta_backend_x11_create_clutter_backend; backend_class->create_clutter_backend =
meta_backend_x11_create_clutter_backend;
backend_class->post_init = meta_backend_x11_post_init; backend_class->post_init = meta_backend_x11_post_init;
backend_class->grab_device = meta_backend_x11_grab_device; backend_class->grab_device = meta_backend_x11_grab_device;
backend_class->ungrab_device = meta_backend_x11_ungrab_device; backend_class->ungrab_device = meta_backend_x11_ungrab_device;
backend_class->warp_pointer = meta_backend_x11_warp_pointer; backend_class->warp_pointer = meta_backend_x11_warp_pointer;
backend_class->get_current_logical_monitor = meta_backend_x11_get_current_logical_monitor; backend_class->get_current_logical_monitor =
meta_backend_x11_get_current_logical_monitor;
backend_class->get_keymap = meta_backend_x11_get_keymap; backend_class->get_keymap = meta_backend_x11_get_keymap;
backend_class->get_keymap_layout_group = meta_backend_x11_get_keymap_layout_group; backend_class->get_keymap_layout_group =
meta_backend_x11_get_keymap_layout_group;
backend_class->set_numlock = meta_backend_x11_set_numlock; backend_class->set_numlock = meta_backend_x11_set_numlock;
} }
@ -780,7 +792,7 @@ meta_backend_x11_init (MetaBackendX11 *x11)
* in Cogl - see meta_renderer_x11_create_cogl_renderer(). We call it here * in Cogl - see meta_renderer_x11_create_cogl_renderer(). We call it here
* to hopefully call it before any other use of XLib. * to hopefully call it before any other use of XLib.
*/ */
XInitThreads(); XInitThreads ();
/* We do X11 event retrieval ourselves */ /* We do X11 event retrieval ourselves */
clutter_x11_disable_event_retrieval (); clutter_x11_disable_event_retrieval ();

View File

@ -44,8 +44,8 @@ G_DEFINE_TYPE (MetaClutterBackendX11, meta_clutter_backend_x11,
CLUTTER_TYPE_BACKEND_X11) CLUTTER_TYPE_BACKEND_X11)
static CoglRenderer * static CoglRenderer *
meta_clutter_backend_x11_get_renderer (ClutterBackend *clutter_backend, meta_clutter_backend_x11_get_renderer (ClutterBackend * clutter_backend,
GError **error) GError * *error)
{ {
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
MetaRenderer *renderer = meta_backend_get_renderer (backend); MetaRenderer *renderer = meta_backend_get_renderer (backend);
@ -54,9 +54,9 @@ meta_clutter_backend_x11_get_renderer (ClutterBackend *clutter_backend,
} }
static ClutterStageWindow * static ClutterStageWindow *
meta_clutter_backend_x11_create_stage (ClutterBackend *backend, meta_clutter_backend_x11_create_stage (ClutterBackend *backend,
ClutterStage *wrapper, ClutterStage *wrapper,
GError **error) GError **error)
{ {
ClutterEventTranslator *translator; ClutterEventTranslator *translator;
ClutterStageWindow *stage; ClutterStageWindow *stage;
@ -65,12 +65,12 @@ meta_clutter_backend_x11_create_stage (ClutterBackend *backend,
if (meta_is_wayland_compositor ()) if (meta_is_wayland_compositor ())
stage_type = META_TYPE_STAGE_X11_NESTED; stage_type = META_TYPE_STAGE_X11_NESTED;
else else
stage_type = CLUTTER_TYPE_STAGE_X11; stage_type = CLUTTER_TYPE_STAGE_X11;
stage = g_object_new (stage_type, stage = g_object_new (stage_type,
"backend", backend, "backend", backend,
"wrapper", wrapper, "wrapper", wrapper,
NULL); NULL);
/* the X11 stage does event translation */ /* the X11 stage does event translation */
translator = CLUTTER_EVENT_TRANSLATOR (stage); translator = CLUTTER_EVENT_TRANSLATOR (stage);
@ -80,7 +80,7 @@ meta_clutter_backend_x11_create_stage (ClutterBackend *backend,
} }
static void static void
meta_clutter_backend_x11_bell_notify (ClutterBackend *backend) meta_clutter_backend_x11_bell_notify (ClutterBackend *backend)
{ {
MetaDisplay *display = meta_get_display (); MetaDisplay *display = meta_get_display ();

View File

@ -103,7 +103,8 @@ meta_crtc_xrandr_set_config (MetaCrtc *crtc,
static MetaMonitorTransform static MetaMonitorTransform
meta_monitor_transform_from_xrandr (Rotation rotation) meta_monitor_transform_from_xrandr (Rotation rotation)
{ {
static const MetaMonitorTransform y_reflected_map[4] = { static const MetaMonitorTransform y_reflected_map[4] =
{
META_MONITOR_TRANSFORM_FLIPPED_180, META_MONITOR_TRANSFORM_FLIPPED_180,
META_MONITOR_TRANSFORM_FLIPPED_90, META_MONITOR_TRANSFORM_FLIPPED_90,
META_MONITOR_TRANSFORM_FLIPPED, META_MONITOR_TRANSFORM_FLIPPED,
@ -136,7 +137,8 @@ meta_monitor_transform_from_xrandr (Rotation rotation)
return ret; return ret;
} }
#define ALL_ROTATIONS (RR_Rotate_0 | RR_Rotate_90 | RR_Rotate_180 | RR_Rotate_270) #define ALL_ROTATIONS (RR_Rotate_0 | RR_Rotate_90 | RR_Rotate_180 | \
RR_Rotate_270)
static MetaMonitorTransform static MetaMonitorTransform
meta_monitor_transform_from_xrandr_all (Rotation rotation) meta_monitor_transform_from_xrandr_all (Rotation rotation)

View File

@ -38,14 +38,16 @@ struct _MetaCursorRendererX11Private
}; };
typedef struct _MetaCursorRendererX11Private MetaCursorRendererX11Private; typedef struct _MetaCursorRendererX11Private MetaCursorRendererX11Private;
G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorRendererX11, meta_cursor_renderer_x11, META_TYPE_CURSOR_RENDERER); G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorRendererX11, meta_cursor_renderer_x11,
META_TYPE_CURSOR_RENDERER);
static gboolean static gboolean
meta_cursor_renderer_x11_update_cursor (MetaCursorRenderer *renderer, meta_cursor_renderer_x11_update_cursor (MetaCursorRenderer *renderer,
MetaCursorSprite *cursor_sprite) MetaCursorSprite *cursor_sprite)
{ {
MetaCursorRendererX11 *x11 = META_CURSOR_RENDERER_X11 (renderer); MetaCursorRendererX11 *x11 = META_CURSOR_RENDERER_X11 (renderer);
MetaCursorRendererX11Private *priv = meta_cursor_renderer_x11_get_instance_private (x11); MetaCursorRendererX11Private *priv =
meta_cursor_renderer_x11_get_instance_private (x11);
MetaBackendX11 *backend = META_BACKEND_X11 (meta_get_backend ()); MetaBackendX11 *backend = META_BACKEND_X11 (meta_get_backend ());
Window xwindow = meta_backend_x11_get_xwindow (backend); Window xwindow = meta_backend_x11_get_xwindow (backend);
@ -107,7 +109,8 @@ meta_cursor_renderer_x11_class_init (MetaCursorRendererX11Class *klass)
static void static void
meta_cursor_renderer_x11_init (MetaCursorRendererX11 *x11) meta_cursor_renderer_x11_init (MetaCursorRendererX11 *x11)
{ {
MetaCursorRendererX11Private *priv = meta_cursor_renderer_x11_get_instance_private (x11); MetaCursorRendererX11Private *priv =
meta_cursor_renderer_x11_get_instance_private (x11);
/* XFixes has no way to retrieve the current cursor visibility. */ /* XFixes has no way to retrieve the current cursor visibility. */
priv->server_cursor_visible = TRUE; priv->server_cursor_visible = TRUE;

View File

@ -49,7 +49,7 @@ struct _MetaGpuXrandr
G_DEFINE_TYPE (MetaGpuXrandr, meta_gpu_xrandr, META_TYPE_GPU) G_DEFINE_TYPE (MetaGpuXrandr, meta_gpu_xrandr, META_TYPE_GPU)
XRRScreenResources * XRRScreenResources *
meta_gpu_xrandr_get_resources (MetaGpuXrandr *gpu_xrandr) meta_gpu_xrandr_get_resources (MetaGpuXrandr * gpu_xrandr)
{ {
return gpu_xrandr->resources; return gpu_xrandr->resources;
} }
@ -82,8 +82,8 @@ get_xmode_name (XRRModeInfo *xmode)
} }
static gboolean static gboolean
meta_gpu_xrandr_read_current (MetaGpu *gpu, meta_gpu_xrandr_read_current (MetaGpu *gpu,
GError **error) GError **error)
{ {
MetaGpuXrandr *gpu_xrandr = META_GPU_XRANDR (gpu); MetaGpuXrandr *gpu_xrandr = META_GPU_XRANDR (gpu);
MetaMonitorManager *monitor_manager = meta_gpu_get_monitor_manager (gpu); MetaMonitorManager *monitor_manager = meta_gpu_get_monitor_manager (gpu);
@ -163,7 +163,7 @@ meta_gpu_xrandr_read_current (MetaGpu *gpu,
modes = NULL; modes = NULL;
crtcs = NULL; crtcs = NULL;
for (i = 0; i < (unsigned)resources->nmode; i++) for (i = 0; i < (unsigned) resources->nmode; i++)
{ {
XRRModeInfo *xmode = &resources->modes[i]; XRRModeInfo *xmode = &resources->modes[i];
MetaCrtcMode *mode; MetaCrtcMode *mode;
@ -174,7 +174,7 @@ meta_gpu_xrandr_read_current (MetaGpu *gpu,
mode->width = xmode->width; mode->width = xmode->width;
mode->height = xmode->height; mode->height = xmode->height;
mode->refresh_rate = (xmode->dotClock / mode->refresh_rate = (xmode->dotClock /
((float)xmode->hTotal * xmode->vTotal)); ((float) xmode->hTotal * xmode->vTotal));
mode->flags = xmode->modeFlags; mode->flags = xmode->modeFlags;
mode->name = get_xmode_name (xmode); mode->name = get_xmode_name (xmode);
@ -182,7 +182,7 @@ meta_gpu_xrandr_read_current (MetaGpu *gpu,
} }
meta_gpu_take_modes (gpu, modes); meta_gpu_take_modes (gpu, modes);
for (i = 0; i < (unsigned)resources->ncrtc; i++) for (i = 0; i < (unsigned) resources->ncrtc; i++)
{ {
XRRCrtcInfo *xrandr_crtc; XRRCrtcInfo *xrandr_crtc;
RRCrtc crtc_id; RRCrtc crtc_id;
@ -203,7 +203,7 @@ meta_gpu_xrandr_read_current (MetaGpu *gpu,
primary_output = XRRGetOutputPrimary (xdisplay, primary_output = XRRGetOutputPrimary (xdisplay,
DefaultRootWindow (xdisplay)); DefaultRootWindow (xdisplay));
for (i = 0; i < (unsigned)resources->noutput; i++) for (i = 0; i < (unsigned) resources->noutput; i++)
{ {
RROutput output_id; RROutput output_id;
XRROutputInfo *xrandr_output; XRROutputInfo *xrandr_output;

View File

@ -50,7 +50,8 @@ typedef struct _MetaInputSettingsX11Private
G_DEFINE_TYPE_WITH_PRIVATE (MetaInputSettingsX11, meta_input_settings_x11, G_DEFINE_TYPE_WITH_PRIVATE (MetaInputSettingsX11, meta_input_settings_x11,
META_TYPE_INPUT_SETTINGS) META_TYPE_INPUT_SETTINGS)
enum { enum
{
SCROLL_METHOD_FIELD_2FG, SCROLL_METHOD_FIELD_2FG,
SCROLL_METHOD_FIELD_EDGE, SCROLL_METHOD_FIELD_EDGE,
SCROLL_METHOD_FIELD_BUTTON, SCROLL_METHOD_FIELD_BUTTON,
@ -62,7 +63,8 @@ device_free_xdevice (gpointer user_data)
{ {
MetaDisplay *display = meta_get_display (); MetaDisplay *display = meta_get_display ();
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend)); Display *xdisplay =
meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
XDevice *xdev = user_data; XDevice *xdev = user_data;
meta_x11_error_trap_push (display->x11_display); meta_x11_error_trap_push (display->x11_display);
@ -75,7 +77,8 @@ device_ensure_xdevice (ClutterInputDevice *device)
{ {
MetaDisplay *display = meta_get_display (); MetaDisplay *display = meta_get_display ();
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend)); Display *xdisplay =
meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
int device_id = clutter_input_device_get_device_id (device); int device_id = clutter_input_device_get_device_id (device);
XDevice *xdev = NULL; XDevice *xdev = NULL;
@ -105,7 +108,8 @@ get_property (ClutterInputDevice *device,
gulong nitems) gulong nitems)
{ {
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend)); Display *xdisplay =
meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
gulong nitems_ret, bytes_after_ret; gulong nitems_ret, bytes_after_ret;
int rc, device_id, format_ret; int rc, device_id, format_ret;
Atom property_atom, type_ret; Atom property_atom, type_ret;
@ -120,11 +124,14 @@ get_property (ClutterInputDevice *device,
rc = XIGetProperty (xdisplay, device_id, property_atom, rc = XIGetProperty (xdisplay, device_id, property_atom,
0, 10, False, type, &type_ret, &format_ret, 0, 10, False, type, &type_ret, &format_ret,
&nitems_ret, &bytes_after_ret, &data_ret); &nitems_ret, &bytes_after_ret, &data_ret);
if (rc == Success && type_ret == type && format_ret == format && nitems_ret >= nitems) if (rc == Success && type_ret == type && format_ret == format &&
nitems_ret >= nitems)
{ {
if (nitems_ret > nitems) if (nitems_ret > nitems)
g_warning ("Property '%s' for device '%s' returned %lu items, expected %lu", g_warning (
property, clutter_input_device_get_device_name (device), nitems_ret, nitems); "Property '%s' for device '%s' returned %lu items, expected %lu",
property, clutter_input_device_get_device_name (
device), nitems_ret, nitems);
return data_ret; return data_ret;
} }
@ -141,7 +148,8 @@ change_property (ClutterInputDevice *device,
gulong nitems) gulong nitems)
{ {
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend)); Display *xdisplay =
meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
int device_id; int device_id;
Atom property_atom; Atom property_atom;
guchar *data_ret; guchar *data_ret;
@ -162,9 +170,9 @@ change_property (ClutterInputDevice *device,
} }
static void static void
meta_input_settings_x11_set_send_events (MetaInputSettings *settings, meta_input_settings_x11_set_send_events (MetaInputSettings *settings,
ClutterInputDevice *device, ClutterInputDevice *device,
GDesktopDeviceSendEvents mode) GDesktopDeviceSendEvents mode)
{ {
guchar values[2] = { 0 }; /* disabled, disabled-on-external-mouse */ guchar values[2] = { 0 }; /* disabled, disabled-on-external-mouse */
guchar *available; guchar *available;
@ -202,10 +210,14 @@ meta_input_settings_x11_set_matrix (MetaInputSettings *settings,
gfloat matrix[6]) gfloat matrix[6])
{ {
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend)); Display *xdisplay =
gfloat full_matrix[9] = { matrix[0], matrix[1], matrix[2], meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
matrix[3], matrix[4], matrix[5], gfloat full_matrix[9] =
0, 0, 1 }; {
matrix[0], matrix[1], matrix[2],
matrix[3], matrix[4], matrix[5],
0, 0, 1
};
change_property (device, "Coordinate Transformation Matrix", change_property (device, "Coordinate Transformation Matrix",
XInternAtom (xdisplay, "FLOAT", False), XInternAtom (xdisplay, "FLOAT", False),
@ -218,7 +230,8 @@ meta_input_settings_x11_set_speed (MetaInputSettings *settings,
gdouble speed) gdouble speed)
{ {
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend)); Display *xdisplay =
meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
gfloat value = speed; gfloat value = speed;
change_property (device, "libinput Accel Speed", change_property (device, "libinput Accel Speed",
@ -297,11 +310,12 @@ meta_input_settings_x11_set_invert_scroll (MetaInputSettings *settings,
} }
static void static void
meta_input_settings_x11_set_edge_scroll (MetaInputSettings *settings, meta_input_settings_x11_set_edge_scroll (MetaInputSettings *settings,
ClutterInputDevice *device, ClutterInputDevice *device,
gboolean edge_scroll_enabled) gboolean edge_scroll_enabled)
{ {
guchar values[SCROLL_METHOD_NUM_FIELDS] = { 0 }; /* 2fg, edge, button. The last value is unused */ guchar values[SCROLL_METHOD_NUM_FIELDS] = { 0 }; /* 2fg, edge, button. The
* last value is unused */
guchar *current = NULL; guchar *current = NULL;
guchar *available = NULL; guchar *available = NULL;
@ -320,17 +334,18 @@ meta_input_settings_x11_set_edge_scroll (MetaInputSettings *settings,
values[SCROLL_METHOD_FIELD_EDGE] = !!edge_scroll_enabled; values[SCROLL_METHOD_FIELD_EDGE] = !!edge_scroll_enabled;
change_property (device, "libinput Scroll Method Enabled", change_property (device, "libinput Scroll Method Enabled",
XA_INTEGER, 8, &values, SCROLL_METHOD_NUM_FIELDS); XA_INTEGER, 8, &values, SCROLL_METHOD_NUM_FIELDS);
out: out:
meta_XFree (current); meta_XFree (current);
meta_XFree (available); meta_XFree (available);
} }
static void static void
meta_input_settings_x11_set_two_finger_scroll (MetaInputSettings *settings, meta_input_settings_x11_set_two_finger_scroll (MetaInputSettings *settings,
ClutterInputDevice *device, ClutterInputDevice *device,
gboolean two_finger_scroll_enabled) gboolean two_finger_scroll_enabled)
{ {
guchar values[SCROLL_METHOD_NUM_FIELDS] = { 0 }; /* 2fg, edge, button. The last value is unused */ guchar values[SCROLL_METHOD_NUM_FIELDS] = { 0 }; /* 2fg, edge, button. The
* last value is unused */
guchar *current = NULL; guchar *current = NULL;
guchar *available = NULL; guchar *available = NULL;
@ -349,7 +364,7 @@ meta_input_settings_x11_set_two_finger_scroll (MetaInputSettings *set
values[SCROLL_METHOD_FIELD_2FG] = !!two_finger_scroll_enabled; values[SCROLL_METHOD_FIELD_2FG] = !!two_finger_scroll_enabled;
change_property (device, "libinput Scroll Method Enabled", change_property (device, "libinput Scroll Method Enabled",
XA_INTEGER, 8, &values, SCROLL_METHOD_NUM_FIELDS); XA_INTEGER, 8, &values, SCROLL_METHOD_NUM_FIELDS);
out: out:
meta_XFree (current); meta_XFree (current);
meta_XFree (available); meta_XFree (available);
} }
@ -380,9 +395,9 @@ meta_input_settings_x11_set_scroll_button (MetaInputSettings *settings,
} }
static void static void
meta_input_settings_x11_set_click_method (MetaInputSettings *settings, meta_input_settings_x11_set_click_method (MetaInputSettings *settings,
ClutterInputDevice *device, ClutterInputDevice *device,
GDesktopTouchpadClickMethod mode) GDesktopTouchpadClickMethod mode)
{ {
guchar values[2] = { 0 }; /* buttonareas, clickfinger */ guchar values[2] = { 0 }; /* buttonareas, clickfinger */
guchar *defaults, *available; guchar *defaults, *available;
@ -413,7 +428,7 @@ meta_input_settings_x11_set_click_method (MetaInputSettings *settings,
default: default:
g_assert_not_reached (); g_assert_not_reached ();
return; return;
} }
if ((values[0] && !available[0]) || (values[1] && !available[1])) if ((values[0] && !available[0]) || (values[1] && !available[1]))
g_warning ("Device '%s' does not support click method %d\n", g_warning ("Device '%s' does not support click method %d\n",
@ -422,7 +437,7 @@ meta_input_settings_x11_set_click_method (MetaInputSettings *settings,
change_property (device, "libinput Click Method Enabled", change_property (device, "libinput Click Method Enabled",
XA_INTEGER, 8, &values, 2); XA_INTEGER, 8, &values, 2);
meta_XFree(available); meta_XFree (available);
} }
static void static void
@ -432,7 +447,8 @@ meta_input_settings_x11_set_keyboard_repeat (MetaInputSettings *settings,
guint interval) guint interval)
{ {
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend)); Display *xdisplay =
meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
if (enabled) if (enabled)
{ {
@ -521,7 +537,7 @@ set_device_accel_profile (ClutterInputDevice *device,
return; return;
available = get_property (device, "libinput Accel Profiles Available", available = get_property (device, "libinput Accel Profiles Available",
XA_INTEGER, 8, 2); XA_INTEGER, 8, 2);
if (!available) if (!available)
goto err_available; goto err_available;
@ -553,9 +569,10 @@ err_available:
} }
static void static void
meta_input_settings_x11_set_mouse_accel_profile (MetaInputSettings *settings, meta_input_settings_x11_set_mouse_accel_profile (
ClutterInputDevice *device, MetaInputSettings *settings,
GDesktopPointerAccelProfile profile) ClutterInputDevice *device,
GDesktopPointerAccelProfile profile)
{ {
if (!is_mouse (settings, device)) if (!is_mouse (settings, device))
return; return;
@ -564,9 +581,10 @@ meta_input_settings_x11_set_mouse_accel_profile (MetaInputSettings *set
} }
static void static void
meta_input_settings_x11_set_trackball_accel_profile (MetaInputSettings *settings, meta_input_settings_x11_set_trackball_accel_profile (
ClutterInputDevice *device, MetaInputSettings *settings,
GDesktopPointerAccelProfile profile) ClutterInputDevice *device,
GDesktopPointerAccelProfile profile)
{ {
if (!meta_input_settings_x11_is_trackball_device (settings, device)) if (!meta_input_settings_x11_is_trackball_device (settings, device))
return; return;
@ -575,13 +593,14 @@ meta_input_settings_x11_set_trackball_accel_profile (MetaInputSettings
} }
static void static void
meta_input_settings_x11_set_tablet_mapping (MetaInputSettings *settings, meta_input_settings_x11_set_tablet_mapping (MetaInputSettings *settings,
ClutterInputDevice *device, ClutterInputDevice *device,
GDesktopTabletMapping mapping) GDesktopTabletMapping mapping)
{ {
MetaDisplay *display = meta_get_display (); MetaDisplay *display = meta_get_display ();
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend)); Display *xdisplay =
meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
XDevice *xdev; XDevice *xdev;
if (!display) if (!display)
@ -607,8 +626,8 @@ meta_input_settings_x11_set_tablet_mapping (MetaInputSettings *settings,
ClutterInputDeviceMapping dev_mapping; ClutterInputDeviceMapping dev_mapping;
dev_mapping = (mapping == G_DESKTOP_TABLET_MAPPING_ABSOLUTE) ? dev_mapping = (mapping == G_DESKTOP_TABLET_MAPPING_ABSOLUTE) ?
CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE : CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE :
CLUTTER_INPUT_DEVICE_MAPPING_RELATIVE; CLUTTER_INPUT_DEVICE_MAPPING_RELATIVE;
clutter_input_device_set_mapping_mode (device, dev_mapping); clutter_input_device_set_mapping_mode (device, dev_mapping);
} }
} }
@ -621,7 +640,8 @@ device_query_area (ClutterInputDevice *device,
gint *height) gint *height)
{ {
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend)); Display *xdisplay =
meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
gint device_id, n_devices, i; gint device_id, n_devices, i;
XIDeviceInfo *info; XIDeviceInfo *info;
Atom abs_x, abs_y; Atom abs_x, abs_y;
@ -768,16 +788,18 @@ action_to_button (GDesktopStylusButtonAction action,
} }
static void static void
meta_input_settings_x11_set_stylus_button_map (MetaInputSettings *settings, meta_input_settings_x11_set_stylus_button_map (
ClutterInputDevice *device, MetaInputSettings *settings,
ClutterInputDeviceTool *tool, ClutterInputDevice *device,
GDesktopStylusButtonAction primary, ClutterInputDeviceTool *tool,
GDesktopStylusButtonAction secondary, GDesktopStylusButtonAction primary,
GDesktopStylusButtonAction tertiary) GDesktopStylusButtonAction secondary,
GDesktopStylusButtonAction tertiary)
{ {
MetaDisplay *display = meta_get_display (); MetaDisplay *display = meta_get_display ();
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend)); Display *xdisplay =
meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
XDevice *xdev; XDevice *xdev;
if (!display) if (!display)
@ -788,7 +810,8 @@ meta_input_settings_x11_set_stylus_button_map (MetaInputSettings *setti
xdev = device_ensure_xdevice (device); xdev = device_ensure_xdevice (device);
if (xdev) if (xdev)
{ {
guchar map[8] = { guchar map[8] =
{
CLUTTER_BUTTON_PRIMARY, CLUTTER_BUTTON_PRIMARY,
action_to_button (primary, CLUTTER_BUTTON_MIDDLE), action_to_button (primary, CLUTTER_BUTTON_MIDDLE),
action_to_button (secondary, CLUTTER_BUTTON_SECONDARY), action_to_button (secondary, CLUTTER_BUTTON_SECONDARY),
@ -825,36 +848,57 @@ static void
meta_input_settings_x11_class_init (MetaInputSettingsX11Class *klass) meta_input_settings_x11_class_init (MetaInputSettingsX11Class *klass)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass);
MetaInputSettingsClass *input_settings_class = META_INPUT_SETTINGS_CLASS (klass); MetaInputSettingsClass *input_settings_class = META_INPUT_SETTINGS_CLASS (
klass);
object_class->dispose = meta_input_settings_x11_dispose; object_class->dispose = meta_input_settings_x11_dispose;
input_settings_class->set_send_events = meta_input_settings_x11_set_send_events; input_settings_class->set_send_events =
meta_input_settings_x11_set_send_events;
input_settings_class->set_matrix = meta_input_settings_x11_set_matrix; input_settings_class->set_matrix = meta_input_settings_x11_set_matrix;
input_settings_class->set_speed = meta_input_settings_x11_set_speed; input_settings_class->set_speed = meta_input_settings_x11_set_speed;
input_settings_class->set_left_handed = meta_input_settings_x11_set_left_handed; input_settings_class->set_left_handed =
input_settings_class->set_tap_enabled = meta_input_settings_x11_set_tap_enabled; meta_input_settings_x11_set_left_handed;
input_settings_class->set_tap_and_drag_enabled = meta_input_settings_x11_set_tap_and_drag_enabled; input_settings_class->set_tap_enabled =
input_settings_class->set_disable_while_typing = meta_input_settings_x11_set_disable_while_typing; meta_input_settings_x11_set_tap_enabled;
input_settings_class->set_invert_scroll = meta_input_settings_x11_set_invert_scroll; input_settings_class->set_tap_and_drag_enabled =
input_settings_class->set_edge_scroll = meta_input_settings_x11_set_edge_scroll; meta_input_settings_x11_set_tap_and_drag_enabled;
input_settings_class->set_two_finger_scroll = meta_input_settings_x11_set_two_finger_scroll; input_settings_class->set_disable_while_typing =
input_settings_class->set_scroll_button = meta_input_settings_x11_set_scroll_button; meta_input_settings_x11_set_disable_while_typing;
input_settings_class->set_click_method = meta_input_settings_x11_set_click_method; input_settings_class->set_invert_scroll =
input_settings_class->set_keyboard_repeat = meta_input_settings_x11_set_keyboard_repeat; meta_input_settings_x11_set_invert_scroll;
input_settings_class->set_edge_scroll =
meta_input_settings_x11_set_edge_scroll;
input_settings_class->set_two_finger_scroll =
meta_input_settings_x11_set_two_finger_scroll;
input_settings_class->set_scroll_button =
meta_input_settings_x11_set_scroll_button;
input_settings_class->set_click_method =
meta_input_settings_x11_set_click_method;
input_settings_class->set_keyboard_repeat =
meta_input_settings_x11_set_keyboard_repeat;
input_settings_class->set_tablet_mapping = meta_input_settings_x11_set_tablet_mapping; input_settings_class->set_tablet_mapping =
input_settings_class->set_tablet_keep_aspect = meta_input_settings_x11_set_tablet_keep_aspect; meta_input_settings_x11_set_tablet_mapping;
input_settings_class->set_tablet_area = meta_input_settings_x11_set_tablet_area; input_settings_class->set_tablet_keep_aspect =
meta_input_settings_x11_set_tablet_keep_aspect;
input_settings_class->set_tablet_area =
meta_input_settings_x11_set_tablet_area;
input_settings_class->set_mouse_accel_profile = meta_input_settings_x11_set_mouse_accel_profile; input_settings_class->set_mouse_accel_profile =
input_settings_class->set_trackball_accel_profile = meta_input_settings_x11_set_trackball_accel_profile; meta_input_settings_x11_set_mouse_accel_profile;
input_settings_class->set_trackball_accel_profile =
meta_input_settings_x11_set_trackball_accel_profile;
input_settings_class->set_stylus_pressure = meta_input_settings_x11_set_stylus_pressure; input_settings_class->set_stylus_pressure =
input_settings_class->set_stylus_button_map = meta_input_settings_x11_set_stylus_button_map; meta_input_settings_x11_set_stylus_pressure;
input_settings_class->set_stylus_button_map =
meta_input_settings_x11_set_stylus_button_map;
input_settings_class->has_two_finger_scroll = meta_input_settings_x11_has_two_finger_scroll; input_settings_class->has_two_finger_scroll =
input_settings_class->is_trackball_device = meta_input_settings_x11_is_trackball_device; meta_input_settings_x11_has_two_finger_scroll;
input_settings_class->is_trackball_device =
meta_input_settings_x11_is_trackball_device;
} }
static void static void

View File

@ -81,7 +81,8 @@ struct _MetaMonitorManagerXrandrClass
MetaMonitorManagerClass parent_class; MetaMonitorManagerClass parent_class;
}; };
G_DEFINE_TYPE (MetaMonitorManagerXrandr, meta_monitor_manager_xrandr, META_TYPE_MONITOR_MANAGER); G_DEFINE_TYPE (MetaMonitorManagerXrandr, meta_monitor_manager_xrandr,
META_TYPE_MONITOR_MANAGER);
typedef struct _MetaMonitorXrandrData typedef struct _MetaMonitorXrandrData
{ {
@ -91,13 +92,15 @@ typedef struct _MetaMonitorXrandrData
GQuark quark_meta_monitor_xrandr_data; GQuark quark_meta_monitor_xrandr_data;
Display * Display *
meta_monitor_manager_xrandr_get_xdisplay (MetaMonitorManagerXrandr *manager_xrandr) meta_monitor_manager_xrandr_get_xdisplay (
MetaMonitorManagerXrandr *manager_xrandr)
{ {
return manager_xrandr->xdisplay; return manager_xrandr->xdisplay;
} }
gboolean gboolean
meta_monitor_manager_xrandr_has_randr15 (MetaMonitorManagerXrandr *manager_xrandr) meta_monitor_manager_xrandr_has_randr15 (
MetaMonitorManagerXrandr *manager_xrandr)
{ {
return manager_xrandr->has_randr15; return manager_xrandr->has_randr15;
} }
@ -111,27 +114,29 @@ meta_monitor_manager_xrandr_read_edid (MetaMonitorManager *manager,
static void static void
meta_monitor_manager_xrandr_set_power_save_mode (MetaMonitorManager *manager, meta_monitor_manager_xrandr_set_power_save_mode (MetaMonitorManager *manager,
MetaPowerSave mode) MetaPowerSave mode)
{ {
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager); MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (
manager);
CARD16 state; CARD16 state;
switch (mode) { switch (mode)
case META_POWER_SAVE_ON: {
state = DPMSModeOn; case META_POWER_SAVE_ON:
break; state = DPMSModeOn;
case META_POWER_SAVE_STANDBY: break;
state = DPMSModeStandby; case META_POWER_SAVE_STANDBY:
break; state = DPMSModeStandby;
case META_POWER_SAVE_SUSPEND: break;
state = DPMSModeSuspend; case META_POWER_SAVE_SUSPEND:
break; state = DPMSModeSuspend;
case META_POWER_SAVE_OFF: break;
state = DPMSModeOff; case META_POWER_SAVE_OFF:
break; state = DPMSModeOff;
default: break;
return; default:
} return;
}
DPMSForceLevel (manager_xrandr->xdisplay, state); DPMSForceLevel (manager_xrandr->xdisplay, state);
DPMSSetTimeouts (manager_xrandr->xdisplay, 0, 0, 0); DPMSSetTimeouts (manager_xrandr->xdisplay, 0, 0, 0);
@ -219,7 +224,7 @@ is_crtc_assignment_changed (MetaCrtc *crtc,
for (j = 0; j < crtc_info->outputs->len; j++) for (j = 0; j < crtc_info->outputs->len; j++)
{ {
MetaOutput *output = ((MetaOutput**) crtc_info->outputs->pdata)[j]; MetaOutput *output = ((MetaOutput **) crtc_info->outputs->pdata)[j];
MetaCrtc *assigned_crtc; MetaCrtc *assigned_crtc;
assigned_crtc = meta_output_get_assigned_crtc (output); assigned_crtc = meta_output_get_assigned_crtc (output);
@ -276,7 +281,7 @@ is_output_assignment_changed (MetaOutput *output,
for (j = 0; j < crtc_info->outputs->len; j++) for (j = 0; j < crtc_info->outputs->len; j++)
{ {
MetaOutput *crtc_info_output = MetaOutput *crtc_info_output =
((MetaOutput**) crtc_info->outputs->pdata)[j]; ((MetaOutput **) crtc_info->outputs->pdata)[j];
if (crtc_info_output == output && if (crtc_info_output == output &&
crtc_info->crtc == assigned_crtc) crtc_info->crtc == assigned_crtc)
@ -329,7 +334,8 @@ apply_crtc_assignments (MetaMonitorManager *manager,
MetaOutputInfo **outputs, MetaOutputInfo **outputs,
unsigned int n_outputs) unsigned int n_outputs)
{ {
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager); MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (
manager);
unsigned i; unsigned i;
GList *l; GList *l;
int width, height, width_mm, height_mm; int width, height, width_mm, height_mm;
@ -337,7 +343,8 @@ apply_crtc_assignments (MetaMonitorManager *manager,
XGrabServer (manager_xrandr->xdisplay); XGrabServer (manager_xrandr->xdisplay);
/* First compute the new size of the screen (framebuffer) */ /* First compute the new size of the screen (framebuffer) */
width = 0; height = 0; width = 0;
height = 0;
for (i = 0; i < n_crtcs; i++) for (i = 0; i < n_crtcs; i++)
{ {
MetaCrtcInfo *crtc_info = crtcs[i]; MetaCrtcInfo *crtc_info = crtcs[i];
@ -360,10 +367,10 @@ apply_crtc_assignments (MetaMonitorManager *manager,
} }
/* Second disable all newly disabled CRTCs, or CRTCs that in the previous /* Second disable all newly disabled CRTCs, or CRTCs that in the previous
configuration would be outside the new framebuffer (otherwise X complains * configuration would be outside the new framebuffer (otherwise X complains
loudly when resizing) * loudly when resizing)
CRTC will be enabled again after resizing the FB * CRTC will be enabled again after resizing the FB
*/ */
for (i = 0; i < n_crtcs; i++) for (i = 0; i < n_crtcs; i++)
{ {
MetaCrtcInfo *crtc_info = crtcs[i]; MetaCrtcInfo *crtc_info = crtcs[i];
@ -428,7 +435,8 @@ apply_crtc_assignments (MetaMonitorManager *manager,
*/ */
width_mm = (width / DPI_FALLBACK) * 25.4 + 0.5; width_mm = (width / DPI_FALLBACK) * 25.4 + 0.5;
height_mm = (height / DPI_FALLBACK) * 25.4 + 0.5; height_mm = (height / DPI_FALLBACK) * 25.4 + 0.5;
XRRSetScreenSize (manager_xrandr->xdisplay, DefaultRootWindow (manager_xrandr->xdisplay), XRRSetScreenSize (manager_xrandr->xdisplay,
DefaultRootWindow (manager_xrandr->xdisplay),
width, height, width_mm, height_mm); width, height, width_mm, height_mm);
for (i = 0; i < n_crtcs; i++) for (i = 0; i < n_crtcs; i++)
@ -452,7 +460,7 @@ apply_crtc_assignments (MetaMonitorManager *manager,
{ {
MetaOutput *output; MetaOutput *output;
output = ((MetaOutput**)crtc_info->outputs->pdata)[j]; output = ((MetaOutput **) crtc_info->outputs->pdata)[j];
output->is_dirty = TRUE; output->is_dirty = TRUE;
meta_output_assign_crtc (output, crtc); meta_output_assign_crtc (output, crtc);
@ -471,10 +479,12 @@ apply_crtc_assignments (MetaMonitorManager *manager,
rotation, rotation,
output_ids, n_output_ids)) output_ids, n_output_ids))
{ {
meta_warning ("Configuring CRTC %d with mode %d (%d x %d @ %f) at position %d, %d and transform %u failed\n", meta_warning (
(unsigned)(crtc->crtc_id), (unsigned)(mode->mode_id), "Configuring CRTC %d with mode %d (%d x %d @ %f) at position %d, %d and transform %u failed\n",
mode->width, mode->height, (float)mode->refresh_rate, (unsigned) (crtc->crtc_id),
crtc_info->x, crtc_info->y, crtc_info->transform); (unsigned) (mode->mode_id),
mode->width, mode->height, (float) mode->refresh_rate,
crtc_info->x, crtc_info->y, crtc_info->transform);
continue; continue;
} }
@ -561,10 +571,11 @@ meta_monitor_manager_xrandr_rebuild_derived (MetaMonitorManager *manager,
} }
static gboolean static gboolean
meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager *manager, meta_monitor_manager_xrandr_apply_monitors_config (
MetaMonitorsConfig *config, MetaMonitorManager *manager,
MetaMonitorsConfigMethod method, MetaMonitorsConfig *config,
GError **error) MetaMonitorsConfigMethod method,
GError **error)
{ {
GPtrArray *crtc_infos; GPtrArray *crtc_infos;
GPtrArray *output_infos; GPtrArray *output_infos;
@ -617,24 +628,25 @@ meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager *mana
static void static void
meta_monitor_manager_xrandr_change_backlight (MetaMonitorManager *manager, meta_monitor_manager_xrandr_change_backlight (MetaMonitorManager *manager,
MetaOutput *output, MetaOutput *output,
gint value) gint value)
{ {
meta_output_xrandr_change_backlight (output, value); meta_output_xrandr_change_backlight (output, value);
} }
static void static void
meta_monitor_manager_xrandr_get_crtc_gamma (MetaMonitorManager *manager, meta_monitor_manager_xrandr_get_crtc_gamma (MetaMonitorManager *manager,
MetaCrtc *crtc, MetaCrtc *crtc,
gsize *size, gsize *size,
unsigned short **red, unsigned short **red,
unsigned short **green, unsigned short **green,
unsigned short **blue) unsigned short **blue)
{ {
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager); MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (
manager);
XRRCrtcGamma *gamma; XRRCrtcGamma *gamma;
gamma = XRRGetCrtcGamma (manager_xrandr->xdisplay, (XID)crtc->crtc_id); gamma = XRRGetCrtcGamma (manager_xrandr->xdisplay, (XID) crtc->crtc_id);
*size = gamma->size; *size = gamma->size;
*red = g_memdup (gamma->red, sizeof (unsigned short) * gamma->size); *red = g_memdup (gamma->red, sizeof (unsigned short) * gamma->size);
@ -646,13 +658,14 @@ meta_monitor_manager_xrandr_get_crtc_gamma (MetaMonitorManager *manager,
static void static void
meta_monitor_manager_xrandr_set_crtc_gamma (MetaMonitorManager *manager, meta_monitor_manager_xrandr_set_crtc_gamma (MetaMonitorManager *manager,
MetaCrtc *crtc, MetaCrtc *crtc,
gsize size, gsize size,
unsigned short *red, unsigned short *red,
unsigned short *green, unsigned short *green,
unsigned short *blue) unsigned short *blue)
{ {
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager); MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (
manager);
XRRCrtcGamma *gamma; XRRCrtcGamma *gamma;
gamma = XRRAllocGamma (size); gamma = XRRAllocGamma (size);
@ -660,7 +673,7 @@ meta_monitor_manager_xrandr_set_crtc_gamma (MetaMonitorManager *manager,
memcpy (gamma->green, green, sizeof (unsigned short) * size); memcpy (gamma->green, green, sizeof (unsigned short) * size);
memcpy (gamma->blue, blue, sizeof (unsigned short) * size); memcpy (gamma->blue, blue, sizeof (unsigned short) * size);
XRRSetCrtcGamma (manager_xrandr->xdisplay, (XID)crtc->crtc_id, gamma); XRRSetCrtcGamma (manager_xrandr->xdisplay, (XID) crtc->crtc_id, gamma);
XRRFreeGamma (gamma); XRRFreeGamma (gamma);
} }
@ -685,8 +698,9 @@ meta_monitor_xrandr_data_from_monitor (MetaMonitor *monitor)
} }
static void static void
meta_monitor_manager_xrandr_increase_monitor_count (MetaMonitorManagerXrandr *manager_xrandr, meta_monitor_manager_xrandr_increase_monitor_count (
Atom name_atom) MetaMonitorManagerXrandr *manager_xrandr,
Atom name_atom)
{ {
int count; int count;
@ -701,8 +715,9 @@ meta_monitor_manager_xrandr_increase_monitor_count (MetaMonitorManagerXrandr *ma
} }
static int static int
meta_monitor_manager_xrandr_decrease_monitor_count (MetaMonitorManagerXrandr *manager_xrandr, meta_monitor_manager_xrandr_decrease_monitor_count (
Atom name_atom) MetaMonitorManagerXrandr *manager_xrandr,
Atom name_atom)
{ {
int count; int count;
@ -723,7 +738,8 @@ static void
meta_monitor_manager_xrandr_tiled_monitor_added (MetaMonitorManager *manager, meta_monitor_manager_xrandr_tiled_monitor_added (MetaMonitorManager *manager,
MetaMonitor *monitor) MetaMonitor *monitor)
{ {
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager); MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (
manager);
MetaMonitorTiled *monitor_tiled = META_MONITOR_TILED (monitor); MetaMonitorTiled *monitor_tiled = META_MONITOR_TILED (monitor);
const char *product; const char *product;
char *name; char *name;
@ -778,7 +794,8 @@ static void
meta_monitor_manager_xrandr_tiled_monitor_removed (MetaMonitorManager *manager, meta_monitor_manager_xrandr_tiled_monitor_removed (MetaMonitorManager *manager,
MetaMonitor *monitor) MetaMonitor *monitor)
{ {
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager); MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (
manager);
MetaMonitorXrandrData *monitor_xrandr_data; MetaMonitorXrandrData *monitor_xrandr_data;
Atom monitor_name; Atom monitor_name;
@ -800,7 +817,8 @@ meta_monitor_manager_xrandr_tiled_monitor_removed (MetaMonitorManager *manager,
} }
static void static void
meta_monitor_manager_xrandr_init_monitors (MetaMonitorManagerXrandr *manager_xrandr) meta_monitor_manager_xrandr_init_monitors (
MetaMonitorManagerXrandr *manager_xrandr)
{ {
XRRMonitorInfo *m; XRRMonitorInfo *m;
int n, i; int n, i;
@ -809,7 +827,7 @@ meta_monitor_manager_xrandr_init_monitors (MetaMonitorManagerXrandr *manager_xra
return; return;
/* delete any tiled monitors setup, as mutter will want to recreate /* delete any tiled monitors setup, as mutter will want to recreate
things in its image */ * things in its image */
m = XRRGetMonitors (manager_xrandr->xdisplay, m = XRRGetMonitors (manager_xrandr->xdisplay,
DefaultRootWindow (manager_xrandr->xdisplay), DefaultRootWindow (manager_xrandr->xdisplay),
FALSE, &n); FALSE, &n);
@ -837,9 +855,10 @@ meta_monitor_manager_xrandr_is_transform_handled (MetaMonitorManager *manager,
} }
static float static float
meta_monitor_manager_xrandr_calculate_monitor_mode_scale (MetaMonitorManager *manager, meta_monitor_manager_xrandr_calculate_monitor_mode_scale (
MetaMonitor *monitor, MetaMonitorManager *manager,
MetaMonitorMode *monitor_mode) MetaMonitor *monitor,
MetaMonitorMode *monitor_mode)
{ {
return meta_monitor_calculate_mode_scale (monitor, monitor_mode); return meta_monitor_calculate_mode_scale (monitor, monitor_mode);
} }
@ -916,11 +935,12 @@ ensure_supported_monitor_scales (MetaMonitorManager *manager)
} }
static float * static float *
meta_monitor_manager_xrandr_calculate_supported_scales (MetaMonitorManager *manager, meta_monitor_manager_xrandr_calculate_supported_scales (
MetaLogicalMonitorLayoutMode layout_mode, MetaMonitorManager *manager,
MetaMonitor *monitor, MetaLogicalMonitorLayoutMode layout_mode,
MetaMonitorMode *monitor_mode, MetaMonitor *monitor,
int *n_supported_scales) MetaMonitorMode *monitor_mode,
int *n_supported_scales)
{ {
MetaMonitorManagerXrandr *manager_xrandr = MetaMonitorManagerXrandr *manager_xrandr =
META_MONITOR_MANAGER_XRANDR (manager); META_MONITOR_MANAGER_XRANDR (manager);
@ -974,8 +994,8 @@ meta_monitor_manager_xrandr_constructed (GObject *object)
meta_monitor_manager_add_gpu (manager, manager_xrandr->gpu); meta_monitor_manager_add_gpu (manager, manager_xrandr->gpu);
if (!XRRQueryExtension (manager_xrandr->xdisplay, if (!XRRQueryExtension (manager_xrandr->xdisplay,
&manager_xrandr->rr_event_base, &manager_xrandr->rr_event_base,
&manager_xrandr->rr_error_base)) &manager_xrandr->rr_error_base))
{ {
return; return;
} }
@ -983,12 +1003,12 @@ meta_monitor_manager_xrandr_constructed (GObject *object)
{ {
int major_version, minor_version; int major_version, minor_version;
/* We only use ScreenChangeNotify, but GDK uses the others, /* We only use ScreenChangeNotify, but GDK uses the others,
and we don't want to step on its toes */ * and we don't want to step on its toes */
XRRSelectInput (manager_xrandr->xdisplay, XRRSelectInput (manager_xrandr->xdisplay,
DefaultRootWindow (manager_xrandr->xdisplay), DefaultRootWindow (manager_xrandr->xdisplay),
RRScreenChangeNotifyMask RRScreenChangeNotifyMask
| RRCrtcChangeNotifyMask | RRCrtcChangeNotifyMask
| RROutputPropertyNotifyMask); | RROutputPropertyNotifyMask);
manager_xrandr->has_randr15 = FALSE; manager_xrandr->has_randr15 = FALSE;
XRRQueryVersion (manager_xrandr->xdisplay, &major_version, XRRQueryVersion (manager_xrandr->xdisplay, &major_version,
@ -1009,7 +1029,8 @@ meta_monitor_manager_xrandr_constructed (GObject *object)
static void static void
meta_monitor_manager_xrandr_finalize (GObject *object) meta_monitor_manager_xrandr_finalize (GObject *object)
{ {
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (object); MetaMonitorManagerXrandr *manager_xrandr =
META_MONITOR_MANAGER_XRANDR (object);
g_clear_object (&manager_xrandr->gpu); g_clear_object (&manager_xrandr->gpu);
g_hash_table_destroy (manager_xrandr->tiled_monitor_atoms); g_hash_table_destroy (manager_xrandr->tiled_monitor_atoms);
@ -1033,28 +1054,41 @@ meta_monitor_manager_xrandr_class_init (MetaMonitorManagerXrandrClass *klass)
object_class->constructed = meta_monitor_manager_xrandr_constructed; object_class->constructed = meta_monitor_manager_xrandr_constructed;
manager_class->read_edid = meta_monitor_manager_xrandr_read_edid; manager_class->read_edid = meta_monitor_manager_xrandr_read_edid;
manager_class->ensure_initial_config = meta_monitor_manager_xrandr_ensure_initial_config; manager_class->ensure_initial_config =
manager_class->apply_monitors_config = meta_monitor_manager_xrandr_apply_monitors_config; meta_monitor_manager_xrandr_ensure_initial_config;
manager_class->set_power_save_mode = meta_monitor_manager_xrandr_set_power_save_mode; manager_class->apply_monitors_config =
manager_class->change_backlight = meta_monitor_manager_xrandr_change_backlight; meta_monitor_manager_xrandr_apply_monitors_config;
manager_class->set_power_save_mode =
meta_monitor_manager_xrandr_set_power_save_mode;
manager_class->change_backlight =
meta_monitor_manager_xrandr_change_backlight;
manager_class->get_crtc_gamma = meta_monitor_manager_xrandr_get_crtc_gamma; manager_class->get_crtc_gamma = meta_monitor_manager_xrandr_get_crtc_gamma;
manager_class->set_crtc_gamma = meta_monitor_manager_xrandr_set_crtc_gamma; manager_class->set_crtc_gamma = meta_monitor_manager_xrandr_set_crtc_gamma;
manager_class->tiled_monitor_added = meta_monitor_manager_xrandr_tiled_monitor_added; manager_class->tiled_monitor_added =
manager_class->tiled_monitor_removed = meta_monitor_manager_xrandr_tiled_monitor_removed; meta_monitor_manager_xrandr_tiled_monitor_added;
manager_class->is_transform_handled = meta_monitor_manager_xrandr_is_transform_handled; manager_class->tiled_monitor_removed =
manager_class->calculate_monitor_mode_scale = meta_monitor_manager_xrandr_calculate_monitor_mode_scale; meta_monitor_manager_xrandr_tiled_monitor_removed;
manager_class->calculate_supported_scales = meta_monitor_manager_xrandr_calculate_supported_scales; manager_class->is_transform_handled =
manager_class->get_capabilities = meta_monitor_manager_xrandr_get_capabilities; meta_monitor_manager_xrandr_is_transform_handled;
manager_class->get_max_screen_size = meta_monitor_manager_xrandr_get_max_screen_size; manager_class->calculate_monitor_mode_scale =
manager_class->get_default_layout_mode = meta_monitor_manager_xrandr_get_default_layout_mode; meta_monitor_manager_xrandr_calculate_monitor_mode_scale;
manager_class->calculate_supported_scales =
meta_monitor_manager_xrandr_calculate_supported_scales;
manager_class->get_capabilities =
meta_monitor_manager_xrandr_get_capabilities;
manager_class->get_max_screen_size =
meta_monitor_manager_xrandr_get_max_screen_size;
manager_class->get_default_layout_mode =
meta_monitor_manager_xrandr_get_default_layout_mode;
quark_meta_monitor_xrandr_data = quark_meta_monitor_xrandr_data =
g_quark_from_static_string ("-meta-monitor-xrandr-data"); g_quark_from_static_string ("-meta-monitor-xrandr-data");
} }
gboolean gboolean
meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xrandr, meta_monitor_manager_xrandr_handle_xevent (
XEvent *event) MetaMonitorManagerXrandr *manager_xrandr,
XEvent *event)
{ {
MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_xrandr); MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_xrandr);
MetaGpuXrandr *gpu_xrandr; MetaGpuXrandr *gpu_xrandr;

View File

@ -143,7 +143,7 @@ static int
normalize_backlight (MetaOutput *output, normalize_backlight (MetaOutput *output,
int hw_value) int hw_value)
{ {
return round ((double)(hw_value - output->backlight_min) / return round ((double) (hw_value - output->backlight_min) /
(output->backlight_max - output->backlight_min) * 100.0); (output->backlight_max - output->backlight_min) * 100.0);
} }
@ -161,12 +161,13 @@ meta_output_xrandr_change_backlight (MetaOutput *output,
atom = XInternAtom (xdisplay, "Backlight", False); atom = XInternAtom (xdisplay, "Backlight", False);
xcb_randr_change_output_property (XGetXCBConnection (xdisplay), xcb_randr_change_output_property (XGetXCBConnection (xdisplay),
(XID)output->winsys_id, (XID) output->winsys_id,
atom, XCB_ATOM_INTEGER, 32, atom, XCB_ATOM_INTEGER, 32,
XCB_PROP_MODE_REPLACE, XCB_PROP_MODE_REPLACE,
1, &hw_value); 1, &hw_value);
/* We're not selecting for property notifies, so update the value immediately */ /* We're not selecting for property notifies, so update the value immediately
* */
output->backlight = normalize_backlight (output, hw_value); output->backlight = normalize_backlight (output, hw_value);
} }
@ -184,7 +185,7 @@ output_get_integer_property (MetaOutput *output,
atom = XInternAtom (xdisplay, propname, False); atom = XInternAtom (xdisplay, propname, False);
XRRGetOutputProperty (xdisplay, XRRGetOutputProperty (xdisplay,
(XID)output->winsys_id, (XID) output->winsys_id,
atom, atom,
0, G_MAXLONG, False, False, XA_INTEGER, 0, G_MAXLONG, False, False, XA_INTEGER,
&actual_type, &actual_format, &actual_type, &actual_format,
@ -193,7 +194,7 @@ output_get_integer_property (MetaOutput *output,
exists = (actual_type == XA_INTEGER && actual_format == 32 && nitems == 1); exists = (actual_type == XA_INTEGER && actual_format == 32 && nitems == 1);
if (exists && value != NULL) if (exists && value != NULL)
*value = ((int*)buffer)[0]; *value = ((int *) buffer)[0];
XFree (buffer); XFree (buffer);
return exists; return exists;
@ -212,7 +213,7 @@ output_get_property_exists (MetaOutput *output,
atom = XInternAtom (xdisplay, propname, False); atom = XInternAtom (xdisplay, propname, False);
XRRGetOutputProperty (xdisplay, XRRGetOutputProperty (xdisplay,
(XID)output->winsys_id, (XID) output->winsys_id,
atom, atom,
0, G_MAXLONG, False, False, AnyPropertyType, 0, G_MAXLONG, False, False, AnyPropertyType,
&actual_type, &actual_format, &actual_type, &actual_format,
@ -236,7 +237,7 @@ output_get_boolean_property (MetaOutput *output,
atom = XInternAtom (xdisplay, propname, False); atom = XInternAtom (xdisplay, propname, False);
XRRGetOutputProperty (xdisplay, XRRGetOutputProperty (xdisplay,
(XID)output->winsys_id, (XID) output->winsys_id,
atom, atom,
0, G_MAXLONG, False, False, XA_CARDINAL, 0, G_MAXLONG, False, False, XA_CARDINAL,
&actual_type, &actual_format, &actual_type, &actual_format,
@ -245,7 +246,7 @@ output_get_boolean_property (MetaOutput *output,
if (actual_type != XA_CARDINAL || actual_format != 32 || nitems < 1) if (actual_type != XA_CARDINAL || actual_format != 32 || nitems < 1)
return FALSE; return FALSE;
return ((int*)buffer)[0]; return ((int *) buffer)[0];
} }
static gboolean static gboolean
@ -266,7 +267,7 @@ output_get_underscanning_xrandr (MetaOutput *output)
atom = XInternAtom (xdisplay, "underscan", False); atom = XInternAtom (xdisplay, "underscan", False);
XRRGetOutputProperty (xdisplay, XRRGetOutputProperty (xdisplay,
(XID)output->winsys_id, (XID) output->winsys_id,
atom, atom,
0, G_MAXLONG, False, False, XA_ATOM, 0, G_MAXLONG, False, False, XA_ATOM,
&actual_type, &actual_format, &actual_type, &actual_format,
@ -275,7 +276,7 @@ output_get_underscanning_xrandr (MetaOutput *output)
if (actual_type != XA_ATOM || actual_format != 32 || nitems < 1) if (actual_type != XA_ATOM || actual_format != 32 || nitems < 1)
return FALSE; return FALSE;
str = XGetAtomName (xdisplay, *(Atom *)buffer); str = XGetAtomName (xdisplay, *(Atom *) buffer);
return (strcmp (str, "on") == 0); return (strcmp (str, "on") == 0);
} }
@ -293,7 +294,7 @@ output_get_supports_underscanning_xrandr (MetaOutput *output)
atom = XInternAtom (xdisplay, "underscan", False); atom = XInternAtom (xdisplay, "underscan", False);
XRRGetOutputProperty (xdisplay, XRRGetOutputProperty (xdisplay,
(XID)output->winsys_id, (XID) output->winsys_id,
atom, atom,
0, G_MAXLONG, False, False, XA_ATOM, 0, G_MAXLONG, False, False, XA_ATOM,
&actual_type, &actual_format, &actual_type, &actual_format,
@ -336,7 +337,7 @@ output_get_backlight_xrandr (MetaOutput *output)
atom = XInternAtom (xdisplay, "Backlight", False); atom = XInternAtom (xdisplay, "Backlight", False);
XRRGetOutputProperty (xdisplay, XRRGetOutputProperty (xdisplay,
(XID)output->winsys_id, (XID) output->winsys_id,
atom, atom,
0, G_MAXLONG, False, False, XA_INTEGER, 0, G_MAXLONG, False, False, XA_INTEGER,
&actual_type, &actual_format, &actual_type, &actual_format,
@ -345,7 +346,7 @@ output_get_backlight_xrandr (MetaOutput *output)
if (actual_type != XA_INTEGER || actual_format != 32 || nitems < 1) if (actual_type != XA_INTEGER || actual_format != 32 || nitems < 1)
return FALSE; return FALSE;
value = ((int*)buffer)[0]; value = ((int *) buffer)[0];
if (value > 0) if (value > 0)
return normalize_backlight (output, value); return normalize_backlight (output, value);
else else
@ -387,10 +388,10 @@ output_get_backlight_limits_xrandr (MetaOutput *output)
} }
static guint8 * static guint8 *
get_edid_property (Display *xdisplay, get_edid_property (Display *xdisplay,
RROutput output, RROutput output,
Atom atom, Atom atom,
gsize *len) gsize *len)
{ {
unsigned char *prop; unsigned char *prop;
int actual_format; int actual_format;
@ -522,7 +523,7 @@ output_get_connector_type_from_prop (MetaOutput *output)
atom = XInternAtom (xdisplay, "ConnectorType", False); atom = XInternAtom (xdisplay, "ConnectorType", False);
XRRGetOutputProperty (xdisplay, XRRGetOutputProperty (xdisplay,
(XID)output->winsys_id, (XID) output->winsys_id,
atom, atom,
0, G_MAXLONG, False, False, XA_ATOM, 0, G_MAXLONG, False, False, XA_ATOM,
&actual_type, &actual_format, &actual_type, &actual_format,
@ -618,7 +619,7 @@ output_get_panel_orientation_transform (MetaOutput *output)
g_autofree char *str = NULL; g_autofree char *str = NULL;
atom = XInternAtom (xdisplay, "panel orientation", False); atom = XInternAtom (xdisplay, "panel orientation", False);
XRRGetOutputProperty (xdisplay, (XID)output->winsys_id, atom, XRRGetOutputProperty (xdisplay, (XID) output->winsys_id, atom,
0, G_MAXLONG, False, False, XA_ATOM, 0, G_MAXLONG, False, False, XA_ATOM,
&actual_type, &actual_format, &actual_type, &actual_format,
&nitems, &bytes_after, &buffer); &nitems, &bytes_after, &buffer);
@ -626,7 +627,7 @@ output_get_panel_orientation_transform (MetaOutput *output)
if (actual_type != XA_ATOM || actual_format != 32 || nitems < 1) if (actual_type != XA_ATOM || actual_format != 32 || nitems < 1)
return META_MONITOR_TRANSFORM_NORMAL; return META_MONITOR_TRANSFORM_NORMAL;
str = XGetAtomName (xdisplay, *(Atom *)buffer); str = XGetAtomName (xdisplay, *(Atom *) buffer);
if (strcmp (str, "Upside Down") == 0) if (strcmp (str, "Upside Down") == 0)
return META_MONITOR_TRANSFORM_180; return META_MONITOR_TRANSFORM_180;
@ -666,7 +667,7 @@ output_get_tile_info (MetaOutput *output)
if (actual_type == XA_INTEGER && actual_format == 32 && nitems == 8) if (actual_type == XA_INTEGER && actual_format == 32 && nitems == 8)
{ {
long *values = (long *)prop; long *values = (long *) prop;
output->tile_info.group_id = values[0]; output->tile_info.group_id = values[0];
output->tile_info.flags = values[1]; output->tile_info.flags = values[1];
output->tile_info.max_h_tiles = values[2]; output->tile_info.max_h_tiles = values[2];
@ -781,7 +782,7 @@ meta_create_xrandr_output (MetaGpuXrandr *gpu_xrandr,
output_get_panel_orientation_transform (output); output_get_panel_orientation_transform (output);
if (meta_monitor_transform_is_rotated ( if (meta_monitor_transform_is_rotated (
output->panel_orientation_transform)) output->panel_orientation_transform))
{ {
output->width_mm = xrandr_output->mm_height; output->width_mm = xrandr_output->mm_height;
output->height_mm = xrandr_output->mm_width; output->height_mm = xrandr_output->mm_width;

View File

@ -43,7 +43,7 @@
G_DEFINE_TYPE (MetaRendererX11, meta_renderer_x11, META_TYPE_RENDERER) G_DEFINE_TYPE (MetaRendererX11, meta_renderer_x11, META_TYPE_RENDERER)
static const CoglWinsysVtable * static const CoglWinsysVtable *
get_x11_cogl_winsys_vtable (CoglRenderer *renderer) get_x11_cogl_winsys_vtable (CoglRenderer * renderer)
{ {
#ifdef COGL_HAS_EGL_PLATFORM_XLIB_SUPPORT #ifdef COGL_HAS_EGL_PLATFORM_XLIB_SUPPORT
if (meta_is_wayland_compositor ()) if (meta_is_wayland_compositor ())

View File

@ -229,11 +229,11 @@ draw_logical_monitor (MetaStageX11Nested *stage_nested,
meta_monitor_mode_foreach_crtc (monitor, current_mode, meta_monitor_mode_foreach_crtc (monitor, current_mode,
draw_crtc, draw_crtc,
&(DrawCrtcData) { &(DrawCrtcData) {
.stage_nested = stage_nested, .stage_nested = stage_nested,
.texture = texture, .texture = texture,
.view = view, .view = view,
.logical_monitor = logical_monitor .logical_monitor = logical_monitor
}, },
NULL); NULL);
} }
@ -274,7 +274,8 @@ meta_stage_x11_nested_finish_frame (ClutterStageWindow *stage_window)
logical_monitor = meta_renderer_view_get_logical_monitor (renderer_view); logical_monitor = meta_renderer_view_get_logical_monitor (renderer_view);
if (logical_monitor) if (logical_monitor)
{ {
draw_logical_monitor (stage_nested, logical_monitor, texture, view, &view_layout); draw_logical_monitor (stage_nested, logical_monitor, texture, view,
&view_layout);
} }
else else
{ {
@ -289,7 +290,8 @@ meta_stage_x11_nested_finish_frame (ClutterStageWindow *stage_window)
{ {
logical_monitor = k->data; logical_monitor = k->data;
draw_logical_monitor (stage_nested, logical_monitor, texture, view, &view_layout); draw_logical_monitor (stage_nested, logical_monitor, texture,
view, &view_layout);
} }
} }
} }
@ -316,7 +318,7 @@ meta_stage_x11_nested_unrealize (ClutterStageWindow *stage_window)
* 1x1 one if we're unrealizing the current one, so Cogl doesn't * 1x1 one if we're unrealizing the current one, so Cogl doesn't
* keep any reference to the foreign window. * keep any reference to the foreign window.
*/ */
for (l = meta_renderer_get_views (renderer); l ;l = l->next) for (l = meta_renderer_get_views (renderer); l; l = l->next)
{ {
ClutterStageView *view = l->data; ClutterStageView *view = l->data;
CoglFramebuffer *framebuffer = clutter_stage_view_get_framebuffer (view); CoglFramebuffer *framebuffer = clutter_stage_view_get_framebuffer (view);

View File

@ -32,8 +32,8 @@ G_DEFINE_TYPE (MetaBackendX11Nested, meta_backend_x11_nested,
META_TYPE_BACKEND_X11) META_TYPE_BACKEND_X11)
static MetaRenderer * static MetaRenderer *
meta_backend_x11_nested_create_renderer (MetaBackend *backend, meta_backend_x11_nested_create_renderer (MetaBackend * backend,
GError **error) GError * *error)
{ {
return g_object_new (META_TYPE_RENDERER_X11_NESTED, NULL); return g_object_new (META_TYPE_RENDERER_X11_NESTED, NULL);
} }
@ -99,7 +99,8 @@ meta_backend_x11_nested_select_stage_events (MetaBackend *backend)
* When we're a nested application, we want to behave like any other * When we're a nested application, we want to behave like any other
* application, so select these events like normal apps do. * application, so select these events like normal apps do.
*/ */
XISetMask (mask.mask, XI_TouchBegin); XISetMask (mask.mask, XI_TouchEnd); XISetMask (mask.mask, XI_TouchBegin);
XISetMask (mask.mask, XI_TouchEnd);
XISetMask (mask.mask, XI_TouchUpdate); XISetMask (mask.mask, XI_TouchUpdate);
XISelectEvents (xdisplay, xwin, &mask, 1); XISelectEvents (xdisplay, xwin, &mask, 1);
@ -112,9 +113,9 @@ meta_backend_x11_nested_select_stage_events (MetaBackend *backend)
*/ */
XWindowAttributes xwa; XWindowAttributes xwa;
XGetWindowAttributes(xdisplay, xwin, &xwa); XGetWindowAttributes (xdisplay, xwin, &xwa);
XSelectInput(xdisplay, xwin, XSelectInput (xdisplay, xwin,
xwa.your_event_mask | FocusChangeMask | KeymapStateMask); xwa.your_event_mask | FocusChangeMask | KeymapStateMask);
} }
static void static void
@ -185,14 +186,21 @@ meta_backend_x11_nested_class_init (MetaBackendX11NestedClass *klass)
MetaBackendX11Class *backend_x11_class = META_BACKEND_X11_CLASS (klass); MetaBackendX11Class *backend_x11_class = META_BACKEND_X11_CLASS (klass);
backend_class->create_renderer = meta_backend_x11_nested_create_renderer; backend_class->create_renderer = meta_backend_x11_nested_create_renderer;
backend_class->create_monitor_manager = meta_backend_x11_nested_create_monitor_manager; backend_class->create_monitor_manager =
backend_class->create_cursor_renderer = meta_backend_x11_nested_create_cursor_renderer; meta_backend_x11_nested_create_monitor_manager;
backend_class->create_input_settings = meta_backend_x11_nested_create_input_settings; backend_class->create_cursor_renderer =
backend_class->update_screen_size = meta_backend_x11_nested_update_screen_size; meta_backend_x11_nested_create_cursor_renderer;
backend_class->select_stage_events = meta_backend_x11_nested_select_stage_events; backend_class->create_input_settings =
meta_backend_x11_nested_create_input_settings;
backend_class->update_screen_size =
meta_backend_x11_nested_update_screen_size;
backend_class->select_stage_events =
meta_backend_x11_nested_select_stage_events;
backend_class->lock_layout_group = meta_backend_x11_nested_lock_layout_group; backend_class->lock_layout_group = meta_backend_x11_nested_lock_layout_group;
backend_class->set_keymap = meta_backend_x11_nested_set_keymap; backend_class->set_keymap = meta_backend_x11_nested_set_keymap;
backend_x11_class->handle_host_xevent = meta_backend_x11_nested_handle_host_xevent; backend_x11_class->handle_host_xevent =
backend_x11_class->translate_device_event = meta_backend_x11_nested_translate_device_event; meta_backend_x11_nested_handle_host_xevent;
backend_x11_class->translate_device_event =
meta_backend_x11_nested_translate_device_event;
} }

View File

@ -83,7 +83,8 @@ meta_cursor_renderer_x11_nested_init (MetaCursorRendererX11Nested *x11_nested)
} }
static void static void
meta_cursor_renderer_x11_nested_class_init (MetaCursorRendererX11NestedClass *klass) meta_cursor_renderer_x11_nested_class_init (
MetaCursorRendererX11NestedClass *klass)
{ {
MetaCursorRendererClass *renderer_class = META_CURSOR_RENDERER_CLASS (klass); MetaCursorRendererClass *renderer_class = META_CURSOR_RENDERER_CLASS (klass);

View File

@ -103,14 +103,16 @@ create_offscreen (CoglContext *cogl_context,
} }
static void static void
meta_renderer_x11_nested_resize_legacy_view (MetaRendererX11Nested *renderer_x11_nested, meta_renderer_x11_nested_resize_legacy_view (
int width, MetaRendererX11Nested *renderer_x11_nested,
int height) int width,
int height)
{ {
MetaRenderer *renderer = META_RENDERER (renderer_x11_nested); MetaRenderer *renderer = META_RENDERER (renderer_x11_nested);
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend); ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
CoglContext *cogl_context = clutter_backend_get_cogl_context (clutter_backend); CoglContext *cogl_context =
clutter_backend_get_cogl_context (clutter_backend);
MetaRendererView *legacy_view; MetaRendererView *legacy_view;
cairo_rectangle_int_t view_layout; cairo_rectangle_int_t view_layout;
CoglOffscreen *fake_onscreen; CoglOffscreen *fake_onscreen;
@ -124,8 +126,8 @@ meta_renderer_x11_nested_resize_legacy_view (MetaRendererX11Nested *renderer_x11
return; return;
view_layout = (cairo_rectangle_int_t) { view_layout = (cairo_rectangle_int_t) {
.width = width, .width = width,
.height = height .height = height
}; };
fake_onscreen = create_offscreen (cogl_context, width, height); fake_onscreen = create_offscreen (cogl_context, width, height);
@ -137,14 +139,16 @@ meta_renderer_x11_nested_resize_legacy_view (MetaRendererX11Nested *renderer_x11
} }
void void
meta_renderer_x11_nested_ensure_legacy_view (MetaRendererX11Nested *renderer_x11_nested, meta_renderer_x11_nested_ensure_legacy_view (
int width, MetaRendererX11Nested *renderer_x11_nested,
int height) int width,
int height)
{ {
MetaRenderer *renderer = META_RENDERER (renderer_x11_nested); MetaRenderer *renderer = META_RENDERER (renderer_x11_nested);
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend); ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
CoglContext *cogl_context = clutter_backend_get_cogl_context (clutter_backend); CoglContext *cogl_context =
clutter_backend_get_cogl_context (clutter_backend);
cairo_rectangle_int_t view_layout; cairo_rectangle_int_t view_layout;
CoglOffscreen *fake_onscreen; CoglOffscreen *fake_onscreen;
MetaRendererView *legacy_view; MetaRendererView *legacy_view;
@ -178,7 +182,8 @@ meta_renderer_x11_nested_create_view (MetaRenderer *renderer,
MetaMonitorManager *monitor_manager = MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend); meta_backend_get_monitor_manager (backend);
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend); ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
CoglContext *cogl_context = clutter_backend_get_cogl_context (clutter_backend); CoglContext *cogl_context =
clutter_backend_get_cogl_context (clutter_backend);
MetaMonitorTransform view_transform; MetaMonitorTransform view_transform;
float view_scale; float view_scale;
int width, height; int width, height;
@ -234,4 +239,3 @@ meta_renderer_x11_nested_class_init (MetaRendererX11NestedClass *klass)
renderer_class->create_view = meta_renderer_x11_nested_create_view; renderer_class->create_view = meta_renderer_x11_nested_create_view;
} }

View File

@ -57,8 +57,11 @@ round_to_fixed (float x)
/* Help macros to scale from OpenGL <-1,1> coordinates system to /* Help macros to scale from OpenGL <-1,1> coordinates system to
* window coordinates ranging [0,window-size]. Borrowed from clutter-utils.c * window coordinates ranging [0,window-size]. Borrowed from clutter-utils.c
*/ */
#define MTX_GL_SCALE_X(x,w,v1,v2) ((((((x) / (w)) + 1.0f) / 2.0f) * (v1)) + (v2)) #define MTX_GL_SCALE_X(x, w, v1, \
#define MTX_GL_SCALE_Y(y,w,v1,v2) ((v1) - (((((y) / (w)) + 1.0f) / 2.0f) * (v1)) + (v2)) v2) ((((((x) / (w)) + 1.0f) / 2.0f) * (v1)) + (v2))
#define MTX_GL_SCALE_Y(y, w, v1, \
v2) ((v1) - (((((y) / (w)) + 1.0f) / 2.0f) * (v1)) + \
(v2))
/* This helper function checks if (according to our fixed point precision) /* This helper function checks if (according to our fixed point precision)
* the vertices @verts form a box of width @widthf and height @heightf * the vertices @verts form a box of width @widthf and height @heightf
@ -76,12 +79,17 @@ meta_actor_vertices_are_untransformed (ClutterVertex *verts,
int v0x, v0y, v1x, v1y, v2x, v2y, v3x, v3y; int v0x, v0y, v1x, v1y, v2x, v2y, v3x, v3y;
int x, y; int x, y;
width = round_to_fixed (widthf); height = round_to_fixed (heightf); width = round_to_fixed (widthf);
height = round_to_fixed (heightf);
v0x = round_to_fixed (verts[0].x); v0y = round_to_fixed (verts[0].y); v0x = round_to_fixed (verts[0].x);
v1x = round_to_fixed (verts[1].x); v1y = round_to_fixed (verts[1].y); v0y = round_to_fixed (verts[0].y);
v2x = round_to_fixed (verts[2].x); v2y = round_to_fixed (verts[2].y); v1x = round_to_fixed (verts[1].x);
v3x = round_to_fixed (verts[3].x); v3y = round_to_fixed (verts[3].y); v1y = round_to_fixed (verts[1].y);
v2x = round_to_fixed (verts[2].x);
v2y = round_to_fixed (verts[2].y);
v3x = round_to_fixed (verts[3].x);
v3y = round_to_fixed (verts[3].y);
/* Using shifting for converting fixed => int, gets things right for /* Using shifting for converting fixed => int, gets things right for
* negative values. / 256. wouldn't do the same * negative values. / 256. wouldn't do the same
@ -124,7 +132,8 @@ meta_actor_is_untransformed (ClutterActor *actor,
clutter_actor_get_size (actor, &widthf, &heightf); clutter_actor_get_size (actor, &widthf, &heightf);
clutter_actor_get_abs_allocation_vertices (actor, verts); clutter_actor_get_abs_allocation_vertices (actor, verts);
return meta_actor_vertices_are_untransformed (verts, widthf, heightf, x_origin, y_origin); return meta_actor_vertices_are_untransformed (verts, widthf, heightf,
x_origin, y_origin);
} }
/** /**
@ -146,10 +155,10 @@ meta_actor_is_untransformed (ClutterActor *actor,
* transform. * transform.
*/ */
gboolean gboolean
meta_actor_painting_untransformed (int paint_width, meta_actor_painting_untransformed (int paint_width,
int paint_height, int paint_height,
int *x_origin, int *x_origin,
int *y_origin) int *y_origin)
{ {
CoglMatrix modelview, projection, modelview_projection; CoglMatrix modelview, projection, modelview_projection;
ClutterVertex vertices[4]; ClutterVertex vertices[4];
@ -181,13 +190,15 @@ meta_actor_painting_untransformed (int paint_width,
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
{ {
float w = 1; float w = 1;
cogl_matrix_transform_point (&modelview_projection, &vertices[i].x, &vertices[i].y, &vertices[i].z, &w); cogl_matrix_transform_point (&modelview_projection, &vertices[i].x,
&vertices[i].y, &vertices[i].z, &w);
vertices[i].x = MTX_GL_SCALE_X (vertices[i].x, w, vertices[i].x = MTX_GL_SCALE_X (vertices[i].x, w,
viewport[2], viewport[0]); viewport[2], viewport[0]);
vertices[i].y = MTX_GL_SCALE_Y (vertices[i].y, w, vertices[i].y = MTX_GL_SCALE_Y (vertices[i].y, w,
viewport[3], viewport[1]); viewport[3], viewport[1]);
} }
return meta_actor_vertices_are_untransformed (vertices, paint_width, paint_height, x_origin, y_origin); return meta_actor_vertices_are_untransformed (vertices, paint_width,
paint_height, x_origin,
y_origin);
} }

View File

@ -43,11 +43,11 @@ meta_create_texture_pipeline (CoglTexture *src_texture)
CoglPipeline *pipeline; CoglPipeline *pipeline;
/* The only state used in the pipeline that would affect the shader /* The only state used in the pipeline that would affect the shader
generation is the texture type on the layer. Therefore we create * generation is the texture type on the layer. Therefore we create
a template pipeline which sets this state and all texture * a template pipeline which sets this state and all texture
pipelines are created as a copy of this. That way Cogl can find * pipelines are created as a copy of this. That way Cogl can find
the shader state for the pipeline more quickly by looking at the * the shader state for the pipeline more quickly by looking at the
pipeline ancestry instead of resorting to the shader cache. */ * pipeline ancestry instead of resorting to the shader cache. */
if (G_UNLIKELY (texture_pipeline_template == NULL)) if (G_UNLIKELY (texture_pipeline_template == NULL))
{ {
CoglContext *ctx = CoglContext *ctx =
@ -119,14 +119,16 @@ meta_create_texture (int width,
} }
if (should_use_rectangle) if (should_use_rectangle)
texture = COGL_TEXTURE (cogl_texture_rectangle_new_with_size (ctx, width, height)); texture =
COGL_TEXTURE (cogl_texture_rectangle_new_with_size (ctx, width, height));
else else
texture = COGL_TEXTURE (cogl_texture_2d_new_with_size (ctx, width, height)); texture = COGL_TEXTURE (cogl_texture_2d_new_with_size (ctx, width, height));
cogl_texture_set_components (texture, components); cogl_texture_set_components (texture, components);
if ((flags & META_TEXTURE_ALLOW_SLICING) != 0) if ((flags & META_TEXTURE_ALLOW_SLICING) != 0)
{ {
/* To find out if we need to slice the texture, we have to go ahead and force storage /* To find out if we need to slice the texture, we have to go ahead and
* force storage
* to be allocated * to be allocated
*/ */
CoglError *catch_error = NULL; CoglError *catch_error = NULL;
@ -134,7 +136,10 @@ meta_create_texture (int width,
{ {
cogl_error_free (catch_error); cogl_error_free (catch_error);
cogl_object_unref (texture); cogl_object_unref (texture);
texture = COGL_TEXTURE (cogl_texture_2d_sliced_new_with_size (ctx, width, height, COGL_TEXTURE_MAX_WASTE)); texture =
COGL_TEXTURE (cogl_texture_2d_sliced_new_with_size (ctx, width,
height,
COGL_TEXTURE_MAX_WASTE));
cogl_texture_set_components (texture, components); cogl_texture_set_components (texture, components);
} }
} }

View File

@ -39,7 +39,8 @@
* *
* # Containers # * # Containers #
* *
* There's two containers in the stage that are used to place window actors, here * There's two containers in the stage that are used to place window actors,
*here
* are listed in the order in which they are painted: * are listed in the order in which they are painted:
* *
* - window group, accessible with meta_get_window_group_for_display() * - window group, accessible with meta_get_window_group_for_display()
@ -141,7 +142,8 @@ process_damage (MetaCompositor *compositor,
XDamageNotifyEvent *event, XDamageNotifyEvent *event,
MetaWindow *window) MetaWindow *window)
{ {
MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window)); MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (
window));
meta_window_actor_process_x11_damage (window_actor, event); meta_window_actor_process_x11_damage (window_actor, event);
compositor->frame_has_updated_xsurfaces = TRUE; compositor->frame_has_updated_xsurfaces = TRUE;
@ -210,7 +212,8 @@ meta_get_feedback_group_for_display (MetaDisplay *display)
* meta_get_window_actors: * meta_get_window_actors:
* @display: a #MetaDisplay * @display: a #MetaDisplay
* *
* Returns: (transfer none) (element-type Clutter.Actor): The set of #MetaWindowActor on @display * Returns: (transfer none) (element-type Clutter.Actor): The set of
*#MetaWindowActor on @display
*/ */
GList * GList *
meta_get_window_actors (MetaDisplay *display) meta_get_window_actors (MetaDisplay *display)
@ -232,23 +235,29 @@ meta_set_stage_input_region (MetaDisplay *display,
{ {
MetaCompositor *compositor = display->compositor; MetaCompositor *compositor = display->compositor;
Display *xdpy = meta_x11_display_get_xdisplay (display->x11_display); Display *xdpy = meta_x11_display_get_xdisplay (display->x11_display);
Window xstage = clutter_x11_get_stage_window (CLUTTER_STAGE (compositor->stage)); Window xstage =
clutter_x11_get_stage_window (CLUTTER_STAGE (compositor->stage));
XFixesSetWindowShapeRegion (xdpy, xstage, ShapeInput, 0, 0, region); XFixesSetWindowShapeRegion (xdpy, xstage, ShapeInput, 0, 0, region);
/* It's generally a good heuristic that when a crossing event is generated because /* It's generally a good heuristic that when a crossing event is generated
* we reshape the overlay, we don't want it to affect focus-follows-mouse focus - * because
* it's not the user doing something, it's the environment changing under the user. * we reshape the overlay, we don't want it to affect focus-follows-mouse
*focus -
* it's not the user doing something, it's the environment changing under
*the user.
*/ */
meta_display_add_ignored_crossing_serial (display, XNextRequest (xdpy)); meta_display_add_ignored_crossing_serial (display, XNextRequest (xdpy));
XFixesSetWindowShapeRegion (xdpy, compositor->output, ShapeInput, 0, 0, region); XFixesSetWindowShapeRegion (xdpy, compositor->output, ShapeInput, 0, 0,
region);
} }
} }
void void
meta_empty_stage_input_region (MetaDisplay *display) meta_empty_stage_input_region (MetaDisplay *display)
{ {
/* Using a static region here is a bit hacky, but Metacity never opens more than /* Using a static region here is a bit hacky, but Metacity never opens more
* than
* one XDisplay, so it works fine. */ * one XDisplay, so it works fine. */
static XserverRegion region = None; static XserverRegion region = None;
@ -304,8 +313,8 @@ meta_stage_is_focused (MetaDisplay *display)
} }
static gboolean static gboolean
grab_devices (MetaModalOptions options, grab_devices (MetaModalOptions options,
guint32 timestamp) guint32 timestamp)
{ {
MetaBackend *backend = META_BACKEND (meta_get_backend ()); MetaBackend *backend = META_BACKEND (meta_get_backend ());
gboolean pointer_grabbed = FALSE; gboolean pointer_grabbed = FALSE;
@ -313,7 +322,8 @@ grab_devices (MetaModalOptions options,
if ((options & META_MODAL_POINTER_ALREADY_GRABBED) == 0) if ((options & META_MODAL_POINTER_ALREADY_GRABBED) == 0)
{ {
if (!meta_backend_grab_device (backend, META_VIRTUAL_CORE_POINTER_ID, timestamp)) if (!meta_backend_grab_device (backend, META_VIRTUAL_CORE_POINTER_ID,
timestamp))
goto fail; goto fail;
pointer_grabbed = TRUE; pointer_grabbed = TRUE;
@ -321,7 +331,8 @@ grab_devices (MetaModalOptions options,
if ((options & META_MODAL_KEYBOARD_ALREADY_GRABBED) == 0) if ((options & META_MODAL_KEYBOARD_ALREADY_GRABBED) == 0)
{ {
if (!meta_backend_grab_device (backend, META_VIRTUAL_CORE_KEYBOARD_ID, timestamp)) if (!meta_backend_grab_device (backend, META_VIRTUAL_CORE_KEYBOARD_ID,
timestamp))
goto fail; goto fail;
keyboard_grabbed = TRUE; keyboard_grabbed = TRUE;
@ -329,23 +340,27 @@ grab_devices (MetaModalOptions options,
return TRUE; return TRUE;
fail: fail:
if (pointer_grabbed) if (pointer_grabbed)
meta_backend_ungrab_device (backend, META_VIRTUAL_CORE_POINTER_ID, timestamp); meta_backend_ungrab_device (backend, META_VIRTUAL_CORE_POINTER_ID,
timestamp);
if (keyboard_grabbed) if (keyboard_grabbed)
meta_backend_ungrab_device (backend, META_VIRTUAL_CORE_KEYBOARD_ID, timestamp); meta_backend_ungrab_device (backend, META_VIRTUAL_CORE_KEYBOARD_ID,
timestamp);
return FALSE; return FALSE;
} }
gboolean gboolean
meta_begin_modal_for_plugin (MetaCompositor *compositor, meta_begin_modal_for_plugin (MetaCompositor *compositor,
MetaPlugin *plugin, MetaPlugin *plugin,
MetaModalOptions options, MetaModalOptions options,
guint32 timestamp) guint32 timestamp)
{ {
/* To some extent this duplicates code in meta_display_begin_grab_op(), but there /* To some extent this duplicates code in meta_display_begin_grab_op(), but
* are significant differences in how we handle grabs that make it difficult to * there
* are significant differences in how we handle grabs that make it difficult
*to
* merge the two. * merge the two.
*/ */
MetaDisplay *display = compositor->display; MetaDisplay *display = compositor->display;
@ -417,7 +432,8 @@ meta_end_modal_for_plugin (MetaCompositor *compositor,
display->grab_have_keyboard = FALSE; display->grab_have_keyboard = FALSE;
meta_backend_ungrab_device (backend, META_VIRTUAL_CORE_POINTER_ID, timestamp); meta_backend_ungrab_device (backend, META_VIRTUAL_CORE_POINTER_ID, timestamp);
meta_backend_ungrab_device (backend, META_VIRTUAL_CORE_KEYBOARD_ID, timestamp); meta_backend_ungrab_device (backend, META_VIRTUAL_CORE_KEYBOARD_ID,
timestamp);
#ifdef HAVE_WAYLAND #ifdef HAVE_WAYLAND
if (meta_is_wayland_compositor ()) if (meta_is_wayland_compositor ())
@ -440,7 +456,8 @@ after_stage_paint (ClutterStage *stage,
#ifdef HAVE_WAYLAND #ifdef HAVE_WAYLAND
if (meta_is_wayland_compositor ()) if (meta_is_wayland_compositor ())
meta_wayland_compositor_paint_finished (meta_wayland_compositor_get_default ()); meta_wayland_compositor_paint_finished (
meta_wayland_compositor_get_default ());
#endif #endif
} }
@ -460,7 +477,8 @@ redirect_windows (MetaX11Display *x11_display)
n_retries = 0; n_retries = 0;
/* Some compositors (like old versions of Mutter) might not properly unredirect /* Some compositors (like old versions of Mutter) might not properly
* unredirect
* subwindows before destroying the WM selection window; so we wait a while * subwindows before destroying the WM selection window; so we wait a while
* for such a compositor to exit before giving up. * for such a compositor to exit before giving up.
*/ */
@ -475,9 +493,11 @@ redirect_windows (MetaX11Display *x11_display)
if (n_retries == max_retries) if (n_retries == max_retries)
{ {
/* This probably means that a non-WM compositor like xcompmgr is running; /* This probably means that a non-WM compositor like xcompmgr is
* running;
* we have no way to get it to exit */ * we have no way to get it to exit */
meta_fatal (_("Another compositing manager is already running on screen %i on display “%s”."), meta_fatal (_(
"Another compositing manager is already running on screen %i on display “%s”."),
screen_number, x11_display->name); screen_number, x11_display->name);
} }
@ -516,7 +536,8 @@ meta_compositor_manage (MetaCompositor *compositor)
g_signal_connect_after (CLUTTER_STAGE (compositor->stage), "after-paint", g_signal_connect_after (CLUTTER_STAGE (compositor->stage), "after-paint",
G_CALLBACK (after_stage_paint), compositor); G_CALLBACK (after_stage_paint), compositor);
clutter_stage_set_sync_delay (CLUTTER_STAGE (compositor->stage), META_SYNC_DELAY); clutter_stage_set_sync_delay (CLUTTER_STAGE (
compositor->stage), META_SYNC_DELAY);
compositor->window_group = meta_window_group_new (display); compositor->window_group = meta_window_group_new (display);
compositor->top_window_group = meta_window_group_new (display); compositor->top_window_group = meta_window_group_new (display);
@ -553,9 +574,11 @@ meta_compositor_manage (MetaCompositor *compositor)
* because the X server will destroy the overlay window * because the X server will destroy the overlay window
* when the last client using it exits. * when the last client using it exits.
*/ */
XFixesSetWindowShapeRegion (xdisplay, compositor->output, ShapeBounding, 0, 0, None); XFixesSetWindowShapeRegion (xdisplay, compositor->output, ShapeBounding,
0, 0, None);
/* Map overlay window before redirecting windows offscreen so we catch their /* Map overlay window before redirecting windows offscreen so we catch
* their
* contents until we show the stage. * contents until we show the stage.
*/ */
XMapWindow (xdisplay, compositor->output); XMapWindow (xdisplay, compositor->output);
@ -598,13 +621,14 @@ meta_compositor_unmanage (MetaCompositor *compositor)
*/ */
static void static void
meta_shape_cow_for_window (MetaCompositor *compositor, meta_shape_cow_for_window (MetaCompositor *compositor,
MetaWindow *window) MetaWindow *window)
{ {
MetaDisplay *display = compositor->display; MetaDisplay *display = compositor->display;
Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display); Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
if (window == NULL) if (window == NULL)
XFixesSetWindowShapeRegion (xdisplay, compositor->output, ShapeBounding, 0, 0, None); XFixesSetWindowShapeRegion (xdisplay, compositor->output, ShapeBounding, 0,
0, None);
else else
{ {
XserverRegion output_region; XserverRegion output_region;
@ -628,7 +652,8 @@ meta_shape_cow_for_window (MetaCompositor *compositor,
output_region = XFixesCreateRegion (xdisplay, &window_bounds, 1); output_region = XFixesCreateRegion (xdisplay, &window_bounds, 1);
XFixesInvertRegion (xdisplay, output_region, &screen_rect, output_region); XFixesInvertRegion (xdisplay, output_region, &screen_rect, output_region);
XFixesSetWindowShapeRegion (xdisplay, compositor->output, ShapeBounding, 0, 0, output_region); XFixesSetWindowShapeRegion (xdisplay, compositor->output, ShapeBounding,
0, 0, output_region);
XFixesDestroyRegion (xdisplay, output_region); XFixesDestroyRegion (xdisplay, output_region);
} }
} }
@ -642,7 +667,9 @@ set_unredirected_window (MetaCompositor *compositor,
if (compositor->unredirected_window != NULL) if (compositor->unredirected_window != NULL)
{ {
MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (compositor->unredirected_window)); MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (
compositor->
unredirected_window));
meta_window_actor_set_unredirected (window_actor, FALSE); meta_window_actor_set_unredirected (window_actor, FALSE);
} }
@ -651,14 +678,16 @@ set_unredirected_window (MetaCompositor *compositor,
if (compositor->unredirected_window != NULL) if (compositor->unredirected_window != NULL)
{ {
MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (compositor->unredirected_window)); MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (
compositor->
unredirected_window));
meta_window_actor_set_unredirected (window_actor, TRUE); meta_window_actor_set_unredirected (window_actor, TRUE);
} }
} }
void void
meta_compositor_add_window (MetaCompositor *compositor, meta_compositor_add_window (MetaCompositor *compositor,
MetaWindow *window) MetaWindow *window)
{ {
MetaDisplay *display = compositor->display; MetaDisplay *display = compositor->display;
@ -674,7 +703,8 @@ void
meta_compositor_remove_window (MetaCompositor *compositor, meta_compositor_remove_window (MetaCompositor *compositor,
MetaWindow *window) MetaWindow *window)
{ {
MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window)); MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (
window));
if (compositor->unredirected_window == window) if (compositor->unredirected_window == window)
set_unredirected_window (compositor, NULL); set_unredirected_window (compositor, NULL);
@ -686,7 +716,8 @@ void
meta_compositor_sync_updates_frozen (MetaCompositor *compositor, meta_compositor_sync_updates_frozen (MetaCompositor *compositor,
MetaWindow *window) MetaWindow *window)
{ {
MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window)); MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (
window));
meta_window_actor_sync_updates_frozen (window_actor); meta_window_actor_sync_updates_frozen (window_actor);
} }
@ -695,7 +726,8 @@ meta_compositor_queue_frame_drawn (MetaCompositor *compositor,
MetaWindow *window, MetaWindow *window,
gboolean no_delay_frame) gboolean no_delay_frame)
{ {
MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window)); MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (
window));
meta_window_actor_queue_frame_drawn (window_actor, no_delay_frame); meta_window_actor_queue_frame_drawn (window_actor, no_delay_frame);
} }
@ -704,7 +736,8 @@ meta_compositor_window_shape_changed (MetaCompositor *compositor,
MetaWindow *window) MetaWindow *window)
{ {
MetaWindowActor *window_actor; MetaWindowActor *window_actor;
window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window)); window_actor =
META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
if (!window_actor) if (!window_actor)
return; return;
@ -716,7 +749,8 @@ meta_compositor_window_opacity_changed (MetaCompositor *compositor,
MetaWindow *window) MetaWindow *window)
{ {
MetaWindowActor *window_actor; MetaWindowActor *window_actor;
window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window)); window_actor =
META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
if (!window_actor) if (!window_actor)
return; return;
@ -728,7 +762,8 @@ meta_compositor_window_surface_changed (MetaCompositor *compositor,
MetaWindow *window) MetaWindow *window)
{ {
MetaWindowActor *window_actor; MetaWindowActor *window_actor;
window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window)); window_actor =
META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
if (!window_actor) if (!window_actor)
return; return;
@ -750,9 +785,11 @@ meta_compositor_process_event (MetaCompositor *compositor,
MetaX11Display *x11_display = compositor->display->x11_display; MetaX11Display *x11_display = compositor->display->x11_display;
if (!meta_is_wayland_compositor () && if (!meta_is_wayland_compositor () &&
event->type == meta_x11_display_get_damage_event_base (x11_display) + XDamageNotify) event->type ==
meta_x11_display_get_damage_event_base (x11_display) + XDamageNotify)
{ {
/* Core code doesn't handle damage events, so we need to extract the MetaWindow /* Core code doesn't handle damage events, so we need to extract the
* MetaWindow
* ourselves * ourselves
*/ */
if (window == NULL) if (window == NULL)
@ -769,13 +806,14 @@ meta_compositor_process_event (MetaCompositor *compositor,
meta_sync_ring_handle_event (event); meta_sync_ring_handle_event (event);
/* Clutter needs to know about MapNotify events otherwise it will /* Clutter needs to know about MapNotify events otherwise it will
think the stage is invisible */ * think the stage is invisible */
if (!meta_is_wayland_compositor () && event->type == MapNotify) if (!meta_is_wayland_compositor () && event->type == MapNotify)
clutter_x11_handle_event (event); clutter_x11_handle_event (event);
/* The above handling is basically just "observing" the events, so we return /* The above handling is basically just "observing" the events, so we return
* FALSE to indicate that the event should not be filtered out; if we have * FALSE to indicate that the event should not be filtered out; if we have
* GTK+ windows in the same process, GTK+ needs the ConfigureNotify event, for example. * GTK+ windows in the same process, GTK+ needs the ConfigureNotify event, for
*example.
*/ */
return FALSE; return FALSE;
} }
@ -784,16 +822,18 @@ gboolean
meta_compositor_filter_keybinding (MetaCompositor *compositor, meta_compositor_filter_keybinding (MetaCompositor *compositor,
MetaKeyBinding *binding) MetaKeyBinding *binding)
{ {
return meta_plugin_manager_filter_keybinding (compositor->plugin_mgr, binding); return meta_plugin_manager_filter_keybinding (compositor->plugin_mgr,
binding);
} }
void void
meta_compositor_show_window (MetaCompositor *compositor, meta_compositor_show_window (MetaCompositor *compositor,
MetaWindow *window, MetaWindow *window,
MetaCompEffect effect) MetaCompEffect effect)
{ {
MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window)); MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (
meta_window_actor_show (window_actor, effect); window));
meta_window_actor_show (window_actor, effect);
} }
void void
@ -801,20 +841,23 @@ meta_compositor_hide_window (MetaCompositor *compositor,
MetaWindow *window, MetaWindow *window,
MetaCompEffect effect) MetaCompEffect effect)
{ {
MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window)); MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (
window));
meta_window_actor_hide (window_actor, effect); meta_window_actor_hide (window_actor, effect);
meta_stack_tracker_queue_sync_stack (compositor->display->stack_tracker); meta_stack_tracker_queue_sync_stack (compositor->display->stack_tracker);
} }
void void
meta_compositor_size_change_window (MetaCompositor *compositor, meta_compositor_size_change_window (MetaCompositor *compositor,
MetaWindow *window, MetaWindow *window,
MetaSizeChange which_change, MetaSizeChange which_change,
MetaRectangle *old_frame_rect, MetaRectangle *old_frame_rect,
MetaRectangle *old_buffer_rect) MetaRectangle *old_buffer_rect)
{ {
MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window)); MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (
meta_window_actor_size_change (window_actor, which_change, old_frame_rect, old_buffer_rect); window));
meta_window_actor_size_change (window_actor, which_change, old_frame_rect,
old_buffer_rect);
} }
void void
@ -825,7 +868,7 @@ meta_compositor_switch_workspace (MetaCompositor *compositor,
{ {
gint to_indx, from_indx; gint to_indx, from_indx;
to_indx = meta_workspace_index (to); to_indx = meta_workspace_index (to);
from_indx = meta_workspace_index (from); from_indx = meta_workspace_index (from);
compositor->switch_workspace_in_progress++; compositor->switch_workspace_in_progress++;
@ -892,7 +935,8 @@ sync_actor_stacking (MetaCompositor *compositor)
{ {
has_windows = TRUE; has_windows = TRUE;
if (expected_window_node != NULL && actor == expected_window_node->data) if (expected_window_node != NULL &&
actor == expected_window_node->data)
expected_window_node = expected_window_node->next; expected_window_node = expected_window_node->next;
else else
reordered = TRUE; reordered = TRUE;
@ -976,8 +1020,8 @@ on_top_window_actor_destroyed (MetaWindowActor *window_actor,
} }
void void
meta_compositor_sync_stack (MetaCompositor *compositor, meta_compositor_sync_stack (MetaCompositor *compositor,
GList *stack) GList *stack)
{ {
GList *old_stack; GList *old_stack;
@ -989,7 +1033,8 @@ meta_compositor_sync_stack (MetaCompositor *compositor,
/* Sources: first window is the highest */ /* Sources: first window is the highest */
stack = g_list_copy (stack); /* The new stack of MetaWindow */ stack = g_list_copy (stack); /* The new stack of MetaWindow */
old_stack = g_list_reverse (compositor->windows); /* The old stack of MetaWindowActor */ old_stack = g_list_reverse (compositor->windows); /* The old stack of
* MetaWindowActor */
compositor->windows = NULL; compositor->windows = NULL;
while (TRUE) while (TRUE)
@ -1018,11 +1063,13 @@ meta_compositor_sync_stack (MetaCompositor *compositor,
while (stack) while (stack)
{ {
stack_window = stack->data; stack_window = stack->data;
stack_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (stack_window)); stack_actor =
META_WINDOW_ACTOR (meta_window_get_compositor_private (stack_window));
if (!stack_actor) if (!stack_actor)
{ {
meta_verbose ("Failed to find corresponding MetaWindowActor " meta_verbose ("Failed to find corresponding MetaWindowActor "
"for window %s\n", meta_window_get_description (stack_window)); "for window %s\n",
meta_window_get_description (stack_window));
stack = g_list_delete_link (stack, stack); stack = g_list_delete_link (stack, stack);
} }
else else
@ -1077,10 +1124,11 @@ meta_compositor_sync_stack (MetaCompositor *compositor,
void void
meta_compositor_sync_window_geometry (MetaCompositor *compositor, meta_compositor_sync_window_geometry (MetaCompositor *compositor,
MetaWindow *window, MetaWindow *window,
gboolean did_placement) gboolean did_placement)
{ {
MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window)); MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (
window));
meta_window_actor_sync_actor_geometry (window_actor, did_placement); meta_window_actor_sync_actor_geometry (window_actor, did_placement);
meta_plugin_manager_event_size_changed (compositor->plugin_mgr, window_actor); meta_plugin_manager_event_size_changed (compositor->plugin_mgr, window_actor);
} }
@ -1104,7 +1152,8 @@ on_presented (ClutterStage *stage,
* guaranteed to be in nanoseconds but with no specified base. The * guaranteed to be in nanoseconds but with no specified base. The
* normal case with the open source GPU drivers on Linux 3.8 and * normal case with the open source GPU drivers on Linux 3.8 and
* newer is that the base of cogl_get_clock_time() is that of * newer is that the base of cogl_get_clock_time() is that of
* clock_gettime(CLOCK_MONOTONIC), so the same as g_get_monotonic_time), * clock_gettime(CLOCK_MONOTONIC), so the same as
*g_get_monotonic_time),
* but there's no exposure of that through the API. clock_gettime() * but there's no exposure of that through the API. clock_gettime()
* is fairly fast, so calling it twice and subtracting to get a * is fairly fast, so calling it twice and subtracting to get a
* nearly-zero number is acceptable, if a litle ugly. * nearly-zero number is acceptable, if a litle ugly.
@ -1113,7 +1162,8 @@ on_presented (ClutterStage *stage,
gint64 current_monotonic_time = g_get_monotonic_time (); gint64 current_monotonic_time = g_get_monotonic_time ();
presentation_time = presentation_time =
current_monotonic_time + (presentation_time_cogl - current_cogl_time) / 1000; current_monotonic_time +
(presentation_time_cogl - current_cogl_time) / 1000;
} }
else else
{ {
@ -1121,7 +1171,8 @@ on_presented (ClutterStage *stage,
} }
for (l = compositor->windows; l; l = l->next) for (l = compositor->windows; l; l = l->next)
meta_window_actor_frame_complete (l->data, frame_info, presentation_time); meta_window_actor_frame_complete (l->data, frame_info,
presentation_time);
} }
} }
@ -1213,11 +1264,11 @@ meta_post_paint_func (gpointer data)
default: default:
/* The ARB_robustness spec says that, on error, the application /* The ARB_robustness spec says that, on error, the application
should destroy the old context and create a new one. Since we * should destroy the old context and create a new one. Since we
don't have the necessary plumbing to do this we'll simply * don't have the necessary plumbing to do this we'll simply
restart the process. Obviously we can't do this when we are * restart the process. Obviously we can't do this when we are
a wayland compositor but in that case we shouldn't get here * a wayland compositor but in that case we shouldn't get here
since we don't enable robustness in that case. */ * since we don't enable robustness in that case. */
g_assert (!meta_is_wayland_compositor ()); g_assert (!meta_is_wayland_compositor ());
meta_restart (NULL); meta_restart (NULL);
break; break;
@ -1309,7 +1360,8 @@ meta_enable_unredirect_for_display (MetaDisplay *display)
{ {
MetaCompositor *compositor = get_compositor_for_display (display); MetaCompositor *compositor = get_compositor_for_display (display);
if (compositor->disable_unredirect_count == 0) if (compositor->disable_unredirect_count == 0)
g_warning ("Called enable_unredirect_for_display while unredirection is enabled."); g_warning (
"Called enable_unredirect_for_display while unredirection is enabled.");
if (compositor->disable_unredirect_count > 0) if (compositor->disable_unredirect_count > 0)
compositor->disable_unredirect_count--; compositor->disable_unredirect_count--;
} }
@ -1422,10 +1474,13 @@ meta_compositor_monotonic_time_to_server_time (MetaDisplay *display,
if (compositor->server_time_query_time == 0 || if (compositor->server_time_query_time == 0 ||
(!compositor->server_time_is_monotonic_time && (!compositor->server_time_is_monotonic_time &&
monotonic_time > compositor->server_time_query_time + 10*1000*1000)) /* 10 seconds */ monotonic_time > compositor->server_time_query_time + 10 * 1000 * 1000)) /*
* 10
* seconds
* */
{ {
guint32 server_time = meta_display_get_current_time_roundtrip (display); guint32 server_time = meta_display_get_current_time_roundtrip (display);
gint64 server_time_usec = (gint64)server_time * 1000; gint64 server_time_usec = (gint64) server_time * 1000;
gint64 current_monotonic_time = g_get_monotonic_time (); gint64 current_monotonic_time = g_get_monotonic_time ();
compositor->server_time_query_time = current_monotonic_time; compositor->server_time_query_time = current_monotonic_time;
@ -1435,11 +1490,12 @@ meta_compositor_monotonic_time_to_server_time (MetaDisplay *display,
* is under load and our processing of the server response is * is under load and our processing of the server response is
* delayed. * delayed.
*/ */
if (server_time_usec > current_monotonic_time - 1000*1000 && if (server_time_usec > current_monotonic_time - 1000 * 1000 &&
server_time_usec < current_monotonic_time + 1000*1000) server_time_usec < current_monotonic_time + 1000 * 1000)
compositor->server_time_is_monotonic_time = TRUE; compositor->server_time_is_monotonic_time = TRUE;
compositor->server_time_offset = server_time_usec - current_monotonic_time; compositor->server_time_offset = server_time_usec -
current_monotonic_time;
} }
if (compositor->server_time_is_monotonic_time) if (compositor->server_time_is_monotonic_time)
@ -1455,7 +1511,8 @@ meta_compositor_show_tile_preview (MetaCompositor *compositor,
int tile_monitor_number) int tile_monitor_number)
{ {
meta_plugin_manager_show_tile_preview (compositor->plugin_mgr, meta_plugin_manager_show_tile_preview (compositor->plugin_mgr,
window, tile_rect, tile_monitor_number); window, tile_rect,
tile_monitor_number);
} }
void void
@ -1465,22 +1522,24 @@ meta_compositor_hide_tile_preview (MetaCompositor *compositor)
} }
void void
meta_compositor_show_window_menu (MetaCompositor *compositor, meta_compositor_show_window_menu (MetaCompositor *compositor,
MetaWindow *window, MetaWindow *window,
MetaWindowMenuType menu, MetaWindowMenuType menu,
int x, int x,
int y) int y)
{ {
meta_plugin_manager_show_window_menu (compositor->plugin_mgr, window, menu, x, y); meta_plugin_manager_show_window_menu (compositor->plugin_mgr, window, menu, x,
y);
} }
void void
meta_compositor_show_window_menu_for_rect (MetaCompositor *compositor, meta_compositor_show_window_menu_for_rect (MetaCompositor *compositor,
MetaWindow *window, MetaWindow *window,
MetaWindowMenuType menu, MetaWindowMenuType menu,
MetaRectangle *rect) MetaRectangle *rect)
{ {
meta_plugin_manager_show_window_menu_for_rect (compositor->plugin_mgr, window, menu, rect); meta_plugin_manager_show_window_menu_for_rect (compositor->plugin_mgr, window,
menu, rect);
} }
MetaCloseDialog * MetaCloseDialog *
@ -1495,6 +1554,7 @@ MetaInhibitShortcutsDialog *
meta_compositor_create_inhibit_shortcuts_dialog (MetaCompositor *compositor, meta_compositor_create_inhibit_shortcuts_dialog (MetaCompositor *compositor,
MetaWindow *window) MetaWindow *window)
{ {
return meta_plugin_manager_create_inhibit_shortcuts_dialog (compositor->plugin_mgr, return meta_plugin_manager_create_inhibit_shortcuts_dialog (
window); compositor->plugin_mgr,
window);
} }

View File

@ -97,7 +97,8 @@ enum
PROP_VIGNETTE_BRIGHTNESS PROP_VIGNETTE_BRIGHTNESS
}; };
typedef enum { typedef enum
{
CHANGED_BACKGROUND = 1 << 0, CHANGED_BACKGROUND = 1 << 0,
CHANGED_EFFECTS = 1 << 2, CHANGED_EFFECTS = 1 << 2,
CHANGED_VIGNETTE_PARAMETERS = 1 << 3, CHANGED_VIGNETTE_PARAMETERS = 1 << 3,
@ -106,44 +107,45 @@ typedef enum {
} ChangedFlags; } ChangedFlags;
#define GRADIENT_VERTEX_SHADER_DECLARATIONS \ #define GRADIENT_VERTEX_SHADER_DECLARATIONS \
"uniform vec2 scale;\n" \ "uniform vec2 scale;\n" \
"varying vec2 position;\n" \ "varying vec2 position;\n" \
#define GRADIENT_VERTEX_SHADER_CODE \ #define GRADIENT_VERTEX_SHADER_CODE \
"position = cogl_tex_coord0_in.xy * scale;\n" \ "position = cogl_tex_coord0_in.xy * scale;\n" \
#define GRADIENT_FRAGMENT_SHADER_DECLARATIONS \ #define GRADIENT_FRAGMENT_SHADER_DECLARATIONS \
"uniform float gradient_height_perc;\n" \ "uniform float gradient_height_perc;\n" \
"uniform float gradient_max_darkness;\n" \ "uniform float gradient_max_darkness;\n" \
"varying vec2 position;\n" \ "varying vec2 position;\n" \
#define GRADIENT_FRAGMENT_SHADER_CODE \ #define GRADIENT_FRAGMENT_SHADER_CODE \
"float min_brightness = 1.0 - gradient_max_darkness;\n" \ "float min_brightness = 1.0 - gradient_max_darkness;\n" \
"float gradient_y_pos = min(position.y, gradient_height_perc) / gradient_height_perc;\n" \ "float gradient_y_pos = min(position.y, gradient_height_perc) / gradient_height_perc;\n" \
"float pixel_brightness = (1.0 - min_brightness) * gradient_y_pos + min_brightness;\n" \ "float pixel_brightness = (1.0 - min_brightness) * gradient_y_pos + min_brightness;\n" \
"cogl_color_out.rgb = cogl_color_out.rgb * pixel_brightness;\n" \ "cogl_color_out.rgb = cogl_color_out.rgb * pixel_brightness;\n" \
#define VIGNETTE_VERTEX_SHADER_DECLARATIONS \ #define VIGNETTE_VERTEX_SHADER_DECLARATIONS \
"uniform vec2 scale;\n" \ "uniform vec2 scale;\n" \
"uniform vec2 offset;\n" \ "uniform vec2 offset;\n" \
"varying vec2 position;\n" \ "varying vec2 position;\n" \
#define VIGNETTE_VERTEX_SHADER_CODE \ #define VIGNETTE_VERTEX_SHADER_CODE \
"position = cogl_tex_coord0_in.xy * scale + offset;\n" \ "position = cogl_tex_coord0_in.xy * scale + offset;\n" \
#define VIGNETTE_FRAGMENT_SHADER_DECLARATIONS \ #define VIGNETTE_FRAGMENT_SHADER_DECLARATIONS \
"uniform float vignette_sharpness;\n" \ "uniform float vignette_sharpness;\n" \
"varying vec2 position;\n" \ "varying vec2 position;\n" \
#define VIGNETTE_FRAGMENT_SHADER_CODE \ #define VIGNETTE_FRAGMENT_SHADER_CODE \
"float t = 2.0 * length(position);\n" \ "float t = 2.0 * length(position);\n" \
"t = min(t, 1.0);\n" \ "t = min(t, 1.0);\n" \
"float pixel_brightness = 1.0 - t * vignette_sharpness;\n" \ "float pixel_brightness = 1.0 - t * vignette_sharpness;\n" \
"cogl_color_out.rgb = cogl_color_out.rgb * pixel_brightness;\n" \ "cogl_color_out.rgb = cogl_color_out.rgb * pixel_brightness;\n" \
typedef struct _MetaBackgroundLayer MetaBackgroundLayer; typedef struct _MetaBackgroundLayer MetaBackgroundLayer;
typedef enum { typedef enum
{
PIPELINE_VIGNETTE = (1 << 0), PIPELINE_VIGNETTE = (1 << 0),
PIPELINE_BLEND = (1 << 1), PIPELINE_BLEND = (1 << 1),
PIPELINE_GRADIENT = (1 << 2), PIPELINE_GRADIENT = (1 << 2),
@ -175,9 +177,11 @@ struct _MetaBackgroundActorPrivate
static void cullable_iface_init (MetaCullableInterface *iface); static void cullable_iface_init (MetaCullableInterface *iface);
G_DEFINE_TYPE_WITH_CODE (MetaBackgroundActor, meta_background_actor, CLUTTER_TYPE_ACTOR, G_DEFINE_TYPE_WITH_CODE (MetaBackgroundActor, meta_background_actor,
CLUTTER_TYPE_ACTOR,
G_ADD_PRIVATE (MetaBackgroundActor) G_ADD_PRIVATE (MetaBackgroundActor)
G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE, cullable_iface_init)); G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE,
cullable_iface_init));
static void static void
set_clip_region (MetaBackgroundActor *self, set_clip_region (MetaBackgroundActor *self,
@ -280,16 +284,18 @@ make_pipeline (PipelineFlags pipeline_flags)
static CoglSnippet *vignette_fragment_snippet; static CoglSnippet *vignette_fragment_snippet;
if (!vignette_vertex_snippet) if (!vignette_vertex_snippet)
vignette_vertex_snippet = cogl_snippet_new (COGL_SNIPPET_HOOK_VERTEX, vignette_vertex_snippet = cogl_snippet_new (
VIGNETTE_VERTEX_SHADER_DECLARATIONS, COGL_SNIPPET_HOOK_VERTEX,
VIGNETTE_VERTEX_SHADER_CODE); VIGNETTE_VERTEX_SHADER_DECLARATIONS,
VIGNETTE_VERTEX_SHADER_CODE);
cogl_pipeline_add_snippet (*templatep, vignette_vertex_snippet); cogl_pipeline_add_snippet (*templatep, vignette_vertex_snippet);
if (!vignette_fragment_snippet) if (!vignette_fragment_snippet)
vignette_fragment_snippet = cogl_snippet_new (COGL_SNIPPET_HOOK_FRAGMENT, vignette_fragment_snippet = cogl_snippet_new (
VIGNETTE_FRAGMENT_SHADER_DECLARATIONS, COGL_SNIPPET_HOOK_FRAGMENT,
VIGNETTE_FRAGMENT_SHADER_CODE); VIGNETTE_FRAGMENT_SHADER_DECLARATIONS,
VIGNETTE_FRAGMENT_SHADER_CODE);
cogl_pipeline_add_snippet (*templatep, vignette_fragment_snippet); cogl_pipeline_add_snippet (*templatep, vignette_fragment_snippet);
} }
@ -300,16 +306,18 @@ make_pipeline (PipelineFlags pipeline_flags)
static CoglSnippet *gradient_fragment_snippet; static CoglSnippet *gradient_fragment_snippet;
if (!gradient_vertex_snippet) if (!gradient_vertex_snippet)
gradient_vertex_snippet = cogl_snippet_new (COGL_SNIPPET_HOOK_VERTEX, gradient_vertex_snippet = cogl_snippet_new (
GRADIENT_VERTEX_SHADER_DECLARATIONS, COGL_SNIPPET_HOOK_VERTEX,
GRADIENT_VERTEX_SHADER_CODE); GRADIENT_VERTEX_SHADER_DECLARATIONS,
GRADIENT_VERTEX_SHADER_CODE);
cogl_pipeline_add_snippet (*templatep, gradient_vertex_snippet); cogl_pipeline_add_snippet (*templatep, gradient_vertex_snippet);
if (!gradient_fragment_snippet) if (!gradient_fragment_snippet)
gradient_fragment_snippet = cogl_snippet_new (COGL_SNIPPET_HOOK_FRAGMENT, gradient_fragment_snippet = cogl_snippet_new (
GRADIENT_FRAGMENT_SHADER_DECLARATIONS, COGL_SNIPPET_HOOK_FRAGMENT,
GRADIENT_FRAGMENT_SHADER_CODE); GRADIENT_FRAGMENT_SHADER_DECLARATIONS,
GRADIENT_FRAGMENT_SHADER_CODE);
cogl_pipeline_add_snippet (*templatep, gradient_fragment_snippet); cogl_pipeline_add_snippet (*templatep, gradient_fragment_snippet);
} }
@ -334,9 +342,11 @@ setup_pipeline (MetaBackgroundActor *self,
opacity = clutter_actor_get_paint_opacity (CLUTTER_ACTOR (self)); opacity = clutter_actor_get_paint_opacity (CLUTTER_ACTOR (self));
if (opacity < 255) if (opacity < 255)
pipeline_flags |= PIPELINE_BLEND; pipeline_flags |= PIPELINE_BLEND;
if (priv->vignette && clutter_feature_available (CLUTTER_FEATURE_SHADERS_GLSL)) if (priv->vignette &&
clutter_feature_available (CLUTTER_FEATURE_SHADERS_GLSL))
pipeline_flags |= PIPELINE_VIGNETTE; pipeline_flags |= PIPELINE_VIGNETTE;
if (priv->gradient && clutter_feature_available (CLUTTER_FEATURE_SHADERS_GLSL)) if (priv->gradient &&
clutter_feature_available (CLUTTER_FEATURE_SHADERS_GLSL))
pipeline_flags |= PIPELINE_GRADIENT; pipeline_flags |= PIPELINE_GRADIENT;
if (priv->pipeline && if (priv->pipeline &&
@ -361,8 +371,10 @@ setup_pipeline (MetaBackgroundActor *self,
&priv->texture_area, &priv->texture_area,
&wrap_mode); &wrap_mode);
priv->force_bilinear = texture && priv->force_bilinear = texture &&
(priv->texture_area.width != (int)cogl_texture_get_width (texture) || (priv->texture_area.width !=
priv->texture_area.height != (int)cogl_texture_get_height (texture)); (int) cogl_texture_get_width (texture) ||
priv->texture_area.height !=
(int) cogl_texture_get_height (texture));
cogl_pipeline_set_layer_texture (priv->pipeline, 0, texture); cogl_pipeline_set_layer_texture (priv->pipeline, 0, texture);
cogl_pipeline_set_layer_wrap_mode (priv->pipeline, 0, wrap_mode); cogl_pipeline_set_layer_wrap_mode (priv->pipeline, 0, wrap_mode);
@ -373,7 +385,8 @@ setup_pipeline (MetaBackgroundActor *self,
if ((priv->changed & CHANGED_VIGNETTE_PARAMETERS) != 0) if ((priv->changed & CHANGED_VIGNETTE_PARAMETERS) != 0)
{ {
cogl_pipeline_set_uniform_1f (priv->pipeline, cogl_pipeline_set_uniform_1f (priv->pipeline,
cogl_pipeline_get_uniform_location (priv->pipeline, cogl_pipeline_get_uniform_location (priv->
pipeline,
"vignette_sharpness"), "vignette_sharpness"),
priv->vignette_sharpness); priv->vignette_sharpness);
@ -387,13 +400,17 @@ setup_pipeline (MetaBackgroundActor *self,
meta_display_get_monitor_geometry (priv->display, meta_display_get_monitor_geometry (priv->display,
priv->monitor, &monitor_geometry); priv->monitor, &monitor_geometry);
gradient_height_perc = MAX (0.0001, priv->gradient_height / (float)monitor_geometry.height); gradient_height_perc = MAX (0.0001,
priv->gradient_height /
(float) monitor_geometry.height);
cogl_pipeline_set_uniform_1f (priv->pipeline, cogl_pipeline_set_uniform_1f (priv->pipeline,
cogl_pipeline_get_uniform_location (priv->pipeline, cogl_pipeline_get_uniform_location (priv->
pipeline,
"gradient_height_perc"), "gradient_height_perc"),
gradient_height_perc); gradient_height_perc);
cogl_pipeline_set_uniform_1f (priv->pipeline, cogl_pipeline_set_uniform_1f (priv->pipeline,
cogl_pipeline_get_uniform_location (priv->pipeline, cogl_pipeline_get_uniform_location (priv->
pipeline,
"gradient_max_darkness"), "gradient_max_darkness"),
priv->gradient_max_darkness); priv->gradient_max_darkness);
@ -423,7 +440,8 @@ setup_pipeline (MetaBackgroundActor *self,
opacity / 255.); opacity / 255.);
if (!priv->force_bilinear && if (!priv->force_bilinear &&
meta_actor_painting_untransformed (actor_pixel_rect->width, actor_pixel_rect->height, NULL, NULL)) meta_actor_painting_untransformed (actor_pixel_rect->width,
actor_pixel_rect->height, NULL, NULL))
filter = COGL_PIPELINE_FILTER_NEAREST; filter = COGL_PIPELINE_FILTER_NEAREST;
else else
filter = COGL_PIPELINE_FILTER_LINEAR; filter = COGL_PIPELINE_FILTER_LINEAR;
@ -442,18 +460,20 @@ set_glsl_parameters (MetaBackgroundActor *self,
/* Compute a scale and offset for transforming texture coordinates to the /* Compute a scale and offset for transforming texture coordinates to the
* coordinate system from [-0.5 to 0.5] across the area of the actor * coordinate system from [-0.5 to 0.5] across the area of the actor
*/ */
scale[0] = priv->texture_area.width / (float)actor_pixel_rect->width; scale[0] = priv->texture_area.width / (float) actor_pixel_rect->width;
scale[1] = priv->texture_area.height / (float)actor_pixel_rect->height; scale[1] = priv->texture_area.height / (float) actor_pixel_rect->height;
offset[0] = priv->texture_area.x / (float)actor_pixel_rect->width - 0.5; offset[0] = priv->texture_area.x / (float) actor_pixel_rect->width - 0.5;
offset[1] = priv->texture_area.y / (float)actor_pixel_rect->height - 0.5; offset[1] = priv->texture_area.y / (float) actor_pixel_rect->height - 0.5;
cogl_pipeline_set_uniform_float (priv->pipeline, cogl_pipeline_set_uniform_float (priv->pipeline,
cogl_pipeline_get_uniform_location (priv->pipeline, cogl_pipeline_get_uniform_location (priv->
pipeline,
"scale"), "scale"),
2, 1, scale); 2, 1, scale);
cogl_pipeline_set_uniform_float (priv->pipeline, cogl_pipeline_set_uniform_float (priv->pipeline,
cogl_pipeline_get_uniform_location (priv->pipeline, cogl_pipeline_get_uniform_location (priv->
pipeline,
"offset"), "offset"),
2, 1, offset); 2, 1, offset);
} }
@ -524,22 +544,24 @@ meta_background_actor_paint (ClutterActor *actor)
int n_rects = cairo_region_num_rectangles (priv->clip_region); int n_rects = cairo_region_num_rectangles (priv->clip_region);
if (n_rects <= MAX_RECTS) if (n_rects <= MAX_RECTS)
{ {
for (i = 0; i < n_rects; i++) for (i = 0; i < n_rects; i++)
{ {
cairo_rectangle_int_t rect; cairo_rectangle_int_t rect;
cairo_region_get_rectangle (priv->clip_region, i, &rect); cairo_region_get_rectangle (priv->clip_region, i, &rect);
if (!gdk_rectangle_intersect (&actor_pixel_rect, &rect, &rect)) if (!gdk_rectangle_intersect (&actor_pixel_rect, &rect, &rect))
continue; continue;
paint_clipped_rectangle (fb, priv->pipeline, &rect, &priv->texture_area); paint_clipped_rectangle (fb, priv->pipeline, &rect,
} &priv->texture_area);
}
return; return;
} }
} }
paint_clipped_rectangle (fb, priv->pipeline, &actor_pixel_rect, &priv->texture_area); paint_clipped_rectangle (fb, priv->pipeline, &actor_pixel_rect,
&priv->texture_area);
} }
static void static void
@ -605,10 +627,10 @@ meta_background_actor_set_property (GObject *object,
} }
static void static void
meta_background_actor_get_property (GObject *object, meta_background_actor_get_property (GObject *object,
guint prop_id, guint prop_id,
GValue *value, GValue *value,
GParamSpec *pspec) GParamSpec *pspec)
{ {
MetaBackgroundActorPrivate *priv = META_BACKGROUND_ACTOR (object)->priv; MetaBackgroundActorPrivate *priv = META_BACKGROUND_ACTOR (object)->priv;
@ -659,7 +681,8 @@ meta_background_actor_class_init (MetaBackgroundActorClass *klass)
object_class->get_property = meta_background_actor_get_property; object_class->get_property = meta_background_actor_get_property;
actor_class->get_preferred_width = meta_background_actor_get_preferred_width; actor_class->get_preferred_width = meta_background_actor_get_preferred_width;
actor_class->get_preferred_height = meta_background_actor_get_preferred_height; actor_class->get_preferred_height =
meta_background_actor_get_preferred_height;
actor_class->get_paint_volume = meta_background_actor_get_paint_volume; actor_class->get_paint_volume = meta_background_actor_get_paint_volume;
actor_class->paint = meta_background_actor_paint; actor_class->paint = meta_background_actor_paint;
@ -716,8 +739,8 @@ meta_background_actor_class_init (MetaBackgroundActorClass *klass)
param_spec = g_param_spec_double ("gradient-max-darkness", param_spec = g_param_spec_double ("gradient-max-darkness",
"Gradient Max Darkness", "Gradient Max Darkness",
"How dark is the gradient initially", "How dark is the gradient initially",
0.0, 1.0, 0.0, 0.0, 1.0, 0.0,
G_PARAM_READWRITE); G_PARAM_READWRITE);
g_object_class_install_property (object_class, g_object_class_install_property (object_class,
PROP_GRADIENT_MAX_DARKNESS, PROP_GRADIENT_MAX_DARKNESS,
@ -866,7 +889,7 @@ meta_background_actor_set_background (MetaBackgroundActor *self,
if (priv->background) if (priv->background)
{ {
g_signal_handlers_disconnect_by_func (priv->background, g_signal_handlers_disconnect_by_func (priv->background,
(gpointer)on_background_changed, (gpointer) on_background_changed,
self); self);
g_object_unref (priv->background); g_object_unref (priv->background);
priv->background = NULL; priv->background = NULL;
@ -907,7 +930,8 @@ meta_background_actor_set_gradient (MetaBackgroundActor *self,
changed = TRUE; changed = TRUE;
} }
if (height != priv->gradient_height || max_darkness != priv->gradient_max_darkness) if (height != priv->gradient_height ||
max_darkness != priv->gradient_max_darkness)
{ {
priv->gradient_height = height; priv->gradient_height = height;
priv->gradient_max_darkness = max_darkness; priv->gradient_max_darkness = max_darkness;
@ -929,12 +953,13 @@ meta_background_actor_set_monitor (MetaBackgroundActor *self,
MetaDisplay *display = priv->display; MetaDisplay *display = priv->display;
if(priv->monitor == monitor) if(priv->monitor == monitor)
return; return;
meta_display_get_monitor_geometry (display, priv->monitor, &old_monitor_geometry); meta_display_get_monitor_geometry (display, priv->monitor,
&old_monitor_geometry);
meta_display_get_monitor_geometry (display, monitor, &new_monitor_geometry); meta_display_get_monitor_geometry (display, monitor, &new_monitor_geometry);
if(old_monitor_geometry.height != new_monitor_geometry.height) if(old_monitor_geometry.height != new_monitor_geometry.height)
invalidate_pipeline (self, CHANGED_GRADIENT_PARAMETERS); invalidate_pipeline (self, CHANGED_GRADIENT_PARAMETERS);
priv->monitor = monitor; priv->monitor = monitor;
} }
@ -963,7 +988,8 @@ meta_background_actor_set_vignette (MetaBackgroundActor *self,
changed = TRUE; changed = TRUE;
} }
if (brightness != priv->vignette_brightness || sharpness != priv->vignette_sharpness) if (brightness != priv->vignette_brightness ||
sharpness != priv->vignette_sharpness)
{ {
priv->vignette_brightness = brightness; priv->vignette_brightness = brightness;
priv->vignette_sharpness = sharpness; priv->vignette_sharpness = sharpness;

View File

@ -21,8 +21,10 @@
static void cullable_iface_init (MetaCullableInterface *iface); static void cullable_iface_init (MetaCullableInterface *iface);
G_DEFINE_TYPE_WITH_CODE (MetaBackgroundGroup, meta_background_group, CLUTTER_TYPE_ACTOR, G_DEFINE_TYPE_WITH_CODE (MetaBackgroundGroup, meta_background_group,
G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE, cullable_iface_init)); CLUTTER_TYPE_ACTOR,
G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE,
cullable_iface_init));
static void static void
meta_background_group_class_init (MetaBackgroundGroupClass *klass) meta_background_group_class_init (MetaBackgroundGroupClass *klass)

View File

@ -19,7 +19,8 @@
/** /**
* SECTION:meta-background-image * SECTION:meta-background-image
* @title: MetaBackgroundImage * @title: MetaBackgroundImage
* @short_description: objects holding images loaded from files, used for backgrounds * @short_description: objects holding images loaded from files, used for
*backgrounds
*/ */
#include "config.h" #include "config.h"
@ -67,7 +68,8 @@ struct _MetaBackgroundImageClass
GObjectClass parent_class; GObjectClass parent_class;
}; };
G_DEFINE_TYPE (MetaBackgroundImageCache, meta_background_image_cache, G_TYPE_OBJECT); G_DEFINE_TYPE (MetaBackgroundImageCache, meta_background_image_cache,
G_TYPE_OBJECT);
static void static void
meta_background_image_cache_init (MetaBackgroundImageCache *cache) meta_background_image_cache_init (MetaBackgroundImageCache *cache)
@ -193,7 +195,8 @@ file_loaded (GObject *source_object,
META_TEXTURE_ALLOW_SLICING); META_TEXTURE_ALLOW_SLICING);
if (!cogl_texture_set_data (texture, if (!cogl_texture_set_data (texture,
has_alpha ? COGL_PIXEL_FORMAT_RGBA_8888 : COGL_PIXEL_FORMAT_RGB_888, has_alpha ? COGL_PIXEL_FORMAT_RGBA_8888 :
COGL_PIXEL_FORMAT_RGB_888,
row_stride, row_stride,
pixels, 0, pixels, 0,
&catch_error)) &catch_error))
@ -226,7 +229,8 @@ out:
* signal will be emitted exactly once. The 'loaded' state means that the * signal will be emitted exactly once. The 'loaded' state means that the
* loading process finished, whether it succeeded or failed. * loading process finished, whether it succeeded or failed.
* *
* Return value: (transfer full): a #MetaBackgroundImage to dereference to get the loaded texture * Return value: (transfer full): a #MetaBackgroundImage to dereference to get
*the loaded texture
*/ */
MetaBackgroundImage * MetaBackgroundImage *
meta_background_image_cache_load (MetaBackgroundImageCache *cache, meta_background_image_cache_load (MetaBackgroundImageCache *cache,

View File

@ -53,10 +53,10 @@ struct _MetaBackgroundPrivate
MetaBackgroundMonitor *monitors; MetaBackgroundMonitor *monitors;
int n_monitors; int n_monitors;
GDesktopBackgroundStyle style; GDesktopBackgroundStyle style;
GDesktopBackgroundShading shading_direction; GDesktopBackgroundShading shading_direction;
ClutterColor color; ClutterColor color;
ClutterColor second_color; ClutterColor second_color;
GFile *file1; GFile *file1;
MetaBackgroundImage *background_image1; MetaBackgroundImage *background_image1;
@ -189,10 +189,10 @@ meta_background_set_property (GObject *object,
} }
static void static void
meta_background_get_property (GObject *object, meta_background_get_property (GObject *object,
guint prop_id, guint prop_id,
GValue *value, GValue *value,
GParamSpec *pspec) GParamSpec *pspec)
{ {
MetaBackgroundPrivate *priv = META_BACKGROUND (object)->priv; MetaBackgroundPrivate *priv = META_BACKGROUND (object)->priv;
@ -211,8 +211,12 @@ static gboolean
need_prerender (MetaBackground *self) need_prerender (MetaBackground *self)
{ {
MetaBackgroundPrivate *priv = self->priv; MetaBackgroundPrivate *priv = self->priv;
CoglTexture *texture1 = priv->background_image1 ? meta_background_image_get_texture (priv->background_image1) : NULL; CoglTexture *texture1 =
CoglTexture *texture2 = priv->background_image2 ? meta_background_image_get_texture (priv->background_image2) : NULL; priv->background_image1 ? meta_background_image_get_texture (
priv->background_image1) : NULL;
CoglTexture *texture2 =
priv->background_image2 ? meta_background_image_get_texture (
priv->background_image2) : NULL;
if (texture1 == NULL && texture2 == NULL) if (texture1 == NULL && texture2 == NULL)
return FALSE; return FALSE;
@ -271,7 +275,7 @@ set_file (MetaBackground *self,
if (*imagep) if (*imagep)
{ {
g_signal_handlers_disconnect_by_func (*imagep, g_signal_handlers_disconnect_by_func (*imagep,
(gpointer)on_background_loaded, (gpointer) on_background_loaded,
self); self);
g_object_unref (*imagep); g_object_unref (*imagep);
*imagep = NULL; *imagep = NULL;
@ -279,7 +283,8 @@ set_file (MetaBackground *self,
if (file) if (file)
{ {
MetaBackgroundImageCache *cache = meta_background_image_cache_get_default (); MetaBackgroundImageCache *cache =
meta_background_image_cache_get_default ();
*filep = g_object_ref (file); *filep = g_object_ref (file);
*imagep = meta_background_image_cache_load (cache, file); *imagep = meta_background_image_cache_load (cache, file);
@ -292,7 +297,7 @@ set_file (MetaBackground *self,
static void static void
meta_background_dispose (GObject *object) meta_background_dispose (GObject *object)
{ {
MetaBackground *self = META_BACKGROUND (object); MetaBackground *self = META_BACKGROUND (object);
MetaBackgroundPrivate *priv = self->priv; MetaBackgroundPrivate *priv = self->priv;
free_color_texture (self); free_color_texture (self);
@ -317,14 +322,15 @@ meta_background_finalize (GObject *object)
static void static void
meta_background_constructed (GObject *object) meta_background_constructed (GObject *object)
{ {
MetaBackground *self = META_BACKGROUND (object); MetaBackground *self = META_BACKGROUND (object);
MetaBackgroundPrivate *priv = self->priv; MetaBackgroundPrivate *priv = self->priv;
MetaMonitorManager *monitor_manager = meta_monitor_manager_get (); MetaMonitorManager *monitor_manager = meta_monitor_manager_get ();
G_OBJECT_CLASS (meta_background_parent_class)->constructed (object); G_OBJECT_CLASS (meta_background_parent_class)->constructed (object);
g_signal_connect_object (priv->display, "gl-video-memory-purged", g_signal_connect_object (priv->display, "gl-video-memory-purged",
G_CALLBACK (mark_changed), object, G_CONNECT_SWAPPED); G_CALLBACK (mark_changed), object,
G_CONNECT_SWAPPED);
g_signal_connect_object (monitor_manager, "monitors-changed", g_signal_connect_object (monitor_manager, "monitors-changed",
G_CALLBACK (on_monitors_changed), self, G_CALLBACK (on_monitors_changed), self,
@ -360,7 +366,6 @@ meta_background_class_init (MetaBackgroundClass *klass)
g_object_class_install_property (object_class, g_object_class_install_property (object_class,
PROP_META_DISPLAY, PROP_META_DISPLAY,
param_spec); param_spec);
} }
static void static void
@ -383,10 +388,10 @@ set_texture_area_from_monitor_area (cairo_rectangle_int_t *monitor_area,
} }
static void static void
get_texture_area (MetaBackground *self, get_texture_area (MetaBackground *self,
cairo_rectangle_int_t *monitor_rect, cairo_rectangle_int_t *monitor_rect,
CoglTexture *texture, CoglTexture *texture,
cairo_rectangle_int_t *texture_area) cairo_rectangle_int_t *texture_area)
{ {
MetaBackgroundPrivate *priv = self->priv; MetaBackgroundPrivate *priv = self->priv;
cairo_rectangle_int_t image_area; cairo_rectangle_int_t image_area;
@ -472,23 +477,23 @@ get_texture_area (MetaBackground *self,
break; break;
case G_DESKTOP_BACKGROUND_STYLE_SPANNED: case G_DESKTOP_BACKGROUND_STYLE_SPANNED:
{ {
/* paint region is the union of all monitors, with the origin /* paint region is the union of all monitors, with the origin
* of the region set to align with monitor associated with the background. * of the region set to align with monitor associated with the background.
*/ */
meta_display_get_size (priv->display, &screen_width, &screen_height); meta_display_get_size (priv->display, &screen_width, &screen_height);
/* unclipped texture area is whole screen */ /* unclipped texture area is whole screen */
image_area.width = screen_width; image_area.width = screen_width;
image_area.height = screen_height; image_area.height = screen_height;
/* But make (0,0) line up with the appropriate monitor */ /* But make (0,0) line up with the appropriate monitor */
image_area.x = -monitor_rect->x; image_area.x = -monitor_rect->x;
image_area.y = -monitor_rect->y; image_area.y = -monitor_rect->y;
*texture_area = image_area; *texture_area = image_area;
break; break;
} }
} }
} }
@ -518,10 +523,13 @@ draw_texture (MetaBackground *self,
0, 0,
monitor_area->width, monitor_area->width,
monitor_area->height, monitor_area->height,
- texture_area.x / (float)texture_area.width, -texture_area.x / (float) texture_area.width,
- texture_area.y / (float)texture_area.height, -texture_area.y / (float) texture_area.height,
(monitor_area->width - texture_area.x) / (float)texture_area.width, (monitor_area->width -
(monitor_area->height - texture_area.y) / (float)texture_area.height); texture_area.x) / (float) texture_area.width,
(monitor_area->height -
texture_area.y) /
(float) texture_area.height);
bare_region_visible = texture_has_alpha (texture); bare_region_visible = texture_has_alpha (texture);
@ -535,13 +543,14 @@ draw_texture (MetaBackground *self,
texture_area.x + texture_area.width, texture_area.x + texture_area.width,
texture_area.y + texture_area.height, texture_area.y + texture_area.height,
0, 0, 1.0, 1.0); 0, 0, 1.0, 1.0);
bare_region_visible = texture_has_alpha (texture) || memcmp (&texture_area, monitor_area, sizeof (cairo_rectangle_int_t)) != 0; bare_region_visible = texture_has_alpha (texture) || memcmp (
&texture_area, monitor_area, sizeof (cairo_rectangle_int_t)) != 0;
break; break;
case G_DESKTOP_BACKGROUND_STYLE_NONE: case G_DESKTOP_BACKGROUND_STYLE_NONE:
bare_region_visible = TRUE; bare_region_visible = TRUE;
break; break;
default: default:
g_return_val_if_reached(FALSE); g_return_val_if_reached (FALSE);
} }
return bare_region_visible; return bare_region_visible;
@ -593,21 +602,25 @@ ensure_color_texture (MetaBackground *self)
pixels[5] = priv->second_color.blue; pixels[5] = priv->second_color.blue;
} }
priv->color_texture = COGL_TEXTURE (cogl_texture_2d_new_from_data (ctx, width, height, priv->color_texture =
COGL_PIXEL_FORMAT_RGB_888, COGL_TEXTURE (cogl_texture_2d_new_from_data (ctx, width, height,
width * 3, COGL_PIXEL_FORMAT_RGB_888,
pixels, width *
&error)); 3,
pixels,
&error));
if (error != NULL) if (error != NULL)
{ {
meta_warning ("Failed to allocate color texture: %s\n", error->message); meta_warning ("Failed to allocate color texture: %s\n",
error->message);
cogl_error_free (error); cogl_error_free (error);
} }
} }
} }
typedef enum { typedef enum
{
PIPELINE_REPLACE, PIPELINE_REPLACE,
PIPELINE_ADD, PIPELINE_ADD,
PIPELINE_OVER_REVERSE, PIPELINE_OVER_REVERSE,
@ -616,10 +629,12 @@ typedef enum {
static CoglPipeline * static CoglPipeline *
create_pipeline (PipelineType type) create_pipeline (PipelineType type)
{ {
const char * const blend_strings[3] = { const char * const blend_strings[3] =
{
[PIPELINE_REPLACE] = "RGBA = ADD (SRC_COLOR, 0)", [PIPELINE_REPLACE] = "RGBA = ADD (SRC_COLOR, 0)",
[PIPELINE_ADD] = "RGBA = ADD (SRC_COLOR, DST_COLOR)", [PIPELINE_ADD] = "RGBA = ADD (SRC_COLOR, DST_COLOR)",
[PIPELINE_OVER_REVERSE] = "RGBA = ADD (SRC_COLOR * (1 - DST_COLOR[A]), DST_COLOR)", [PIPELINE_OVER_REVERSE] =
"RGBA = ADD (SRC_COLOR * (1 - DST_COLOR[A]), DST_COLOR)",
}; };
static CoglPipeline *templates[3]; static CoglPipeline *templates[3];
@ -675,7 +690,8 @@ ensure_wallpaper_texture (MetaBackground *self,
if (!cogl_framebuffer_allocate (fbo, &catch_error)) if (!cogl_framebuffer_allocate (fbo, &catch_error))
{ {
/* This probably means that the size of the wallpapered texture is larger /* This probably means that the size of the wallpapered texture is
* larger
* than the maximum texture size; we treat it as permanent until the * than the maximum texture size; we treat it as permanent until the
* background is changed again. * background is changed again.
*/ */
@ -694,7 +710,8 @@ ensure_wallpaper_texture (MetaBackground *self,
pipeline = create_pipeline (PIPELINE_REPLACE); pipeline = create_pipeline (PIPELINE_REPLACE);
cogl_pipeline_set_layer_texture (pipeline, 0, texture); cogl_pipeline_set_layer_texture (pipeline, 0, texture);
cogl_framebuffer_draw_textured_rectangle (fbo, pipeline, 0, 0, width, height, cogl_framebuffer_draw_textured_rectangle (fbo, pipeline, 0, 0, width,
height,
0., 0., 1., 1.); 0., 0., 1., 1.);
cogl_object_unref (pipeline); cogl_object_unref (pipeline);
@ -719,24 +736,24 @@ get_wrap_mode (GDesktopBackgroundStyle style)
{ {
switch (style) switch (style)
{ {
case G_DESKTOP_BACKGROUND_STYLE_WALLPAPER: case G_DESKTOP_BACKGROUND_STYLE_WALLPAPER:
return COGL_PIPELINE_WRAP_MODE_REPEAT; return COGL_PIPELINE_WRAP_MODE_REPEAT;
case G_DESKTOP_BACKGROUND_STYLE_NONE: case G_DESKTOP_BACKGROUND_STYLE_NONE:
case G_DESKTOP_BACKGROUND_STYLE_STRETCHED: case G_DESKTOP_BACKGROUND_STYLE_STRETCHED:
case G_DESKTOP_BACKGROUND_STYLE_CENTERED: case G_DESKTOP_BACKGROUND_STYLE_CENTERED:
case G_DESKTOP_BACKGROUND_STYLE_SCALED: case G_DESKTOP_BACKGROUND_STYLE_SCALED:
case G_DESKTOP_BACKGROUND_STYLE_ZOOM: case G_DESKTOP_BACKGROUND_STYLE_ZOOM:
case G_DESKTOP_BACKGROUND_STYLE_SPANNED: case G_DESKTOP_BACKGROUND_STYLE_SPANNED:
default: default:
return COGL_PIPELINE_WRAP_MODE_CLAMP_TO_EDGE; return COGL_PIPELINE_WRAP_MODE_CLAMP_TO_EDGE;
} }
} }
CoglTexture * CoglTexture *
meta_background_get_texture (MetaBackground *self, meta_background_get_texture (MetaBackground *self,
int monitor_index, int monitor_index,
cairo_rectangle_int_t *texture_area, cairo_rectangle_int_t *texture_area,
CoglPipelineWrapMode *wrap_mode) CoglPipelineWrapMode *wrap_mode)
{ {
MetaBackgroundPrivate *priv; MetaBackgroundPrivate *priv;
MetaBackgroundMonitor *monitor; MetaBackgroundMonitor *monitor;
@ -746,7 +763,8 @@ meta_background_get_texture (MetaBackground *self,
g_return_val_if_fail (META_IS_BACKGROUND (self), NULL); g_return_val_if_fail (META_IS_BACKGROUND (self), NULL);
priv = self->priv; priv = self->priv;
g_return_val_if_fail (monitor_index >= 0 && monitor_index < priv->n_monitors, NULL); g_return_val_if_fail (monitor_index >= 0 && monitor_index < priv->n_monitors,
NULL);
monitor = &priv->monitors[monitor_index]; monitor = &priv->monitors[monitor_index];
@ -756,8 +774,10 @@ meta_background_get_texture (MetaBackground *self,
monitor_area.width = geometry.width; monitor_area.width = geometry.width;
monitor_area.height = geometry.height; monitor_area.height = geometry.height;
texture1 = priv->background_image1 ? meta_background_image_get_texture (priv->background_image1) : NULL; texture1 = priv->background_image1 ? meta_background_image_get_texture (
texture2 = priv->background_image2 ? meta_background_image_get_texture (priv->background_image2) : NULL; priv->background_image1) : NULL;
texture2 = priv->background_image2 ? meta_background_image_get_texture (
priv->background_image2) : NULL;
if (texture1 == NULL && texture2 == NULL) if (texture1 == NULL && texture2 == NULL)
{ {
@ -790,7 +810,8 @@ meta_background_get_texture (MetaBackground *self,
{ {
CoglOffscreen *offscreen; CoglOffscreen *offscreen;
monitor->texture = meta_create_texture (monitor_area.width, monitor_area.height, monitor->texture = meta_create_texture (monitor_area.width,
monitor_area.height,
COGL_TEXTURE_COMPONENTS_RGBA, COGL_TEXTURE_COMPONENTS_RGBA,
META_TEXTURE_FLAGS_NONE); META_TEXTURE_FLAGS_NONE);
offscreen = cogl_offscreen_new_with_texture (monitor->texture); offscreen = cogl_offscreen_new_with_texture (monitor->texture);
@ -799,7 +820,8 @@ meta_background_get_texture (MetaBackground *self,
if (!cogl_framebuffer_allocate (monitor->fbo, &catch_error)) if (!cogl_framebuffer_allocate (monitor->fbo, &catch_error))
{ {
/* Texture or framebuffer allocation failed; it's unclear why this happened; /* Texture or framebuffer allocation failed; it's unclear why this
* happened;
* we'll try again the next time this is called. (MetaBackgroundActor * we'll try again the next time this is called. (MetaBackgroundActor
* caches the result, so user might be left without a background.) * caches the result, so user might be left without a background.)
*/ */
@ -813,15 +835,18 @@ meta_background_get_texture (MetaBackground *self,
} }
cogl_framebuffer_orthographic (monitor->fbo, 0, 0, cogl_framebuffer_orthographic (monitor->fbo, 0, 0,
monitor_area.width, monitor_area.height, -1., 1.); monitor_area.width, monitor_area.height,
-1., 1.);
if (texture2 != NULL && priv->blend_factor != 0.0) if (texture2 != NULL && priv->blend_factor != 0.0)
{ {
CoglPipeline *pipeline = create_pipeline (PIPELINE_REPLACE); CoglPipeline *pipeline = create_pipeline (PIPELINE_REPLACE);
cogl_pipeline_set_color4f (pipeline, cogl_pipeline_set_color4f (pipeline,
priv->blend_factor, priv->blend_factor, priv->blend_factor, priv->blend_factor); priv->blend_factor, priv->blend_factor,
priv->blend_factor, priv->blend_factor);
cogl_pipeline_set_layer_texture (pipeline, 0, texture2); cogl_pipeline_set_layer_texture (pipeline, 0, texture2);
cogl_pipeline_set_layer_wrap_mode (pipeline, 0, get_wrap_mode (priv->style)); cogl_pipeline_set_layer_wrap_mode (pipeline, 0,
get_wrap_mode (priv->style));
bare_region_visible = draw_texture (self, bare_region_visible = draw_texture (self,
monitor->fbo, pipeline, monitor->fbo, pipeline,
@ -843,13 +868,15 @@ meta_background_get_texture (MetaBackground *self,
(1 - priv->blend_factor), (1 - priv->blend_factor),
(1 - priv->blend_factor), (1 - priv->blend_factor),
(1 - priv->blend_factor), (1 - priv->blend_factor),
(1 - priv->blend_factor));; (1 - priv->blend_factor));
cogl_pipeline_set_layer_texture (pipeline, 0, texture1); cogl_pipeline_set_layer_texture (pipeline, 0, texture1);
cogl_pipeline_set_layer_wrap_mode (pipeline, 0, get_wrap_mode (priv->style)); cogl_pipeline_set_layer_wrap_mode (pipeline, 0,
get_wrap_mode (priv->style));
bare_region_visible = bare_region_visible || draw_texture (self, bare_region_visible = bare_region_visible || draw_texture (self,
monitor->fbo, pipeline, monitor->fbo, pipeline,
texture1, &monitor_area); texture1,
&monitor_area);
cogl_object_unref (pipeline); cogl_object_unref (pipeline);
} }
@ -863,7 +890,8 @@ meta_background_get_texture (MetaBackground *self,
cogl_framebuffer_draw_rectangle (monitor->fbo, cogl_framebuffer_draw_rectangle (monitor->fbo,
pipeline, pipeline,
0, 0, 0, 0,
monitor_area.width, monitor_area.height); monitor_area.width,
monitor_area.height);
cogl_object_unref (pipeline); cogl_object_unref (pipeline);
} }
@ -901,10 +929,10 @@ meta_background_set_color (MetaBackground *self,
} }
void void
meta_background_set_gradient (MetaBackground *self, meta_background_set_gradient (MetaBackground *self,
GDesktopBackgroundShading shading_direction, GDesktopBackgroundShading shading_direction,
ClutterColor *color, ClutterColor *color,
ClutterColor *second_color) ClutterColor *second_color)
{ {
MetaBackgroundPrivate *priv; MetaBackgroundPrivate *priv;
@ -924,9 +952,9 @@ meta_background_set_gradient (MetaBackground *self,
} }
void void
meta_background_set_file (MetaBackground *self, meta_background_set_file (MetaBackground *self,
GFile *file, GFile *file,
GDesktopBackgroundStyle style) GDesktopBackgroundStyle style)
{ {
g_return_if_fail (META_IS_BACKGROUND (self)); g_return_if_fail (META_IS_BACKGROUND (self));
@ -934,11 +962,11 @@ meta_background_set_file (MetaBackground *self,
} }
void void
meta_background_set_blend (MetaBackground *self, meta_background_set_blend (MetaBackground *self,
GFile *file1, GFile *file1,
GFile *file2, GFile *file2,
double blend_factor, double blend_factor,
GDesktopBackgroundStyle style) GDesktopBackgroundStyle style)
{ {
MetaBackgroundPrivate *priv; MetaBackgroundPrivate *priv;

View File

@ -108,10 +108,11 @@ meta_cullable_cull_out_children (MetaCullable *cullable,
clutter_actor_get_position (child, &x, &y); clutter_actor_get_position (child, &x, &y);
/* Temporarily move to the coordinate system of the actor */ /* Temporarily move to the coordinate system of the actor */
cairo_region_translate (unobscured_region, - x, - y); cairo_region_translate (unobscured_region, -x, -y);
cairo_region_translate (clip_region, - x, - y); cairo_region_translate (clip_region, -x, -y);
meta_cullable_cull_out (META_CULLABLE (child), unobscured_region, clip_region); meta_cullable_cull_out (META_CULLABLE (
child), unobscured_region, clip_region);
cairo_region_translate (unobscured_region, x, y); cairo_region_translate (unobscured_region, x, y);
cairo_region_translate (clip_region, x, y); cairo_region_translate (clip_region, x, y);
@ -183,7 +184,8 @@ meta_cullable_cull_out (MetaCullable *cullable,
cairo_region_t *unobscured_region, cairo_region_t *unobscured_region,
cairo_region_t *clip_region) cairo_region_t *clip_region)
{ {
META_CULLABLE_GET_IFACE (cullable)->cull_out (cullable, unobscured_region, clip_region); META_CULLABLE_GET_IFACE (cullable)->cull_out (cullable, unobscured_region,
clip_region);
} }
/** /**

View File

@ -33,7 +33,8 @@
#define DRAG_FAILED_DURATION 500 #define DRAG_FAILED_DURATION 500
enum { enum
{
PROP_DRAG_ORIGIN = 1, PROP_DRAG_ORIGIN = 1,
PROP_DRAG_START_X, PROP_DRAG_START_X,
PROP_DRAG_START_Y PROP_DRAG_START_Y
@ -48,7 +49,8 @@ struct _MetaDnDActorPrivate
int drag_start_y; int drag_start_y;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (MetaDnDActor, meta_dnd_actor, META_TYPE_FEEDBACK_ACTOR) G_DEFINE_TYPE_WITH_PRIVATE (MetaDnDActor, meta_dnd_actor,
META_TYPE_FEEDBACK_ACTOR)
static void static void
meta_dnd_actor_set_property (GObject *object, meta_dnd_actor_set_property (GObject *object,
@ -77,10 +79,10 @@ meta_dnd_actor_set_property (GObject *object,
} }
static void static void
meta_dnd_actor_get_property (GObject *object, meta_dnd_actor_get_property (GObject *object,
guint prop_id, guint prop_id,
GValue *value, GValue *value,
GParamSpec *pspec) GParamSpec *pspec)
{ {
MetaDnDActor *self = META_DND_ACTOR (object); MetaDnDActor *self = META_DND_ACTOR (object);
MetaDnDActorPrivate *priv = meta_dnd_actor_get_instance_private (self); MetaDnDActorPrivate *priv = meta_dnd_actor_get_instance_private (self);

View File

@ -49,7 +49,8 @@ struct _MetaDndPrivate
MetaCompositor *compositor; MetaCompositor *compositor;
MetaWaylandCompositor *wl_compositor; MetaWaylandCompositor *wl_compositor;
#else #else
/* to avoid warnings (g_type_class_add_private: assertion `private_size > 0' failed) */ /* to avoid warnings (g_type_class_add_private: assertion `private_size > 0'
* failed) */
gchar dummy; gchar dummy;
#endif #endif
}; };
@ -117,8 +118,8 @@ meta_dnd_notify_dnd_enter (MetaDnd *dnd)
static void static void
meta_dnd_notify_dnd_position_change (MetaDnd *dnd, meta_dnd_notify_dnd_position_change (MetaDnd *dnd,
int x, int x,
int y) int y)
{ {
g_signal_emit (dnd, signals[POSITION_CHANGE], 0, x, y); g_signal_emit (dnd, signals[POSITION_CHANGE], 0, x, y);
} }
@ -150,7 +151,8 @@ meta_dnd_handle_xdnd_event (MetaBackend *backend,
return FALSE; return FALSE;
if (xev->xany.window != output_window && if (xev->xany.window != output_window &&
xev->xany.window != clutter_x11_get_stage_window (CLUTTER_STAGE (compositor->stage))) xev->xany.window !=
clutter_x11_get_stage_window (CLUTTER_STAGE (compositor->stage)))
return FALSE; return FALSE;
if (xev->xclient.message_type == XInternAtom (xdisplay, "XdndPosition", TRUE)) if (xev->xclient.message_type == XInternAtom (xdisplay, "XdndPosition", TRUE))
@ -158,39 +160,43 @@ meta_dnd_handle_xdnd_event (MetaBackend *backend,
XEvent xevent; XEvent xevent;
Window src = xev->xclient.data.l[0]; Window src = xev->xclient.data.l[0];
memset (&xevent, 0, sizeof(xevent)); memset (&xevent, 0, sizeof (xevent));
xevent.xany.type = ClientMessage; xevent.xany.type = ClientMessage;
xevent.xany.display = xdisplay; xevent.xany.display = xdisplay;
xevent.xclient.window = src; xevent.xclient.window = src;
xevent.xclient.message_type = XInternAtom (xdisplay, "XdndStatus", TRUE); xevent.xclient.message_type = XInternAtom (xdisplay, "XdndStatus", TRUE);
xevent.xclient.format = 32; xevent.xclient.format = 32;
xevent.xclient.data.l[0] = output_window; xevent.xclient.data.l[0] = output_window;
/* flags: bit 0: will we accept the drop? bit 1: do we want more position messages */ /* flags: bit 0: will we accept the drop? bit 1: do we want more position
* messages */
xevent.xclient.data.l[1] = 2; xevent.xclient.data.l[1] = 2;
xevent.xclient.data.l[4] = None; xevent.xclient.data.l[4] = None;
XSendEvent (xdisplay, src, False, 0, &xevent); XSendEvent (xdisplay, src, False, 0, &xevent);
meta_dnd_notify_dnd_position_change (dnd, meta_dnd_notify_dnd_position_change (dnd,
(int)(xev->xclient.data.l[2] >> 16), (int) (xev->xclient.data.l[2] >> 16),
(int)(xev->xclient.data.l[2] & 0xFFFF)); (int) (xev->xclient.data.l[2] &
0xFFFF));
return TRUE; return TRUE;
} }
else if (xev->xclient.message_type == XInternAtom (xdisplay, "XdndLeave", TRUE)) else if (xev->xclient.message_type ==
XInternAtom (xdisplay, "XdndLeave", TRUE))
{ {
meta_dnd_notify_dnd_leave (dnd); meta_dnd_notify_dnd_leave (dnd);
return TRUE; return TRUE;
} }
else if (xev->xclient.message_type == XInternAtom (xdisplay, "XdndEnter", TRUE)) else if (xev->xclient.message_type ==
XInternAtom (xdisplay, "XdndEnter", TRUE))
{ {
meta_dnd_notify_dnd_enter (dnd); meta_dnd_notify_dnd_enter (dnd);
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
} }
#ifdef HAVE_WAYLAND #ifdef HAVE_WAYLAND
@ -206,9 +212,10 @@ meta_dnd_wayland_on_motion_event (ClutterActor *actor,
g_return_if_fail (event != NULL); g_return_if_fail (event != NULL);
clutter_event_get_coords (event, &event_x, &event_y); clutter_event_get_coords (event, &event_x, &event_y);
meta_dnd_notify_dnd_position_change (dnd, (int)event_x, (int)event_y); meta_dnd_notify_dnd_position_change (dnd, (int) event_x, (int) event_y);
current_grab = meta_wayland_data_device_get_current_grab (&priv->wl_compositor->seat->data_device); current_grab = meta_wayland_data_device_get_current_grab (
&priv->wl_compositor->seat->data_device);
if (current_grab) if (current_grab)
meta_wayland_drag_grab_update_feedback_actor (current_grab, event); meta_wayland_drag_grab_update_feedback_actor (current_grab, event);
} }
@ -253,24 +260,28 @@ meta_dnd_wayland_handle_begin_modal (MetaCompositor *compositor)
MetaDndPrivate *priv = meta_dnd_get_instance_private (dnd); MetaDndPrivate *priv = meta_dnd_get_instance_private (dnd);
if (priv->handler_id[0] == 0 && if (priv->handler_id[0] == 0 &&
meta_wayland_data_device_get_current_grab (&wl_compositor->seat->data_device) != NULL) meta_wayland_data_device_get_current_grab (&wl_compositor->seat->
data_device) != NULL)
{ {
priv->compositor = compositor; priv->compositor = compositor;
priv->wl_compositor = wl_compositor; priv->wl_compositor = wl_compositor;
priv->handler_id[0] = g_signal_connect (compositor->stage, priv->handler_id[0] = g_signal_connect (compositor->stage,
"motion-event", "motion-event",
G_CALLBACK (meta_dnd_wayland_on_motion_event), G_CALLBACK (
meta_dnd_wayland_on_motion_event),
dnd); dnd);
priv->handler_id[1] = g_signal_connect (compositor->stage, priv->handler_id[1] = g_signal_connect (compositor->stage,
"button-release-event", "button-release-event",
G_CALLBACK (meta_dnd_wayland_on_button_released), G_CALLBACK (
meta_dnd_wayland_on_button_released),
dnd); dnd);
priv->handler_id[2] = g_signal_connect (compositor->stage, priv->handler_id[2] = g_signal_connect (compositor->stage,
"key-press-event", "key-press-event",
G_CALLBACK (meta_dnd_wayland_on_key_pressed), G_CALLBACK (
meta_dnd_wayland_on_key_pressed),
dnd); dnd);
meta_dnd_notify_dnd_enter (dnd); meta_dnd_notify_dnd_enter (dnd);
@ -289,7 +300,8 @@ meta_dnd_wayland_handle_end_modal (MetaCompositor *compositor)
for (i = 0; i < G_N_ELEMENTS (priv->handler_id); i++) for (i = 0; i < G_N_ELEMENTS (priv->handler_id); i++)
{ {
g_signal_handler_disconnect (priv->compositor->stage, priv->handler_id[i]); g_signal_handler_disconnect (priv->compositor->stage,
priv->handler_id[i]);
priv->handler_id[i] = 0; priv->handler_id[i] = 0;
} }

View File

@ -30,7 +30,8 @@
#include "compositor/meta-feedback-actor-private.h" #include "compositor/meta-feedback-actor-private.h"
#include "core/display-private.h" #include "core/display-private.h"
enum { enum
{
PROP_ANCHOR_X = 1, PROP_ANCHOR_X = 1,
PROP_ANCHOR_Y PROP_ANCHOR_Y
}; };
@ -45,7 +46,8 @@ struct _MetaFeedbackActorPrivate
int pos_y; int pos_y;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (MetaFeedbackActor, meta_feedback_actor, CLUTTER_TYPE_ACTOR) G_DEFINE_TYPE_WITH_PRIVATE (MetaFeedbackActor, meta_feedback_actor,
CLUTTER_TYPE_ACTOR)
static void static void
meta_feedback_actor_constructed (GObject *object) meta_feedback_actor_constructed (GObject *object)
@ -60,7 +62,8 @@ meta_feedback_actor_constructed (GObject *object)
static void static void
meta_feedback_actor_update_position (MetaFeedbackActor *self) meta_feedback_actor_update_position (MetaFeedbackActor *self)
{ {
MetaFeedbackActorPrivate *priv = meta_feedback_actor_get_instance_private (self); MetaFeedbackActorPrivate *priv = meta_feedback_actor_get_instance_private (
self);
clutter_actor_set_position (CLUTTER_ACTOR (self), clutter_actor_set_position (CLUTTER_ACTOR (self),
priv->pos_x - priv->anchor_x, priv->pos_x - priv->anchor_x,
@ -74,7 +77,8 @@ meta_feedback_actor_set_property (GObject *object,
GParamSpec *pspec) GParamSpec *pspec)
{ {
MetaFeedbackActor *self = META_FEEDBACK_ACTOR (object); MetaFeedbackActor *self = META_FEEDBACK_ACTOR (object);
MetaFeedbackActorPrivate *priv = meta_feedback_actor_get_instance_private (self); MetaFeedbackActorPrivate *priv = meta_feedback_actor_get_instance_private (
self);
switch (prop_id) switch (prop_id)
{ {
@ -93,13 +97,14 @@ meta_feedback_actor_set_property (GObject *object,
} }
static void static void
meta_feedback_actor_get_property (GObject *object, meta_feedback_actor_get_property (GObject *object,
guint prop_id, guint prop_id,
GValue *value, GValue *value,
GParamSpec *pspec) GParamSpec *pspec)
{ {
MetaFeedbackActor *self = META_FEEDBACK_ACTOR (object); MetaFeedbackActor *self = META_FEEDBACK_ACTOR (object);
MetaFeedbackActorPrivate *priv = meta_feedback_actor_get_instance_private (self); MetaFeedbackActorPrivate *priv = meta_feedback_actor_get_instance_private (
self);
switch (prop_id) switch (prop_id)
{ {
@ -220,9 +225,9 @@ meta_feedback_actor_get_anchor (MetaFeedbackActor *self,
} }
void void
meta_feedback_actor_set_position (MetaFeedbackActor *self, meta_feedback_actor_set_position (MetaFeedbackActor *self,
int x, int x,
int y) int y)
{ {
MetaFeedbackActorPrivate *priv; MetaFeedbackActorPrivate *priv;

View File

@ -36,22 +36,22 @@ enum
struct _MetaModulePrivate struct _MetaModulePrivate
{ {
GModule *lib; GModule *lib;
gchar *path; gchar *path;
GType plugin_type; GType plugin_type;
}; };
#define META_MODULE_GET_PRIVATE(obj) \ #define META_MODULE_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), META_TYPE_MODULE, MetaModulePrivate)) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), META_TYPE_MODULE, MetaModulePrivate))
G_DEFINE_TYPE_WITH_PRIVATE (MetaModule, meta_module, G_TYPE_TYPE_MODULE); G_DEFINE_TYPE_WITH_PRIVATE (MetaModule, meta_module, G_TYPE_TYPE_MODULE);
static gboolean static gboolean
meta_module_load (GTypeModule *gmodule) meta_module_load (GTypeModule *gmodule)
{ {
MetaModulePrivate *priv = META_MODULE (gmodule)->priv; MetaModulePrivate *priv = META_MODULE (gmodule)->priv;
MetaPluginVersion *info = NULL; MetaPluginVersion *info = NULL;
GType (*register_type) (GTypeModule *) = NULL; GType (*register_type) (GTypeModule *) = NULL;
if (priv->lib && priv->plugin_type) if (priv->lib && priv->plugin_type)
return TRUE; return TRUE;
@ -67,13 +67,13 @@ meta_module_load (GTypeModule *gmodule)
} }
if (g_module_symbol (priv->lib, "meta_plugin_version", if (g_module_symbol (priv->lib, "meta_plugin_version",
(gpointer *)(void *)&info) && (gpointer *) (void *) &info) &&
g_module_symbol (priv->lib, "meta_plugin_register_type", g_module_symbol (priv->lib, "meta_plugin_register_type",
(gpointer *)(void *)&register_type) && (gpointer *) (void *) &register_type) &&
info && register_type) info && register_type)
{ {
if (info->version_api != META_PLUGIN_API_VERSION) if (info->version_api != META_PLUGIN_API_VERSION)
g_warning ("Plugin API mismatch for [%s]", priv->path); g_warning ("Plugin API mismatch for [%s]", priv->path);
else else
{ {
GType plugin_type; GType plugin_type;
@ -86,7 +86,7 @@ meta_module_load (GTypeModule *gmodule)
} }
else else
{ {
priv->plugin_type = plugin_type; priv->plugin_type = plugin_type;
} }
return TRUE; return TRUE;
@ -168,25 +168,25 @@ meta_module_get_property (GObject *object,
static void static void
meta_module_class_init (MetaModuleClass *klass) meta_module_class_init (MetaModuleClass *klass)
{ {
GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GTypeModuleClass *gmodule_class = G_TYPE_MODULE_CLASS (klass); GTypeModuleClass *gmodule_class = G_TYPE_MODULE_CLASS (klass);
gobject_class->finalize = meta_module_finalize; gobject_class->finalize = meta_module_finalize;
gobject_class->dispose = meta_module_dispose; gobject_class->dispose = meta_module_dispose;
gobject_class->set_property = meta_module_set_property; gobject_class->set_property = meta_module_set_property;
gobject_class->get_property = meta_module_get_property; gobject_class->get_property = meta_module_get_property;
gmodule_class->load = meta_module_load; gmodule_class->load = meta_module_load;
gmodule_class->unload = meta_module_unload; gmodule_class->unload = meta_module_unload;
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
PROP_PATH, PROP_PATH,
g_param_spec_string ("path", g_param_spec_string ("path",
"Path", "Path",
"Load path", "Load path",
NULL, NULL,
G_PARAM_READWRITE | G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY)); G_PARAM_CONSTRUCT_ONLY));
} }
static void static void
@ -202,4 +202,3 @@ meta_module_get_plugin_type (MetaModule *module)
return priv->plugin_type; return priv->plugin_type;
} }

View File

@ -57,11 +57,11 @@ meta_plugin_manager_set_plugin_type (GType gtype)
* Loads the given plugin. * Loads the given plugin.
*/ */
void void
meta_plugin_manager_load (const gchar *plugin_name) meta_plugin_manager_load (const gchar *plugin_name)
{ {
const gchar *dpath = MUTTER_PLUGIN_DIR "/"; const gchar *dpath = MUTTER_PLUGIN_DIR "/";
gchar *path; gchar *path;
MetaModule *module; MetaModule *module;
if (g_path_is_absolute (plugin_name)) if (g_path_is_absolute (plugin_name))
path = g_strdup (plugin_name); path = g_strdup (plugin_name);
@ -76,7 +76,7 @@ meta_plugin_manager_load (const gchar *plugin_name)
* our untimely exit. * our untimely exit.
*/ */
g_printerr ("Unable to load plugin module [%s]: %s", g_printerr ("Unable to load plugin module [%s]: %s",
path, g_module_error()); path, g_module_error ());
exit (1); exit (1);
} }
@ -123,8 +123,8 @@ static void
meta_plugin_manager_kill_window_effects (MetaPluginManager *plugin_mgr, meta_plugin_manager_kill_window_effects (MetaPluginManager *plugin_mgr,
MetaWindowActor *actor) MetaWindowActor *actor)
{ {
MetaPlugin *plugin = plugin_mgr->plugin; MetaPlugin *plugin = plugin_mgr->plugin;
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin); MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
if (klass->kill_window_effects) if (klass->kill_window_effects)
klass->kill_window_effects (plugin, actor); klass->kill_window_effects (plugin, actor);
@ -133,8 +133,8 @@ meta_plugin_manager_kill_window_effects (MetaPluginManager *plugin_mgr,
static void static void
meta_plugin_manager_kill_switch_workspace (MetaPluginManager *plugin_mgr) meta_plugin_manager_kill_switch_workspace (MetaPluginManager *plugin_mgr)
{ {
MetaPlugin *plugin = plugin_mgr->plugin; MetaPlugin *plugin = plugin_mgr->plugin;
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin); MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
if (klass->kill_switch_workspace) if (klass->kill_switch_workspace)
klass->kill_switch_workspace (plugin); klass->kill_switch_workspace (plugin);
@ -234,7 +234,8 @@ meta_plugin_manager_event_size_change (MetaPluginManager *plugin_mgr,
return FALSE; return FALSE;
meta_plugin_manager_kill_window_effects (plugin_mgr, actor); meta_plugin_manager_kill_window_effects (plugin_mgr, actor);
klass->size_change (plugin, actor, which_change, old_frame_rect, old_buffer_rect); klass->size_change (plugin, actor, which_change, old_frame_rect,
old_buffer_rect);
return TRUE; return TRUE;
} }
@ -247,10 +248,10 @@ meta_plugin_manager_event_size_change (MetaPluginManager *plugin_mgr,
* appropriate post-effect cleanup is carried out. * appropriate post-effect cleanup is carried out.
*/ */
gboolean gboolean
meta_plugin_manager_switch_workspace (MetaPluginManager *plugin_mgr, meta_plugin_manager_switch_workspace (MetaPluginManager *plugin_mgr,
gint from, gint from,
gint to, gint to,
MetaMotionDirection direction) MetaMotionDirection direction)
{ {
MetaPlugin *plugin = plugin_mgr->plugin; MetaPlugin *plugin = plugin_mgr->plugin;
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin); MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
@ -346,11 +347,11 @@ meta_plugin_manager_hide_tile_preview (MetaPluginManager *plugin_mgr)
} }
void void
meta_plugin_manager_show_window_menu (MetaPluginManager *plugin_mgr, meta_plugin_manager_show_window_menu (MetaPluginManager *plugin_mgr,
MetaWindow *window, MetaWindow *window,
MetaWindowMenuType menu, MetaWindowMenuType menu,
int x, int x,
int y) int y)
{ {
MetaPlugin *plugin = plugin_mgr->plugin; MetaPlugin *plugin = plugin_mgr->plugin;
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin); MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
@ -364,10 +365,10 @@ meta_plugin_manager_show_window_menu (MetaPluginManager *plugin_mgr,
} }
void void
meta_plugin_manager_show_window_menu_for_rect (MetaPluginManager *plugin_mgr, meta_plugin_manager_show_window_menu_for_rect (MetaPluginManager *plugin_mgr,
MetaWindow *window, MetaWindow *window,
MetaWindowMenuType menu, MetaWindowMenuType menu,
MetaRectangle *rect) MetaRectangle *rect)
{ {
MetaPlugin *plugin = plugin_mgr->plugin; MetaPlugin *plugin = plugin_mgr->plugin;
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin); MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
@ -394,8 +395,9 @@ meta_plugin_manager_create_close_dialog (MetaPluginManager *plugin_mgr,
} }
MetaInhibitShortcutsDialog * MetaInhibitShortcutsDialog *
meta_plugin_manager_create_inhibit_shortcuts_dialog (MetaPluginManager *plugin_mgr, meta_plugin_manager_create_inhibit_shortcuts_dialog (
MetaWindow *window) MetaPluginManager *plugin_mgr,
MetaWindow *window)
{ {
MetaPlugin *plugin = plugin_mgr->plugin; MetaPlugin *plugin = plugin_mgr->plugin;
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin); MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);

View File

@ -51,7 +51,7 @@ struct _MetaPluginPrivate
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (MetaPlugin, meta_plugin, G_TYPE_OBJECT); G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (MetaPlugin, meta_plugin, G_TYPE_OBJECT);
#define META_PLUGIN_GET_PRIVATE(obj) \ #define META_PLUGIN_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), META_TYPE_PLUGIN, MetaPluginPrivate)) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), META_TYPE_PLUGIN, MetaPluginPrivate))
static void static void
meta_plugin_class_init (MetaPluginClass *klass) meta_plugin_class_init (MetaPluginClass *klass)
@ -67,7 +67,7 @@ meta_plugin_init (MetaPlugin *self)
const MetaPluginInfo * const MetaPluginInfo *
meta_plugin_get_info (MetaPlugin *plugin) meta_plugin_get_info (MetaPlugin *plugin)
{ {
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin); MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
if (klass && klass->plugin_info) if (klass && klass->plugin_info)
return klass->plugin_info (plugin); return klass->plugin_info (plugin);
@ -150,7 +150,8 @@ meta_plugin_destroy_completed (MetaPlugin *plugin,
* passive X grabs in Meta can trigger but not be handled by the normal * passive X grabs in Meta can trigger but not be handled by the normal
* keybinding handling code.) However, the plugin can establish the keyboard * keybinding handling code.) However, the plugin can establish the keyboard
* and/or mouse grabs ahead of time and pass in the * and/or mouse grabs ahead of time and pass in the
* %META_MODAL_POINTER_ALREADY_GRABBED and/or %META_MODAL_KEYBOARD_ALREADY_GRABBED * %META_MODAL_POINTER_ALREADY_GRABBED and/or
*%META_MODAL_KEYBOARD_ALREADY_GRABBED
* options. This facility is provided for two reasons: first to allow using * options. This facility is provided for two reasons: first to allow using
* this function to establish modality after a passive grab, and second to * this function to establish modality after a passive grab, and second to
* allow using obscure features of XGrabPointer() and XGrabKeyboard() without * allow using obscure features of XGrabPointer() and XGrabKeyboard() without
@ -160,9 +161,9 @@ meta_plugin_destroy_completed (MetaPlugin *plugin,
* mouse and made the plugin modal. * mouse and made the plugin modal.
*/ */
gboolean gboolean
meta_plugin_begin_modal (MetaPlugin *plugin, meta_plugin_begin_modal (MetaPlugin *plugin,
MetaModalOptions options, MetaModalOptions options,
guint32 timestamp) guint32 timestamp)
{ {
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv; MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;

View File

@ -19,7 +19,8 @@
/** /**
* SECTION:meta-shadow-factory * SECTION:meta-shadow-factory
* @title: MetaShadowFactory * @title: MetaShadowFactory
* @short_description: Create and cache shadow textures for abritrary window shapes * @short_description: Create and cache shadow textures for abritrary window
*shapes
*/ */
#include "config.h" #include "config.h"
@ -52,7 +53,7 @@
* - We approximate the 1D gaussian blur as 3 successive box filters. * - We approximate the 1D gaussian blur as 3 successive box filters.
*/ */
typedef struct _MetaShadowCacheKey MetaShadowCacheKey; typedef struct _MetaShadowCacheKey MetaShadowCacheKey;
typedef struct _MetaShadowClassInfo MetaShadowClassInfo; typedef struct _MetaShadowClassInfo MetaShadowClassInfo;
struct _MetaShadowCacheKey struct _MetaShadowCacheKey
@ -122,18 +123,19 @@ static guint signals[LAST_SIGNAL] = { 0 };
/* The first element in this array also defines the default parameters /* The first element in this array also defines the default parameters
* for newly created classes */ * for newly created classes */
MetaShadowClassInfo default_shadow_classes[] = { MetaShadowClassInfo default_shadow_classes[] =
{ "normal", { 10, -1, 0, 3, 128 }, { 8, -1, 0, 2, 64 } }, {
{ "dialog", { 10, -1, 0, 3, 128 }, { 8, -1, 0, 2, 64 } }, { "normal", { 10, -1, 0, 3, 128 }, { 8, -1, 0, 2, 64 } },
{ "dialog", { 10, -1, 0, 3, 128 }, { 8, -1, 0, 2, 64 } },
{ "modal_dialog", { 10, -1, 0, 3, 128 }, { 8, -1, 0, 2, 64 } }, { "modal_dialog", { 10, -1, 0, 3, 128 }, { 8, -1, 0, 2, 64 } },
{ "utility", { 10, -1, 0, 3, 128 }, { 8, -1, 0, 2, 64 } }, { "utility", { 10, -1, 0, 3, 128 }, { 8, -1, 0, 2, 64 } },
{ "border", { 10, -1, 0, 3, 128 }, { 8, -1, 0, 2, 64 } }, { "border", { 10, -1, 0, 3, 128 }, { 8, -1, 0, 2, 64 } },
{ "menu", { 10, -1, 0, 3, 128 }, { 8, -1, 0, 2, 64 } }, { "menu", { 10, -1, 0, 3, 128 }, { 8, -1, 0, 2, 64 } },
{ "popup-menu", { 1, -1, 0, 0, 128 }, { 1, -1, 0, 0, 128 } }, { "popup-menu", { 1, -1, 0, 0, 128 }, { 1, -1, 0, 0, 128 } },
{ "dropdown-menu", { 1, -1, 0, 0, 128 }, { 1, -1, 0, 0, 128 } }, { "dropdown-menu", { 1, -1, 0, 0, 128 }, { 1, -1, 0, 0, 128 } },
{ "attached", { 0, -1, 0, 0, 0 }, { 0, -1, 0, 0, 0 } } { "attached", { 0, -1, 0, 0, 0 }, { 0, -1, 0, 0, 0 } }
}; };
G_DEFINE_TYPE (MetaShadowFactory, meta_shadow_factory, G_TYPE_OBJECT); G_DEFINE_TYPE (MetaShadowFactory, meta_shadow_factory, G_TYPE_OBJECT);
@ -143,7 +145,8 @@ meta_shadow_cache_key_hash (gconstpointer val)
{ {
const MetaShadowCacheKey *key = val; const MetaShadowCacheKey *key = val;
return 59 * key->radius + 67 * key->top_fade + 73 * meta_window_shape_hash (key->shape); return 59 * key->radius + 67 * key->top_fade + 73 * meta_window_shape_hash (
key->shape);
} }
static gboolean static gboolean
@ -153,7 +156,8 @@ meta_shadow_cache_key_equal (gconstpointer a,
const MetaShadowCacheKey *key_a = a; const MetaShadowCacheKey *key_a = a;
const MetaShadowCacheKey *key_b = b; const MetaShadowCacheKey *key_b = b;
return (key_a->radius == key_b->radius && key_a->top_fade == key_b->top_fade && return (key_a->radius == key_b->radius &&
key_a->top_fade == key_b->top_fade &&
meta_window_shape_equal (key_a->shape, key_b->shape)); meta_window_shape_equal (key_a->shape, key_b->shape));
} }
@ -231,8 +235,12 @@ meta_shadow_paint (MetaShadow *shadow,
n_x = 3; n_x = 3;
src_x[0] = 0.0; src_x[0] = 0.0;
src_x[1] = (shadow->inner_border_left + shadow->outer_border_left) / texture_width; src_x[1] = (shadow->inner_border_left + shadow->outer_border_left) /
src_x[2] = (texture_width - (shadow->inner_border_right + shadow->outer_border_right)) / texture_width; texture_width;
src_x[2] =
(texture_width -
(shadow->inner_border_right + shadow->outer_border_right)) /
texture_width;
src_x[3] = 1.0; src_x[3] = 1.0;
dest_x[0] = window_x - shadow->outer_border_left; dest_x[0] = window_x - shadow->outer_border_left;
@ -256,8 +264,12 @@ meta_shadow_paint (MetaShadow *shadow,
n_y = 3; n_y = 3;
src_y[0] = 0.0; src_y[0] = 0.0;
src_y[1] = (shadow->inner_border_top + shadow->outer_border_top) / texture_height; src_y[1] = (shadow->inner_border_top + shadow->outer_border_top) /
src_y[2] = (texture_height - (shadow->inner_border_bottom + shadow->outer_border_bottom)) / texture_height; texture_height;
src_y[2] =
(texture_height -
(shadow->inner_border_bottom + shadow->outer_border_bottom)) /
texture_height;
src_y[3] = 1.0; src_y[3] = 1.0;
dest_y[0] = window_y - shadow->outer_border_top; dest_y[0] = window_y - shadow->outer_border_top;
@ -330,22 +342,35 @@ meta_shadow_paint (MetaShadow *shadow,
cairo_region_get_rectangle (intersection, k, &rect); cairo_region_get_rectangle (intersection, k, &rect);
/* Separately linear interpolate X and Y coordinates in the source /* Separately linear interpolate X and Y coordinates in the
* source
* based on the destination X and Y coordinates */ * based on the destination X and Y coordinates */
src_x1 = (src_x[i] * (dest_rect.x + dest_rect.width - rect.x) + src_x1 =
src_x[i + 1] * (rect.x - dest_rect.x)) / dest_rect.width; (src_x[i] * (dest_rect.x + dest_rect.width - rect.x) +
src_x2 = (src_x[i] * (dest_rect.x + dest_rect.width - (rect.x + rect.width)) + src_x[i + 1] * (rect.x - dest_rect.x)) /
src_x[i + 1] * (rect.x + rect.width - dest_rect.x)) / dest_rect.width; dest_rect.width;
src_x2 =
(src_x[i] *
(dest_rect.x + dest_rect.width - (rect.x + rect.width)) +
src_x[i + 1] *
(rect.x + rect.width - dest_rect.x)) / dest_rect.width;
src_y1 = (src_y[j] * (dest_rect.y + dest_rect.height - rect.y) + src_y1 =
src_y[j + 1] * (rect.y - dest_rect.y)) / dest_rect.height; (src_y[j] * (dest_rect.y + dest_rect.height - rect.y) +
src_y2 = (src_y[j] * (dest_rect.y + dest_rect.height - (rect.y + rect.height)) + src_y[j + 1] * (rect.y - dest_rect.y)) /
src_y[j + 1] * (rect.y + rect.height - dest_rect.y)) / dest_rect.height; dest_rect.height;
src_y2 =
(src_y[j] *
(dest_rect.y + dest_rect.height - (rect.y + rect.height)) +
src_y[j + 1] *
(rect.y + rect.height - dest_rect.y)) / dest_rect.height;
cogl_rectangle_with_texture_coords (rect.x, rect.y, cogl_rectangle_with_texture_coords (rect.x, rect.y,
rect.x + rect.width, rect.y + rect.height, rect.x + rect.width,
src_x1, src_y1, src_x2, src_y2); rect.y + rect.height,
src_x1, src_y1, src_x2,
src_y2);
} }
cairo_region_destroy (intersection); cairo_region_destroy (intersection);
@ -375,14 +400,16 @@ meta_shadow_get_bounds (MetaShadow *shadow,
{ {
bounds->x = window_x - shadow->outer_border_left; bounds->x = window_x - shadow->outer_border_left;
bounds->y = window_y - shadow->outer_border_top; bounds->y = window_y - shadow->outer_border_top;
bounds->width = window_width + shadow->outer_border_left + shadow->outer_border_right; bounds->width = window_width + shadow->outer_border_left +
bounds->height = window_height + shadow->outer_border_top + shadow->outer_border_bottom; shadow->outer_border_right;
bounds->height = window_height + shadow->outer_border_top +
shadow->outer_border_bottom;
} }
static void static void
meta_shadow_class_info_free (MetaShadowClassInfo *class_info) meta_shadow_class_info_free (MetaShadowClassInfo *class_info)
{ {
g_free ((char *)class_info->name); g_free ((char *) class_info->name);
g_slice_free (MetaShadowClassInfo, class_info); g_slice_free (MetaShadowClassInfo, class_info);
} }
@ -397,7 +424,7 @@ meta_shadow_factory_init (MetaShadowFactory *factory)
factory->shadow_classes = g_hash_table_new_full (g_str_hash, factory->shadow_classes = g_hash_table_new_full (g_str_hash,
g_str_equal, g_str_equal,
NULL, NULL,
(GDestroyNotify)meta_shadow_class_info_free); (GDestroyNotify) meta_shadow_class_info_free);
for (i = 0; i < G_N_ELEMENTS (default_shadow_classes); i++) for (i = 0; i < G_N_ELEMENTS (default_shadow_classes); i++)
{ {
@ -407,7 +434,7 @@ meta_shadow_factory_init (MetaShadowFactory *factory)
class_info->name = g_strdup (class_info->name); class_info->name = g_strdup (class_info->name);
g_hash_table_insert (factory->shadow_classes, g_hash_table_insert (factory->shadow_classes,
(char *)class_info->name, class_info); (char *) class_info->name, class_info);
} }
} }
@ -487,7 +514,7 @@ meta_shadow_factory_get_default (void)
static int static int
get_box_filter_size (int radius) get_box_filter_size (int radius)
{ {
return (int)(0.5 + radius * (0.75 * sqrt(2*M_PI))); return (int) (0.5 + radius * (0.75 * sqrt (2 * M_PI)));
} }
/* The "spread" of the filter is the number of pixels from an original /* The "spread" of the filter is the number of pixels from an original
@ -566,13 +593,13 @@ blur_xspan (guchar *row,
} }
static void static void
blur_rows (cairo_region_t *convolve_region, blur_rows (cairo_region_t *convolve_region,
int x_offset, int x_offset,
int y_offset, int y_offset,
guchar *buffer, guchar *buffer,
int buffer_width, int buffer_width,
int buffer_height, int buffer_height,
int d) int d)
{ {
int i, j; int i, j;
int n_rectangles; int n_rectangles;
@ -650,8 +677,8 @@ flip_buffer (guchar *buffer,
for (j0 = 0; j0 < height; j0 += BLOCK_SIZE) for (j0 = 0; j0 < height; j0 += BLOCK_SIZE)
for (i0 = 0; i0 <= j0; i0 += BLOCK_SIZE) for (i0 = 0; i0 <= j0; i0 += BLOCK_SIZE)
{ {
int max_j = MIN(j0 + BLOCK_SIZE, height); int max_j = MIN (j0 + BLOCK_SIZE, height);
int max_i = MIN(i0 + BLOCK_SIZE, width); int max_i = MIN (i0 + BLOCK_SIZE, width);
int i, j; int i, j;
if (i0 == j0) if (i0 == j0)
@ -686,8 +713,8 @@ flip_buffer (guchar *buffer,
for (i0 = 0; i0 < width; i0 += BLOCK_SIZE) for (i0 = 0; i0 < width; i0 += BLOCK_SIZE)
for (j0 = 0; j0 < height; j0 += BLOCK_SIZE) for (j0 = 0; j0 < height; j0 += BLOCK_SIZE)
{ {
int max_j = MIN(j0 + BLOCK_SIZE, height); int max_j = MIN (j0 + BLOCK_SIZE, height);
int max_i = MIN(i0 + BLOCK_SIZE, width); int max_i = MIN (i0 + BLOCK_SIZE, width);
int i, j; int i, j;
for (i = i0; i < max_i; i++) for (i = i0; i < max_i; i++)
@ -790,22 +817,45 @@ make_shadow (MetaShadow *shadow,
/* Step 6: fade out the top, if applicable */ /* Step 6: fade out the top, if applicable */
if (shadow->key.top_fade >= 0) if (shadow->key.top_fade >= 0)
{ {
for (j = y_offset; j < y_offset + MIN (shadow->key.top_fade, extents.height + shadow->outer_border_bottom); j++) for (j = y_offset;
fade_bytes(buffer + j * buffer_width, buffer_width, j - y_offset, shadow->key.top_fade); j <
y_offset +
MIN (shadow->key.top_fade,
extents.height + shadow->outer_border_bottom);
j++)
fade_bytes (buffer + j * buffer_width, buffer_width, j - y_offset,
shadow->key.top_fade);
} }
/* We offset the passed in pixels to crop off the extra area we allocated at the top /* We offset the passed in pixels to crop off the extra area we allocated at
* in the case of top_fade >= 0. We also account for padding at the left for symmetry * the top
* in the case of top_fade >= 0. We also account for padding at the left for
*symmetry
* though that doesn't currently occur. * though that doesn't currently occur.
*/ */
shadow->texture = COGL_TEXTURE (cogl_texture_2d_new_from_data (ctx, shadow->texture = COGL_TEXTURE (cogl_texture_2d_new_from_data (ctx,
shadow->outer_border_left + extents.width + shadow->outer_border_right, shadow->
shadow->outer_border_top + extents.height + shadow->outer_border_bottom, outer_border_left
+ extents.width
+ shadow->
outer_border_right,
shadow->
outer_border_top
+ extents.
height +
shadow->
outer_border_bottom,
COGL_PIXEL_FORMAT_A_8, COGL_PIXEL_FORMAT_A_8,
buffer_width, buffer_width,
(buffer + (buffer +
(y_offset - shadow->outer_border_top) * buffer_width + (y_offset -
(x_offset - shadow->outer_border_left)), shadow->
outer_border_top)
* buffer_width
+
(x_offset -
shadow->
outer_border_left)),
&error)); &error));
if (error) if (error)
@ -827,8 +877,9 @@ get_shadow_params (MetaShadowFactory *factory,
gboolean focused, gboolean focused,
gboolean create) gboolean create)
{ {
MetaShadowClassInfo *class_info = g_hash_table_lookup (factory->shadow_classes, MetaShadowClassInfo *class_info = g_hash_table_lookup (
class_name); factory->shadow_classes,
class_name);
if (class_info == NULL) if (class_info == NULL)
{ {
if (create) if (create)
@ -838,7 +889,7 @@ get_shadow_params (MetaShadowFactory *factory,
class_info->name = g_strdup (class_info->name); class_info->name = g_strdup (class_info->name);
g_hash_table_insert (factory->shadow_classes, g_hash_table_insert (factory->shadow_classes,
(char *)class_info->name, class_info); (char *) class_info->name, class_info);
} }
else else
{ {
@ -883,9 +934,12 @@ meta_shadow_factory_get_shadow (MetaShadowFactory *factory,
MetaShadow *shadow; MetaShadow *shadow;
cairo_region_t *region; cairo_region_t *region;
int spread; int spread;
int shape_border_top, shape_border_right, shape_border_bottom, shape_border_left; int shape_border_top, shape_border_right, shape_border_bottom,
int inner_border_top, inner_border_right, inner_border_bottom, inner_border_left; shape_border_left;
int outer_border_top, outer_border_right, outer_border_bottom, outer_border_left; int inner_border_top, inner_border_right, inner_border_bottom,
inner_border_left;
int outer_border_top, outer_border_right, outer_border_bottom,
outer_border_left;
gboolean scale_width, scale_height; gboolean scale_width, scale_height;
gboolean cacheable; gboolean cacheable;
int center_width, center_height; int center_width, center_height;
@ -969,13 +1023,15 @@ meta_shadow_factory_get_shadow (MetaShadowFactory *factory,
shadow->scale_width = scale_width; shadow->scale_width = scale_width;
if (scale_width) if (scale_width)
center_width = inner_border_left + inner_border_right - (shape_border_left + shape_border_right); center_width = inner_border_left + inner_border_right -
(shape_border_left + shape_border_right);
else else
center_width = width - (shape_border_left + shape_border_right); center_width = width - (shape_border_left + shape_border_right);
shadow->scale_height = scale_height; shadow->scale_height = scale_height;
if (scale_height) if (scale_height)
center_height = inner_border_top + inner_border_bottom - (shape_border_top + shape_border_bottom); center_height = inner_border_top + inner_border_bottom -
(shape_border_top + shape_border_bottom);
else else
center_height = height - (shape_border_top + shape_border_bottom); center_height = height - (shape_border_top + shape_border_bottom);
@ -1034,7 +1090,8 @@ meta_shadow_factory_set_params (MetaShadowFactory *factory,
* @factory: a #MetaShadowFactory * @factory: a #MetaShadowFactory
* @class_name: name of the class of shadow to get the params for * @class_name: name of the class of shadow to get the params for
* @focused: whether the shadow is for a focused window * @focused: whether the shadow is for a focused window
* @params: (out caller-allocates): location to store the current parameter values * @params: (out caller-allocates): location to store the current parameter
*values
* *
* Gets the shadow parameters for a particular class of shadows * Gets the shadow parameters for a particular class of shadows
* for either the focused or unfocused state. If the class name * for either the focused or unfocused state. If the class name

View File

@ -52,9 +52,9 @@
*/ */
#define MIN_FAST_UPDATES_BEFORE_UNMIPMAP 20 #define MIN_FAST_UPDATES_BEFORE_UNMIPMAP 20
static void meta_shaped_texture_dispose (GObject *object); static void meta_shaped_texture_dispose (GObject *object);
static void meta_shaped_texture_paint (ClutterActor *actor); static void meta_shaped_texture_paint (ClutterActor *actor);
static void meta_shaped_texture_get_preferred_width (ClutterActor *self, static void meta_shaped_texture_get_preferred_width (ClutterActor *self,
gfloat for_height, gfloat for_height,
@ -66,7 +66,8 @@ static void meta_shaped_texture_get_preferred_height (ClutterActor *self,
gfloat *min_height_p, gfloat *min_height_p,
gfloat *natural_height_p); gfloat *natural_height_p);
static gboolean meta_shaped_texture_get_paint_volume (ClutterActor *self, ClutterPaintVolume *volume); static gboolean meta_shaped_texture_get_paint_volume (ClutterActor *self,
ClutterPaintVolume *volume);
static void cullable_iface_init (MetaCullableInterface *iface); static void cullable_iface_init (MetaCullableInterface *iface);
@ -74,7 +75,8 @@ static void cullable_iface_init (MetaCullableInterface *iface);
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), META_TYPE_SHAPED_TEXTURE, \ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), META_TYPE_SHAPED_TEXTURE, \
MetaShapedTexturePrivate)) MetaShapedTexturePrivate))
enum { enum
{
SIZE_CHANGED, SIZE_CHANGED,
LAST_SIGNAL, LAST_SIGNAL,
@ -114,9 +116,11 @@ struct _MetaShapedTexturePrivate
guint create_mipmaps : 1; guint create_mipmaps : 1;
}; };
G_DEFINE_TYPE_WITH_CODE (MetaShapedTexture, meta_shaped_texture, CLUTTER_TYPE_ACTOR, G_DEFINE_TYPE_WITH_CODE (MetaShapedTexture, meta_shaped_texture,
CLUTTER_TYPE_ACTOR,
G_ADD_PRIVATE (MetaShapedTexture) G_ADD_PRIVATE (MetaShapedTexture)
G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE, cullable_iface_init)); G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE,
cullable_iface_init));
static void static void
meta_shaped_texture_class_init (MetaShapedTextureClass *klass) meta_shaped_texture_class_init (MetaShapedTextureClass *klass)
@ -488,7 +492,9 @@ meta_shaped_texture_paint (ClutterActor *actor)
if (tex_width == 0 || tex_height == 0) /* no contents yet */ if (tex_width == 0 || tex_height == 0) /* no contents yet */
return; return;
tex_rect = (cairo_rectangle_int_t) { 0, 0, tex_width, tex_height }; tex_rect = (cairo_rectangle_int_t) {
0, 0, tex_width, tex_height
};
/* Use nearest-pixel interpolation if the texture is unscaled. This /* Use nearest-pixel interpolation if the texture is unscaled. This
* improves performance, especially with software rendering. * improves performance, especially with software rendering.
@ -621,7 +627,8 @@ meta_shaped_texture_paint (ClutterActor *actor)
else else
{ {
blended_pipeline = get_masked_pipeline (stex, ctx); blended_pipeline = get_masked_pipeline (stex, ctx);
cogl_pipeline_set_layer_texture (blended_pipeline, 1, priv->mask_texture); cogl_pipeline_set_layer_texture (blended_pipeline, 1,
priv->mask_texture);
cogl_pipeline_set_layer_filters (blended_pipeline, 1, filter, filter); cogl_pipeline_set_layer_filters (blended_pipeline, 1, filter, filter);
} }
@ -724,7 +731,7 @@ effective_unobscured_region (MetaShapedTexture *self)
} }
static gboolean static gboolean
meta_shaped_texture_get_paint_volume (ClutterActor *actor, meta_shaped_texture_get_paint_volume (ClutterActor *actor,
ClutterPaintVolume *volume) ClutterPaintVolume *volume)
{ {
return clutter_paint_volume_set_from_allocation (volume, actor); return clutter_paint_volume_set_from_allocation (volume, actor);
@ -732,7 +739,7 @@ meta_shaped_texture_get_paint_volume (ClutterActor *actor,
void void
meta_shaped_texture_set_create_mipmaps (MetaShapedTexture *stex, meta_shaped_texture_set_create_mipmaps (MetaShapedTexture *stex,
gboolean create_mipmaps) gboolean create_mipmaps)
{ {
MetaShapedTexturePrivate *priv; MetaShapedTexturePrivate *priv;
@ -798,10 +805,10 @@ meta_shaped_texture_is_obscured (MetaShapedTexture *self)
*/ */
gboolean gboolean
meta_shaped_texture_update_area (MetaShapedTexture *stex, meta_shaped_texture_update_area (MetaShapedTexture *stex,
int x, int x,
int y, int y,
int width, int width,
int height) int height)
{ {
MetaShapedTexturePrivate *priv; MetaShapedTexturePrivate *priv;
cairo_region_t *unobscured_region; cairo_region_t *unobscured_region;
@ -843,7 +850,8 @@ meta_shaped_texture_update_area (MetaShapedTexture *stex,
{ {
cairo_rectangle_int_t damage_rect; cairo_rectangle_int_t damage_rect;
cairo_region_get_extents (intersection, &damage_rect); cairo_region_get_extents (intersection, &damage_rect);
clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stex), &damage_rect); clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (
stex), &damage_rect);
cairo_region_destroy (intersection); cairo_region_destroy (intersection);
return TRUE; return TRUE;
} }
@ -1032,8 +1040,10 @@ meta_shaped_texture_get_image (MetaShapedTexture *stex,
clip->height); clip->height);
mask_surface = cairo_image_surface_create (CAIRO_FORMAT_A8, mask_surface = cairo_image_surface_create (CAIRO_FORMAT_A8,
cogl_texture_get_width (mask_texture), cogl_texture_get_width (
cogl_texture_get_height (mask_texture)); mask_texture),
cogl_texture_get_height (
mask_texture));
cogl_texture_get_data (mask_texture, COGL_PIXEL_FORMAT_A_8, cogl_texture_get_data (mask_texture, COGL_PIXEL_FORMAT_A_8,
cairo_image_surface_get_stride (mask_surface), cairo_image_surface_get_stride (mask_surface),

View File

@ -91,9 +91,10 @@ meta_surface_actor_wayland_is_unredirected (MetaSurfaceActor *actor)
void void
meta_surface_actor_wayland_add_frame_callbacks (MetaSurfaceActorWayland *self, meta_surface_actor_wayland_add_frame_callbacks (MetaSurfaceActorWayland *self,
struct wl_list *frame_callbacks) struct wl_list *frame_callbacks)
{ {
MetaSurfaceActorWaylandPrivate *priv = meta_surface_actor_wayland_get_instance_private (self); MetaSurfaceActorWaylandPrivate *priv =
meta_surface_actor_wayland_get_instance_private (self);
wl_list_insert_list (&priv->frame_callback_list, frame_callbacks); wl_list_insert_list (&priv->frame_callback_list, frame_callbacks);
} }
@ -128,7 +129,7 @@ meta_surface_actor_wayland_get_preferred_width (ClutterActor *actor,
natural_width_p); natural_width_p);
if (min_width_p) if (min_width_p)
*min_width_p *= scale; *min_width_p *= scale;
if (natural_width_p) if (natural_width_p)
*natural_width_p *= scale; *natural_width_p *= scale;
@ -152,7 +153,7 @@ meta_surface_actor_wayland_get_preferred_height (ClutterActor *actor,
natural_height_p); natural_height_p);
if (min_height_p) if (min_height_p)
*min_height_p *= scale; *min_height_p *= scale;
if (natural_height_p) if (natural_height_p)
*natural_height_p *= scale; *natural_height_p *= scale;
@ -169,7 +170,8 @@ meta_surface_actor_wayland_paint (ClutterActor *actor)
{ {
MetaWaylandCompositor *compositor = priv->surface->compositor; MetaWaylandCompositor *compositor = priv->surface->compositor;
wl_list_insert_list (&compositor->frame_callbacks, &priv->frame_callback_list); wl_list_insert_list (&compositor->frame_callbacks,
&priv->frame_callback_list);
wl_list_init (&priv->frame_callback_list); wl_list_init (&priv->frame_callback_list);
} }
@ -195,7 +197,7 @@ meta_surface_actor_wayland_dispose (GObject *object)
} }
wl_list_for_each_safe (cb, next, &priv->frame_callback_list, link) wl_list_for_each_safe (cb, next, &priv->frame_callback_list, link)
wl_resource_destroy (cb->resource); wl_resource_destroy (cb->resource);
G_OBJECT_CLASS (meta_surface_actor_wayland_parent_class)->dispose (object); G_OBJECT_CLASS (meta_surface_actor_wayland_parent_class)->dispose (object);
} }
@ -207,17 +209,23 @@ meta_surface_actor_wayland_class_init (MetaSurfaceActorWaylandClass *klass)
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass); ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
GObjectClass *object_class = G_OBJECT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass);
actor_class->get_preferred_width = meta_surface_actor_wayland_get_preferred_width; actor_class->get_preferred_width =
actor_class->get_preferred_height = meta_surface_actor_wayland_get_preferred_height; meta_surface_actor_wayland_get_preferred_width;
actor_class->get_preferred_height =
meta_surface_actor_wayland_get_preferred_height;
actor_class->paint = meta_surface_actor_wayland_paint; actor_class->paint = meta_surface_actor_wayland_paint;
surface_actor_class->process_damage = meta_surface_actor_wayland_process_damage; surface_actor_class->process_damage =
meta_surface_actor_wayland_process_damage;
surface_actor_class->pre_paint = meta_surface_actor_wayland_pre_paint; surface_actor_class->pre_paint = meta_surface_actor_wayland_pre_paint;
surface_actor_class->is_visible = meta_surface_actor_wayland_is_visible; surface_actor_class->is_visible = meta_surface_actor_wayland_is_visible;
surface_actor_class->should_unredirect = meta_surface_actor_wayland_should_unredirect; surface_actor_class->should_unredirect =
surface_actor_class->set_unredirected = meta_surface_actor_wayland_set_unredirected; meta_surface_actor_wayland_should_unredirect;
surface_actor_class->is_unredirected = meta_surface_actor_wayland_is_unredirected; surface_actor_class->set_unredirected =
meta_surface_actor_wayland_set_unredirected;
surface_actor_class->is_unredirected =
meta_surface_actor_wayland_is_unredirected;
surface_actor_class->get_window = meta_surface_actor_wayland_get_window; surface_actor_class->get_window = meta_surface_actor_wayland_get_window;
@ -232,8 +240,10 @@ meta_surface_actor_wayland_init (MetaSurfaceActorWayland *self)
MetaSurfaceActor * MetaSurfaceActor *
meta_surface_actor_wayland_new (MetaWaylandSurface *surface) meta_surface_actor_wayland_new (MetaWaylandSurface *surface)
{ {
MetaSurfaceActorWayland *self = g_object_new (META_TYPE_SURFACE_ACTOR_WAYLAND, NULL); MetaSurfaceActorWayland *self = g_object_new (META_TYPE_SURFACE_ACTOR_WAYLAND,
MetaSurfaceActorWaylandPrivate *priv = meta_surface_actor_wayland_get_instance_private (self); NULL);
MetaSurfaceActorWaylandPrivate *priv =
meta_surface_actor_wayland_get_instance_private (self);
g_assert (meta_is_wayland_compositor ()); g_assert (meta_is_wayland_compositor ());
@ -248,6 +258,7 @@ meta_surface_actor_wayland_new (MetaWaylandSurface *surface)
MetaWaylandSurface * MetaWaylandSurface *
meta_surface_actor_wayland_get_surface (MetaSurfaceActorWayland *self) meta_surface_actor_wayland_get_surface (MetaSurfaceActorWayland *self)
{ {
MetaSurfaceActorWaylandPrivate *priv = meta_surface_actor_wayland_get_instance_private (self); MetaSurfaceActorWaylandPrivate *priv =
meta_surface_actor_wayland_get_instance_private (self);
return priv->surface; return priv->surface;
} }

View File

@ -62,12 +62,14 @@ struct _MetaSurfaceActorX11Private
}; };
typedef struct _MetaSurfaceActorX11Private MetaSurfaceActorX11Private; typedef struct _MetaSurfaceActorX11Private MetaSurfaceActorX11Private;
G_DEFINE_TYPE_WITH_PRIVATE (MetaSurfaceActorX11, meta_surface_actor_x11, META_TYPE_SURFACE_ACTOR) G_DEFINE_TYPE_WITH_PRIVATE (MetaSurfaceActorX11, meta_surface_actor_x11,
META_TYPE_SURFACE_ACTOR)
static void static void
free_damage (MetaSurfaceActorX11 *self) free_damage (MetaSurfaceActorX11 *self)
{ {
MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); MetaSurfaceActorX11Private *priv =
meta_surface_actor_x11_get_instance_private (self);
MetaDisplay *display = priv->display; MetaDisplay *display = priv->display;
Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display); Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
@ -83,16 +85,20 @@ free_damage (MetaSurfaceActorX11 *self)
static void static void
detach_pixmap (MetaSurfaceActorX11 *self) detach_pixmap (MetaSurfaceActorX11 *self)
{ {
MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); MetaSurfaceActorX11Private *priv =
meta_surface_actor_x11_get_instance_private (self);
MetaDisplay *display = priv->display; MetaDisplay *display = priv->display;
Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display); Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
MetaShapedTexture *stex = meta_surface_actor_get_texture (META_SURFACE_ACTOR (self)); MetaShapedTexture *stex =
meta_surface_actor_get_texture (META_SURFACE_ACTOR (self));
if (priv->pixmap == None) if (priv->pixmap == None)
return; return;
/* Get rid of all references to the pixmap before freeing it; it's unclear whether /* Get rid of all references to the pixmap before freeing it; it's unclear
* you are supposed to be able to free a GLXPixmap after freeing the underlying * whether
* you are supposed to be able to free a GLXPixmap after freeing the
*underlying
* pixmap, but it certainly doesn't work with current DRI/Mesa * pixmap, but it certainly doesn't work with current DRI/Mesa
*/ */
meta_shaped_texture_set_texture (stex, NULL); meta_shaped_texture_set_texture (stex, NULL);
@ -110,24 +116,30 @@ static void
set_pixmap (MetaSurfaceActorX11 *self, set_pixmap (MetaSurfaceActorX11 *self,
Pixmap pixmap) Pixmap pixmap)
{ {
MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); MetaSurfaceActorX11Private *priv =
meta_surface_actor_x11_get_instance_private (self);
CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ()); CoglContext *ctx = clutter_backend_get_cogl_context (
MetaShapedTexture *stex = meta_surface_actor_get_texture (META_SURFACE_ACTOR (self)); clutter_get_default_backend ());
MetaShapedTexture *stex =
meta_surface_actor_get_texture (META_SURFACE_ACTOR (self));
CoglError *error = NULL; CoglError *error = NULL;
CoglTexture *texture; CoglTexture *texture;
g_assert (priv->pixmap == None); g_assert (priv->pixmap == None);
priv->pixmap = pixmap; priv->pixmap = pixmap;
texture = COGL_TEXTURE (cogl_texture_pixmap_x11_new (ctx, priv->pixmap, FALSE, &error)); texture =
COGL_TEXTURE (cogl_texture_pixmap_x11_new (ctx, priv->pixmap, FALSE,
&error));
if (error != NULL) if (error != NULL)
{ {
g_warning ("Failed to allocate stex texture: %s", error->message); g_warning ("Failed to allocate stex texture: %s", error->message);
cogl_error_free (error); cogl_error_free (error);
} }
else if (G_UNLIKELY (!cogl_texture_pixmap_x11_is_using_tfp_extension (COGL_TEXTURE_PIXMAP_X11 (texture)))) else if (G_UNLIKELY (!cogl_texture_pixmap_x11_is_using_tfp_extension (
COGL_TEXTURE_PIXMAP_X11 (texture))))
g_warning ("NOTE: Not using GLX TFP!\n"); g_warning ("NOTE: Not using GLX TFP!\n");
priv->texture = texture; priv->texture = texture;
@ -137,7 +149,8 @@ set_pixmap (MetaSurfaceActorX11 *self,
static void static void
update_pixmap (MetaSurfaceActorX11 *self) update_pixmap (MetaSurfaceActorX11 *self)
{ {
MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); MetaSurfaceActorX11Private *priv =
meta_surface_actor_x11_get_instance_private (self);
MetaDisplay *display = priv->display; MetaDisplay *display = priv->display;
Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display); Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
@ -181,7 +194,8 @@ update_pixmap (MetaSurfaceActorX11 *self)
static gboolean static gboolean
is_visible (MetaSurfaceActorX11 *self) is_visible (MetaSurfaceActorX11 *self)
{ {
MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); MetaSurfaceActorX11Private *priv =
meta_surface_actor_x11_get_instance_private (self);
return (priv->pixmap != None) && !priv->unredirected; return (priv->pixmap != None) && !priv->unredirected;
} }
@ -190,11 +204,13 @@ meta_surface_actor_x11_process_damage (MetaSurfaceActor *actor,
int x, int y, int width, int height) int x, int y, int width, int height)
{ {
MetaSurfaceActorX11 *self = META_SURFACE_ACTOR_X11 (actor); MetaSurfaceActorX11 *self = META_SURFACE_ACTOR_X11 (actor);
MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); MetaSurfaceActorX11Private *priv =
meta_surface_actor_x11_get_instance_private (self);
priv->received_damage = TRUE; priv->received_damage = TRUE;
if (meta_window_is_fullscreen (priv->window) && !priv->unredirected && !priv->does_full_damage) if (meta_window_is_fullscreen (priv->window) && !priv->unredirected &&
!priv->does_full_damage)
{ {
MetaRectangle window_rect; MetaRectangle window_rect;
meta_window_get_frame_rect (priv->window, &window_rect); meta_window_get_frame_rect (priv->window, &window_rect);
@ -222,7 +238,8 @@ static void
meta_surface_actor_x11_pre_paint (MetaSurfaceActor *actor) meta_surface_actor_x11_pre_paint (MetaSurfaceActor *actor)
{ {
MetaSurfaceActorX11 *self = META_SURFACE_ACTOR_X11 (actor); MetaSurfaceActorX11 *self = META_SURFACE_ACTOR_X11 (actor);
MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); MetaSurfaceActorX11Private *priv =
meta_surface_actor_x11_get_instance_private (self);
MetaDisplay *display = priv->display; MetaDisplay *display = priv->display;
Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display); Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
@ -249,7 +266,8 @@ static gboolean
meta_surface_actor_x11_is_opaque (MetaSurfaceActor *actor) meta_surface_actor_x11_is_opaque (MetaSurfaceActor *actor)
{ {
MetaSurfaceActorX11 *self = META_SURFACE_ACTOR_X11 (actor); MetaSurfaceActorX11 *self = META_SURFACE_ACTOR_X11 (actor);
MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); MetaSurfaceActorX11Private *priv =
meta_surface_actor_x11_get_instance_private (self);
/* If we're not ARGB32, then we're opaque. */ /* If we're not ARGB32, then we're opaque. */
if (!meta_surface_actor_is_argb32 (actor)) if (!meta_surface_actor_is_argb32 (actor))
@ -266,7 +284,8 @@ meta_surface_actor_x11_is_opaque (MetaSurfaceActor *actor)
meta_window_get_client_area_rect (window, &client_area); meta_window_get_client_area_rect (window, &client_area);
/* Otherwise, check if our opaque region covers our entire surface. */ /* Otherwise, check if our opaque region covers our entire surface. */
if (cairo_region_contains_rectangle (opaque_region, &client_area) == CAIRO_REGION_OVERLAP_IN) if (cairo_region_contains_rectangle (opaque_region,
&client_area) == CAIRO_REGION_OVERLAP_IN)
return TRUE; return TRUE;
return FALSE; return FALSE;
@ -276,7 +295,8 @@ static gboolean
meta_surface_actor_x11_should_unredirect (MetaSurfaceActor *actor) meta_surface_actor_x11_should_unredirect (MetaSurfaceActor *actor)
{ {
MetaSurfaceActorX11 *self = META_SURFACE_ACTOR_X11 (actor); MetaSurfaceActorX11 *self = META_SURFACE_ACTOR_X11 (actor);
MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); MetaSurfaceActorX11Private *priv =
meta_surface_actor_x11_get_instance_private (self);
MetaWindow *window = priv->window; MetaWindow *window = priv->window;
@ -310,7 +330,8 @@ meta_surface_actor_x11_should_unredirect (MetaSurfaceActor *actor)
static void static void
sync_unredirected (MetaSurfaceActorX11 *self) sync_unredirected (MetaSurfaceActorX11 *self)
{ {
MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); MetaSurfaceActorX11Private *priv =
meta_surface_actor_x11_get_instance_private (self);
MetaDisplay *display = priv->display; MetaDisplay *display = priv->display;
Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display); Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
Window xwindow = meta_window_x11_get_toplevel_xwindow (priv->window); Window xwindow = meta_window_x11_get_toplevel_xwindow (priv->window);
@ -335,7 +356,8 @@ meta_surface_actor_x11_set_unredirected (MetaSurfaceActor *actor,
gboolean unredirected) gboolean unredirected)
{ {
MetaSurfaceActorX11 *self = META_SURFACE_ACTOR_X11 (actor); MetaSurfaceActorX11 *self = META_SURFACE_ACTOR_X11 (actor);
MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); MetaSurfaceActorX11Private *priv =
meta_surface_actor_x11_get_instance_private (self);
if (priv->unredirected == unredirected) if (priv->unredirected == unredirected)
return; return;
@ -348,7 +370,8 @@ static gboolean
meta_surface_actor_x11_is_unredirected (MetaSurfaceActor *actor) meta_surface_actor_x11_is_unredirected (MetaSurfaceActor *actor)
{ {
MetaSurfaceActorX11 *self = META_SURFACE_ACTOR_X11 (actor); MetaSurfaceActorX11 *self = META_SURFACE_ACTOR_X11 (actor);
MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); MetaSurfaceActorX11Private *priv =
meta_surface_actor_x11_get_instance_private (self);
return priv->unredirected; return priv->unredirected;
} }
@ -367,7 +390,8 @@ meta_surface_actor_x11_dispose (GObject *object)
static MetaWindow * static MetaWindow *
meta_surface_actor_x11_get_window (MetaSurfaceActor *actor) meta_surface_actor_x11_get_window (MetaSurfaceActor *actor)
{ {
MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (META_SURFACE_ACTOR_X11 (actor)); MetaSurfaceActorX11Private *priv =
meta_surface_actor_x11_get_instance_private (META_SURFACE_ACTOR_X11 (actor));
return priv->window; return priv->window;
} }
@ -384,8 +408,10 @@ meta_surface_actor_x11_class_init (MetaSurfaceActorX11Class *klass)
surface_actor_class->pre_paint = meta_surface_actor_x11_pre_paint; surface_actor_class->pre_paint = meta_surface_actor_x11_pre_paint;
surface_actor_class->is_visible = meta_surface_actor_x11_is_visible; surface_actor_class->is_visible = meta_surface_actor_x11_is_visible;
surface_actor_class->should_unredirect = meta_surface_actor_x11_should_unredirect; surface_actor_class->should_unredirect =
surface_actor_class->set_unredirected = meta_surface_actor_x11_set_unredirected; meta_surface_actor_x11_should_unredirect;
surface_actor_class->set_unredirected =
meta_surface_actor_x11_set_unredirected;
surface_actor_class->is_unredirected = meta_surface_actor_x11_is_unredirected; surface_actor_class->is_unredirected = meta_surface_actor_x11_is_unredirected;
surface_actor_class->get_window = meta_surface_actor_x11_get_window; surface_actor_class->get_window = meta_surface_actor_x11_get_window;
@ -394,7 +420,8 @@ meta_surface_actor_x11_class_init (MetaSurfaceActorX11Class *klass)
static void static void
meta_surface_actor_x11_init (MetaSurfaceActorX11 *self) meta_surface_actor_x11_init (MetaSurfaceActorX11 *self)
{ {
MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); MetaSurfaceActorX11Private *priv =
meta_surface_actor_x11_get_instance_private (self);
priv->last_width = -1; priv->last_width = -1;
priv->last_height = -1; priv->last_height = -1;
@ -403,8 +430,10 @@ meta_surface_actor_x11_init (MetaSurfaceActorX11 *self)
static void static void
create_damage (MetaSurfaceActorX11 *self) create_damage (MetaSurfaceActorX11 *self)
{ {
MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); MetaSurfaceActorX11Private *priv =
Display *xdisplay = meta_x11_display_get_xdisplay (priv->display->x11_display); meta_surface_actor_x11_get_instance_private (self);
Display *xdisplay =
meta_x11_display_get_xdisplay (priv->display->x11_display);
Window xwindow = meta_window_x11_get_toplevel_xwindow (priv->window); Window xwindow = meta_window_x11_get_toplevel_xwindow (priv->window);
priv->damage = XDamageCreate (xdisplay, xwindow, XDamageReportBoundingBox); priv->damage = XDamageCreate (xdisplay, xwindow, XDamageReportBoundingBox);
@ -425,8 +454,10 @@ window_decorated_notify (MetaWindow *window,
static void static void
reset_texture (MetaSurfaceActorX11 *self) reset_texture (MetaSurfaceActorX11 *self)
{ {
MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); MetaSurfaceActorX11Private *priv =
MetaShapedTexture *stex = meta_surface_actor_get_texture (META_SURFACE_ACTOR (self)); meta_surface_actor_x11_get_instance_private (self);
MetaShapedTexture *stex =
meta_surface_actor_get_texture (META_SURFACE_ACTOR (self));
if (!priv->texture) if (!priv->texture)
return; return;
@ -442,7 +473,8 @@ MetaSurfaceActor *
meta_surface_actor_x11_new (MetaWindow *window) meta_surface_actor_x11_new (MetaWindow *window)
{ {
MetaSurfaceActorX11 *self = g_object_new (META_TYPE_SURFACE_ACTOR_X11, NULL); MetaSurfaceActorX11 *self = g_object_new (META_TYPE_SURFACE_ACTOR_X11, NULL);
MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); MetaSurfaceActorX11Private *priv =
meta_surface_actor_x11_get_instance_private (self);
MetaDisplay *display = meta_window_get_display (window); MetaDisplay *display = meta_window_get_display (window);
g_assert (!meta_is_wayland_compositor ()); g_assert (!meta_is_wayland_compositor ());
@ -468,8 +500,10 @@ void
meta_surface_actor_x11_set_size (MetaSurfaceActorX11 *self, meta_surface_actor_x11_set_size (MetaSurfaceActorX11 *self,
int width, int height) int width, int height)
{ {
MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); MetaSurfaceActorX11Private *priv =
MetaShapedTexture *stex = meta_surface_actor_get_texture (META_SURFACE_ACTOR (self)); meta_surface_actor_x11_get_instance_private (self);
MetaShapedTexture *stex =
meta_surface_actor_get_texture (META_SURFACE_ACTOR (self));
if (priv->last_width == width && if (priv->last_width == width &&
priv->last_height == height) priv->last_height == height)

View File

@ -31,11 +31,14 @@ struct _MetaSurfaceActorPrivate
static void cullable_iface_init (MetaCullableInterface *iface); static void cullable_iface_init (MetaCullableInterface *iface);
G_DEFINE_ABSTRACT_TYPE_WITH_CODE (MetaSurfaceActor, meta_surface_actor, CLUTTER_TYPE_ACTOR, G_DEFINE_ABSTRACT_TYPE_WITH_CODE (MetaSurfaceActor, meta_surface_actor,
CLUTTER_TYPE_ACTOR,
G_ADD_PRIVATE (MetaSurfaceActor) G_ADD_PRIVATE (MetaSurfaceActor)
G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE, cullable_iface_init)); G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE,
cullable_iface_init));
enum { enum
{
REPAINT_SCHEDULED, REPAINT_SCHEDULED,
SIZE_CHANGED, SIZE_CHANGED,
@ -88,7 +91,8 @@ meta_surface_actor_pick (ClutterActor *actor,
ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ()); ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
fb = cogl_get_draw_framebuffer (); fb = cogl_get_draw_framebuffer ();
cogl_color_init_from_4ub (&cogl_color, color->red, color->green, color->blue, color->alpha); cogl_color_init_from_4ub (&cogl_color, color->red, color->green,
color->blue, color->alpha);
pipeline = cogl_pipeline_new (ctx); pipeline = cogl_pipeline_new (ctx);
cogl_pipeline_set_color (pipeline, &cogl_color); cogl_pipeline_set_color (pipeline, &cogl_color);
@ -277,7 +281,10 @@ meta_surface_actor_process_damage (MetaSurfaceActor *self,
* any drawing done to the window is always immediately reflected in the * any drawing done to the window is always immediately reflected in the
* texture regardless of damage event handling. * texture regardless of damage event handling.
*/ */
cairo_rectangle_int_t rect = { .x = x, .y = y, .width = width, .height = height }; cairo_rectangle_int_t rect =
{
.x = x, .y = y, .width = width, .height = height
};
if (!priv->pending_damage) if (!priv->pending_damage)
priv->pending_damage = cairo_region_create_rectangle (&rect); priv->pending_damage = cairo_region_create_rectangle (&rect);
@ -286,7 +293,8 @@ meta_surface_actor_process_damage (MetaSurfaceActor *self,
return; return;
} }
META_SURFACE_ACTOR_GET_CLASS (self)->process_damage (self, x, y, width, height); META_SURFACE_ACTOR_GET_CLASS (self)->process_damage (self, x, y, width,
height);
if (meta_surface_actor_is_visible (self)) if (meta_surface_actor_is_visible (self))
meta_surface_actor_update_area (self, x, y, width, height); meta_surface_actor_update_area (self, x, y, width, height);
@ -348,7 +356,8 @@ meta_surface_actor_set_frozen (MetaSurfaceActor *self,
int i, n_rects = cairo_region_num_rectangles (priv->pending_damage); int i, n_rects = cairo_region_num_rectangles (priv->pending_damage);
cairo_rectangle_int_t rect; cairo_rectangle_int_t rect;
/* Since we ignore damage events while a window is frozen for certain effects /* Since we ignore damage events while a window is frozen for certain
* effects
* we need to apply the tracked damage now. */ * we need to apply the tracked damage now. */
for (i = 0; i < n_rects; i++) for (i = 0; i < n_rects; i++)

View File

@ -104,23 +104,23 @@ static MetaSyncRing meta_sync_ring = { 0 };
static XSyncValue SYNC_VALUE_ZERO; static XSyncValue SYNC_VALUE_ZERO;
static XSyncValue SYNC_VALUE_ONE; static XSyncValue SYNC_VALUE_ONE;
static const char* (*meta_gl_get_string) (GLenum name); static const char * (*meta_gl_get_string) (GLenum name);
static void (*meta_gl_get_integerv) (GLenum pname, static void (*meta_gl_get_integerv) (GLenum pname,
GLint *params); GLint *params);
static const char* (*meta_gl_get_stringi) (GLenum name, static const char * (*meta_gl_get_stringi) (GLenum name,
GLuint index); GLuint index);
static void (*meta_gl_delete_sync) (GLsync sync); static void (*meta_gl_delete_sync) (GLsync sync);
static GLenum (*meta_gl_client_wait_sync) (GLsync sync, static GLenum (*meta_gl_client_wait_sync) (GLsync sync,
GLbitfield flags, GLbitfield flags,
GLuint64 timeout); GLuint64 timeout);
static void (*meta_gl_wait_sync) (GLsync sync, static void (*meta_gl_wait_sync) (GLsync sync,
GLbitfield flags, GLbitfield flags,
GLuint64 timeout); GLuint64 timeout);
static GLsync (*meta_gl_import_sync) (GLenum external_sync_type, static GLsync (*meta_gl_import_sync) (GLenum external_sync_type,
GLintptr external_sync, GLintptr external_sync,
GLbitfield flags); GLbitfield flags);
static GLsync (*meta_gl_fence_sync) (GLenum condition, static GLsync (*meta_gl_fence_sync) (GLenum condition,
GLbitfield flags); GLbitfield flags);
static MetaSyncRing * static MetaSyncRing *
meta_sync_ring_get (void) meta_sync_ring_get (void)
@ -132,13 +132,14 @@ meta_sync_ring_get (void)
} }
static gboolean static gboolean
load_gl_symbol (const char *name, load_gl_symbol (const char *name,
void **func) void **func)
{ {
*func = cogl_get_proc_address (name); *func = cogl_get_proc_address (name);
if (!*func) if (!*func)
{ {
meta_verbose ("MetaSyncRing: failed to resolve required GL symbol \"%s\"\n", name); meta_verbose (
"MetaSyncRing: failed to resolve required GL symbol \"%s\"\n", name);
return FALSE; return FALSE;
} }
return TRUE; return TRUE;
@ -160,32 +161,32 @@ check_gl_extensions (void)
switch (cogl_renderer_get_driver (cogl_renderer)) switch (cogl_renderer_get_driver (cogl_renderer))
{ {
case COGL_DRIVER_GL3: case COGL_DRIVER_GL3:
{ {
int num_extensions, i; int num_extensions, i;
gboolean arb_sync = FALSE; gboolean arb_sync = FALSE;
gboolean x11_sync_object = FALSE; gboolean x11_sync_object = FALSE;
meta_gl_get_integerv (GL_NUM_EXTENSIONS, &num_extensions); meta_gl_get_integerv (GL_NUM_EXTENSIONS, &num_extensions);
for (i = 0; i < num_extensions; ++i) for (i = 0; i < num_extensions; ++i)
{ {
const char *ext = meta_gl_get_stringi (GL_EXTENSIONS, i); const char *ext = meta_gl_get_stringi (GL_EXTENSIONS, i);
if (g_strcmp0 ("GL_ARB_sync", ext) == 0) if (g_strcmp0 ("GL_ARB_sync", ext) == 0)
arb_sync = TRUE; arb_sync = TRUE;
else if (g_strcmp0 ("GL_EXT_x11_sync_object", ext) == 0) else if (g_strcmp0 ("GL_EXT_x11_sync_object", ext) == 0)
x11_sync_object = TRUE; x11_sync_object = TRUE;
} }
return arb_sync && x11_sync_object; return arb_sync && x11_sync_object;
} }
case COGL_DRIVER_GL: case COGL_DRIVER_GL:
{ {
const char *extensions = meta_gl_get_string (GL_EXTENSIONS); const char *extensions = meta_gl_get_string (GL_EXTENSIONS);
return (extensions != NULL && return (extensions != NULL &&
strstr (extensions, "GL_ARB_sync") != NULL && strstr (extensions, "GL_ARB_sync") != NULL &&
strstr (extensions, "GL_EXT_x11_sync_object") != NULL); strstr (extensions, "GL_EXT_x11_sync_object") != NULL);
} }
default: default:
break; break;
} }
@ -231,7 +232,7 @@ load_required_symbols (void)
goto out; goto out;
success = TRUE; success = TRUE;
out: out:
return success; return success;
} }
@ -321,7 +322,8 @@ meta_sync_new (Display *xdisplay)
self->xdisplay = xdisplay; self->xdisplay = xdisplay;
self->xfence = XSyncCreateFence (xdisplay, DefaultRootWindow (xdisplay), FALSE); self->xfence =
XSyncCreateFence (xdisplay, DefaultRootWindow (xdisplay), FALSE);
self->gl_x11_sync = 0; self->gl_x11_sync = 0;
self->gpu_fence = 0; self->gpu_fence = 0;
@ -351,13 +353,14 @@ static void
meta_sync_import (MetaSync *self) meta_sync_import (MetaSync *self)
{ {
g_return_if_fail (self->gl_x11_sync == 0); g_return_if_fail (self->gl_x11_sync == 0);
self->gl_x11_sync = meta_gl_import_sync (GL_SYNC_X11_FENCE_EXT, self->xfence, 0); self->gl_x11_sync = meta_gl_import_sync (GL_SYNC_X11_FENCE_EXT, self->xfence,
0);
} }
static Bool static Bool
alarm_event_predicate (Display *dpy, alarm_event_predicate (Display *dpy,
XEvent *event, XEvent *event,
XPointer data) XPointer data)
{ {
MetaSyncRing *ring = meta_sync_ring_get (); MetaSyncRing *ring = meta_sync_ring_get ();
@ -366,7 +369,8 @@ alarm_event_predicate (Display *dpy,
if (event->type == ring->xsync_event_base + XSyncAlarmNotify) if (event->type == ring->xsync_event_base + XSyncAlarmNotify)
{ {
if (((MetaSync *) data)->xalarm == ((XSyncAlarmNotifyEvent *) event)->alarm) if (((MetaSync *) data)->xalarm ==
((XSyncAlarmNotifyEvent *) event)->alarm)
return True; return True;
} }
return False; return False;
@ -389,12 +393,12 @@ meta_sync_free (MetaSync *self)
/* nothing to do */ /* nothing to do */
break; break;
case META_SYNC_STATE_RESET_PENDING: case META_SYNC_STATE_RESET_PENDING:
{ {
XEvent event; XEvent event;
XIfEvent (self->xdisplay, &event, alarm_event_predicate, (XPointer) self); XIfEvent (self->xdisplay, &event, alarm_event_predicate, (XPointer) self);
meta_sync_handle_event (self, (XSyncAlarmNotifyEvent *) &event); meta_sync_handle_event (self, (XSyncAlarmNotifyEvent *) &event);
} }
/* fall through */ /* fall through */
case META_SYNC_STATE_READY: case META_SYNC_STATE_READY:
XSyncTriggerFence (self->xdisplay, self->xfence); XSyncTriggerFence (self->xdisplay, self->xfence);
XFlush (self->xdisplay); XFlush (self->xdisplay);
@ -427,7 +431,8 @@ meta_sync_ring_init (Display *xdisplay)
if (!load_required_symbols ()) if (!load_required_symbols ())
return FALSE; return FALSE;
if (!XSyncQueryExtension (xdisplay, &ring->xsync_event_base, &ring->xsync_error_base) || if (!XSyncQueryExtension (xdisplay, &ring->xsync_event_base,
&ring->xsync_error_base) ||
!XSyncInitialize (xdisplay, &major, &minor)) !XSyncInitialize (xdisplay, &major, &minor))
return FALSE; return FALSE;
@ -516,14 +521,17 @@ meta_sync_ring_after_frame (void)
if (ring->warmup_syncs >= NUM_SYNCS / 2) if (ring->warmup_syncs >= NUM_SYNCS / 2)
{ {
guint reset_sync_idx = (ring->current_sync_idx + NUM_SYNCS - (NUM_SYNCS / 2)) % NUM_SYNCS; guint reset_sync_idx =
(ring->current_sync_idx + NUM_SYNCS - (NUM_SYNCS / 2)) % NUM_SYNCS;
MetaSync *sync_to_reset = ring->syncs_array[reset_sync_idx]; MetaSync *sync_to_reset = ring->syncs_array[reset_sync_idx];
GLenum status = meta_sync_check_update_finished (sync_to_reset, 0); GLenum status = meta_sync_check_update_finished (sync_to_reset, 0);
if (status == GL_TIMEOUT_EXPIRED) if (status == GL_TIMEOUT_EXPIRED)
{ {
meta_warning ("MetaSyncRing: We should never wait for a sync -- add more syncs?\n"); meta_warning (
status = meta_sync_check_update_finished (sync_to_reset, MAX_SYNC_WAIT_TIME); "MetaSyncRing: We should never wait for a sync -- add more syncs?\n");
status = meta_sync_check_update_finished (sync_to_reset,
MAX_SYNC_WAIT_TIME);
} }
if (status != GL_ALREADY_SIGNALED && status != GL_CONDITION_SATISFIED) if (status != GL_ALREADY_SIGNALED && status != GL_CONDITION_SATISFIED)
@ -559,7 +567,8 @@ meta_sync_ring_insert_wait (void)
if (ring->current_sync->state != META_SYNC_STATE_READY) if (ring->current_sync->state != META_SYNC_STATE_READY)
{ {
meta_warning ("MetaSyncRing: Sync object is not ready -- were events handled properly?\n"); meta_warning (
"MetaSyncRing: Sync object is not ready -- were events handled properly?\n");
if (!meta_sync_ring_reboot (ring->xdisplay)) if (!meta_sync_ring_reboot (ring->xdisplay))
return FALSE; return FALSE;
} }

View File

@ -30,7 +30,7 @@ static void
texture_rectangle_check_cb (CoglTexture *sub_texture, texture_rectangle_check_cb (CoglTexture *sub_texture,
const float *sub_texture_coords, const float *sub_texture_coords,
const float *meta_coords, const float *meta_coords,
void *user_data) void *user_data)
{ {
gboolean *result = user_data; gboolean *result = user_data;

View File

@ -154,8 +154,10 @@ meta_texture_tower_set_base_texture (MetaTextureTower *tower,
width = cogl_texture_get_width (tower->textures[0]); width = cogl_texture_get_width (tower->textures[0]);
height = cogl_texture_get_height (tower->textures[0]); height = cogl_texture_get_height (tower->textures[0]);
tower->n_levels = 1 + MAX ((int)(M_LOG2E * log (width)), (int)(M_LOG2E * log (height))); tower->n_levels = 1 +
tower->n_levels = MIN(tower->n_levels, MAX_TEXTURE_LEVELS); MAX ((int) (M_LOG2E * log (width)),
(int) (M_LOG2E * log (height)));
tower->n_levels = MIN (tower->n_levels, MAX_TEXTURE_LEVELS);
meta_texture_tower_update_area (tower, 0, 0, width, height); meta_texture_tower_update_area (tower, 0, 0, width, height);
} }
@ -290,41 +292,42 @@ get_paint_level (int width, int height)
/* We'll simplify the equations below for a bit of micro-optimization. /* We'll simplify the equations below for a bit of micro-optimization.
* The commented out code is the unsimplified version. * The commented out code is the unsimplified version.
*
// Partial derivates of window coordinates: * // Partial derivates of window coordinates:
// * //
// x_w = 0.5 * viewport_width * x_c / w_c + viewport_center_x * // x_w = 0.5 * viewport_width * x_c / w_c + viewport_center_x
// y_w = 0.5 * viewport_height * y_c / w_c + viewport_center_y * // y_w = 0.5 * viewport_height * y_c / w_c + viewport_center_y
// * //
// with respect to u, v, using * // with respect to u, v, using
// d(a/b)/dx = da/dx * (1/b) - a * db/dx / (b^2) * // d(a/b)/dx = da/dx * (1/b) - a * db/dx / (b^2)
*
dxdu = 0.5 * viewport_width * (pm.xx - pm.wx * (xc/wc)) / wc; * dxdu = 0.5 * viewport_width * (pm.xx - pm.wx * (xc/wc)) / wc;
dxdv = 0.5 * viewport_width * (pm.xy - pm.wy * (xc/wc)) / wc; * dxdv = 0.5 * viewport_width * (pm.xy - pm.wy * (xc/wc)) / wc;
dydu = 0.5 * viewport_height * (pm.yx - pm.wx * (yc/wc)) / wc; * dydu = 0.5 * viewport_height * (pm.yx - pm.wx * (yc/wc)) / wc;
dydv = 0.5 * viewport_height * (pm.yy - pm.wy * (yc/wc)) / wc; * dydv = 0.5 * viewport_height * (pm.yy - pm.wy * (yc/wc)) / wc;
*
// Compute the inverse partials as the matrix inverse * // Compute the inverse partials as the matrix inverse
det = dxdu * dydv - dxdv * dydu; * det = dxdu * dydv - dxdv * dydu;
*
dudx = dydv / det; * dudx = dydv / det;
dudy = - dxdv / det; * dudy = - dxdv / det;
dvdx = - dydu / det; * dvdx = - dydu / det;
dvdy = dvdu / det; * dvdy = dvdu / det;
*
// Scale factor; maximum of the distance in texels for a change of 1 pixel * // Scale factor; maximum of the distance in texels for a change of 1 pixel
// in the X direction or 1 pixel in the Y direction * // in the X direction or 1 pixel in the Y direction
rho = MAX (sqrt (dudx * dudx + dvdx * dvdx), sqrt(dudy * dudy + dvdy * dvdy)); * rho = MAX (sqrt (dudx * dudx + dvdx * dvdx), sqrt(dudy * dudy + dvdy *
*dvdy));
// Level of detail *
lambda = log2 (rho) + LOD_BIAS; * // Level of detail
*/ * lambda = log2 (rho) + LOD_BIAS;
*/
/* dxdu * wc, etc */ /* dxdu * wc, etc */
dxdu_ = 0.5 * viewport_width * (pm.xx - pm.wx * (xc/wc)); dxdu_ = 0.5 * viewport_width * (pm.xx - pm.wx * (xc / wc));
dxdv_ = 0.5 * viewport_width * (pm.xy - pm.wy * (xc/wc)); dxdv_ = 0.5 * viewport_width * (pm.xy - pm.wy * (xc / wc));
dydu_ = 0.5 * viewport_height * (pm.yx - pm.wx * (yc/wc)); dydu_ = 0.5 * viewport_height * (pm.yx - pm.wx * (yc / wc));
dydv_ = 0.5 * viewport_height * (pm.yy - pm.wy * (yc/wc)); dydv_ = 0.5 * viewport_height * (pm.yy - pm.wy * (yc / wc));
/* det * wc^2 */ /* det * wc^2 */
det_ = dxdu_ * dydv_ - dxdv_ * dydu_; det_ = dxdu_ * dydv_ - dxdv_ * dydu_;
@ -337,13 +340,14 @@ get_paint_level (int width, int height)
lambda = 0.5 * M_LOG2E * log (rho_sq * wc * wc / det_sq) + LOD_BIAS; lambda = 0.5 * M_LOG2E * log (rho_sq * wc * wc / det_sq) + LOD_BIAS;
#if 0 #if 0
g_print ("%g %g %g\n", 0.5 * viewport_width * pm.xx / pm.ww, 0.5 * viewport_height * pm.yy / pm.ww, lambda); g_print ("%g %g %g\n", 0.5 * viewport_width * pm.xx / pm.ww,
0.5 * viewport_height * pm.yy / pm.ww, lambda);
#endif #endif
if (lambda <= 0.) if (lambda <= 0.)
return 0; return 0;
else else
return (int)(0.5 + lambda); return (int) (0.5 + lambda);
} }
static gboolean static gboolean
@ -365,7 +369,8 @@ texture_tower_create_texture (MetaTextureTower *tower,
CoglContext *context = clutter_backend_get_cogl_context (backend); CoglContext *context = clutter_backend_get_cogl_context (backend);
CoglTextureRectangle *texture_rectangle; CoglTextureRectangle *texture_rectangle;
texture_rectangle = cogl_texture_rectangle_new_with_size (context, width, height); texture_rectangle = cogl_texture_rectangle_new_with_size (context, width,
height);
tower->textures[level] = COGL_TEXTURE (texture_rectangle); tower->textures[level] = COGL_TEXTURE (texture_rectangle);
} }
else else
@ -407,14 +412,16 @@ texture_tower_revalidate (MetaTextureTower *tower,
return; return;
} }
cogl_framebuffer_orthographic (fb, 0, 0, dest_texture_width, dest_texture_height, -1., 1.); cogl_framebuffer_orthographic (fb, 0, 0, dest_texture_width,
dest_texture_height, -1., 1.);
if (!tower->pipeline_template) if (!tower->pipeline_template)
{ {
CoglContext *ctx = CoglContext *ctx =
clutter_backend_get_cogl_context (clutter_get_default_backend ()); clutter_backend_get_cogl_context (clutter_get_default_backend ());
tower->pipeline_template = cogl_pipeline_new (ctx); tower->pipeline_template = cogl_pipeline_new (ctx);
cogl_pipeline_set_blend (tower->pipeline_template, "RGBA = ADD (SRC_COLOR, 0)", NULL); cogl_pipeline_set_blend (tower->pipeline_template,
"RGBA = ADD (SRC_COLOR, 0)", NULL);
} }
pipeline = cogl_pipeline_copy (tower->pipeline_template); pipeline = cogl_pipeline_copy (tower->pipeline_template);
@ -426,7 +433,8 @@ texture_tower_revalidate (MetaTextureTower *tower,
(2. * invalid->x1) / source_texture_width, (2. * invalid->x1) / source_texture_width,
(2. * invalid->y1) / source_texture_height, (2. * invalid->y1) / source_texture_height,
(2. * invalid->x2) / source_texture_width, (2. * invalid->x2) / source_texture_width,
(2. * invalid->y2) / source_texture_height); (2. * invalid->y2) /
source_texture_height);
cogl_object_unref (pipeline); cogl_object_unref (pipeline);
@ -461,7 +469,7 @@ meta_texture_tower_get_paint_texture (MetaTextureTower *tower)
texture_width = cogl_texture_get_width (tower->textures[0]); texture_width = cogl_texture_get_width (tower->textures[0]);
texture_height = cogl_texture_get_height (tower->textures[0]); texture_height = cogl_texture_get_height (tower->textures[0]);
level = get_paint_level(texture_width, texture_height); level = get_paint_level (texture_width, texture_height);
if (level < 0) /* singular paint matrix, scaled to nothing */ if (level < 0) /* singular paint matrix, scaled to nothing */
return NULL; return NULL;
level = MIN (level, tower->n_levels - 1); level = MIN (level, tower->n_levels - 1);
@ -473,22 +481,24 @@ meta_texture_tower_get_paint_texture (MetaTextureTower *tower)
int i; int i;
for (i = 1; i <= level; i++) for (i = 1; i <= level; i++)
{ {
/* Use "floor" convention here to be consistent with the NPOT texture extension */ /* Use "floor" convention here to be consistent with the NPOT texture
texture_width = MAX (1, texture_width / 2); * extension */
texture_height = MAX (1, texture_height / 2); texture_width = MAX (1, texture_width / 2);
texture_height = MAX (1, texture_height / 2);
if (tower->textures[i] == NULL) if (tower->textures[i] == NULL)
texture_tower_create_texture (tower, i, texture_width, texture_height); texture_tower_create_texture (tower, i, texture_width,
} texture_height);
}
for (i = 1; i <= level; i++) for (i = 1; i <= level; i++)
{ {
if (tower->invalid[level].x2 != tower->invalid[level].x1 && if (tower->invalid[level].x2 != tower->invalid[level].x1 &&
tower->invalid[level].y2 != tower->invalid[level].y1) tower->invalid[level].y2 != tower->invalid[level].y1)
texture_tower_revalidate (tower, i); texture_tower_revalidate (tower, i);
} }
} }
return tower->textures[level]; return tower->textures[level];
} }

View File

@ -3,7 +3,8 @@
/** /**
* SECTION:meta-window-actor * SECTION:meta-window-actor
* @title: MetaWindowActor * @title: MetaWindowActor
* @short_description: An actor representing a top-level window in the scene graph * @short_description: An actor representing a top-level window in the scene
*graph
*/ */
#include "config.h" #include "config.h"
@ -40,7 +41,8 @@
#include "wayland/meta-wayland-surface.h" #include "wayland/meta-wayland-surface.h"
#endif #endif
typedef enum { typedef enum
{
INITIALLY_FROZEN, INITIALLY_FROZEN,
DRAWING_FIRST_FRAME, DRAWING_FIRST_FRAME,
EMITTED_FIRST_FRAME EMITTED_FIRST_FRAME
@ -64,68 +66,70 @@ struct _MetaWindowActorPrivate
* size-invariant window shape, we'll often find that the new shadow * size-invariant window shape, we'll often find that the new shadow
* is the same as the old shadow. * is the same as the old shadow.
*/ */
MetaShadow *focused_shadow; MetaShadow *focused_shadow;
MetaShadow *unfocused_shadow; MetaShadow *unfocused_shadow;
/* A region that matches the shape of the window, including frame bounds */ /* A region that matches the shape of the window, including frame bounds */
cairo_region_t *shape_region; cairo_region_t *shape_region;
/* The region we should clip to when painting the shadow */ /* The region we should clip to when painting the shadow */
cairo_region_t *shadow_clip; cairo_region_t *shadow_clip;
/* Extracted size-invariant shape used for shadows */ /* Extracted size-invariant shape used for shadows */
MetaWindowShape *shadow_shape; MetaWindowShape *shadow_shape;
char * shadow_class; char *shadow_class;
MetaShadowMode shadow_mode; MetaShadowMode shadow_mode;
guint send_frame_messages_timer; guint send_frame_messages_timer;
gint64 frame_drawn_time; gint64 frame_drawn_time;
guint repaint_scheduled_id; guint repaint_scheduled_id;
guint size_changed_id; guint size_changed_id;
/* /*
* These need to be counters rather than flags, since more plugins * These need to be counters rather than flags, since more plugins
* can implement same effect; the practicality of stacking effects * can implement same effect; the practicality of stacking effects
* might be dubious, but we have to at least handle it correctly. * might be dubious, but we have to at least handle it correctly.
*/ */
gint minimize_in_progress; gint minimize_in_progress;
gint unminimize_in_progress; gint unminimize_in_progress;
gint size_change_in_progress; gint size_change_in_progress;
gint map_in_progress; gint map_in_progress;
gint destroy_in_progress; gint destroy_in_progress;
/* List of FrameData for recent frames */ /* List of FrameData for recent frames */
GList *frames; GList *frames;
guint freeze_count; guint freeze_count;
guint visible : 1; guint visible : 1;
guint disposed : 1; guint disposed : 1;
/* If set, the client needs to be sent a _NET_WM_FRAME_DRAWN /* If set, the client needs to be sent a _NET_WM_FRAME_DRAWN
* client message for one or more messages in ->frames */ * client message for one or more messages in ->frames */
guint needs_frame_drawn : 1; guint needs_frame_drawn : 1;
guint repaint_scheduled : 1; guint repaint_scheduled : 1;
guint needs_reshape : 1; guint needs_reshape : 1;
guint recompute_focused_shadow : 1; guint recompute_focused_shadow : 1;
guint recompute_unfocused_shadow : 1; guint recompute_unfocused_shadow : 1;
guint needs_destroy : 1; guint needs_destroy : 1;
guint updates_frozen : 1; guint updates_frozen : 1;
guint first_frame_state : 2; /* FirstFrameState */ guint first_frame_state : 2; /* FirstFrameState */
}; };
typedef struct _FrameData FrameData; typedef struct _FrameData FrameData;
/* Each time the application updates the sync request counter to a new even value /* Each time the application updates the sync request counter to a new even
* value
* value, we queue a frame into the windows list of frames. Once we're painting * value, we queue a frame into the windows list of frames. Once we're painting
* an update "in response" to the window, we fill in frame_counter with the * an update "in response" to the window, we fill in frame_counter with the
* Cogl counter for that frame, and send _NET_WM_FRAME_DRAWN at the end of the * Cogl counter for that frame, and send _NET_WM_FRAME_DRAWN at the end of the
* frame. _NET_WM_FRAME_TIMINGS is sent when we get a frame_complete callback. * frame. _NET_WM_FRAME_TIMINGS is sent when we get a frame_complete callback.
* *
* As an exception, if a window is completely obscured, we try to throttle drawning * As an exception, if a window is completely obscured, we try to throttle
*drawning
* to a slower frame rate. In this case, frame_counter stays -1 until * to a slower frame rate. In this case, frame_counter stays -1 until
* send_frame_message_timeout() runs, at which point we send both the * send_frame_message_timeout() runs, at which point we send both the
* _NET_WM_FRAME_DRAWN and _NET_WM_FRAME_TIMINGS messages. * _NET_WM_FRAME_DRAWN and _NET_WM_FRAME_TIMINGS messages.
@ -154,17 +158,17 @@ enum
PROP_SHADOW_CLASS PROP_SHADOW_CLASS
}; };
static void meta_window_actor_dispose (GObject *object); static void meta_window_actor_dispose (GObject *object);
static void meta_window_actor_finalize (GObject *object); static void meta_window_actor_finalize (GObject *object);
static void meta_window_actor_constructed (GObject *object); static void meta_window_actor_constructed (GObject *object);
static void meta_window_actor_set_property (GObject *object, static void meta_window_actor_set_property (GObject *object,
guint prop_id, guint prop_id,
const GValue *value, const GValue *value,
GParamSpec *pspec); GParamSpec *pspec);
static void meta_window_actor_get_property (GObject *object, static void meta_window_actor_get_property (GObject *object,
guint prop_id, guint prop_id,
GValue *value, GValue *value,
GParamSpec *pspec); GParamSpec *pspec);
static void meta_window_actor_paint (ClutterActor *actor); static void meta_window_actor_paint (ClutterActor *actor);
@ -179,8 +183,8 @@ static void meta_window_actor_handle_updates (MetaWindowActor *self);
static void check_needs_reshape (MetaWindowActor *self); static void check_needs_reshape (MetaWindowActor *self);
static void do_send_frame_drawn (MetaWindowActor *self, FrameData *frame); static void do_send_frame_drawn (MetaWindowActor *self, FrameData *frame);
static void do_send_frame_timings (MetaWindowActor *self, static void do_send_frame_timings (MetaWindowActor *self,
FrameData *frame, FrameData *frame,
gint refresh_interval, gint refresh_interval,
gint64 presentation_time); gint64 presentation_time);
@ -188,7 +192,8 @@ static void cullable_iface_init (MetaCullableInterface *iface);
G_DEFINE_TYPE_WITH_CODE (MetaWindowActor, meta_window_actor, CLUTTER_TYPE_ACTOR, G_DEFINE_TYPE_WITH_CODE (MetaWindowActor, meta_window_actor, CLUTTER_TYPE_ACTOR,
G_ADD_PRIVATE (MetaWindowActor) G_ADD_PRIVATE (MetaWindowActor)
G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE, cullable_iface_init)); G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE,
cullable_iface_init));
static void static void
frame_data_free (FrameData *frame) frame_data_free (FrameData *frame)
@ -201,13 +206,13 @@ meta_window_actor_class_init (MetaWindowActorClass *klass)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass);
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass); ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
GParamSpec *pspec; GParamSpec *pspec;
object_class->dispose = meta_window_actor_dispose; object_class->dispose = meta_window_actor_dispose;
object_class->finalize = meta_window_actor_finalize; object_class->finalize = meta_window_actor_finalize;
object_class->set_property = meta_window_actor_set_property; object_class->set_property = meta_window_actor_set_property;
object_class->get_property = meta_window_actor_get_property; object_class->get_property = meta_window_actor_get_property;
object_class->constructed = meta_window_actor_constructed; object_class->constructed = meta_window_actor_constructed;
actor_class->paint = meta_window_actor_paint; actor_class->paint = meta_window_actor_paint;
actor_class->get_paint_volume = meta_window_actor_get_paint_volume; actor_class->get_paint_volume = meta_window_actor_get_paint_volume;
@ -290,8 +295,8 @@ meta_window_actor_init (MetaWindowActor *self)
MetaWindowActorPrivate *priv; MetaWindowActorPrivate *priv;
priv = self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, priv = self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
META_TYPE_WINDOW_ACTOR, META_TYPE_WINDOW_ACTOR,
MetaWindowActorPrivate); MetaWindowActorPrivate);
priv->shadow_class = NULL; priv->shadow_class = NULL;
} }
@ -328,9 +333,9 @@ is_argb32 (MetaWindowActor *self)
MetaWindowActorPrivate *priv = self->priv; MetaWindowActorPrivate *priv = self->priv;
/* assume we're argb until we get the window (because /* assume we're argb until we get the window (because
in practice we're drawing nothing, so we're fully * in practice we're drawing nothing, so we're fully
transparent) * transparent)
*/ */
if (priv->surface) if (priv->surface)
return meta_surface_actor_is_argb32 (priv->surface); return meta_surface_actor_is_argb32 (priv->surface);
else else
@ -362,7 +367,7 @@ meta_window_actor_freeze (MetaWindowActor *self)
if (priv->freeze_count == 0 && priv->surface) if (priv->freeze_count == 0 && priv->surface)
meta_surface_actor_set_frozen (priv->surface, TRUE); meta_surface_actor_set_frozen (priv->surface, TRUE);
priv->freeze_count ++; priv->freeze_count++;
} }
static void static void
@ -414,7 +419,8 @@ set_surface (MetaWindowActor *self,
g_signal_handler_disconnect (priv->surface, priv->repaint_scheduled_id); g_signal_handler_disconnect (priv->surface, priv->repaint_scheduled_id);
g_signal_handler_disconnect (priv->surface, priv->size_changed_id); g_signal_handler_disconnect (priv->surface, priv->size_changed_id);
priv->repaint_scheduled_id = 0; priv->repaint_scheduled_id = 0;
clutter_actor_remove_child (CLUTTER_ACTOR (self), CLUTTER_ACTOR (priv->surface)); clutter_actor_remove_child (CLUTTER_ACTOR (self),
CLUTTER_ACTOR (priv->surface));
g_object_unref (priv->surface); g_object_unref (priv->surface);
} }
@ -423,11 +429,16 @@ set_surface (MetaWindowActor *self,
if (priv->surface) if (priv->surface)
{ {
g_object_ref_sink (priv->surface); g_object_ref_sink (priv->surface);
priv->repaint_scheduled_id = g_signal_connect (priv->surface, "repaint-scheduled", priv->repaint_scheduled_id = g_signal_connect (priv->surface,
G_CALLBACK (surface_repaint_scheduled), self); "repaint-scheduled",
G_CALLBACK (
surface_repaint_scheduled),
self);
priv->size_changed_id = g_signal_connect (priv->surface, "size-changed", priv->size_changed_id = g_signal_connect (priv->surface, "size-changed",
G_CALLBACK (surface_size_changed), self); G_CALLBACK (
clutter_actor_add_child (CLUTTER_ACTOR (self), CLUTTER_ACTOR (priv->surface)); surface_size_changed), self);
clutter_actor_add_child (CLUTTER_ACTOR (self),
CLUTTER_ACTOR (priv->surface));
meta_window_actor_update_shape (self); meta_window_actor_update_shape (self);
@ -502,7 +513,8 @@ meta_window_actor_dispose (GObject *object)
g_clear_pointer (&priv->unfocused_shadow, meta_shadow_unref); g_clear_pointer (&priv->unfocused_shadow, meta_shadow_unref);
g_clear_pointer (&priv->shadow_shape, meta_window_shape_unref); g_clear_pointer (&priv->shadow_shape, meta_window_shape_unref);
compositor->windows = g_list_remove (compositor->windows, (gconstpointer) self); compositor->windows =
g_list_remove (compositor->windows, (gconstpointer) self);
g_clear_object (&priv->window); g_clear_object (&priv->window);
@ -514,7 +526,7 @@ meta_window_actor_dispose (GObject *object)
static void static void
meta_window_actor_finalize (GObject *object) meta_window_actor_finalize (GObject *object)
{ {
MetaWindowActor *self = META_WINDOW_ACTOR (object); MetaWindowActor *self = META_WINDOW_ACTOR (object);
MetaWindowActorPrivate *priv = self->priv; MetaWindowActorPrivate *priv = self->priv;
g_list_free_full (priv->frames, (GDestroyNotify) frame_data_free); g_list_free_full (priv->frames, (GDestroyNotify) frame_data_free);
@ -528,7 +540,7 @@ meta_window_actor_set_property (GObject *object,
const GValue *value, const GValue *value,
GParamSpec *pspec) GParamSpec *pspec)
{ {
MetaWindowActor *self = META_WINDOW_ACTOR (object); MetaWindowActor *self = META_WINDOW_ACTOR (object);
MetaWindowActorPrivate *priv = self->priv; MetaWindowActorPrivate *priv = self->priv;
switch (prop_id) switch (prop_id)
@ -536,33 +548,34 @@ meta_window_actor_set_property (GObject *object,
case PROP_META_WINDOW: case PROP_META_WINDOW:
priv->window = g_value_dup_object (value); priv->window = g_value_dup_object (value);
g_signal_connect_object (priv->window, "notify::appears-focused", g_signal_connect_object (priv->window, "notify::appears-focused",
G_CALLBACK (window_appears_focused_notify), self, 0); G_CALLBACK (
window_appears_focused_notify), self, 0);
break; break;
case PROP_SHADOW_MODE: case PROP_SHADOW_MODE:
{ {
MetaShadowMode newv = g_value_get_enum (value); MetaShadowMode newv = g_value_get_enum (value);
if (newv == priv->shadow_mode) if (newv == priv->shadow_mode)
return; return;
priv->shadow_mode = newv; priv->shadow_mode = newv;
meta_window_actor_invalidate_shadow (self); meta_window_actor_invalidate_shadow (self);
} }
break; break;
case PROP_SHADOW_CLASS: case PROP_SHADOW_CLASS:
{ {
const char *newv = g_value_get_string (value); const char *newv = g_value_get_string (value);
if (g_strcmp0 (newv, priv->shadow_class) == 0) if (g_strcmp0 (newv, priv->shadow_class) == 0)
return; return;
g_free (priv->shadow_class); g_free (priv->shadow_class);
priv->shadow_class = g_strdup (newv); priv->shadow_class = g_strdup (newv);
meta_window_actor_invalidate_shadow (self); meta_window_actor_invalidate_shadow (self);
} }
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@ -570,10 +583,10 @@ meta_window_actor_set_property (GObject *object,
} }
static void static void
meta_window_actor_get_property (GObject *object, meta_window_actor_get_property (GObject *object,
guint prop_id, guint prop_id,
GValue *value, GValue *value,
GParamSpec *pspec) GParamSpec *pspec)
{ {
MetaWindowActorPrivate *priv = META_WINDOW_ACTOR (object)->priv; MetaWindowActorPrivate *priv = META_WINDOW_ACTOR (object)->priv;
@ -613,10 +626,10 @@ meta_window_actor_get_shadow_class (MetaWindowActor *self)
case META_WINDOW_POPUP_MENU: case META_WINDOW_POPUP_MENU:
return "popup-menu"; return "popup-menu";
default: default:
{ {
MetaFrameType frame_type = meta_window_get_frame_type (priv->window); MetaFrameType frame_type = meta_window_get_frame_type (priv->window);
return meta_frame_type_to_string (frame_type); return meta_frame_type_to_string (frame_type);
} }
} }
} }
} }
@ -648,7 +661,8 @@ meta_window_actor_get_shadow_bounds (MetaWindowActor *self,
cairo_rectangle_int_t *bounds) cairo_rectangle_int_t *bounds)
{ {
MetaWindowActorPrivate *priv = self->priv; MetaWindowActorPrivate *priv = self->priv;
MetaShadow *shadow = appears_focused ? priv->focused_shadow : priv->unfocused_shadow; MetaShadow *shadow =
appears_focused ? priv->focused_shadow : priv->unfocused_shadow;
cairo_rectangle_int_t shape_bounds; cairo_rectangle_int_t shape_bounds;
MetaShadowParams params; MetaShadowParams params;
@ -712,12 +726,13 @@ meta_window_actor_paint (ClutterActor *actor)
MetaWindowActor *self = META_WINDOW_ACTOR (actor); MetaWindowActor *self = META_WINDOW_ACTOR (actor);
MetaWindowActorPrivate *priv = self->priv; MetaWindowActorPrivate *priv = self->priv;
gboolean appears_focused = meta_window_appears_focused (priv->window); gboolean appears_focused = meta_window_appears_focused (priv->window);
MetaShadow *shadow = appears_focused ? priv->focused_shadow : priv->unfocused_shadow; MetaShadow *shadow =
appears_focused ? priv->focused_shadow : priv->unfocused_shadow;
/* This window got damage when obscured; we set up a timer /* This window got damage when obscured; we set up a timer
* to send frame completion events, but since we're drawing * to send frame completion events, but since we're drawing
* the window now (for some other reason) cancel the timer * the window now (for some other reason) cancel the timer
* and send the completion events normally */ * and send the completion events normally */
if (priv->send_frame_messages_timer != 0) if (priv->send_frame_messages_timer != 0)
{ {
g_source_remove (priv->send_frame_messages_timer); g_source_remove (priv->send_frame_messages_timer);
@ -741,7 +756,8 @@ meta_window_actor_paint (ClutterActor *actor)
*/ */
if (!clip && clip_shadow_under_window (self)) if (!clip && clip_shadow_under_window (self))
{ {
cairo_region_t *frame_bounds = meta_window_get_frame_bounds (priv->window); cairo_region_t *frame_bounds = meta_window_get_frame_bounds (
priv->window);
cairo_rectangle_int_t bounds; cairo_rectangle_int_t bounds;
meta_window_actor_get_shadow_bounds (self, appears_focused, &bounds); meta_window_actor_get_shadow_bounds (self, appears_focused, &bounds);
@ -755,9 +771,12 @@ meta_window_actor_paint (ClutterActor *actor)
params.y_offset + shape_bounds.y, params.y_offset + shape_bounds.y,
shape_bounds.width, shape_bounds.width,
shape_bounds.height, shape_bounds.height,
(clutter_actor_get_paint_opacity (actor) * params.opacity * window->opacity) / (255 * 255), (clutter_actor_get_paint_opacity (actor) *
params.opacity * window->opacity) / (255 * 255),
clip, clip,
clip_shadow_under_window (self)); /* clip_strictly - not just as an optimization */ clip_shadow_under_window (self)); /* clip_strictly -
* not just as an
* optimization */
if (clip && clip != priv->shadow_clip) if (clip && clip != priv->shadow_clip)
cairo_region_destroy (clip); cairo_region_destroy (clip);
@ -790,7 +809,8 @@ meta_window_actor_get_paint_volume (ClutterActor *actor,
* at all. * at all.
*/ */
meta_window_actor_get_shadow_bounds (self, appears_focused, &shadow_bounds); meta_window_actor_get_shadow_bounds (self, appears_focused,
&shadow_bounds);
shadow_box.x1 = shadow_bounds.x; shadow_box.x1 = shadow_bounds.x;
shadow_box.x2 = shadow_bounds.x + shadow_bounds.width; shadow_box.x2 = shadow_bounds.x + shadow_bounds.width;
shadow_box.y1 = shadow_bounds.y; shadow_box.y1 = shadow_bounds.y;
@ -803,7 +823,9 @@ meta_window_actor_get_paint_volume (ClutterActor *actor,
{ {
const ClutterPaintVolume *child_volume; const ClutterPaintVolume *child_volume;
child_volume = clutter_actor_get_transformed_paint_volume (CLUTTER_ACTOR (priv->surface), actor); child_volume =
clutter_actor_get_transformed_paint_volume (CLUTTER_ACTOR (
priv->surface), actor);
if (!child_volume) if (!child_volume)
return FALSE; return FALSE;
@ -989,15 +1011,21 @@ queue_send_frame_messages_timeout (MetaWindowActor *self)
current_time = current_time =
meta_compositor_monotonic_time_to_server_time (display, meta_compositor_monotonic_time_to_server_time (display,
g_get_monotonic_time ()); g_get_monotonic_time ());
interval = (int)(1000000 / refresh_rate) * 6; interval = (int) (1000000 / refresh_rate) * 6;
offset = MAX (0, priv->frame_drawn_time + interval - current_time) / 1000; offset = MAX (0, priv->frame_drawn_time + interval - current_time) / 1000;
/* The clutter master clock source has already been added with META_PRIORITY_REDRAW, /* The clutter master clock source has already been added with
* so the timer will run *after* the clutter frame handling, if a frame is ready * META_PRIORITY_REDRAW,
* to be drawn when the timer expires. * so the timer will run *after* the clutter frame handling, if a frame is
*/ *ready
priv->send_frame_messages_timer = g_timeout_add_full (META_PRIORITY_REDRAW, offset, send_frame_messages_timeout, self, NULL); * to be drawn when the timer expires.
g_source_set_name_by_id (priv->send_frame_messages_timer, "[mutter] send_frame_messages_timeout"); */
priv->send_frame_messages_timer = g_timeout_add_full (META_PRIORITY_REDRAW,
offset,
send_frame_messages_timeout, self,
NULL);
g_source_set_name_by_id (priv->send_frame_messages_timer,
"[mutter] send_frame_messages_timeout");
} }
void void
@ -1051,7 +1079,8 @@ meta_window_actor_queue_frame_drawn (MetaWindowActor *self,
if (priv->surface) if (priv->surface)
{ {
const cairo_rectangle_int_t clip = { 0, 0, 1, 1 }; const cairo_rectangle_int_t clip = { 0, 0, 1, 1 };
clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (priv->surface), &clip); clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (
priv->surface), &clip);
priv->repaint_scheduled = TRUE; priv->repaint_scheduled = TRUE;
} }
} }
@ -1062,28 +1091,28 @@ gboolean
meta_window_actor_effect_in_progress (MetaWindowActor *self) meta_window_actor_effect_in_progress (MetaWindowActor *self)
{ {
return (self->priv->minimize_in_progress || return (self->priv->minimize_in_progress ||
self->priv->size_change_in_progress || self->priv->size_change_in_progress ||
self->priv->map_in_progress || self->priv->map_in_progress ||
self->priv->destroy_in_progress); self->priv->destroy_in_progress);
} }
static gboolean static gboolean
is_freeze_thaw_effect (MetaPluginEffect event) is_freeze_thaw_effect (MetaPluginEffect event)
{ {
switch (event) switch (event)
{ {
case META_PLUGIN_DESTROY: case META_PLUGIN_DESTROY:
case META_PLUGIN_SIZE_CHANGE: case META_PLUGIN_SIZE_CHANGE:
return TRUE; return TRUE;
break; break;
default: default:
return FALSE; return FALSE;
} }
} }
static gboolean static gboolean
start_simple_effect (MetaWindowActor *self, start_simple_effect (MetaWindowActor *self,
MetaPluginEffect event) MetaPluginEffect event)
{ {
MetaWindowActorPrivate *priv = self->priv; MetaWindowActorPrivate *priv = self->priv;
MetaCompositor *compositor = priv->compositor; MetaCompositor *compositor = priv->compositor;
@ -1093,26 +1122,26 @@ start_simple_effect (MetaWindowActor *self,
g_assert (compositor->plugin_mgr != NULL); g_assert (compositor->plugin_mgr != NULL);
switch (event) switch (event)
{ {
case META_PLUGIN_NONE: case META_PLUGIN_NONE:
return FALSE; return FALSE;
case META_PLUGIN_MINIMIZE: case META_PLUGIN_MINIMIZE:
counter = &priv->minimize_in_progress; counter = &priv->minimize_in_progress;
break; break;
case META_PLUGIN_UNMINIMIZE: case META_PLUGIN_UNMINIMIZE:
counter = &priv->unminimize_in_progress; counter = &priv->unminimize_in_progress;
break; break;
case META_PLUGIN_MAP: case META_PLUGIN_MAP:
counter = &priv->map_in_progress; counter = &priv->map_in_progress;
break; break;
case META_PLUGIN_DESTROY: case META_PLUGIN_DESTROY:
counter = &priv->destroy_in_progress; counter = &priv->destroy_in_progress;
break; break;
case META_PLUGIN_SIZE_CHANGE: case META_PLUGIN_SIZE_CHANGE:
case META_PLUGIN_SWITCH_WORKSPACE: case META_PLUGIN_SWITCH_WORKSPACE:
g_assert_not_reached (); g_assert_not_reached ();
break; break;
} }
g_assert (counter); g_assert (counter);
@ -1151,10 +1180,10 @@ meta_window_actor_after_effects (MetaWindowActor *self)
} }
void void
meta_window_actor_effect_completed (MetaWindowActor *self, meta_window_actor_effect_completed (MetaWindowActor *self,
MetaPluginEffect event) MetaPluginEffect event)
{ {
MetaWindowActorPrivate *priv = self->priv; MetaWindowActorPrivate *priv = self->priv;
gboolean inconsistent = FALSE; gboolean inconsistent = FALSE;
/* NB: Keep in mind that when effects get completed it possible /* NB: Keep in mind that when effects get completed it possible
@ -1162,68 +1191,68 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
* In this case priv->window will == NULL */ * In this case priv->window will == NULL */
switch (event) switch (event)
{ {
case META_PLUGIN_NONE: case META_PLUGIN_NONE:
break; break;
case META_PLUGIN_MINIMIZE: case META_PLUGIN_MINIMIZE:
{ {
priv->minimize_in_progress--; priv->minimize_in_progress--;
if (priv->minimize_in_progress < 0) if (priv->minimize_in_progress < 0)
{ {
g_warning ("Error in minimize accounting."); g_warning ("Error in minimize accounting.");
priv->minimize_in_progress = 0; priv->minimize_in_progress = 0;
inconsistent = TRUE; inconsistent = TRUE;
} }
} }
break; break;
case META_PLUGIN_UNMINIMIZE: case META_PLUGIN_UNMINIMIZE:
{ {
priv->unminimize_in_progress--; priv->unminimize_in_progress--;
if (priv->unminimize_in_progress < 0) if (priv->unminimize_in_progress < 0)
{ {
g_warning ("Error in unminimize accounting."); g_warning ("Error in unminimize accounting.");
priv->unminimize_in_progress = 0; priv->unminimize_in_progress = 0;
inconsistent = TRUE; inconsistent = TRUE;
} }
} }
break; break;
case META_PLUGIN_MAP: case META_PLUGIN_MAP:
/* /*
* Make sure that the actor is at the correct place in case * Make sure that the actor is at the correct place in case
* the plugin fscked. * the plugin fscked.
*/ */
priv->map_in_progress--; priv->map_in_progress--;
if (priv->map_in_progress < 0) if (priv->map_in_progress < 0)
{ {
g_warning ("Error in map accounting."); g_warning ("Error in map accounting.");
priv->map_in_progress = 0; priv->map_in_progress = 0;
inconsistent = TRUE; inconsistent = TRUE;
} }
break; break;
case META_PLUGIN_DESTROY: case META_PLUGIN_DESTROY:
priv->destroy_in_progress--; priv->destroy_in_progress--;
if (priv->destroy_in_progress < 0) if (priv->destroy_in_progress < 0)
{ {
g_warning ("Error in destroy accounting."); g_warning ("Error in destroy accounting.");
priv->destroy_in_progress = 0; priv->destroy_in_progress = 0;
inconsistent = TRUE; inconsistent = TRUE;
} }
break; break;
case META_PLUGIN_SIZE_CHANGE: case META_PLUGIN_SIZE_CHANGE:
priv->size_change_in_progress--; priv->size_change_in_progress--;
if (priv->size_change_in_progress < 0) if (priv->size_change_in_progress < 0)
{ {
g_warning ("Error in size change accounting."); g_warning ("Error in size change accounting.");
priv->size_change_in_progress = 0; priv->size_change_in_progress = 0;
inconsistent = TRUE; inconsistent = TRUE;
} }
break; break;
case META_PLUGIN_SWITCH_WORKSPACE: case META_PLUGIN_SWITCH_WORKSPACE:
g_assert_not_reached (); g_assert_not_reached ();
break; break;
} }
if (is_freeze_thaw_effect (event) && !inconsistent) if (is_freeze_thaw_effect (event) && !inconsistent)
meta_window_actor_thaw (self); meta_window_actor_thaw (self);
@ -1248,7 +1277,7 @@ meta_window_actor_set_unredirected (MetaWindowActor *self,
{ {
MetaWindowActorPrivate *priv = self->priv; MetaWindowActorPrivate *priv = self->priv;
g_assert(priv->surface); /* because otherwise should_unredirect() is FALSE */ g_assert (priv->surface); /* because otherwise should_unredirect() is FALSE */
meta_surface_actor_set_unredirected (priv->surface, unredirected); meta_surface_actor_set_unredirected (priv->surface, unredirected);
} }
@ -1323,8 +1352,8 @@ meta_window_actor_sync_actor_geometry (MetaWindowActor *self,
} }
void void
meta_window_actor_show (MetaWindowActor *self, meta_window_actor_show (MetaWindowActor *self,
MetaCompEffect effect) MetaCompEffect effect)
{ {
MetaWindowActorPrivate *priv = self->priv; MetaWindowActorPrivate *priv = self->priv;
MetaCompositor *compositor = priv->compositor; MetaCompositor *compositor = priv->compositor;
@ -1346,7 +1375,7 @@ meta_window_actor_show (MetaWindowActor *self,
event = META_PLUGIN_NONE; event = META_PLUGIN_NONE;
break; break;
default: default:
g_assert_not_reached(); g_assert_not_reached ();
} }
if (compositor->switch_workspace_in_progress || if (compositor->switch_workspace_in_progress ||
@ -1387,7 +1416,7 @@ meta_window_actor_hide (MetaWindowActor *self,
event = META_PLUGIN_NONE; event = META_PLUGIN_NONE;
break; break;
default: default:
g_assert_not_reached(); g_assert_not_reached ();
} }
if (!start_simple_effect (self, event)) if (!start_simple_effect (self, event))
@ -1395,10 +1424,10 @@ meta_window_actor_hide (MetaWindowActor *self,
} }
void void
meta_window_actor_size_change (MetaWindowActor *self, meta_window_actor_size_change (MetaWindowActor *self,
MetaSizeChange which_change, MetaSizeChange which_change,
MetaRectangle *old_frame_rect, MetaRectangle *old_frame_rect,
MetaRectangle *old_buffer_rect) MetaRectangle *old_buffer_rect)
{ {
MetaWindowActorPrivate *priv = self->priv; MetaWindowActorPrivate *priv = self->priv;
MetaCompositor *compositor = priv->compositor; MetaCompositor *compositor = priv->compositor;
@ -1407,7 +1436,8 @@ meta_window_actor_size_change (MetaWindowActor *self,
meta_window_actor_freeze (self); meta_window_actor_freeze (self);
if (!meta_plugin_manager_event_size_change (compositor->plugin_mgr, self, if (!meta_plugin_manager_event_size_change (compositor->plugin_mgr, self,
which_change, old_frame_rect, old_buffer_rect)) which_change, old_frame_rect,
old_buffer_rect))
{ {
self->priv->size_change_in_progress--; self->priv->size_change_in_progress--;
meta_window_actor_thaw (self); meta_window_actor_thaw (self);
@ -1419,9 +1449,9 @@ meta_window_actor_new (MetaWindow *window)
{ {
MetaDisplay *display = meta_window_get_display (window); MetaDisplay *display = meta_window_get_display (window);
MetaCompositor *compositor = display->compositor; MetaCompositor *compositor = display->compositor;
MetaWindowActor *self; MetaWindowActor *self;
MetaWindowActorPrivate *priv; MetaWindowActorPrivate *priv;
ClutterActor *window_group; ClutterActor *window_group;
self = g_object_new (META_TYPE_WINDOW_ACTOR, self = g_object_new (META_TYPE_WINDOW_ACTOR,
"meta-window", window, "meta-window", window,
@ -1493,7 +1523,8 @@ see_region (cairo_region_t *region,
int height, int height,
char *filename) char *filename)
{ {
cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_A8, width, height); cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_A8, width,
height);
cairo_t *cr = cairo_create (surface); cairo_t *cr = cairo_create (surface);
gdk_cairo_region (cr, region); gdk_cairo_region (cr, region);
@ -1534,7 +1565,8 @@ meta_window_actor_set_clip_region_beneath (MetaWindowActor *self,
if (clip_shadow_under_window (self)) if (clip_shadow_under_window (self))
{ {
cairo_region_t *frame_bounds = meta_window_get_frame_bounds (priv->window); cairo_region_t *frame_bounds = meta_window_get_frame_bounds (
priv->window);
cairo_region_subtract (priv->shadow_clip, frame_bounds); cairo_region_subtract (priv->shadow_clip, frame_bounds);
} }
} }
@ -1626,8 +1658,10 @@ check_needs_shadow (MetaWindowActor *self)
meta_window_actor_get_shape_bounds (self, &shape_bounds); meta_window_actor_get_shape_bounds (self, &shape_bounds);
*shadow_location = meta_shadow_factory_get_shadow (factory, *shadow_location = meta_shadow_factory_get_shadow (factory,
priv->shadow_shape, priv->shadow_shape,
shape_bounds.width, shape_bounds.height, shape_bounds.width,
shadow_class, appears_focused); shape_bounds.height,
shadow_class,
appears_focused);
} }
if (old_shadow != NULL) if (old_shadow != NULL)
@ -1684,7 +1718,8 @@ scan_visible_region (guchar *mask_data,
for (x = rect.x; x < (rect.x + rect.width); x++) for (x = rect.x; x < (rect.x + rect.width); x++)
{ {
int x2 = x; int x2 = x;
while (mask_data[y * stride + x2] == 255 && x2 < (rect.x + rect.width)) while (mask_data[y * stride + x2] == 255 &&
x2 < (rect.x + rect.width))
x2++; x2++;
if (x2 > x) if (x2 > x)
@ -1757,7 +1792,8 @@ build_and_scan_frame_mask (MetaWindowActor *self,
meta_frame_get_mask (priv->window->frame, cr); meta_frame_get_mask (priv->window->frame, cr);
cairo_surface_flush (surface); cairo_surface_flush (surface);
scanned_region = scan_visible_region (mask_data, stride, frame_paint_region); scanned_region = scan_visible_region (mask_data, stride,
frame_paint_region);
cairo_region_union (shape_region, scanned_region); cairo_region_union (shape_region, scanned_region);
cairo_region_destroy (scanned_region); cairo_region_destroy (scanned_region);
cairo_region_destroy (frame_paint_region); cairo_region_destroy (frame_paint_region);
@ -1768,7 +1804,9 @@ build_and_scan_frame_mask (MetaWindowActor *self,
if (meta_texture_rectangle_check (paint_tex)) if (meta_texture_rectangle_check (paint_tex))
{ {
mask_texture = COGL_TEXTURE (cogl_texture_rectangle_new_with_size (ctx, tex_width, tex_height)); mask_texture =
COGL_TEXTURE (cogl_texture_rectangle_new_with_size (ctx, tex_width,
tex_height));
cogl_texture_set_components (mask_texture, COGL_TEXTURE_COMPONENTS_A); cogl_texture_set_components (mask_texture, COGL_TEXTURE_COMPONENTS_A);
cogl_texture_set_region (mask_texture, cogl_texture_set_region (mask_texture,
0, 0, /* src_x/y */ 0, 0, /* src_x/y */
@ -1782,9 +1820,11 @@ build_and_scan_frame_mask (MetaWindowActor *self,
{ {
CoglError *error = NULL; CoglError *error = NULL;
mask_texture = COGL_TEXTURE (cogl_texture_2d_new_from_data (ctx, tex_width, tex_height, mask_texture =
COGL_PIXEL_FORMAT_A_8, COGL_TEXTURE (cogl_texture_2d_new_from_data (ctx, tex_width, tex_height,
stride, mask_data, &error)); COGL_PIXEL_FORMAT_A_8,
stride,
mask_data, &error));
if (error) if (error)
{ {
@ -1972,21 +2012,22 @@ do_send_frame_drawn (MetaWindowActor *self, FrameData *frame)
XClientMessageEvent ev = { 0, }; XClientMessageEvent ev = { 0, };
frame->frame_drawn_time = meta_compositor_monotonic_time_to_server_time (display, frame->frame_drawn_time = meta_compositor_monotonic_time_to_server_time (
g_get_monotonic_time ()); display,
g_get_monotonic_time ());
priv->frame_drawn_time = frame->frame_drawn_time; priv->frame_drawn_time = frame->frame_drawn_time;
ev.type = ClientMessage; ev.type = ClientMessage;
ev.window = meta_window_get_xwindow (priv->window); ev.window = meta_window_get_xwindow (priv->window);
ev.message_type = display->x11_display->atom__NET_WM_FRAME_DRAWN; ev.message_type = display->x11_display->atom__NET_WM_FRAME_DRAWN;
ev.format = 32; ev.format = 32;
ev.data.l[0] = frame->sync_request_serial & G_GUINT64_CONSTANT(0xffffffff); ev.data.l[0] = frame->sync_request_serial & G_GUINT64_CONSTANT (0xffffffff);
ev.data.l[1] = frame->sync_request_serial >> 32; ev.data.l[1] = frame->sync_request_serial >> 32;
ev.data.l[2] = frame->frame_drawn_time & G_GUINT64_CONSTANT(0xffffffff); ev.data.l[2] = frame->frame_drawn_time & G_GUINT64_CONSTANT (0xffffffff);
ev.data.l[3] = frame->frame_drawn_time >> 32; ev.data.l[3] = frame->frame_drawn_time >> 32;
meta_x11_error_trap_push (display->x11_display); meta_x11_error_trap_push (display->x11_display);
XSendEvent (xdisplay, ev.window, False, 0, (XEvent*) &ev); XSendEvent (xdisplay, ev.window, False, 0, (XEvent *) &ev);
XFlush (xdisplay); XFlush (xdisplay);
meta_x11_error_trap_pop (display->x11_display); meta_x11_error_trap_pop (display->x11_display);
} }
@ -2029,8 +2070,8 @@ meta_window_actor_post_paint (MetaWindowActor *self)
} }
static void static void
do_send_frame_timings (MetaWindowActor *self, do_send_frame_timings (MetaWindowActor *self,
FrameData *frame, FrameData *frame,
gint refresh_interval, gint refresh_interval,
gint64 presentation_time) gint64 presentation_time)
{ {
@ -2044,18 +2085,20 @@ do_send_frame_timings (MetaWindowActor *self,
ev.window = meta_window_get_xwindow (priv->window); ev.window = meta_window_get_xwindow (priv->window);
ev.message_type = display->x11_display->atom__NET_WM_FRAME_TIMINGS; ev.message_type = display->x11_display->atom__NET_WM_FRAME_TIMINGS;
ev.format = 32; ev.format = 32;
ev.data.l[0] = frame->sync_request_serial & G_GUINT64_CONSTANT(0xffffffff); ev.data.l[0] = frame->sync_request_serial & G_GUINT64_CONSTANT (0xffffffff);
ev.data.l[1] = frame->sync_request_serial >> 32; ev.data.l[1] = frame->sync_request_serial >> 32;
if (presentation_time != 0) if (presentation_time != 0)
{ {
gint64 presentation_time_server = meta_compositor_monotonic_time_to_server_time (display, gint64 presentation_time_server =
presentation_time); meta_compositor_monotonic_time_to_server_time (display,
gint64 presentation_time_offset = presentation_time_server - frame->frame_drawn_time; presentation_time);
gint64 presentation_time_offset = presentation_time_server -
frame->frame_drawn_time;
if (presentation_time_offset == 0) if (presentation_time_offset == 0)
presentation_time_offset = 1; presentation_time_offset = 1;
if ((gint32)presentation_time_offset == presentation_time_offset) if ((gint32) presentation_time_offset == presentation_time_offset)
ev.data.l[2] = presentation_time_offset; ev.data.l[2] = presentation_time_offset;
} }
@ -2063,7 +2106,7 @@ do_send_frame_timings (MetaWindowActor *self,
ev.data.l[4] = 1000 * META_SYNC_DELAY; ev.data.l[4] = 1000 * META_SYNC_DELAY;
meta_x11_error_trap_push (display->x11_display); meta_x11_error_trap_push (display->x11_display);
XSendEvent (xdisplay, ev.window, False, 0, (XEvent*) &ev); XSendEvent (xdisplay, ev.window, False, 0, (XEvent *) &ev);
XFlush (xdisplay); XFlush (xdisplay);
meta_x11_error_trap_pop (display->x11_display); meta_x11_error_trap_pop (display->x11_display);
} }
@ -2107,11 +2150,13 @@ meta_window_actor_frame_complete (MetaWindowActor *self,
if (frame->frame_counter != -1 && frame->frame_counter <= frame_counter) if (frame->frame_counter != -1 && frame->frame_counter <= frame_counter)
{ {
if (G_UNLIKELY (frame->frame_drawn_time == 0)) if (G_UNLIKELY (frame->frame_drawn_time == 0))
g_warning ("%s: Frame has assigned frame counter but no frame drawn time", g_warning (
priv->window->desc); "%s: Frame has assigned frame counter but no frame drawn time",
priv->window->desc);
if (G_UNLIKELY (frame->frame_counter < frame_counter)) if (G_UNLIKELY (frame->frame_counter < frame_counter))
g_warning ("%s: frame_complete callback never occurred for frame %" G_GINT64_FORMAT, g_warning (
priv->window->desc, frame->frame_counter); "%s: frame_complete callback never occurred for frame %" G_GINT64_FORMAT,
priv->window->desc, frame->frame_counter);
priv->frames = g_list_delete_link (priv->frames, l); priv->frames = g_list_delete_link (priv->frames, l);
send_frame_timings (self, frame, frame_info, presentation_time); send_frame_timings (self, frame, frame_info, presentation_time);
@ -2170,7 +2215,8 @@ meta_window_actor_sync_updates_frozen (MetaWindowActor *self)
MetaWindowActorPrivate *priv = self->priv; MetaWindowActorPrivate *priv = self->priv;
MetaWindow *window = priv->window; MetaWindow *window = priv->window;
meta_window_actor_set_updates_frozen (self, meta_window_updates_are_frozen (window)); meta_window_actor_set_updates_frozen (self,
meta_window_updates_are_frozen (window));
} }
MetaWindowActor * MetaWindowActor *

View File

@ -28,7 +28,8 @@ struct _MetaWindowGroup
static void cullable_iface_init (MetaCullableInterface *iface); static void cullable_iface_init (MetaCullableInterface *iface);
G_DEFINE_TYPE_WITH_CODE (MetaWindowGroup, meta_window_group, CLUTTER_TYPE_ACTOR, G_DEFINE_TYPE_WITH_CODE (MetaWindowGroup, meta_window_group, CLUTTER_TYPE_ACTOR,
G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE, cullable_iface_init)); G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE,
cullable_iface_init));
static void static void
meta_window_group_cull_out (MetaCullable *cullable, meta_window_group_cull_out (MetaCullable *cullable,
@ -115,7 +116,8 @@ meta_window_group_paint (ClutterActor *actor)
cairo_region_translate (clip_region, -paint_x_origin, -paint_y_origin); cairo_region_translate (clip_region, -paint_x_origin, -paint_y_origin);
meta_cullable_cull_out (META_CULLABLE (window_group), unobscured_region, clip_region); meta_cullable_cull_out (META_CULLABLE (
window_group), unobscured_region, clip_region);
cairo_region_destroy (unobscured_region); cairo_region_destroy (unobscured_region);
cairo_region_destroy (clip_region); cairo_region_destroy (clip_region);

View File

@ -144,9 +144,11 @@ meta_window_shape_new (cairo_region_t *region)
#if 0 #if 0
g_print ("%d: +%d+%dx%dx%d => +%d+%dx%dx%d\n", g_print ("%d: +%d+%dx%dx%d => +%d+%dx%dx%d\n",
iter.i, iter.rectangle.x, iter.rectangle.y, iter.rectangle.width, iter.rectangle.height, iter.i, iter.rectangle.x, iter.rectangle.y, iter.rectangle.width,
iter.rectangle.height,
shape->rectangles[iter.i].x, shape->rectangles[iter.i].y, shape->rectangles[iter.i].x, shape->rectangles[iter.i].y,
hape->rectangles[iter.i].width, shape->rectangles[iter.i].height); hape->rectangles[iter.i].width,
shape->rectangles[iter.i].height);
#endif #endif
hash = hash * 31 + x1 * 17 + x2 * 27 + y1 * 37 + y2 * 43; hash = hash * 31 + x1 * 17 + x2 * 27 + y1 * 37 + y2 * 43;
@ -155,7 +157,8 @@ meta_window_shape_new (cairo_region_t *region)
shape->hash = hash; shape->hash = hash;
#if 0 #if 0
g_print ("%d %d %d %d: %#x\n\n", shape->top, shape->right, shape->bottom, shape->left, shape->hash); g_print ("%d %d %d %d: %#x\n\n", shape->top, shape->right, shape->bottom,
shape->left, shape->hash);
#endif #endif
return shape; return shape;

View File

@ -44,17 +44,26 @@
#define DISPLAY_TILE_PREVIEW_DATA_KEY "MCCP-Default-display-tile-preview-data" #define DISPLAY_TILE_PREVIEW_DATA_KEY "MCCP-Default-display-tile-preview-data"
#define META_TYPE_DEFAULT_PLUGIN (meta_default_plugin_get_type ()) #define META_TYPE_DEFAULT_PLUGIN (meta_default_plugin_get_type ())
#define META_DEFAULT_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEFAULT_PLUGIN, MetaDefaultPlugin)) #define META_DEFAULT_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
#define META_DEFAULT_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEFAULT_PLUGIN, MetaDefaultPluginClass)) META_TYPE_DEFAULT_PLUGIN, \
#define META_IS_DEFAULT_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_DEFAULT_PLUGIN_TYPE)) MetaDefaultPlugin))
#define META_IS_DEFAULT_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEFAULT_PLUGIN)) #define META_DEFAULT_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), \
#define META_DEFAULT_PLUGIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEFAULT_PLUGIN, MetaDefaultPluginClass)) META_TYPE_DEFAULT_PLUGIN, \
MetaDefaultPluginClass))
#define META_IS_DEFAULT_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
META_DEFAULT_PLUGIN_TYPE))
#define META_IS_DEFAULT_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), \
META_TYPE_DEFAULT_PLUGIN))
#define META_DEFAULT_PLUGIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), \
META_TYPE_DEFAULT_PLUGIN, \
MetaDefaultPluginClass))
#define META_DEFAULT_PLUGIN_GET_PRIVATE(obj) \ #define META_DEFAULT_PLUGIN_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), META_TYPE_DEFAULT_PLUGIN, MetaDefaultPluginPrivate)) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), META_TYPE_DEFAULT_PLUGIN, \
MetaDefaultPluginPrivate))
typedef struct _MetaDefaultPlugin MetaDefaultPlugin; typedef struct _MetaDefaultPlugin MetaDefaultPlugin;
typedef struct _MetaDefaultPluginClass MetaDefaultPluginClass; typedef struct _MetaDefaultPluginClass MetaDefaultPluginClass;
typedef struct _MetaDefaultPluginPrivate MetaDefaultPluginPrivate; typedef struct _MetaDefaultPluginPrivate MetaDefaultPluginPrivate;
struct _MetaDefaultPlugin struct _MetaDefaultPlugin
@ -72,32 +81,32 @@ struct _MetaDefaultPluginClass
static GQuark actor_data_quark = 0; static GQuark actor_data_quark = 0;
static GQuark display_tile_preview_data_quark = 0; static GQuark display_tile_preview_data_quark = 0;
static void start (MetaPlugin *plugin); static void start (MetaPlugin *plugin);
static void minimize (MetaPlugin *plugin, static void minimize (MetaPlugin *plugin,
MetaWindowActor *actor); MetaWindowActor *actor);
static void map (MetaPlugin *plugin, static void map (MetaPlugin *plugin,
MetaWindowActor *actor); MetaWindowActor *actor);
static void destroy (MetaPlugin *plugin, static void destroy (MetaPlugin *plugin,
MetaWindowActor *actor); MetaWindowActor *actor);
static void switch_workspace (MetaPlugin *plugin, static void switch_workspace (MetaPlugin *plugin,
gint from, gint from,
gint to, gint to,
MetaMotionDirection direction); MetaMotionDirection direction);
static void kill_window_effects (MetaPlugin *plugin, static void kill_window_effects (MetaPlugin *plugin,
MetaWindowActor *actor); MetaWindowActor *actor);
static void kill_switch_workspace (MetaPlugin *plugin); static void kill_switch_workspace (MetaPlugin *plugin);
static void show_tile_preview (MetaPlugin *plugin, static void show_tile_preview (MetaPlugin *plugin,
MetaWindow *window, MetaWindow *window,
MetaRectangle *tile_rect, MetaRectangle *tile_rect,
int tile_monitor_number); int tile_monitor_number);
static void hide_tile_preview (MetaPlugin *plugin); static void hide_tile_preview (MetaPlugin *plugin);
static void confirm_display_change (MetaPlugin *plugin); static void confirm_display_change (MetaPlugin *plugin);
static const MetaPluginInfo * plugin_info (MetaPlugin *plugin); static const MetaPluginInfo *plugin_info (MetaPlugin *plugin);
/* /*
* Plugin private data that we store in the .plugin_private member. * Plugin private data that we store in the .plugin_private member.
@ -105,14 +114,14 @@ static const MetaPluginInfo * plugin_info (MetaPlugin *plugin);
struct _MetaDefaultPluginPrivate struct _MetaDefaultPluginPrivate
{ {
/* Valid only when switch_workspace effect is in progress */ /* Valid only when switch_workspace effect is in progress */
ClutterTimeline *tml_switch_workspace1; ClutterTimeline *tml_switch_workspace1;
ClutterTimeline *tml_switch_workspace2; ClutterTimeline *tml_switch_workspace2;
ClutterActor *desktop1; ClutterActor *desktop1;
ClutterActor *desktop2; ClutterActor *desktop2;
ClutterActor *background_group; ClutterActor *background_group;
MetaPluginInfo info; MetaPluginInfo info;
}; };
META_PLUGIN_DECLARE_WITH_CODE (MetaDefaultPlugin, meta_default_plugin, META_PLUGIN_DECLARE_WITH_CODE (MetaDefaultPlugin, meta_default_plugin,
@ -140,18 +149,18 @@ typedef struct
typedef struct _DisplayTilePreview typedef struct _DisplayTilePreview
{ {
ClutterActor *actor; ClutterActor *actor;
GdkRGBA *preview_color; GdkRGBA *preview_color;
MetaRectangle tile_rect; MetaRectangle tile_rect;
} DisplayTilePreview; } DisplayTilePreview;
static void static void
meta_default_plugin_dispose (GObject *object) meta_default_plugin_dispose (GObject *object)
{ {
/* MetaDefaultPluginPrivate *priv = META_DEFAULT_PLUGIN (object)->priv; /* MetaDefaultPluginPrivate *priv = META_DEFAULT_PLUGIN (object)->priv;
*/ */
G_OBJECT_CLASS (meta_default_plugin_parent_class)->dispose (object); G_OBJECT_CLASS (meta_default_plugin_parent_class)->dispose (object);
} }
@ -163,9 +172,9 @@ meta_default_plugin_finalize (GObject *object)
static void static void
meta_default_plugin_set_property (GObject *object, meta_default_plugin_set_property (GObject *object,
guint prop_id, guint prop_id,
const GValue *value, const GValue *value,
GParamSpec *pspec) GParamSpec *pspec)
{ {
switch (prop_id) switch (prop_id)
{ {
@ -177,9 +186,9 @@ meta_default_plugin_set_property (GObject *object,
static void static void
meta_default_plugin_get_property (GObject *object, meta_default_plugin_get_property (GObject *object,
guint prop_id, guint prop_id,
GValue *value, GValue *value,
GParamSpec *pspec) GParamSpec *pspec)
{ {
switch (prop_id) switch (prop_id)
{ {
@ -192,23 +201,23 @@ meta_default_plugin_get_property (GObject *object,
static void static void
meta_default_plugin_class_init (MetaDefaultPluginClass *klass) meta_default_plugin_class_init (MetaDefaultPluginClass *klass)
{ {
GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
MetaPluginClass *plugin_class = META_PLUGIN_CLASS (klass); MetaPluginClass *plugin_class = META_PLUGIN_CLASS (klass);
gobject_class->finalize = meta_default_plugin_finalize; gobject_class->finalize = meta_default_plugin_finalize;
gobject_class->dispose = meta_default_plugin_dispose; gobject_class->dispose = meta_default_plugin_dispose;
gobject_class->set_property = meta_default_plugin_set_property; gobject_class->set_property = meta_default_plugin_set_property;
gobject_class->get_property = meta_default_plugin_get_property; gobject_class->get_property = meta_default_plugin_get_property;
plugin_class->start = start; plugin_class->start = start;
plugin_class->map = map; plugin_class->map = map;
plugin_class->minimize = minimize; plugin_class->minimize = minimize;
plugin_class->destroy = destroy; plugin_class->destroy = destroy;
plugin_class->switch_workspace = switch_workspace; plugin_class->switch_workspace = switch_workspace;
plugin_class->show_tile_preview = show_tile_preview; plugin_class->show_tile_preview = show_tile_preview;
plugin_class->hide_tile_preview = hide_tile_preview; plugin_class->hide_tile_preview = hide_tile_preview;
plugin_class->plugin_info = plugin_info; plugin_class->plugin_info = plugin_info;
plugin_class->kill_window_effects = kill_window_effects; plugin_class->kill_window_effects = kill_window_effects;
plugin_class->kill_switch_workspace = kill_switch_workspace; plugin_class->kill_switch_workspace = kill_switch_workspace;
plugin_class->confirm_display_change = confirm_display_change; plugin_class->confirm_display_change = confirm_display_change;
} }
@ -220,10 +229,10 @@ meta_default_plugin_init (MetaDefaultPlugin *self)
self->priv = priv = META_DEFAULT_PLUGIN_GET_PRIVATE (self); self->priv = priv = META_DEFAULT_PLUGIN_GET_PRIVATE (self);
priv->info.name = "Default Effects"; priv->info.name = "Default Effects";
priv->info.version = "0.1"; priv->info.version = "0.1";
priv->info.author = "Intel Corp."; priv->info.author = "Intel Corp.";
priv->info.license = "GPL"; priv->info.license = "GPL";
priv->info.description = "This is an example of a plugin implementation."; priv->info.description = "This is an example of a plugin implementation.";
} }
@ -258,10 +267,10 @@ get_actor_private (MetaWindowActor *actor)
} }
static ClutterTimeline * static ClutterTimeline *
actor_animate (ClutterActor *actor, actor_animate (ClutterActor *actor,
ClutterAnimationMode mode, ClutterAnimationMode mode,
guint duration, guint duration,
const gchar *first_property, const gchar *first_property,
...) ...)
{ {
va_list args; va_list args;
@ -285,7 +294,7 @@ actor_animate (ClutterActor *actor,
static void static void
on_switch_workspace_effect_complete (ClutterTimeline *timeline, gpointer data) on_switch_workspace_effect_complete (ClutterTimeline *timeline, gpointer data)
{ {
MetaPlugin *plugin = META_PLUGIN (data); MetaPlugin *plugin = META_PLUGIN (data);
MetaDefaultPluginPrivate *priv = META_DEFAULT_PLUGIN (plugin)->priv; MetaDefaultPluginPrivate *priv = META_DEFAULT_PLUGIN (plugin)->priv;
MetaDisplay *display = meta_plugin_get_display (plugin); MetaDisplay *display = meta_plugin_get_display (plugin);
GList *l = meta_get_window_actors (display); GList *l = meta_get_window_actors (display);
@ -347,9 +356,9 @@ on_monitors_changed (MetaMonitorManager *monitor_manager,
clutter_actor_set_size (background_actor, rect.width, rect.height); clutter_actor_set_size (background_actor, rect.width, rect.height);
/* Don't use rand() here, mesa calls srand() internally when /* Don't use rand() here, mesa calls srand() internally when
parsing the driconf XML, but it's nice if the colors are * parsing the driconf XML, but it's nice if the colors are
reproducible. * reproducible.
*/ */
clutter_color_init (&color, clutter_color_init (&color,
g_rand_int_range (rand, 0, 255), g_rand_int_range (rand, 0, 255),
g_rand_int_range (rand, 0, 255), g_rand_int_range (rand, 0, 255),
@ -358,10 +367,12 @@ on_monitors_changed (MetaMonitorManager *monitor_manager,
background = meta_background_new (display); background = meta_background_new (display);
meta_background_set_color (background, &color); meta_background_set_color (background, &color);
meta_background_actor_set_background (META_BACKGROUND_ACTOR (background_actor), background); meta_background_actor_set_background (META_BACKGROUND_ACTOR (
background_actor), background);
g_object_unref (background); g_object_unref (background);
meta_background_actor_set_vignette (META_BACKGROUND_ACTOR (background_actor), meta_background_actor_set_vignette (META_BACKGROUND_ACTOR (
background_actor),
TRUE, TRUE,
0.5, 0.5,
0.5); 0.5);
@ -398,11 +409,11 @@ switch_workspace (MetaPlugin *plugin,
{ {
MetaDisplay *display; MetaDisplay *display;
MetaDefaultPluginPrivate *priv = META_DEFAULT_PLUGIN (plugin)->priv; MetaDefaultPluginPrivate *priv = META_DEFAULT_PLUGIN (plugin)->priv;
GList *l; GList *l;
ClutterActor *workspace0 = clutter_actor_new (); ClutterActor *workspace0 = clutter_actor_new ();
ClutterActor *workspace1 = clutter_actor_new (); ClutterActor *workspace1 = clutter_actor_new ();
ClutterActor *stage; ClutterActor *stage;
int screen_width, screen_height; int screen_width, screen_height;
display = meta_plugin_get_display (plugin); display = meta_plugin_get_display (plugin);
stage = meta_get_stage_for_display (display); stage = meta_get_stage_for_display (display);
@ -432,12 +443,14 @@ switch_workspace (MetaPlugin *plugin,
while (l) while (l)
{ {
MetaWindowActor *window_actor = l->data; MetaWindowActor *window_actor = l->data;
ActorPrivate *apriv = get_actor_private (window_actor); ActorPrivate *apriv = get_actor_private (window_actor);
ClutterActor *actor = CLUTTER_ACTOR (window_actor); ClutterActor *actor = CLUTTER_ACTOR (window_actor);
MetaWorkspace *workspace; MetaWorkspace *workspace;
gint win_workspace; gint win_workspace;
workspace = meta_window_get_workspace (meta_window_actor_get_meta_window (window_actor)); workspace =
meta_window_get_workspace (meta_window_actor_get_meta_window (
window_actor));
win_workspace = meta_workspace_index (workspace); win_workspace = meta_workspace_index (workspace);
if (win_workspace == to || win_workspace == from) if (win_workspace == to || win_workspace == from)
@ -493,7 +506,8 @@ switch_workspace (MetaPlugin *plugin,
* calls the manager callback function. * calls the manager callback function.
*/ */
static void static void
on_minimize_effect_complete (ClutterTimeline *timeline, EffectCompleteData *data) on_minimize_effect_complete (ClutterTimeline *timeline,
EffectCompleteData *data)
{ {
/* /*
* Must reverse the effect of the effect; must hide it first to ensure * Must reverse the effect of the effect; must hide it first to ensure
@ -528,12 +542,12 @@ minimize (MetaPlugin *plugin, MetaWindowActor *window_actor)
MetaWindowType type; MetaWindowType type;
MetaRectangle icon_geometry; MetaRectangle icon_geometry;
MetaWindow *meta_window = meta_window_actor_get_meta_window (window_actor); MetaWindow *meta_window = meta_window_actor_get_meta_window (window_actor);
ClutterActor *actor = CLUTTER_ACTOR (window_actor); ClutterActor *actor = CLUTTER_ACTOR (window_actor);
type = meta_window_get_window_type (meta_window); type = meta_window_get_window_type (meta_window);
if (!meta_window_get_icon_geometry(meta_window, &icon_geometry)) if (!meta_window_get_icon_geometry (meta_window, &icon_geometry))
{ {
icon_geometry.x = 0; icon_geometry.x = 0;
icon_geometry.y = 0; icon_geometry.y = 0;
@ -549,15 +563,14 @@ minimize (MetaPlugin *plugin, MetaWindowActor *window_actor)
MINIMIZE_TIMEOUT, MINIMIZE_TIMEOUT,
"scale-x", 0.0, "scale-x", 0.0,
"scale-y", 0.0, "scale-y", 0.0,
"x", (double)icon_geometry.x, "x", (double) icon_geometry.x,
"y", (double)icon_geometry.y, "y", (double) icon_geometry.y,
NULL); NULL);
data->plugin = plugin; data->plugin = plugin;
data->actor = actor; data->actor = actor;
g_signal_connect (apriv->tml_minimize, "completed", g_signal_connect (apriv->tml_minimize, "completed",
G_CALLBACK (on_minimize_effect_complete), G_CALLBACK (on_minimize_effect_complete),
data); data);
} }
else else
meta_plugin_minimize_completed (plugin, window_actor); meta_plugin_minimize_completed (plugin, window_actor);
@ -570,8 +583,8 @@ on_map_effect_complete (ClutterTimeline *timeline, EffectCompleteData *data)
* Must reverse the effect of the effect. * Must reverse the effect of the effect.
*/ */
MetaPlugin *plugin = data->plugin; MetaPlugin *plugin = data->plugin;
MetaWindowActor *window_actor = META_WINDOW_ACTOR (data->actor); MetaWindowActor *window_actor = META_WINDOW_ACTOR (data->actor);
ActorPrivate *apriv = get_actor_private (window_actor); ActorPrivate *apriv = get_actor_private (window_actor);
apriv->tml_map = NULL; apriv->tml_map = NULL;
@ -679,19 +692,23 @@ free_display_tile_preview (gpointer data)
{ {
DisplayTilePreview *preview = data; DisplayTilePreview *preview = data;
if (G_LIKELY (preview != NULL)) { if (G_LIKELY (preview != NULL))
clutter_actor_destroy (preview->actor); {
g_slice_free (DisplayTilePreview, preview); clutter_actor_destroy (preview->actor);
} g_slice_free (DisplayTilePreview, preview);
}
} }
static DisplayTilePreview * static DisplayTilePreview *
get_display_tile_preview (MetaDisplay *display) get_display_tile_preview (MetaDisplay *display)
{ {
DisplayTilePreview *preview = g_object_get_qdata (G_OBJECT (display), display_tile_preview_data_quark); DisplayTilePreview *preview = g_object_get_qdata (G_OBJECT (
display),
display_tile_preview_data_quark);
if (G_UNLIKELY (display_tile_preview_data_quark == 0)) if (G_UNLIKELY (display_tile_preview_data_quark == 0))
display_tile_preview_data_quark = g_quark_from_static_string (DISPLAY_TILE_PREVIEW_DATA_KEY); display_tile_preview_data_quark = g_quark_from_static_string (
DISPLAY_TILE_PREVIEW_DATA_KEY);
if (G_UNLIKELY (!preview)) if (G_UNLIKELY (!preview))
{ {
@ -701,7 +718,8 @@ get_display_tile_preview (MetaDisplay *display)
clutter_actor_set_background_color (preview->actor, CLUTTER_COLOR_Blue); clutter_actor_set_background_color (preview->actor, CLUTTER_COLOR_Blue);
clutter_actor_set_opacity (preview->actor, 100); clutter_actor_set_opacity (preview->actor, 100);
clutter_actor_add_child (meta_get_window_group_for_display (display), preview->actor); clutter_actor_add_child (meta_get_window_group_for_display (
display), preview->actor);
g_object_set_qdata_full (G_OBJECT (display), g_object_set_qdata_full (G_OBJECT (display),
display_tile_preview_data_quark, preview, display_tile_preview_data_quark, preview,
free_display_tile_preview); free_display_tile_preview);
@ -733,7 +751,8 @@ show_tile_preview (MetaPlugin *plugin,
clutter_actor_show (preview->actor); clutter_actor_show (preview->actor);
window_actor = CLUTTER_ACTOR (meta_window_get_compositor_private (window)); window_actor = CLUTTER_ACTOR (meta_window_get_compositor_private (window));
clutter_actor_set_child_below_sibling (clutter_actor_get_parent (preview->actor), clutter_actor_set_child_below_sibling (clutter_actor_get_parent (preview->
actor),
preview->actor, preview->actor,
window_actor); window_actor);
@ -750,7 +769,7 @@ hide_tile_preview (MetaPlugin *plugin)
} }
static void static void
kill_switch_workspace (MetaPlugin *plugin) kill_switch_workspace (MetaPlugin *plugin)
{ {
MetaDefaultPluginPrivate *priv = META_DEFAULT_PLUGIN (plugin)->priv; MetaDefaultPluginPrivate *priv = META_DEFAULT_PLUGIN (plugin)->priv;

View File

@ -30,17 +30,20 @@
* that are unsorted or overlap; unioning such a set of rectangles 1-by-1 * that are unsorted or overlap; unioning such a set of rectangles 1-by-1
* using cairo_region_union_rectangle() produces O(N^2) behavior (if the union * using cairo_region_union_rectangle() produces O(N^2) behavior (if the union
* adds or removes rectangles in the middle of the region, then it has to * adds or removes rectangles in the middle of the region, then it has to
* move all the rectangles after that.) To avoid this behavior, MetaRegionBuilder * move all the rectangles after that.) To avoid this behavior,
*MetaRegionBuilder
* creates regions for small groups of rectangles and merges them together in * creates regions for small groups of rectangles and merges them together in
* a binary tree. * a binary tree.
* *
* Possible improvement: From a glance at the code, accumulating all the rectangles * Possible improvement: From a glance at the code, accumulating all the
*rectangles
* into a flat array and then calling the (not usefully documented) * into a flat array and then calling the (not usefully documented)
* cairo_region_create_rectangles() would have the same behavior and would be * cairo_region_create_rectangles() would have the same behavior and would be
* simpler and a bit more efficient. * simpler and a bit more efficient.
*/ */
/* Optimium performance seems to be with MAX_CHUNK_RECTANGLES=4; 8 is about 10% slower. /* Optimium performance seems to be with MAX_CHUNK_RECTANGLES=4; 8 is about 10%
* slower.
* But using 8 may be more robust to systems with slow malloc(). */ * But using 8 may be more robust to systems with slow malloc(). */
#define MAX_CHUNK_RECTANGLES 8 #define MAX_CHUNK_RECTANGLES 8
@ -112,7 +115,7 @@ meta_region_builder_finish (MetaRegionBuilder *builder)
result = builder->levels[i]; result = builder->levels[i];
else else
{ {
cairo_region_union(result, builder->levels[i]); cairo_region_union (result, builder->levels[i]);
cairo_region_destroy (builder->levels[i]); cairo_region_destroy (builder->levels[i]);
} }
} }
@ -165,7 +168,8 @@ meta_region_iterator_next (MetaRegionIterator *iter)
if (iter->i + 1 < iter->n_rectangles) if (iter->i + 1 < iter->n_rectangles)
{ {
cairo_region_get_rectangle (iter->region, iter->i + 1, &iter->next_rectangle); cairo_region_get_rectangle (iter->region, iter->i + 1,
&iter->next_rectangle);
iter->line_end = iter->next_rectangle.y != iter->rectangle.y; iter->line_end = iter->next_rectangle.y != iter->rectangle.y;
} }
else else
@ -175,9 +179,9 @@ meta_region_iterator_next (MetaRegionIterator *iter)
} }
cairo_region_t * cairo_region_t *
meta_region_scale_double (cairo_region_t *region, meta_region_scale_double (cairo_region_t *region,
double scale, double scale,
MetaRoundingStrategy rounding_strategy) MetaRoundingStrategy rounding_strategy)
{ {
int n_rects, i; int n_rects, i;
cairo_rectangle_int_t *rects; cairo_rectangle_int_t *rects;
@ -190,7 +194,7 @@ meta_region_scale_double (cairo_region_t *region,
n_rects = cairo_region_num_rectangles (region); n_rects = cairo_region_num_rectangles (region);
rects = g_malloc (sizeof(cairo_rectangle_int_t) * n_rects); rects = g_malloc (sizeof (cairo_rectangle_int_t) * n_rects);
for (i = 0; i < n_rects; i++) for (i = 0; i < n_rects; i++)
{ {
cairo_region_get_rectangle (region, i, &rects[i]); cairo_region_get_rectangle (region, i, &rects[i]);
@ -231,7 +235,7 @@ meta_region_scale (cairo_region_t *region, int scale)
n_rects = cairo_region_num_rectangles (region); n_rects = cairo_region_num_rectangles (region);
rects = g_malloc (sizeof(cairo_rectangle_int_t) * n_rects); rects = g_malloc (sizeof (cairo_rectangle_int_t) * n_rects);
for (i = 0; i < n_rects; i++) for (i = 0; i < n_rects; i++)
{ {
cairo_region_get_rectangle (region, i, &rects[i]); cairo_region_get_rectangle (region, i, &rects[i]);
@ -249,23 +253,25 @@ meta_region_scale (cairo_region_t *region, int scale)
} }
static void static void
add_expanded_rect (MetaRegionBuilder *builder, add_expanded_rect (MetaRegionBuilder *builder,
int x, int x,
int y, int y,
int width, int width,
int height, int height,
int x_amount, int x_amount,
int y_amount, int y_amount,
gboolean flip) gboolean flip)
{ {
if (flip) if (flip)
meta_region_builder_add_rectangle (builder, meta_region_builder_add_rectangle (builder,
y - y_amount, x - x_amount, y - y_amount, x - x_amount,
height + 2 * y_amount, width + 2 * x_amount); height + 2 * y_amount,
width + 2 * x_amount);
else else
meta_region_builder_add_rectangle (builder, meta_region_builder_add_rectangle (builder,
x - x_amount, y - y_amount, x - x_amount, y - y_amount,
width + 2 * x_amount, height + 2 * y_amount); width + 2 * x_amount,
height + 2 * y_amount);
} }
static cairo_region_t * static cairo_region_t *
@ -337,10 +343,14 @@ expand_region_inverse (cairo_region_t *region,
if (iter.line_end) if (iter.line_end)
{ {
if (extents.x + extents.width > iter.rectangle.x + iter.rectangle.width) if (extents.x + extents.width >
iter.rectangle.x + iter.rectangle.width)
add_expanded_rect (&builder, add_expanded_rect (&builder,
iter.rectangle.x + iter.rectangle.width, iter.rectangle.y, iter.rectangle.x + iter.rectangle.width,
(extents.x + extents.width) - (iter.rectangle.x + iter.rectangle.width), iter.rectangle.height, iter.rectangle.y,
(extents.x + extents.width) -
(iter.rectangle.x + iter.rectangle.width),
iter.rectangle.height,
x_amount, y_amount, flip); x_amount, y_amount, flip);
last_x = extents.x; last_x = extents.x;
} }

View File

@ -191,7 +191,7 @@ bell_flash_window_frame (MetaWindow *window)
* flashed state, no matter how loaded we are. * flashed state, no matter how loaded we are.
*/ */
id = g_timeout_add_full (META_PRIORITY_REDRAW, 100, id = g_timeout_add_full (META_PRIORITY_REDRAW, 100,
bell_unflash_frame, window->frame, NULL); bell_unflash_frame, window->frame, NULL);
g_source_set_name_by_id (id, "[mutter] bell_unflash_frame"); g_source_set_name_by_id (id, "[mutter] bell_unflash_frame");
} }
@ -260,9 +260,11 @@ bell_audible_notify (MetaDisplay *display,
if (window) if (window)
{ {
ca_proplist_sets (p, CA_PROP_WINDOW_NAME, window->title); ca_proplist_sets (p, CA_PROP_WINDOW_NAME, window->title);
ca_proplist_setf (p, CA_PROP_WINDOW_X11_XID, "%lu", (unsigned long)window->xwindow); ca_proplist_setf (p, CA_PROP_WINDOW_X11_XID, "%lu",
(unsigned long) window->xwindow);
ca_proplist_sets (p, CA_PROP_APPLICATION_NAME, window->res_name); ca_proplist_sets (p, CA_PROP_APPLICATION_NAME, window->res_name);
ca_proplist_setf (p, CA_PROP_APPLICATION_PROCESS_ID, "%d", window->net_wm_pid); ca_proplist_setf (p, CA_PROP_APPLICATION_PROCESS_ID, "%d",
window->net_wm_pid);
} }
res = ca_context_play_full (ca_gtk_context_get (), 1, p, NULL, NULL); res = ca_context_play_full (ca_gtk_context_get (), 1, p, NULL, NULL);

View File

@ -59,13 +59,15 @@ meta_rectangle_get_type (void)
static GType type_id = 0; static GType type_id = 0;
if (!type_id) if (!type_id)
type_id = g_boxed_type_register_static (g_intern_static_string ("MetaRectangle"), type_id =
(GBoxedCopyFunc) meta_rectangle_copy, g_boxed_type_register_static (g_intern_static_string (
(GBoxedFreeFunc) meta_rectangle_free); "MetaRectangle"),
(GBoxedCopyFunc) meta_rectangle_copy,
(GBoxedFreeFunc) meta_rectangle_free);
return type_id; return type_id;
} }
char* char *
meta_rectangle_to_string (const MetaRectangle *rect, meta_rectangle_to_string (const MetaRectangle *rect,
char *output) char *output)
{ {
@ -79,7 +81,7 @@ meta_rectangle_to_string (const MetaRectangle *rect,
return output; return output;
} }
char* char *
meta_rectangle_region_to_string (GList *region, meta_rectangle_region_to_string (GList *region,
const char *separator_string, const char *separator_string,
char *output) char *output)
@ -111,7 +113,7 @@ meta_rectangle_region_to_string (GList *region,
return output; return output;
} }
char* char *
meta_rectangle_edge_to_string (const MetaEdge *edge, meta_rectangle_edge_to_string (const MetaEdge *edge,
char *output) char *output)
{ {
@ -129,7 +131,7 @@ meta_rectangle_edge_to_string (const MetaEdge *edge,
return output; return output;
} }
char* char *
meta_rectangle_edge_list_to_string (GList *edge_list, meta_rectangle_edge_list_to_string (GList *edge_list,
const char *separator_string, const char *separator_string,
char *output) char *output)
@ -152,7 +154,7 @@ meta_rectangle_edge_list_to_string (GList *edge_list,
while (tmp) while (tmp)
{ {
MetaEdge *edge = tmp->data; MetaEdge *edge = tmp->data;
MetaRectangle *rect = &edge->rect; MetaRectangle *rect = &edge->rect;
g_snprintf (rect_string, EDGE_LENGTH, "([%d,%d +%d,%d], %2d, %2d)", g_snprintf (rect_string, EDGE_LENGTH, "([%d,%d +%d,%d], %2d, %2d)",
rect->x, rect->y, rect->width, rect->height, rect->x, rect->y, rect->width, rect->height,
@ -172,7 +174,7 @@ meta_rect (int x, int y, int width, int height)
MetaRectangle temporary; MetaRectangle temporary;
temporary.x = x; temporary.x = x;
temporary.y = y; temporary.y = y;
temporary.width = width; temporary.width = width;
temporary.height = height; temporary.height = height;
return temporary; return temporary;
@ -197,8 +199,8 @@ meta_rectangle_area (const MetaRectangle *rect)
*/ */
gboolean gboolean
meta_rectangle_intersect (const MetaRectangle *src1, meta_rectangle_intersect (const MetaRectangle *src1,
const MetaRectangle *src2, const MetaRectangle *src2,
MetaRectangle *dest) MetaRectangle *dest)
{ {
int dest_x, dest_y; int dest_x, dest_y;
int dest_w, dest_h; int dest_w, dest_h;
@ -290,8 +292,8 @@ meta_rectangle_overlap (const MetaRectangle *rect1,
g_return_val_if_fail (rect1 != NULL, FALSE); g_return_val_if_fail (rect1 != NULL, FALSE);
g_return_val_if_fail (rect2 != NULL, FALSE); g_return_val_if_fail (rect2 != NULL, FALSE);
return !((rect1->x + rect1->width <= rect2->x) || return !((rect1->x + rect1->width <= rect2->x) ||
(rect2->x + rect2->width <= rect1->x) || (rect2->x + rect2->width <= rect1->x) ||
(rect1->y + rect1->height <= rect2->y) || (rect1->y + rect1->height <= rect2->y) ||
(rect2->y + rect2->height <= rect1->y)); (rect2->y + rect2->height <= rect1->y));
} }
@ -316,7 +318,7 @@ gboolean
meta_rectangle_could_fit_rect (const MetaRectangle *outer_rect, meta_rectangle_could_fit_rect (const MetaRectangle *outer_rect,
const MetaRectangle *inner_rect) const MetaRectangle *inner_rect)
{ {
return (outer_rect->width >= inner_rect->width && return (outer_rect->width >= inner_rect->width &&
outer_rect->height >= inner_rect->height); outer_rect->height >= inner_rect->height);
} }
@ -325,9 +327,9 @@ meta_rectangle_contains_rect (const MetaRectangle *outer_rect,
const MetaRectangle *inner_rect) const MetaRectangle *inner_rect)
{ {
return return
inner_rect->x >= outer_rect->x && inner_rect->x >= outer_rect->x &&
inner_rect->y >= outer_rect->y && inner_rect->y >= outer_rect->y &&
inner_rect->x + inner_rect->width <= outer_rect->x + outer_rect->width && inner_rect->x + inner_rect->width <= outer_rect->x + outer_rect->width &&
inner_rect->y + inner_rect->height <= outer_rect->y + outer_rect->height; inner_rect->y + inner_rect->height <= outer_rect->y + outer_rect->height;
} }
@ -378,7 +380,7 @@ meta_rectangle_resize_with_gravity (const MetaRectangle *old_rect,
* would cause drift. * would cause drift.
*/ */
new_width -= (old_rect->width - new_width) % 2; new_width -= (old_rect->width - new_width) % 2;
rect->x = old_rect->x + (old_rect->width - new_width)/2; rect->x = old_rect->x + (old_rect->width - new_width) / 2;
break; break;
case NorthEastGravity: case NorthEastGravity:
@ -410,7 +412,7 @@ meta_rectangle_resize_with_gravity (const MetaRectangle *old_rect,
* would cause drift. * would cause drift.
*/ */
new_height -= (old_rect->height - new_height) % 2; new_height -= (old_rect->height - new_height) % 2;
rect->y = old_rect->y + (old_rect->height - new_height)/2; rect->y = old_rect->y + (old_rect->height - new_height) / 2;
break; break;
case SouthWestGravity: case SouthWestGravity:
@ -428,7 +430,7 @@ meta_rectangle_resize_with_gravity (const MetaRectangle *old_rect,
} }
/* Not so simple helper function for get_minimal_spanning_set_for_region() */ /* Not so simple helper function for get_minimal_spanning_set_for_region() */
static GList* static GList *
merge_spanning_rects_in_region (GList *region) merge_spanning_rects_in_region (GList *region)
{ {
/* NOTE FOR ANY OPTIMIZATION PEOPLE OUT THERE: Please see the /* NOTE FOR ANY OPTIMIZATION PEOPLE OUT THERE: Please see the
@ -436,7 +438,7 @@ merge_spanning_rects_in_region (GList *region)
* considerations that also apply to this function. * considerations that also apply to this function.
*/ */
GList* compare; GList *compare;
compare = region; compare = region;
if (region == NULL) if (region == NULL)
@ -528,7 +530,6 @@ merge_spanning_rects_in_region (GList *region)
g_free (delete_me->data); g_free (delete_me->data);
region = g_list_delete_link (region, delete_me); region = g_list_delete_link (region, delete_me);
} }
} }
compare = compare->next; compare = compare->next;
@ -590,10 +591,10 @@ check_strut_align (MetaStrut *strut, const MetaRectangle *rect)
* *
* Returns: (transfer full) (element-type Meta.Rectangle): Minimal spanning set * Returns: (transfer full) (element-type Meta.Rectangle): Minimal spanning set
*/ */
GList* GList *
meta_rectangle_get_minimal_spanning_set_for_region ( meta_rectangle_get_minimal_spanning_set_for_region (
const MetaRectangle *basic_rect, const MetaRectangle *basic_rect,
const GSList *all_struts) const GSList *all_struts)
{ {
/* NOTE FOR OPTIMIZERS: This function *might* be somewhat slow, /* NOTE FOR OPTIMIZERS: This function *might* be somewhat slow,
* especially due to the call to merge_spanning_rects_in_region() (which * especially due to the call to merge_spanning_rects_in_region() (which
@ -631,9 +632,9 @@ meta_rectangle_get_minimal_spanning_set_for_region (
* URL splitting.) * URL splitting.)
*/ */
GList *ret; GList *ret;
GList *tmp_list; GList *tmp_list;
const GSList *strut_iter; const GSList *strut_iter;
MetaRectangle *temp_rect; MetaRectangle *temp_rect;
/* The algorithm is basically as follows: /* The algorithm is basically as follows:
@ -654,7 +655,7 @@ meta_rectangle_get_minimal_spanning_set_for_region (
for (strut_iter = all_struts; strut_iter; strut_iter = strut_iter->next) for (strut_iter = all_struts; strut_iter; strut_iter = strut_iter->next)
{ {
GList *rect_iter; GList *rect_iter;
MetaStrut *strut = (MetaStrut*)strut_iter->data; MetaStrut *strut = (MetaStrut *) strut_iter->data;
MetaRectangle *strut_rect = &strut->rect; MetaRectangle *strut_rect = &strut->rect;
tmp_list = ret; tmp_list = ret;
@ -662,7 +663,7 @@ meta_rectangle_get_minimal_spanning_set_for_region (
rect_iter = tmp_list; rect_iter = tmp_list;
while (rect_iter) while (rect_iter)
{ {
MetaRectangle *rect = (MetaRectangle*) rect_iter->data; MetaRectangle *rect = (MetaRectangle *) rect_iter->data;
if (!meta_rectangle_overlap (strut_rect, rect) || if (!meta_rectangle_overlap (strut_rect, rect) ||
!check_strut_align (strut, basic_rect)) !check_strut_align (strut, basic_rect))
@ -684,7 +685,7 @@ meta_rectangle_get_minimal_spanning_set_for_region (
temp_rect = g_new (MetaRectangle, 1); temp_rect = g_new (MetaRectangle, 1);
*temp_rect = *rect; *temp_rect = *rect;
new_x = BOX_RIGHT (*strut_rect); new_x = BOX_RIGHT (*strut_rect);
temp_rect->width = BOX_RIGHT(*rect) - new_x; temp_rect->width = BOX_RIGHT (*rect) - new_x;
temp_rect->x = new_x; temp_rect->x = new_x;
ret = g_list_prepend (ret, temp_rect); ret = g_list_prepend (ret, temp_rect);
} }
@ -727,12 +728,12 @@ meta_rectangle_get_minimal_spanning_set_for_region (
* meta_rectangle_expand_region: (skip) * meta_rectangle_expand_region: (skip)
* *
*/ */
GList* GList *
meta_rectangle_expand_region (GList *region, meta_rectangle_expand_region (GList *region,
const int left_expand, const int left_expand,
const int right_expand, const int right_expand,
const int top_expand, const int top_expand,
const int bottom_expand) const int bottom_expand)
{ {
return meta_rectangle_expand_region_conditionally (region, return meta_rectangle_expand_region_conditionally (region,
left_expand, left_expand,
@ -747,27 +748,27 @@ meta_rectangle_expand_region (GList *region,
* meta_rectangle_expand_region_conditionally: (skip) * meta_rectangle_expand_region_conditionally: (skip)
* *
*/ */
GList* GList *
meta_rectangle_expand_region_conditionally (GList *region, meta_rectangle_expand_region_conditionally (GList *region,
const int left_expand, const int left_expand,
const int right_expand, const int right_expand,
const int top_expand, const int top_expand,
const int bottom_expand, const int bottom_expand,
const int min_x, const int min_x,
const int min_y) const int min_y)
{ {
GList *tmp_list = region; GList *tmp_list = region;
while (tmp_list) while (tmp_list)
{ {
MetaRectangle *rect = (MetaRectangle*) tmp_list->data; MetaRectangle *rect = (MetaRectangle *) tmp_list->data;
if (rect->width >= min_x) if (rect->width >= min_x)
{ {
rect->x -= left_expand; rect->x -= left_expand;
rect->width += (left_expand + right_expand); rect->width += (left_expand + right_expand);
} }
if (rect->height >= min_y) if (rect->height >= min_y)
{ {
rect->y -= top_expand; rect->y -= top_expand;
rect->height += (top_expand + bottom_expand); rect->height += (top_expand + bottom_expand);
} }
tmp_list = tmp_list->next; tmp_list = tmp_list->next;
@ -790,16 +791,16 @@ meta_rectangle_expand_to_avoiding_struts (MetaRectangle *rect,
* horizontal directions (exclusive-)or both vertical directions. * horizontal directions (exclusive-)or both vertical directions.
*/ */
g_assert ((direction == META_DIRECTION_HORIZONTAL) ^ g_assert ((direction == META_DIRECTION_HORIZONTAL) ^
(direction == META_DIRECTION_VERTICAL )); (direction == META_DIRECTION_VERTICAL));
if (direction == META_DIRECTION_HORIZONTAL) if (direction == META_DIRECTION_HORIZONTAL)
{ {
rect->x = expand_to->x; rect->x = expand_to->x;
rect->width = expand_to->width; rect->width = expand_to->width;
} }
else else
{ {
rect->y = expand_to->y; rect->y = expand_to->y;
rect->height = expand_to->height; rect->height = expand_to->height;
} }
@ -807,7 +808,7 @@ meta_rectangle_expand_to_avoiding_struts (MetaRectangle *rect,
/* Run over all struts */ /* Run over all struts */
for (strut_iter = all_struts; strut_iter; strut_iter = strut_iter->next) for (strut_iter = all_struts; strut_iter; strut_iter = strut_iter->next)
{ {
MetaStrut *strut = (MetaStrut*) strut_iter->data; MetaStrut *strut = (MetaStrut *) strut_iter->data;
/* Skip struts that don't overlap */ /* Skip struts that don't overlap */
if (!meta_rectangle_overlap (&strut->rect, rect)) if (!meta_rectangle_overlap (&strut->rect, rect))
@ -817,13 +818,13 @@ meta_rectangle_expand_to_avoiding_struts (MetaRectangle *rect,
{ {
if (strut->side == META_SIDE_LEFT) if (strut->side == META_SIDE_LEFT)
{ {
int offset = BOX_RIGHT(strut->rect) - BOX_LEFT(*rect); int offset = BOX_RIGHT (strut->rect) - BOX_LEFT (*rect);
rect->x += offset; rect->x += offset;
rect->width -= offset; rect->width -= offset;
} }
else if (strut->side == META_SIDE_RIGHT) else if (strut->side == META_SIDE_RIGHT)
{ {
int offset = BOX_RIGHT (*rect) - BOX_LEFT(strut->rect); int offset = BOX_RIGHT (*rect) - BOX_LEFT (strut->rect);
rect->width -= offset; rect->width -= offset;
} }
/* else ignore the strut */ /* else ignore the strut */
@ -832,13 +833,13 @@ meta_rectangle_expand_to_avoiding_struts (MetaRectangle *rect,
{ {
if (strut->side == META_SIDE_TOP) if (strut->side == META_SIDE_TOP)
{ {
int offset = BOX_BOTTOM(strut->rect) - BOX_TOP(*rect); int offset = BOX_BOTTOM (strut->rect) - BOX_TOP (*rect);
rect->y += offset; rect->y += offset;
rect->height -= offset; rect->height -= offset;
} }
else if (strut->side == META_SIDE_BOTTOM) else if (strut->side == META_SIDE_BOTTOM)
{ {
int offset = BOX_BOTTOM(*rect) - BOX_TOP(strut->rect); int offset = BOX_BOTTOM (*rect) - BOX_TOP (strut->rect);
rect->height -= offset; rect->height -= offset;
} }
/* else ignore the strut */ /* else ignore the strut */
@ -850,7 +851,7 @@ void
meta_rectangle_free_list_and_elements (GList *filled_list) meta_rectangle_free_list_and_elements (GList *filled_list)
{ {
g_list_foreach (filled_list, g_list_foreach (filled_list,
(void (*)(gpointer,gpointer))&g_free, /* ew, for ugly */ (void (*)(gpointer, gpointer)) & g_free, /* ew, for ugly */
NULL); NULL);
g_list_free (filled_list); g_list_free (filled_list);
} }
@ -860,7 +861,7 @@ meta_rectangle_could_fit_in_region (const GList *spanning_rects,
const MetaRectangle *rect) const MetaRectangle *rect)
{ {
const GList *temp; const GList *temp;
gboolean could_fit; gboolean could_fit;
temp = spanning_rects; temp = spanning_rects;
could_fit = FALSE; could_fit = FALSE;
@ -878,7 +879,7 @@ meta_rectangle_contained_in_region (const GList *spanning_rects,
const MetaRectangle *rect) const MetaRectangle *rect)
{ {
const GList *temp; const GList *temp;
gboolean contained; gboolean contained;
temp = spanning_rects; temp = spanning_rects;
contained = FALSE; contained = FALSE;
@ -896,7 +897,7 @@ meta_rectangle_overlaps_with_region (const GList *spanning_rects,
const MetaRectangle *rect) const MetaRectangle *rect)
{ {
const GList *temp; const GList *temp;
gboolean overlaps; gboolean overlaps;
temp = spanning_rects; temp = spanning_rects;
overlaps = FALSE; overlaps = FALSE;
@ -918,7 +919,7 @@ meta_rectangle_clamp_to_fit_into_region (const GList *spanning_rects,
{ {
const GList *temp; const GList *temp;
const MetaRectangle *best_rect = NULL; const MetaRectangle *best_rect = NULL;
int best_overlap = 0; int best_overlap = 0;
/* First, find best rectangle from spanning_rects to which we can clamp /* First, find best rectangle from spanning_rects to which we can clamp
* rect to fit into. * rect to fit into.
@ -926,7 +927,7 @@ meta_rectangle_clamp_to_fit_into_region (const GList *spanning_rects,
for (temp = spanning_rects; temp; temp = temp->next) for (temp = spanning_rects; temp; temp = temp->next)
{ {
MetaRectangle *compare_rect = temp->data; MetaRectangle *compare_rect = temp->data;
int maximal_overlap_amount_for_compare; int maximal_overlap_amount_for_compare;
/* If x is fixed and the entire width of rect doesn't fit in compare, /* If x is fixed and the entire width of rect doesn't fit in compare,
* skip this rectangle. * skip this rectangle.
@ -945,19 +946,19 @@ meta_rectangle_clamp_to_fit_into_region (const GList *spanning_rects,
continue; continue;
/* If compare can't hold the min_size window, skip this rectangle. */ /* If compare can't hold the min_size window, skip this rectangle. */
if (compare_rect->width < min_size->width || if (compare_rect->width < min_size->width ||
compare_rect->height < min_size->height) compare_rect->height < min_size->height)
continue; continue;
/* Determine maximal overlap amount */ /* Determine maximal overlap amount */
maximal_overlap_amount_for_compare = maximal_overlap_amount_for_compare =
MIN (rect->width, compare_rect->width) * MIN (rect->width, compare_rect->width) *
MIN (rect->height, compare_rect->height); MIN (rect->height, compare_rect->height);
/* See if this is the best rect so far */ /* See if this is the best rect so far */
if (maximal_overlap_amount_for_compare > best_overlap) if (maximal_overlap_amount_for_compare > best_overlap)
{ {
best_rect = compare_rect; best_rect = compare_rect;
best_overlap = maximal_overlap_amount_for_compare; best_overlap = maximal_overlap_amount_for_compare;
} }
} }
@ -969,25 +970,25 @@ meta_rectangle_clamp_to_fit_into_region (const GList *spanning_rects,
/* If it doesn't fit, at least make it no bigger than it has to be */ /* If it doesn't fit, at least make it no bigger than it has to be */
if (!(fixed_directions & FIXED_DIRECTION_X)) if (!(fixed_directions & FIXED_DIRECTION_X))
rect->width = min_size->width; rect->width = min_size->width;
if (!(fixed_directions & FIXED_DIRECTION_Y)) if (!(fixed_directions & FIXED_DIRECTION_Y))
rect->height = min_size->height; rect->height = min_size->height;
} }
else else
{ {
rect->width = MIN (rect->width, best_rect->width); rect->width = MIN (rect->width, best_rect->width);
rect->height = MIN (rect->height, best_rect->height); rect->height = MIN (rect->height, best_rect->height);
} }
} }
void void
meta_rectangle_clip_to_region (const GList *spanning_rects, meta_rectangle_clip_to_region (const GList *spanning_rects,
FixedDirections fixed_directions, FixedDirections fixed_directions,
MetaRectangle *rect) MetaRectangle *rect)
{ {
const GList *temp; const GList *temp;
const MetaRectangle *best_rect = NULL; const MetaRectangle *best_rect = NULL;
int best_overlap = 0; int best_overlap = 0;
/* First, find best rectangle from spanning_rects to which we will clip /* First, find best rectangle from spanning_rects to which we will clip
* rect into. * rect into.
@ -995,8 +996,8 @@ meta_rectangle_clip_to_region (const GList *spanning_rects,
for (temp = spanning_rects; temp; temp = temp->next) for (temp = spanning_rects; temp; temp = temp->next)
{ {
MetaRectangle *compare_rect = temp->data; MetaRectangle *compare_rect = temp->data;
MetaRectangle overlap; MetaRectangle overlap;
int maximal_overlap_amount_for_compare; int maximal_overlap_amount_for_compare;
/* If x is fixed and the entire width of rect doesn't fit in compare, /* If x is fixed and the entire width of rect doesn't fit in compare,
* skip the rectangle. * skip the rectangle.
@ -1021,7 +1022,7 @@ meta_rectangle_clip_to_region (const GList *spanning_rects,
/* See if this is the best rect so far */ /* See if this is the best rect so far */
if (maximal_overlap_amount_for_compare > best_overlap) if (maximal_overlap_amount_for_compare > best_overlap)
{ {
best_rect = compare_rect; best_rect = compare_rect;
best_overlap = maximal_overlap_amount_for_compare; best_overlap = maximal_overlap_amount_for_compare;
} }
} }
@ -1040,7 +1041,7 @@ meta_rectangle_clip_to_region (const GList *spanning_rects,
{ {
/* Find the new left and right */ /* Find the new left and right */
int new_x = MAX (rect->x, best_rect->x); int new_x = MAX (rect->x, best_rect->x);
rect->width = MIN ((rect->x + rect->width) - new_x, rect->width = MIN ((rect->x + rect->width) - new_x,
(best_rect->x + best_rect->width) - new_x); (best_rect->x + best_rect->width) - new_x);
rect->x = new_x; rect->x = new_x;
} }
@ -1052,7 +1053,7 @@ meta_rectangle_clip_to_region (const GList *spanning_rects,
{ {
/* Clip the top, if needed */ /* Clip the top, if needed */
int new_y = MAX (rect->y, best_rect->y); int new_y = MAX (rect->y, best_rect->y);
rect->height = MIN ((rect->y + rect->height) - new_y, rect->height = MIN ((rect->y + rect->height) - new_y,
(best_rect->y + best_rect->height) - new_y); (best_rect->y + best_rect->height) - new_y);
rect->y = new_y; rect->y = new_y;
} }
@ -1060,14 +1061,14 @@ meta_rectangle_clip_to_region (const GList *spanning_rects,
} }
void void
meta_rectangle_shove_into_region (const GList *spanning_rects, meta_rectangle_shove_into_region (const GList *spanning_rects,
FixedDirections fixed_directions, FixedDirections fixed_directions,
MetaRectangle *rect) MetaRectangle *rect)
{ {
const GList *temp; const GList *temp;
const MetaRectangle *best_rect = NULL; const MetaRectangle *best_rect = NULL;
int best_overlap = 0; int best_overlap = 0;
int shortest_distance = G_MAXINT; int shortest_distance = G_MAXINT;
/* First, find best rectangle from spanning_rects to which we will shove /* First, find best rectangle from spanning_rects to which we will shove
* rect into. * rect into.
@ -1076,8 +1077,8 @@ meta_rectangle_shove_into_region (const GList *spanning_rects,
for (temp = spanning_rects; temp; temp = temp->next) for (temp = spanning_rects; temp; temp = temp->next)
{ {
MetaRectangle *compare_rect = temp->data; MetaRectangle *compare_rect = temp->data;
int maximal_overlap_amount_for_compare; int maximal_overlap_amount_for_compare;
int dist_to_compare; int dist_to_compare;
/* If x is fixed and the entire width of rect doesn't fit in compare, /* If x is fixed and the entire width of rect doesn't fit in compare,
* skip this rectangle. * skip this rectangle.
@ -1097,7 +1098,7 @@ meta_rectangle_shove_into_region (const GList *spanning_rects,
/* Determine maximal overlap amount between rect & compare_rect */ /* Determine maximal overlap amount between rect & compare_rect */
maximal_overlap_amount_for_compare = maximal_overlap_amount_for_compare =
MIN (rect->width, compare_rect->width) * MIN (rect->width, compare_rect->width) *
MIN (rect->height, compare_rect->height); MIN (rect->height, compare_rect->height);
/* Determine distance necessary to put rect into compare_rect */ /* Determine distance necessary to put rect into compare_rect */
@ -1116,10 +1117,10 @@ meta_rectangle_shove_into_region (const GList *spanning_rects,
/* See if this is the best rect so far */ /* See if this is the best rect so far */
if ((maximal_overlap_amount_for_compare > best_overlap) || if ((maximal_overlap_amount_for_compare > best_overlap) ||
(maximal_overlap_amount_for_compare == best_overlap && (maximal_overlap_amount_for_compare == best_overlap &&
dist_to_compare < shortest_distance)) dist_to_compare < shortest_distance))
{ {
best_rect = compare_rect; best_rect = compare_rect;
best_overlap = maximal_overlap_amount_for_compare; best_overlap = maximal_overlap_amount_for_compare;
shortest_distance = dist_to_compare; shortest_distance = dist_to_compare;
} }
} }
@ -1162,12 +1163,12 @@ meta_rectangle_shove_into_region (const GList *spanning_rects,
} }
void void
meta_rectangle_find_linepoint_closest_to_point (double x1, meta_rectangle_find_linepoint_closest_to_point (double x1,
double y1, double y1,
double x2, double x2,
double y2, double y2,
double px, double px,
double py, double py,
double *valx, double *valx,
double *valy) double *valy)
{ {
@ -1237,18 +1238,18 @@ meta_rectangle_edge_aligns (const MetaRectangle *rect, const MetaEdge *edge)
{ {
case META_SIDE_LEFT: case META_SIDE_LEFT:
case META_SIDE_RIGHT: case META_SIDE_RIGHT:
return BOX_TOP (*rect) <= BOX_BOTTOM (edge->rect) && return BOX_TOP (*rect) <= BOX_BOTTOM (edge->rect) &&
BOX_TOP (edge->rect) <= BOX_BOTTOM (*rect); BOX_TOP (edge->rect) <= BOX_BOTTOM (*rect);
case META_SIDE_TOP: case META_SIDE_TOP:
case META_SIDE_BOTTOM: case META_SIDE_BOTTOM:
return BOX_LEFT (*rect) <= BOX_RIGHT (edge->rect) && return BOX_LEFT (*rect) <= BOX_RIGHT (edge->rect) &&
BOX_LEFT (edge->rect) <= BOX_RIGHT (*rect); BOX_LEFT (edge->rect) <= BOX_RIGHT (*rect);
default: default:
g_assert_not_reached (); g_assert_not_reached ();
} }
} }
static GList* static GList *
get_rect_minus_overlap (const GList *rect_in_list, get_rect_minus_overlap (const GList *rect_in_list,
MetaRectangle *overlap) MetaRectangle *overlap)
{ {
@ -1274,18 +1275,18 @@ get_rect_minus_overlap (const GList *rect_in_list,
if (BOX_TOP (*rect) < BOX_TOP (*overlap)) if (BOX_TOP (*rect) < BOX_TOP (*overlap))
{ {
temp = g_new (MetaRectangle, 1); temp = g_new (MetaRectangle, 1);
temp->x = overlap->x; temp->x = overlap->x;
temp->width = overlap->width; temp->width = overlap->width;
temp->y = BOX_TOP (*rect); temp->y = BOX_TOP (*rect);
temp->height = BOX_TOP (*overlap) - BOX_TOP (*rect); temp->height = BOX_TOP (*overlap) - BOX_TOP (*rect);
ret = g_list_prepend (ret, temp); ret = g_list_prepend (ret, temp);
} }
if (BOX_BOTTOM (*rect) > BOX_BOTTOM (*overlap)) if (BOX_BOTTOM (*rect) > BOX_BOTTOM (*overlap))
{ {
temp = g_new (MetaRectangle, 1); temp = g_new (MetaRectangle, 1);
temp->x = overlap->x; temp->x = overlap->x;
temp->width = overlap->width; temp->width = overlap->width;
temp->y = BOX_BOTTOM (*overlap); temp->y = BOX_BOTTOM (*overlap);
temp->height = BOX_BOTTOM (*rect) - BOX_BOTTOM (*overlap); temp->height = BOX_BOTTOM (*rect) - BOX_BOTTOM (*overlap);
ret = g_list_prepend (ret, temp); ret = g_list_prepend (ret, temp);
} }
@ -1293,7 +1294,7 @@ get_rect_minus_overlap (const GList *rect_in_list,
return ret; return ret;
} }
static GList* static GList *
replace_rect_with_list (GList *old_element, replace_rect_with_list (GList *old_element,
GList *new_list) GList *new_list)
{ {
@ -1334,7 +1335,7 @@ replace_rect_with_list (GList *old_element,
* that aren't disjoint in a way that the overlapping part is only included * that aren't disjoint in a way that the overlapping part is only included
* once, so it's not really magic...). * once, so it's not really magic...).
*/ */
static GList* static GList *
get_disjoint_strut_rect_list_in_region (const GSList *old_struts, get_disjoint_strut_rect_list_in_region (const GSList *old_struts,
const MetaRectangle *region) const MetaRectangle *region)
{ {
@ -1345,7 +1346,7 @@ get_disjoint_strut_rect_list_in_region (const GSList *old_struts,
strut_rects = NULL; strut_rects = NULL;
while (old_struts) while (old_struts)
{ {
MetaRectangle *cur = &((MetaStrut*)old_struts->data)->rect; MetaRectangle *cur = &((MetaStrut *) old_struts->data)->rect;
MetaRectangle *copy = g_new (MetaRectangle, 1); MetaRectangle *copy = g_new (MetaRectangle, 1);
*copy = *cur; *copy = *cur;
if (meta_rectangle_intersect (copy, region, copy)) if (meta_rectangle_intersect (copy, region, copy))
@ -1377,7 +1378,7 @@ get_disjoint_strut_rect_list_in_region (const GSList *old_struts,
/* Get a list of rectangles for each strut that don't overlap /* Get a list of rectangles for each strut that don't overlap
* the intersection region. * the intersection region.
*/ */
GList *cur_leftover = get_rect_minus_overlap (tmp, &overlap); GList *cur_leftover = get_rect_minus_overlap (tmp, &overlap);
GList *comp_leftover = get_rect_minus_overlap (compare, &overlap); GList *comp_leftover = get_rect_minus_overlap (compare, &overlap);
/* Add the intersection region to cur_leftover */ /* Add the intersection region to cur_leftover */
@ -1392,7 +1393,7 @@ get_disjoint_strut_rect_list_in_region (const GSList *old_struts,
tmp = strut_rects; tmp = strut_rects;
} }
else else
tmp = replace_rect_with_list (tmp, cur_leftover); tmp = replace_rect_with_list (tmp, cur_leftover);
compare = replace_rect_with_list (compare, comp_leftover); compare = replace_rect_with_list (compare, comp_leftover);
if (compare == NULL) if (compare == NULL)
@ -1420,7 +1421,7 @@ meta_rectangle_edge_cmp_ignore_type (gconstpointer a, gconstpointer b)
/* Edges must be both vertical or both horizontal, or it doesn't make /* Edges must be both vertical or both horizontal, or it doesn't make
* sense to compare them. * sense to compare them.
*/ */
g_assert ((a_edge_rect->rect.width == 0 && b_edge_rect->rect.width == 0) || g_assert ((a_edge_rect->rect.width == 0 && b_edge_rect->rect.width == 0) ||
(a_edge_rect->rect.height == 0 && b_edge_rect->rect.height == 0)); (a_edge_rect->rect.height == 0 && b_edge_rect->rect.height == 0));
a_compare = b_compare = 0; /* gcc-3.4.2 sucks at figuring initialized'ness */ a_compare = b_compare = 0; /* gcc-3.4.2 sucks at figuring initialized'ness */
@ -1498,7 +1499,7 @@ rectangle_and_edge_intersection (const MetaRectangle *rect,
MetaEdge *overlap, MetaEdge *overlap,
int *handle_type) int *handle_type)
{ {
const MetaRectangle *rect2 = &edge->rect; const MetaRectangle *rect2 = &edge->rect;
MetaRectangle *result = &overlap->rect; MetaRectangle *result = &overlap->rect;
gboolean intersect = TRUE; gboolean intersect = TRUE;
@ -1509,13 +1510,13 @@ rectangle_and_edge_intersection (const MetaRectangle *rect,
/* Figure out what the intersection is */ /* Figure out what the intersection is */
result->x = MAX (rect->x, rect2->x); result->x = MAX (rect->x, rect2->x);
result->y = MAX (rect->y, rect2->y); result->y = MAX (rect->y, rect2->y);
result->width = MIN (BOX_RIGHT (*rect), BOX_RIGHT (*rect2)) - result->x; result->width = MIN (BOX_RIGHT (*rect), BOX_RIGHT (*rect2)) - result->x;
result->height = MIN (BOX_BOTTOM (*rect), BOX_BOTTOM (*rect2)) - result->y; result->height = MIN (BOX_BOTTOM (*rect), BOX_BOTTOM (*rect2)) - result->y;
/* Find out if the intersection is empty; have to do it this way since /* Find out if the intersection is empty; have to do it this way since
* edges have a thickness of 0 * edges have a thickness of 0
*/ */
if ((result->width < 0 || result->height < 0) || if ((result->width < 0 || result->height < 0) ||
(result->width == 0 && result->height == 0)) (result->width == 0 && result->height == 0))
{ {
result->width = 0; result->width = 0;
@ -1576,7 +1577,7 @@ rectangle_and_edge_intersection (const MetaRectangle *rect,
* rect_is_internal is false, the side types are switched (LEFT<->RIGHT and * rect_is_internal is false, the side types are switched (LEFT<->RIGHT and
* TOP<->BOTTOM). * TOP<->BOTTOM).
*/ */
static GList* static GList *
add_edges (GList *cur_edges, add_edges (GList *cur_edges,
const MetaRectangle *rect, const MetaRectangle *rect,
gboolean rect_is_internal) gboolean rect_is_internal)
@ -1584,7 +1585,7 @@ add_edges (GList *cur_edges,
MetaEdge *temp_edge; MetaEdge *temp_edge;
int i; int i;
for (i=0; i<4; i++) for (i = 0; i < 4; i++)
{ {
temp_edge = g_new (MetaEdge, 1); temp_edge = g_new (MetaEdge, 1);
temp_edge->rect = *rect; temp_edge->rect = *rect;
@ -1598,8 +1599,8 @@ add_edges (GList *cur_edges,
case 1: case 1:
temp_edge->side_type = temp_edge->side_type =
rect_is_internal ? META_SIDE_RIGHT : META_SIDE_LEFT; rect_is_internal ? META_SIDE_RIGHT : META_SIDE_LEFT;
temp_edge->rect.x += temp_edge->rect.width; temp_edge->rect.x += temp_edge->rect.width;
temp_edge->rect.width = 0; temp_edge->rect.width = 0;
break; break;
case 2: case 2:
temp_edge->side_type = temp_edge->side_type =
@ -1609,8 +1610,8 @@ add_edges (GList *cur_edges,
case 3: case 3:
temp_edge->side_type = temp_edge->side_type =
rect_is_internal ? META_SIDE_BOTTOM : META_SIDE_TOP; rect_is_internal ? META_SIDE_BOTTOM : META_SIDE_TOP;
temp_edge->rect.y += temp_edge->rect.height; temp_edge->rect.y += temp_edge->rect.height;
temp_edge->rect.height = 0; temp_edge->rect.height = 0;
break; break;
} }
temp_edge->edge_type = META_EDGE_SCREEN; temp_edge->edge_type = META_EDGE_SCREEN;
@ -1623,8 +1624,8 @@ add_edges (GList *cur_edges,
/* Remove any part of old_edge that intersects remove and add any resulting /* Remove any part of old_edge that intersects remove and add any resulting
* edges to cur_list. Return cur_list when finished. * edges to cur_list. Return cur_list when finished.
*/ */
static GList* static GList *
split_edge (GList *cur_list, split_edge (GList *cur_list,
const MetaEdge *old_edge, const MetaEdge *old_edge,
const MetaEdge *remove) const MetaEdge *remove)
{ {
@ -1634,42 +1635,42 @@ split_edge (GList *cur_list,
case META_SIDE_LEFT: case META_SIDE_LEFT:
case META_SIDE_RIGHT: case META_SIDE_RIGHT:
g_assert (meta_rectangle_vert_overlap (&old_edge->rect, &remove->rect)); g_assert (meta_rectangle_vert_overlap (&old_edge->rect, &remove->rect));
if (BOX_TOP (old_edge->rect) < BOX_TOP (remove->rect)) if (BOX_TOP (old_edge->rect) < BOX_TOP (remove->rect))
{ {
temp_edge = g_new (MetaEdge, 1); temp_edge = g_new (MetaEdge, 1);
*temp_edge = *old_edge; *temp_edge = *old_edge;
temp_edge->rect.height = BOX_TOP (remove->rect) temp_edge->rect.height = BOX_TOP (remove->rect)
- BOX_TOP (old_edge->rect); - BOX_TOP (old_edge->rect);
cur_list = g_list_prepend (cur_list, temp_edge); cur_list = g_list_prepend (cur_list, temp_edge);
} }
if (BOX_BOTTOM (old_edge->rect) > BOX_BOTTOM (remove->rect)) if (BOX_BOTTOM (old_edge->rect) > BOX_BOTTOM (remove->rect))
{ {
temp_edge = g_new (MetaEdge, 1); temp_edge = g_new (MetaEdge, 1);
*temp_edge = *old_edge; *temp_edge = *old_edge;
temp_edge->rect.y = BOX_BOTTOM (remove->rect); temp_edge->rect.y = BOX_BOTTOM (remove->rect);
temp_edge->rect.height = BOX_BOTTOM (old_edge->rect) temp_edge->rect.height = BOX_BOTTOM (old_edge->rect)
- BOX_BOTTOM (remove->rect); - BOX_BOTTOM (remove->rect);
cur_list = g_list_prepend (cur_list, temp_edge); cur_list = g_list_prepend (cur_list, temp_edge);
} }
break; break;
case META_SIDE_TOP: case META_SIDE_TOP:
case META_SIDE_BOTTOM: case META_SIDE_BOTTOM:
g_assert (meta_rectangle_horiz_overlap (&old_edge->rect, &remove->rect)); g_assert (meta_rectangle_horiz_overlap (&old_edge->rect, &remove->rect));
if (BOX_LEFT (old_edge->rect) < BOX_LEFT (remove->rect)) if (BOX_LEFT (old_edge->rect) < BOX_LEFT (remove->rect))
{ {
temp_edge = g_new (MetaEdge, 1); temp_edge = g_new (MetaEdge, 1);
*temp_edge = *old_edge; *temp_edge = *old_edge;
temp_edge->rect.width = BOX_LEFT (remove->rect) temp_edge->rect.width = BOX_LEFT (remove->rect)
- BOX_LEFT (old_edge->rect); - BOX_LEFT (old_edge->rect);
cur_list = g_list_prepend (cur_list, temp_edge); cur_list = g_list_prepend (cur_list, temp_edge);
} }
if (BOX_RIGHT (old_edge->rect) > BOX_RIGHT (remove->rect)) if (BOX_RIGHT (old_edge->rect) > BOX_RIGHT (remove->rect))
{ {
temp_edge = g_new (MetaEdge, 1); temp_edge = g_new (MetaEdge, 1);
*temp_edge = *old_edge; *temp_edge = *old_edge;
temp_edge->rect.x = BOX_RIGHT (remove->rect); temp_edge->rect.x = BOX_RIGHT (remove->rect);
temp_edge->rect.width = BOX_RIGHT (old_edge->rect) temp_edge->rect.width = BOX_RIGHT (old_edge->rect)
- BOX_RIGHT (remove->rect); - BOX_RIGHT (remove->rect);
cur_list = g_list_prepend (cur_list, temp_edge); cur_list = g_list_prepend (cur_list, temp_edge);
} }
break; break;
@ -1684,12 +1685,12 @@ split_edge (GList *cur_list,
* if and how rect and edge intersect. * if and how rect and edge intersect.
*/ */
static void static void
fix_up_edges (MetaRectangle *rect, MetaEdge *edge, fix_up_edges (MetaRectangle *rect, MetaEdge *edge,
GList **strut_edges, GList **edge_splits, GList **strut_edges, GList **edge_splits,
gboolean *edge_needs_removal) gboolean *edge_needs_removal)
{ {
MetaEdge overlap; MetaEdge overlap;
int handle_type; int handle_type;
if (!rectangle_and_edge_intersection (rect, edge, &overlap, &handle_type)) if (!rectangle_and_edge_intersection (rect, edge, &overlap, &handle_type))
return; return;
@ -1734,10 +1735,9 @@ fix_up_edges (MetaRectangle *rect, MetaEdge *edge,
* This function removes intersections of edges with the rectangles from the * This function removes intersections of edges with the rectangles from the
* list of edges. * list of edges.
*/ */
GList* GList *
meta_rectangle_remove_intersections_with_boxes_from_edges ( meta_rectangle_remove_intersections_with_boxes_from_edges (GList *edges,
GList *edges, const GSList *rectangles)
const GSList *rectangles)
{ {
const GSList *rect_iter; const GSList *rect_iter;
const int opposing = 1; const int opposing = 1;
@ -1752,13 +1752,12 @@ meta_rectangle_remove_intersections_with_boxes_from_edges (
{ {
MetaEdge *edge = edge_iter->data; MetaEdge *edge = edge_iter->data;
MetaEdge overlap; MetaEdge overlap;
int handle; int handle;
gboolean edge_iter_advanced = FALSE; gboolean edge_iter_advanced = FALSE;
/* If this edge overlaps with this rect... */ /* If this edge overlaps with this rect... */
if (rectangle_and_edge_intersection (rect, edge, &overlap, &handle)) if (rectangle_and_edge_intersection (rect, edge, &overlap, &handle))
{ {
/* "Intersections" where the edges touch but are opposite /* "Intersections" where the edges touch but are opposite
* sides (e.g. a left edge against the right edge) should not * sides (e.g. a left edge against the right edge) should not
* be split. Note that the comments in * be split. Note that the comments in
@ -1802,14 +1801,14 @@ meta_rectangle_remove_intersections_with_boxes_from_edges (
* *
* This function is trying to find all the edges of an onscreen region. * This function is trying to find all the edges of an onscreen region.
*/ */
GList* GList *
meta_rectangle_find_onscreen_edges (const MetaRectangle *basic_rect, meta_rectangle_find_onscreen_edges (const MetaRectangle *basic_rect,
const GSList *all_struts) const GSList *all_struts)
{ {
GList *ret; GList *ret;
GList *fixed_strut_rects; GList *fixed_strut_rects;
GList *edge_iter; GList *edge_iter;
const GList *strut_rect_iter; const GList *strut_rect_iter;
/* The algorithm is basically as follows: /* The algorithm is basically as follows:
* Make sure the struts are disjoint * Make sure the struts are disjoint
@ -1836,7 +1835,7 @@ meta_rectangle_find_onscreen_edges (const MetaRectangle *basic_rect,
strut_rect_iter = fixed_strut_rects; strut_rect_iter = fixed_strut_rects;
while (strut_rect_iter) while (strut_rect_iter)
{ {
MetaRectangle *strut_rect = (MetaRectangle*) strut_rect_iter->data; MetaRectangle *strut_rect = (MetaRectangle *) strut_rect_iter->data;
/* Get the new possible edges we may need to add from the strut */ /* Get the new possible edges we may need to add from the strut */
GList *new_strut_edges = add_edges (NULL, strut_rect, FALSE); GList *new_strut_edges = add_edges (NULL, strut_rect, FALSE);
@ -1848,7 +1847,7 @@ meta_rectangle_find_onscreen_edges (const MetaRectangle *basic_rect,
GList *splits_of_cur_edge = NULL; GList *splits_of_cur_edge = NULL;
gboolean edge_needs_removal = FALSE; gboolean edge_needs_removal = FALSE;
fix_up_edges (strut_rect, cur_edge, fix_up_edges (strut_rect, cur_edge,
&new_strut_edges, &splits_of_cur_edge, &new_strut_edges, &splits_of_cur_edge,
&edge_needs_removal); &edge_needs_removal);
@ -1888,10 +1887,9 @@ meta_rectangle_find_onscreen_edges (const MetaRectangle *basic_rect,
* meta_rectangle_find_nonintersected_monitor_edges: (skip) * meta_rectangle_find_nonintersected_monitor_edges: (skip)
* *
*/ */
GList* GList *
meta_rectangle_find_nonintersected_monitor_edges ( meta_rectangle_find_nonintersected_monitor_edges (const GList *monitor_rects,
const GList *monitor_rects, const GSList *all_struts)
const GSList *all_struts)
{ {
/* This function cannot easily be merged with /* This function cannot easily be merged with
* meta_rectangle_find_onscreen_edges() because real screen edges * meta_rectangle_find_onscreen_edges() because real screen edges
@ -1899,7 +1897,7 @@ meta_rectangle_find_nonintersected_monitor_edges (
* immediately on the other side"; monitor edges are different. * immediately on the other side"; monitor edges are different.
*/ */
GList *ret; GList *ret;
const GList *cur; const GList *cur;
GSList *temp_rects; GSList *temp_rects;
/* Initialize the return list to be empty */ /* Initialize the return list to be empty */
@ -1918,16 +1916,16 @@ meta_rectangle_find_nonintersected_monitor_edges (
MetaRectangle *compare_rect = compare->data; MetaRectangle *compare_rect = compare->data;
/* Check if cur might be horizontally adjacent to compare */ /* Check if cur might be horizontally adjacent to compare */
if (meta_rectangle_vert_overlap(cur_rect, compare_rect)) if (meta_rectangle_vert_overlap (cur_rect, compare_rect))
{ {
MetaSide side_type; MetaSide side_type;
int y = MAX (cur_rect->y, compare_rect->y); int y = MAX (cur_rect->y, compare_rect->y);
int height = MIN (BOX_BOTTOM (*cur_rect) - y, int height = MIN (BOX_BOTTOM (*cur_rect) - y,
BOX_BOTTOM (*compare_rect) - y); BOX_BOTTOM (*compare_rect) - y);
int width = 0; int width = 0;
int x; int x;
if (BOX_LEFT (*cur_rect) == BOX_RIGHT (*compare_rect)) if (BOX_LEFT (*cur_rect) == BOX_RIGHT (*compare_rect))
{ {
/* compare_rect is to the left of cur_rect */ /* compare_rect is to the left of cur_rect */
x = BOX_LEFT (*cur_rect); x = BOX_LEFT (*cur_rect);
@ -1950,7 +1948,7 @@ meta_rectangle_find_nonintersected_monitor_edges (
* a right edge for the monitor on the left. Just fill * a right edge for the monitor on the left. Just fill
* up the edges and stick 'em on the list. * up the edges and stick 'em on the list.
*/ */
MetaEdge *new_edge = g_new (MetaEdge, 1); MetaEdge *new_edge = g_new (MetaEdge, 1);
new_edge->rect = meta_rect (x, y, width, height); new_edge->rect = meta_rect (x, y, width, height);
new_edge->side_type = side_type; new_edge->side_type = side_type;
@ -1961,16 +1959,16 @@ meta_rectangle_find_nonintersected_monitor_edges (
} }
/* Check if cur might be vertically adjacent to compare */ /* Check if cur might be vertically adjacent to compare */
if (meta_rectangle_horiz_overlap(cur_rect, compare_rect)) if (meta_rectangle_horiz_overlap (cur_rect, compare_rect))
{ {
MetaSide side_type; MetaSide side_type;
int x = MAX (cur_rect->x, compare_rect->x); int x = MAX (cur_rect->x, compare_rect->x);
int width = MIN (BOX_RIGHT (*cur_rect) - x, int width = MIN (BOX_RIGHT (*cur_rect) - x,
BOX_RIGHT (*compare_rect) - x); BOX_RIGHT (*compare_rect) - x);
int height = 0; int height = 0;
int y; int y;
if (BOX_TOP (*cur_rect) == BOX_BOTTOM (*compare_rect)) if (BOX_TOP (*cur_rect) == BOX_BOTTOM (*compare_rect))
{ {
/* compare_rect is to the top of cur_rect */ /* compare_rect is to the top of cur_rect */
y = BOX_TOP (*cur_rect); y = BOX_TOP (*cur_rect);
@ -2011,7 +2009,7 @@ meta_rectangle_find_nonintersected_monitor_edges (
temp_rects = NULL; temp_rects = NULL;
for (; all_struts; all_struts = all_struts->next) for (; all_struts; all_struts = all_struts->next)
temp_rects = g_slist_prepend (temp_rects, temp_rects = g_slist_prepend (temp_rects,
&((MetaStrut*)all_struts->data)->rect); &((MetaStrut *) all_struts->data)->rect);
ret = meta_rectangle_remove_intersections_with_boxes_from_edges (ret, ret = meta_rectangle_remove_intersections_with_boxes_from_edges (ret,
temp_rects); temp_rects);
g_slist_free (temp_rects); g_slist_free (temp_rects);

File diff suppressed because it is too large Load Diff

View File

@ -53,7 +53,8 @@ get_window (Display *xdisplay,
MetaWindow *window; MetaWindow *window;
display = meta_display_for_x_display (xdisplay); display = meta_display_for_x_display (xdisplay);
window = meta_x11_display_lookup_x_window (display->x11_display, frame_xwindow); window =
meta_x11_display_lookup_x_window (display->x11_display, frame_xwindow);
if (window == NULL || window->frame == NULL) if (window == NULL || window->frame == NULL)
{ {
@ -76,7 +77,7 @@ meta_core_queue_frame_resize (Display *xdisplay,
static gboolean static gboolean
lower_window_and_transients (MetaWindow *window, lower_window_and_transients (MetaWindow *window,
gpointer data) gpointer data)
{ {
MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; MetaWorkspaceManager *workspace_manager = window->display->workspace_manager;
@ -94,7 +95,7 @@ lower_window_and_transients (MetaWindow *window,
meta_window_located_on_workspace (window, meta_window_located_on_workspace (window,
workspace_manager->active_workspace)) workspace_manager->active_workspace))
{ {
GList* link; GList *link;
link = g_list_find (workspace_manager->active_workspace->mru_list, link = g_list_find (workspace_manager->active_workspace->mru_list,
window); window);
g_assert (link); g_assert (link);
@ -123,10 +124,10 @@ meta_core_user_lower_and_unfocus (Display *xdisplay,
lower_window_and_transients (window, NULL); lower_window_and_transients (window, NULL);
/* Rather than try to figure that out whether we just lowered /* Rather than try to figure that out whether we just lowered
* the focus window, assume that's always the case. (Typically, * the focus window, assume that's always the case. (Typically,
* this will be invoked via keyboard action or by a mouse action; * this will be invoked via keyboard action or by a mouse action;
* in either case the window or a modal child will have been focused.) */ * in either case the window or a modal child will have been focused.) */
meta_workspace_focus_default_window (workspace_manager->active_workspace, meta_workspace_focus_default_window (workspace_manager->active_workspace,
NULL, NULL,
timestamp); timestamp);
@ -134,7 +135,7 @@ meta_core_user_lower_and_unfocus (Display *xdisplay,
void void
meta_core_toggle_maximize_vertically (Display *xdisplay, meta_core_toggle_maximize_vertically (Display *xdisplay,
Window frame_xwindow) Window frame_xwindow)
{ {
MetaWindow *window = get_window (xdisplay, frame_xwindow); MetaWindow *window = get_window (xdisplay, frame_xwindow);
@ -149,7 +150,7 @@ meta_core_toggle_maximize_vertically (Display *xdisplay,
void void
meta_core_toggle_maximize_horizontally (Display *xdisplay, meta_core_toggle_maximize_horizontally (Display *xdisplay,
Window frame_xwindow) Window frame_xwindow)
{ {
MetaWindow *window = get_window (xdisplay, frame_xwindow); MetaWindow *window = get_window (xdisplay, frame_xwindow);
@ -178,12 +179,12 @@ meta_core_toggle_maximize (Display *xdisplay,
} }
void void
meta_core_show_window_menu (Display *xdisplay, meta_core_show_window_menu (Display *xdisplay,
Window frame_xwindow, Window frame_xwindow,
MetaWindowMenuType menu, MetaWindowMenuType menu,
int root_x, int root_x,
int root_y, int root_y,
guint32 timestamp) guint32 timestamp)
{ {
MetaWindow *window = get_window (xdisplay, frame_xwindow); MetaWindow *window = get_window (xdisplay, frame_xwindow);
@ -195,11 +196,11 @@ meta_core_show_window_menu (Display *xdisplay,
} }
void void
meta_core_show_window_menu_for_rect (Display *xdisplay, meta_core_show_window_menu_for_rect (Display *xdisplay,
Window frame_xwindow, Window frame_xwindow,
MetaWindowMenuType menu, MetaWindowMenuType menu,
MetaRectangle *rect, MetaRectangle *rect,
guint32 timestamp) guint32 timestamp)
{ {
MetaWindow *window = get_window (xdisplay, frame_xwindow); MetaWindow *window = get_window (xdisplay, frame_xwindow);
@ -211,16 +212,16 @@ meta_core_show_window_menu_for_rect (Display *xdisplay,
} }
gboolean gboolean
meta_core_begin_grab_op (Display *xdisplay, meta_core_begin_grab_op (Display *xdisplay,
Window frame_xwindow, Window frame_xwindow,
MetaGrabOp op, MetaGrabOp op,
gboolean pointer_already_grabbed, gboolean pointer_already_grabbed,
gboolean frame_action, gboolean frame_action,
int button, int button,
gulong modmask, gulong modmask,
guint32 timestamp, guint32 timestamp,
int root_x, int root_x,
int root_y) int root_y)
{ {
MetaWindow *window = get_window (xdisplay, frame_xwindow); MetaWindow *window = get_window (xdisplay, frame_xwindow);
MetaDisplay *display; MetaDisplay *display;
@ -268,8 +269,8 @@ meta_core_grab_buttons (Display *xdisplay,
} }
void void
meta_core_set_screen_cursor (Display *xdisplay, meta_core_set_screen_cursor (Display *xdisplay,
Window frame_on_screen, Window frame_on_screen,
MetaCursor cursor) MetaCursor cursor)
{ {
MetaWindow *window = get_window (xdisplay, frame_on_screen); MetaWindow *window = get_window (xdisplay, frame_on_screen);

View File

@ -33,9 +33,9 @@
#include "meta/workspace.h" #include "meta/workspace.h"
static void static void
close_dialog_response_cb (MetaCloseDialog *dialog, close_dialog_response_cb (MetaCloseDialog *dialog,
MetaCloseDialogResponse response, MetaCloseDialogResponse response,
MetaWindow *window) MetaWindow *window)
{ {
if (response == META_CLOSE_DIALOG_RESPONSE_FORCE_CLOSE) if (response == META_CLOSE_DIALOG_RESPONSE_FORCE_CLOSE)
meta_window_kill (window); meta_window_kill (window);
@ -50,8 +50,9 @@ meta_window_ensure_close_dialog (MetaWindow *window)
return; return;
display = window->display; display = window->display;
window->close_dialog = meta_compositor_create_close_dialog (display->compositor, window->close_dialog = meta_compositor_create_close_dialog (
window); display->compositor,
window);
g_signal_connect (window->close_dialog, "response", g_signal_connect (window->close_dialog, "response",
G_CALLBACK (close_dialog_response_cb), window); G_CALLBACK (close_dialog_response_cb), window);
} }
@ -84,8 +85,8 @@ meta_window_check_alive (MetaWindow *window,
} }
void void
meta_window_delete (MetaWindow *window, meta_window_delete (MetaWindow *window,
guint32 timestamp) guint32 timestamp)
{ {
META_WINDOW_GET_CLASS (window)->delete (window, timestamp); META_WINDOW_GET_CLASS (window)->delete (window, timestamp);

View File

@ -109,11 +109,11 @@
typedef struct typedef struct
{ {
MetaWindow *window; MetaWindow *window;
guint32 serial; guint32 serial;
guint ping_timeout_id; guint ping_timeout_id;
} MetaPingData; } MetaPingData;
G_DEFINE_TYPE(MetaDisplay, meta_display, G_TYPE_OBJECT); G_DEFINE_TYPE (MetaDisplay, meta_display, G_TYPE_OBJECT);
/* Signals */ /* Signals */
enum enum
@ -151,7 +151,8 @@ enum
LAST_SIGNAL LAST_SIGNAL
}; };
enum { enum
{
PROP_0, PROP_0,
PROP_FOCUS_WINDOW PROP_FOCUS_WINDOW
@ -170,17 +171,17 @@ static MetaDisplay *the_display = NULL;
static void on_monitors_changed_internal (MetaMonitorManager *monitor_manager, static void on_monitors_changed_internal (MetaMonitorManager *monitor_manager,
MetaDisplay *display); MetaDisplay *display);
static void prefs_changed_callback (MetaPreference pref, static void prefs_changed_callback (MetaPreference pref,
void *data); void *data);
static int mru_cmp (gconstpointer a, static int mru_cmp (gconstpointer a,
gconstpointer b); gconstpointer b);
static void static void
meta_display_get_property(GObject *object, meta_display_get_property(GObject *object,
guint prop_id, guint prop_id,
GValue *value, GValue *value,
GParamSpec *pspec) GParamSpec *pspec)
{ {
MetaDisplay *display = META_DISPLAY (object); MetaDisplay *display = META_DISPLAY (object);
@ -196,10 +197,10 @@ meta_display_get_property(GObject *object,
} }
static void static void
meta_display_set_property(GObject *object, meta_display_set_property(GObject *object,
guint prop_id, guint prop_id,
const GValue *value, const GValue *value,
GParamSpec *pspec) GParamSpec *pspec)
{ {
switch (prop_id) switch (prop_id)
{ {
@ -491,7 +492,6 @@ meta_display_class_init (MetaDisplayClass *klass)
"Currently focused window", "Currently focused window",
META_TYPE_WINDOW, META_TYPE_WINDOW,
G_PARAM_READABLE)); G_PARAM_READABLE));
} }
@ -535,7 +535,8 @@ meta_display_remove_pending_pings_for_window (MetaDisplay *display,
{ {
MetaPingData *ping_data = tmp->data; MetaPingData *ping_data = tmp->data;
display->pending_pings = g_slist_remove (display->pending_pings, ping_data); display->pending_pings =
g_slist_remove (display->pending_pings, ping_data);
ping_data_free (ping_data); ping_data_free (ping_data);
} }
@ -560,7 +561,7 @@ enable_compositor (MetaDisplay *display)
} }
int version = (x11_display->composite_major_version * 10) + int version = (x11_display->composite_major_version * 10) +
x11_display->composite_minor_version; x11_display->composite_minor_version;
if (version < 3) if (version < 3)
{ {
meta_warning ("Your version of COMPOSITE is too old."); meta_warning ("Your version of COMPOSITE is too old.");
@ -569,7 +570,7 @@ enable_compositor (MetaDisplay *display)
} }
if (!display->compositor) if (!display->compositor)
display->compositor = meta_compositor_new (display); display->compositor = meta_compositor_new (display);
meta_compositor_manage (display->compositor); meta_compositor_manage (display->compositor);
} }
@ -620,8 +621,10 @@ gesture_tracker_state_changed (MetaGestureTracker *tracker,
XIAllowTouchEvents (meta_backend_x11_get_xdisplay (backend), XIAllowTouchEvents (meta_backend_x11_get_xdisplay (backend),
META_VIRTUAL_CORE_POINTER_ID, META_VIRTUAL_CORE_POINTER_ID,
clutter_x11_event_sequence_get_touch_detail (sequence), clutter_x11_event_sequence_get_touch_detail (
DefaultRootWindow (display->x11_display->xdisplay), event_mode); sequence),
DefaultRootWindow (
display->x11_display->xdisplay), event_mode);
} }
} }
@ -686,7 +689,7 @@ meta_display_open (void)
display->mouse_mode = TRUE; /* Only relevant for mouse or sloppy focus */ display->mouse_mode = TRUE; /* Only relevant for mouse or sloppy focus */
display->allow_terminal_deactivation = TRUE; /* Only relevant for when a display->allow_terminal_deactivation = TRUE; /* Only relevant for when a
terminal has the focus */ * terminal has the focus */
i = 0; i = 0;
while (i < N_IGNORED_CROSSING_SERIALS) while (i < N_IGNORED_CROSSING_SERIALS)
@ -783,15 +786,18 @@ meta_display_open (void)
if (old_active_xwindow != None) if (old_active_xwindow != None)
{ {
MetaWindow *old_active_window; MetaWindow *old_active_window;
old_active_window = meta_x11_display_lookup_x_window (display->x11_display, old_active_window = meta_x11_display_lookup_x_window (
old_active_xwindow); display->x11_display,
old_active_xwindow);
if (old_active_window) if (old_active_window)
meta_window_focus (old_active_window, timestamp); meta_window_focus (old_active_window, timestamp);
else else
meta_x11_display_focus_the_no_focus_window (display->x11_display, timestamp); meta_x11_display_focus_the_no_focus_window (display->x11_display,
timestamp);
} }
else if (display->x11_display) else if (display->x11_display)
meta_x11_display_focus_the_no_focus_window (display->x11_display, timestamp); meta_x11_display_focus_the_no_focus_window (display->x11_display,
timestamp);
meta_idle_monitor_init_dbus (); meta_idle_monitor_init_dbus ();
@ -823,9 +829,9 @@ ptrcmp (gconstpointer a, gconstpointer b)
* *
* Return value: (transfer container): the list of windows. * Return value: (transfer container): the list of windows.
*/ */
GSList* GSList *
meta_display_list_windows (MetaDisplay *display, meta_display_list_windows (MetaDisplay *display,
MetaListWindowsFlags flags) MetaListWindowsFlags flags)
{ {
GSList *winlist; GSList *winlist;
GSList *prev; GSList *prev;
@ -992,14 +998,15 @@ meta_display_close (MetaDisplay *display,
* Returns: The singleton X display, or %NULL if @xdisplay isn't the one * Returns: The singleton X display, or %NULL if @xdisplay isn't the one
* we're managing. * we're managing.
*/ */
MetaDisplay* MetaDisplay *
meta_display_for_x_display (Display *xdisplay) meta_display_for_x_display (Display *xdisplay)
{ {
if (the_display->x11_display->xdisplay == xdisplay) if (the_display->x11_display->xdisplay == xdisplay)
return the_display; return the_display;
meta_warning ("Could not find display for X display %p, probably going to crash\n", meta_warning (
xdisplay); "Could not find display for X display %p, probably going to crash\n",
xdisplay);
return NULL; return NULL;
} }
@ -1012,7 +1019,7 @@ meta_display_for_x_display (Display *xdisplay)
* Returns: The only #MetaDisplay there is. This can be %NULL, but only * Returns: The only #MetaDisplay there is. This can be %NULL, but only
* during startup. * during startup.
*/ */
MetaDisplay* MetaDisplay *
meta_get_display (void) meta_get_display (void)
{ {
return the_display; return the_display;
@ -1048,7 +1055,8 @@ meta_grab_op_is_resizing (MetaGrabOp op)
if (!grab_op_is_window (op)) if (!grab_op_is_window (op))
return FALSE; return FALSE;
return (op & META_GRAB_OP_WINDOW_DIR_MASK) != 0 || op == META_GRAB_OP_KEYBOARD_RESIZING_UNKNOWN; return (op & META_GRAB_OP_WINDOW_DIR_MASK) != 0 ||
op == META_GRAB_OP_KEYBOARD_RESIZING_UNKNOWN;
} }
gboolean gboolean
@ -1097,11 +1105,11 @@ meta_display_windows_are_interactable (MetaDisplay *display)
* the result. * the result.
*/ */
gboolean gboolean
meta_display_xserver_time_is_before (MetaDisplay *display, meta_display_xserver_time_is_before (MetaDisplay *display,
guint32 time1, guint32 time1,
guint32 time2) guint32 time2)
{ {
return XSERVER_TIME_IS_BEFORE(time1, time2); return XSERVER_TIME_IS_BEFORE (time1, time2);
} }
/** /**
@ -1151,14 +1159,16 @@ meta_display_add_ignored_crossing_serial (MetaDisplay *display,
int i; int i;
/* don't add the same serial more than once */ /* don't add the same serial more than once */
if (display->ignored_crossing_serials[N_IGNORED_CROSSING_SERIALS-1] == serial) if (display->ignored_crossing_serials[N_IGNORED_CROSSING_SERIALS - 1] ==
serial)
return; return;
/* shift serials to the left */ /* shift serials to the left */
i = 0; i = 0;
while (i < (N_IGNORED_CROSSING_SERIALS - 1)) while (i < (N_IGNORED_CROSSING_SERIALS - 1))
{ {
display->ignored_crossing_serials[i] = display->ignored_crossing_serials[i+1]; display->ignored_crossing_serials[i] =
display->ignored_crossing_serials[i + 1];
++i; ++i;
} }
/* put new one on the end */ /* put new one on the end */
@ -1179,11 +1189,11 @@ window_raise_with_delay_callback (void *data)
if (meta_stack_get_top (window->display->stack) != window) if (meta_stack_get_top (window->display->stack) != window)
{ {
if (meta_window_has_pointer (window)) if (meta_window_has_pointer (window))
meta_window_raise (window); meta_window_raise (window);
else else
meta_topic (META_DEBUG_FOCUS, meta_topic (META_DEBUG_FOCUS,
"Pointer not inside window, not raising %s\n", "Pointer not inside window, not raising %s\n",
window->desc); window->desc);
} }
return G_SOURCE_REMOVE; return G_SOURCE_REMOVE;
@ -1206,7 +1216,8 @@ meta_display_queue_autoraise_callback (MetaDisplay *display,
meta_prefs_get_auto_raise_delay (), meta_prefs_get_auto_raise_delay (),
window_raise_with_delay_callback, window_raise_with_delay_callback,
window, NULL); window, NULL);
g_source_set_name_by_id (display->autoraise_timeout_id, "[mutter] window_raise_with_delay_callback"); g_source_set_name_by_id (display->autoraise_timeout_id,
"[mutter] window_raise_with_delay_callback");
display->autoraise_window = window; display->autoraise_window = window;
} }
@ -1231,7 +1242,8 @@ meta_display_sync_wayland_input_focus (MetaDisplay *display)
else if (display->focus_window && display->focus_window->surface) else if (display->focus_window && display->focus_window->surface)
focus_window = display->focus_window; focus_window = display->focus_window;
else else
meta_topic (META_DEBUG_FOCUS, "Focus change has no effect, because there is no matching wayland surface"); meta_topic (META_DEBUG_FOCUS,
"Focus change has no effect, because there is no matching wayland surface");
meta_stage_set_active (stage, focus_window == NULL); meta_stage_set_active (stage, focus_window == NULL);
meta_wayland_compositor_set_input_focus (compositor, focus_window); meta_wayland_compositor_set_input_focus (compositor, focus_window);
@ -1335,9 +1347,9 @@ meta_display_unregister_wayland_window (MetaDisplay *display,
g_hash_table_remove (display->wayland_windows, window); g_hash_table_remove (display->wayland_windows, window);
} }
MetaWindow* MetaWindow *
meta_display_lookup_stamp (MetaDisplay *display, meta_display_lookup_stamp (MetaDisplay *display,
guint64 stamp) guint64 stamp)
{ {
return g_hash_table_lookup (display->stamps, &stamp); return g_hash_table_lookup (display->stamps, &stamp);
} }
@ -1361,13 +1373,13 @@ meta_display_unregister_stamp (MetaDisplay *display,
g_hash_table_remove (display->stamps, &stamp); g_hash_table_remove (display->stamps, &stamp);
} }
MetaWindow* MetaWindow *
meta_display_lookup_stack_id (MetaDisplay *display, meta_display_lookup_stack_id (MetaDisplay *display,
guint64 stack_id) guint64 stack_id)
{ {
if (META_STACK_ID_IS_X11 (stack_id)) if (META_STACK_ID_IS_X11 (stack_id))
return meta_x11_display_lookup_x_window (display->x11_display, return meta_x11_display_lookup_x_window (display->x11_display,
(Window)stack_id); (Window) stack_id);
else else
return meta_display_lookup_stamp (display, stack_id); return meta_display_lookup_stamp (display, stack_id);
} }
@ -1391,16 +1403,17 @@ meta_display_describe_stack_id (MetaDisplay *display,
window = meta_display_lookup_stack_id (display, stack_id); window = meta_display_lookup_stack_id (display, stack_id);
if (window && window->title) if (window && window->title)
snprintf (result, sizeof(buffer[0]), "%#" G_GINT64_MODIFIER "x (%.10s)", stack_id, window->title); snprintf (result, sizeof (buffer[0]), "%#" G_GINT64_MODIFIER "x (%.10s)",
stack_id, window->title);
else else
snprintf (result, sizeof(buffer[0]), "%#" G_GINT64_MODIFIER "x", stack_id); snprintf (result, sizeof (buffer[0]), "%#" G_GINT64_MODIFIER "x", stack_id);
return result; return result;
} }
void void
meta_display_notify_window_created (MetaDisplay *display, meta_display_notify_window_created (MetaDisplay *display,
MetaWindow *window) MetaWindow *window)
{ {
g_signal_emit (display, display_signals[WINDOW_CREATED], 0, window); g_signal_emit (display, display_signals[WINDOW_CREATED], 0, window);
} }
@ -1640,9 +1653,10 @@ meta_display_begin_grab_op (MetaDisplay *display,
if (display->grab_op != META_GRAB_OP_NONE) if (display->grab_op != META_GRAB_OP_NONE)
{ {
meta_warning ("Attempt to perform window operation %u on window %s when operation %u on %s already in effect\n", meta_warning (
op, window->desc, display->grab_op, "Attempt to perform window operation %u on window %s when operation %u on %s already in effect\n",
display->grab_window ? display->grab_window->desc : "none"); op, window->desc, display->grab_op,
display->grab_window ? display->grab_window->desc : "none");
return FALSE; return FALSE;
} }
@ -1685,7 +1699,8 @@ meta_display_begin_grab_op (MetaDisplay *display,
timestamp); timestamp);
XSync (display->x11_display->xdisplay, False); XSync (display->x11_display->xdisplay, False);
if (meta_backend_grab_device (backend, META_VIRTUAL_CORE_POINTER_ID, timestamp)) if (meta_backend_grab_device (backend, META_VIRTUAL_CORE_POINTER_ID,
timestamp))
display->grab_have_pointer = TRUE; display->grab_have_pointer = TRUE;
if (!display->grab_have_pointer && !meta_grab_op_is_keyboard (op)) if (!display->grab_have_pointer && !meta_grab_op_is_keyboard (op))
@ -1697,12 +1712,15 @@ meta_display_begin_grab_op (MetaDisplay *display,
/* Grab keys when beginning window ops; see #126497 */ /* Grab keys when beginning window ops; see #126497 */
if (event_route == META_EVENT_ROUTE_WINDOW_OP) if (event_route == META_EVENT_ROUTE_WINDOW_OP)
{ {
display->grab_have_keyboard = meta_window_grab_all_keys (grab_window, timestamp); display->grab_have_keyboard = meta_window_grab_all_keys (grab_window,
timestamp);
if (!display->grab_have_keyboard) if (!display->grab_have_keyboard)
{ {
meta_topic (META_DEBUG_WINDOW_OPS, "grabbing all keys failed, ungrabbing pointer\n"); meta_topic (META_DEBUG_WINDOW_OPS,
meta_backend_ungrab_device (backend, META_VIRTUAL_CORE_POINTER_ID, timestamp); "grabbing all keys failed, ungrabbing pointer\n");
meta_backend_ungrab_device (backend, META_VIRTUAL_CORE_POINTER_ID,
timestamp);
display->grab_have_pointer = FALSE; display->grab_have_pointer = FALSE;
return FALSE; return FALSE;
} }
@ -1799,7 +1817,8 @@ meta_display_end_grab_op (MetaDisplay *display,
if (display->grab_have_pointer) if (display->grab_have_pointer)
{ {
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
meta_backend_ungrab_device (backend, META_VIRTUAL_CORE_POINTER_ID, timestamp); meta_backend_ungrab_device (backend, META_VIRTUAL_CORE_POINTER_ID,
timestamp);
} }
if (display->grab_have_keyboard) if (display->grab_have_keyboard)
@ -1829,7 +1848,7 @@ meta_display_end_grab_op (MetaDisplay *display,
/** /**
* meta_display_get_grab_op: * meta_display_get_grab_op:
* @display: The #MetaDisplay that the window is on * @display: The #MetaDisplay that the window is on
*
* Gets the current grab operation, if any. * Gets the current grab operation, if any.
* *
* Return value: the current grab operation, or %META_GRAB_OP_NONE if * Return value: the current grab operation, or %META_GRAB_OP_NONE if
@ -1848,7 +1867,8 @@ meta_display_check_threshold_reached (MetaDisplay *display,
int x, int x,
int y) int y)
{ {
/* Don't bother doing the check again if we've already reached the threshold */ /* Don't bother doing the check again if we've already reached the threshold
* */
if (meta_prefs_get_raise_on_click () || if (meta_prefs_get_raise_on_click () ||
display->grab_threshold_movement_reached) display->grab_threshold_movement_reached)
return; return;
@ -1861,7 +1881,7 @@ meta_display_check_threshold_reached (MetaDisplay *display,
void void
meta_display_queue_retheme_all_windows (MetaDisplay *display) meta_display_queue_retheme_all_windows (MetaDisplay *display)
{ {
GSList* windows; GSList *windows;
GSList *tmp; GSList *tmp;
windows = meta_display_list_windows (display, META_LIST_DEFAULT); windows = meta_display_list_windows (display, META_LIST_DEFAULT);
@ -1989,7 +2009,7 @@ meta_display_ping_timeout (gpointer data)
*/ */
void void
meta_display_ping_window (MetaWindow *window, meta_display_ping_window (MetaWindow *window,
guint32 serial) guint32 serial)
{ {
MetaDisplay *display = window->display; MetaDisplay *display = window->display;
MetaPingData *ping_data; MetaPingData *ping_data;
@ -2007,9 +2027,10 @@ meta_display_ping_window (MetaWindow *window,
ping_data->window = window; ping_data->window = window;
ping_data->serial = serial; ping_data->serial = serial;
ping_data->ping_timeout_id = g_timeout_add (PING_TIMEOUT_DELAY, ping_data->ping_timeout_id = g_timeout_add (PING_TIMEOUT_DELAY,
meta_display_ping_timeout, meta_display_ping_timeout,
ping_data); ping_data);
g_source_set_name_by_id (ping_data->ping_timeout_id, "[mutter] meta_display_ping_timeout"); g_source_set_name_by_id (ping_data->ping_timeout_id,
"[mutter] meta_display_ping_timeout");
display->pending_pings = g_slist_prepend (display->pending_pings, ping_data); display->pending_pings = g_slist_prepend (display->pending_pings, ping_data);
@ -2030,8 +2051,8 @@ meta_display_ping_window (MetaWindow *window,
* reply handler function, and freeing memory. * reply handler function, and freeing memory.
*/ */
void void
meta_display_pong_for_serial (MetaDisplay *display, meta_display_pong_for_serial (MetaDisplay *display,
guint32 serial) guint32 serial)
{ {
GSList *tmp; GSList *tmp;
@ -2074,12 +2095,19 @@ get_focused_group (MetaDisplay *display)
return NULL; return NULL;
} }
#define IN_TAB_CHAIN(w,t) (((t) == META_TAB_LIST_NORMAL && META_WINDOW_IN_NORMAL_TAB_CHAIN (w)) \ #define IN_TAB_CHAIN(w, \
|| ((t) == META_TAB_LIST_DOCKS && META_WINDOW_IN_DOCK_TAB_CHAIN (w)) \ t) (((t) == META_TAB_LIST_NORMAL && \
|| ((t) == META_TAB_LIST_GROUP && META_WINDOW_IN_GROUP_TAB_CHAIN (w, get_focused_group (w->display))) \ META_WINDOW_IN_NORMAL_TAB_CHAIN (w)) \
|| ((t) == META_TAB_LIST_NORMAL_ALL && META_WINDOW_IN_NORMAL_TAB_CHAIN_TYPE (w))) || ((t) == META_TAB_LIST_DOCKS && \
META_WINDOW_IN_DOCK_TAB_CHAIN (w)) \
|| ((t) == META_TAB_LIST_GROUP && \
META_WINDOW_IN_GROUP_TAB_CHAIN (w, \
get_focused_group ( \
w->display))) \
|| ((t) == META_TAB_LIST_NORMAL_ALL && \
META_WINDOW_IN_NORMAL_TAB_CHAIN_TYPE (w)))
static MetaWindow* static MetaWindow *
find_tab_forward (MetaDisplay *display, find_tab_forward (MetaDisplay *display,
MetaTabList type, MetaTabList type,
MetaWorkspace *workspace, MetaWorkspace *workspace,
@ -2119,7 +2147,7 @@ find_tab_forward (MetaDisplay *display,
return NULL; return NULL;
} }
static MetaWindow* static MetaWindow *
find_tab_backward (MetaDisplay *display, find_tab_backward (MetaDisplay *display,
MetaTabList type, MetaTabList type,
MetaWorkspace *workspace, MetaWorkspace *workspace,
@ -2164,8 +2192,8 @@ mru_cmp (gconstpointer a,
{ {
guint32 time_a, time_b; guint32 time_a, time_b;
time_a = meta_window_get_user_time ((MetaWindow *)a); time_a = meta_window_get_user_time ((MetaWindow *) a);
time_b = meta_window_get_user_time ((MetaWindow *)b); time_b = meta_window_get_user_time ((MetaWindow *) b);
if (time_a > time_b) if (time_a > time_b)
return -1; return -1;
@ -2189,7 +2217,7 @@ mru_cmp (gconstpointer a,
* *
* Returns: (transfer container) (element-type Meta.Window): List of windows * Returns: (transfer container) (element-type Meta.Window): List of windows
*/ */
GList* GList *
meta_display_get_tab_list (MetaDisplay *display, meta_display_get_tab_list (MetaDisplay *display,
MetaTabList type, MetaTabList type,
MetaWorkspace *workspace) MetaWorkspace *workspace)
@ -2265,7 +2293,7 @@ meta_display_get_tab_list (MetaDisplay *display,
* Returns: (transfer none): Next window * Returns: (transfer none): Next window
* *
*/ */
MetaWindow* MetaWindow *
meta_display_get_tab_next (MetaDisplay *display, meta_display_get_tab_next (MetaDisplay *display,
MetaTabList type, MetaTabList type,
MetaWorkspace *workspace, MetaWorkspace *workspace,
@ -2285,9 +2313,15 @@ meta_display_get_tab_next (MetaDisplay *display,
g_assert (window->display == display); g_assert (window->display == display);
if (backward) if (backward)
ret = find_tab_backward (display, type, workspace, g_list_find (tab_list, window), TRUE); ret =
find_tab_backward (display, type, workspace, g_list_find (tab_list,
window),
TRUE);
else else
ret = find_tab_forward (display, type, workspace, g_list_find (tab_list, window), TRUE); ret =
find_tab_forward (display, type, workspace, g_list_find (tab_list,
window),
TRUE);
} }
else else
{ {
@ -2314,7 +2348,7 @@ meta_display_get_tab_next (MetaDisplay *display,
* Returns: (transfer none): Current window * Returns: (transfer none): Current window
* *
*/ */
MetaWindow* MetaWindow *
meta_display_get_tab_current (MetaDisplay *display, meta_display_get_tab_current (MetaDisplay *display,
MetaTabList type, MetaTabList type,
MetaWorkspace *workspace) MetaWorkspace *workspace)
@ -2390,7 +2424,8 @@ meta_display_manage_all_windows (MetaDisplay *display)
int n_children, i; int n_children, i;
meta_stack_freeze (display->stack); meta_stack_freeze (display->stack);
meta_stack_tracker_get_stack (display->stack_tracker, &_children, &n_children); meta_stack_tracker_get_stack (display->stack_tracker, &_children,
&n_children);
/* Copy the stack as it will be modified as part of the loop */ /* Copy the stack as it will be modified as part of the loop */
children = g_memdup (_children, sizeof (guint64) * n_children); children = g_memdup (_children, sizeof (guint64) * n_children);
@ -2416,7 +2451,7 @@ meta_display_unmanage_windows (MetaDisplay *display,
winlist = meta_display_list_windows (display, winlist = meta_display_list_windows (display,
META_LIST_INCLUDE_OVERRIDE_REDIRECT); META_LIST_INCLUDE_OVERRIDE_REDIRECT);
winlist = g_slist_sort (winlist, meta_display_stack_cmp); winlist = g_slist_sort (winlist, meta_display_stack_cmp);
g_slist_foreach (winlist, (GFunc)g_object_ref, NULL); g_slist_foreach (winlist, (GFunc) g_object_ref, NULL);
/* Unmanage all windows */ /* Unmanage all windows */
tmp = winlist; tmp = winlist;
@ -2441,8 +2476,8 @@ int
meta_display_stack_cmp (const void *a, meta_display_stack_cmp (const void *a,
const void *b) const void *b)
{ {
MetaWindow *aw = (void*) a; MetaWindow *aw = (void *) a;
MetaWindow *bw = (void*) b; MetaWindow *bw = (void *) b;
return meta_stack_windows_cmp (aw->display->stack, aw, bw); return meta_stack_windows_cmp (aw->display->stack, aw, bw);
} }
@ -2454,7 +2489,8 @@ meta_display_stack_cmp (const void *a,
* *
* Sorts a set of windows according to their current stacking order. If windows * Sorts a set of windows according to their current stacking order. If windows
* from multiple screens are present in the set of input windows, then all the * from multiple screens are present in the set of input windows, then all the
* windows on screen 0 are sorted below all the windows on screen 1, and so forth. * windows on screen 0 are sorted below all the windows on screen 1, and so
*forth.
* Since the stacking order of override-redirect windows isn't controlled by * Since the stacking order of override-redirect windows isn't controlled by
* Metacity, if override-redirect windows are in the input, the result may not * Metacity, if override-redirect windows are in the input, the result may not
* correspond to the actual stacking order in the X server. * correspond to the actual stacking order in the X server.
@ -2462,7 +2498,8 @@ meta_display_stack_cmp (const void *a,
* An example of using this would be to sort the list of transient dialogs for a * An example of using this would be to sort the list of transient dialogs for a
* window into their current stacking order. * window into their current stacking order.
* *
* Returns: (transfer container) (element-type MetaWindow): Input windows sorted by stacking order, from lowest to highest * Returns: (transfer container) (element-type MetaWindow): Input windows sorted
*by stacking order, from lowest to highest
*/ */
GSList * GSList *
meta_display_sort_windows_by_stacking (MetaDisplay *display, meta_display_sort_windows_by_stacking (MetaDisplay *display,
@ -2499,7 +2536,7 @@ meta_display_increment_focus_sentinel (MetaDisplay *display)
display->x11_display->xroot, display->x11_display->xroot,
display->x11_display->atom__MUTTER_SENTINEL, display->x11_display->atom__MUTTER_SENTINEL,
XA_CARDINAL, XA_CARDINAL,
32, PropModeReplace, (guchar*) data, 1); 32, PropModeReplace, (guchar *) data, 1);
display->sentinel_counter += 1; display->sentinel_counter += 1;
} }
@ -2598,7 +2635,8 @@ meta_display_modifiers_accelerator_activate (MetaDisplay *display)
{ {
gboolean freeze; gboolean freeze;
g_signal_emit (display, display_signals[MODIFIERS_ACCELERATOR_ACTIVATED], 0, &freeze); g_signal_emit (display, display_signals[MODIFIERS_ACCELERATOR_ACTIVATED], 0,
&freeze);
return freeze; return freeze;
} }
@ -2627,7 +2665,7 @@ meta_display_supports_extended_barriers (MetaDisplay *display)
if (META_IS_BACKEND_X11 (meta_get_backend ())) if (META_IS_BACKEND_X11 (meta_get_backend ()))
{ {
return (META_X11_DISPLAY_HAS_XINPUT_23 (display->x11_display) && return (META_X11_DISPLAY_HAS_XINPUT_23 (display->x11_display) &&
!meta_is_wayland_compositor()); !meta_is_wayland_compositor ());
} }
g_assert_not_reached (); g_assert_not_reached ();
@ -2747,11 +2785,11 @@ meta_display_request_restart (MetaDisplay *display)
} }
gboolean gboolean
meta_display_show_resize_popup (MetaDisplay *display, meta_display_show_resize_popup (MetaDisplay *display,
gboolean show, gboolean show,
MetaRectangle *rect, MetaRectangle *rect,
int display_w, int display_w,
int display_h) int display_h)
{ {
gboolean result = FALSE; gboolean result = FALSE;
@ -2812,8 +2850,9 @@ meta_display_request_pad_osd (MetaDisplay *display,
logical_monitor = logical_monitor =
meta_input_settings_get_tablet_logical_monitor (input_settings, pad); meta_input_settings_get_tablet_logical_monitor (input_settings, pad);
#ifdef HAVE_LIBWACOM #ifdef HAVE_LIBWACOM
wacom_device = meta_input_settings_get_tablet_wacom_device (input_settings, wacom_device = meta_input_settings_get_tablet_wacom_device (
pad); input_settings,
pad);
layout_path = libwacom_get_layout_filename (wacom_device); layout_path = libwacom_get_layout_filename (wacom_device);
#endif #endif
} }
@ -2849,7 +2888,8 @@ meta_display_get_pad_action_label (MetaDisplay *display,
/* First, lookup the action, as imposed by settings */ /* First, lookup the action, as imposed by settings */
settings = meta_backend_get_input_settings (meta_get_backend ()); settings = meta_backend_get_input_settings (meta_get_backend ());
label = meta_input_settings_get_pad_action_label (settings, pad, action_type, action_number); label = meta_input_settings_get_pad_action_label (settings, pad, action_type,
action_number);
if (label) if (label)
return label; return label;
@ -2862,8 +2902,9 @@ meta_display_get_pad_action_label (MetaDisplay *display,
MetaWaylandTabletPad *tablet_pad = NULL; MetaWaylandTabletPad *tablet_pad = NULL;
compositor = meta_wayland_compositor_get_default (); compositor = meta_wayland_compositor_get_default ();
tablet_seat = meta_wayland_tablet_manager_ensure_seat (compositor->tablet_manager, tablet_seat = meta_wayland_tablet_manager_ensure_seat (
compositor->seat); compositor->tablet_manager,
compositor->seat);
if (tablet_seat) if (tablet_seat)
tablet_pad = meta_wayland_tablet_seat_lookup_pad (tablet_seat, pad); tablet_pad = meta_wayland_tablet_seat_lookup_pad (tablet_seat, pad);
@ -2903,7 +2944,8 @@ lookup_tablet_monitor (MetaDisplay *display,
if (!input_settings) if (!input_settings)
return -1; return -1;
monitor = meta_input_settings_get_tablet_logical_monitor (input_settings, device); monitor = meta_input_settings_get_tablet_logical_monitor (input_settings,
device);
if (monitor) if (monitor)
{ {
@ -2954,10 +2996,10 @@ meta_display_notify_pad_group_switch (MetaDisplay *display,
} }
void void
meta_display_foreach_window (MetaDisplay *display, meta_display_foreach_window (MetaDisplay *display,
MetaListWindowsFlags flags, MetaListWindowsFlags flags,
MetaDisplayWindowFunc func, MetaDisplayWindowFunc func,
gpointer data) gpointer data)
{ {
GSList *windows; GSList *windows;
@ -3086,7 +3128,7 @@ meta_display_update_tile_preview (MetaDisplay *display,
if (display->tile_preview_timeout_id > 0) if (display->tile_preview_timeout_id > 0)
g_source_remove (display->tile_preview_timeout_id); g_source_remove (display->tile_preview_timeout_id);
meta_display_update_tile_preview_timeout ((gpointer)display); meta_display_update_tile_preview_timeout ((gpointer) display);
} }
} }
@ -3160,7 +3202,8 @@ meta_display_apply_startup_properties (MetaDisplay *display,
sequence = seq; sequence = seq;
g_assert (window->startup_id == NULL); g_assert (window->startup_id == NULL);
window->startup_id = g_strdup (sn_startup_sequence_get_id (sequence)); window->startup_id =
g_strdup (sn_startup_sequence_get_id (sequence));
startup_id = window->startup_id; startup_id = window->startup_id;
meta_topic (META_DEBUG_STARTUP, meta_topic (META_DEBUG_STARTUP,
@ -3316,7 +3359,8 @@ check_fullscreen_func (gpointer data)
{ {
/* We want to handle the case where an application is creating an /* We want to handle the case where an application is creating an
* override-redirect window the size of the screen (monitor) and treat * override-redirect window the size of the screen (monitor) and treat
* it similarly to a fullscreen window, though it doesn't have fullscreen * it similarly to a fullscreen window, though it doesn't have
*fullscreen
* window management behavior. (Being O-R, it's not managed at all.) * window management behavior. (Being O-R, it's not managed at all.)
*/ */
if (meta_window_is_monitor_sized (window)) if (meta_window_is_monitor_sized (window))
@ -3374,7 +3418,7 @@ check_fullscreen_func (gpointer data)
if (in_fullscreen_changed) if (in_fullscreen_changed)
{ {
/* DOCK window stacking depends on the monitor's fullscreen /* DOCK window stacking depends on the monitor's fullscreen
status so we need to trigger a re-layering. */ * status so we need to trigger a re-layering. */
MetaWindow *window = meta_stack_get_top (display->stack); MetaWindow *window = meta_stack_get_top (display->stack);
if (window) if (window)
meta_stack_update_layer (display->stack, window); meta_stack_update_layer (display->stack, window);
@ -3389,9 +3433,10 @@ void
meta_display_queue_check_fullscreen (MetaDisplay *display) meta_display_queue_check_fullscreen (MetaDisplay *display)
{ {
if (!display->check_fullscreen_later) if (!display->check_fullscreen_later)
display->check_fullscreen_later = meta_later_add (META_LATER_CHECK_FULLSCREEN, display->check_fullscreen_later = meta_later_add (
check_fullscreen_func, META_LATER_CHECK_FULLSCREEN,
display, NULL); check_fullscreen_func,
display, NULL);
} }
int int
@ -3544,7 +3589,8 @@ meta_display_get_monitor_geometry (MetaDisplay *display,
* You can get notification when this changes by connecting to * You can get notification when this changes by connecting to
* MetaDisplay::in-fullscreen-changed. * MetaDisplay::in-fullscreen-changed.
* *
* Returns: %TRUE if there is a fullscreen window covering the specified monitor. * Returns: %TRUE if there is a fullscreen window covering the specified
*monitor.
*/ */
gboolean gboolean
meta_display_get_monitor_in_fullscreen (MetaDisplay *display, meta_display_get_monitor_in_fullscreen (MetaDisplay *display,
@ -3568,7 +3614,7 @@ meta_display_get_monitor_in_fullscreen (MetaDisplay *display,
monitor); monitor);
/* We use -1 as a flag to mean "not known yet" for notification /* We use -1 as a flag to mean "not known yet" for notification
purposes */ return logical_monitor->in_fullscreen == TRUE; * purposes */return logical_monitor->in_fullscreen == TRUE;
} }
MetaWindow * MetaWindow *

View File

@ -33,20 +33,20 @@
*/ */
#define WINDOW_EDGES_RELEVANT(window, display) \ #define WINDOW_EDGES_RELEVANT(window, display) \
meta_window_should_be_showing (window) && \ meta_window_should_be_showing (window) && \
window != display->grab_window && \ window != display->grab_window && \
window->type != META_WINDOW_DESKTOP && \ window->type != META_WINDOW_DESKTOP && \
window->type != META_WINDOW_MENU && \ window->type != META_WINDOW_MENU && \
window->type != META_WINDOW_SPLASHSCREEN window->type != META_WINDOW_SPLASHSCREEN
struct ResistanceDataForAnEdge struct ResistanceDataForAnEdge
{ {
gboolean timeout_setup; gboolean timeout_setup;
guint timeout_id; guint timeout_id;
int timeout_edge_pos; int timeout_edge_pos;
gboolean timeout_over; gboolean timeout_over;
GSourceFunc timeout_func; GSourceFunc timeout_func;
MetaWindow *window; MetaWindow *window;
int keyboard_buildup; int keyboard_buildup;
}; };
typedef struct ResistanceDataForAnEdge ResistanceDataForAnEdge; typedef struct ResistanceDataForAnEdge ResistanceDataForAnEdge;
@ -96,17 +96,17 @@ find_index_of_edge_near_position (const GArray *edges,
/* Initialize mid, edge, & compare in the off change that the array only /* Initialize mid, edge, & compare in the off change that the array only
* has one element. * has one element.
*/ */
mid = 0; mid = 0;
edge = g_array_index (edges, MetaEdge*, mid); edge = g_array_index (edges, MetaEdge *, mid);
compare = horizontal ? edge->rect.x : edge->rect.y; compare = horizontal ? edge->rect.x : edge->rect.y;
/* Begin the search... */ /* Begin the search... */
low = 0; low = 0;
high = edges->len - 1; high = edges->len - 1;
while (low < high) while (low < high)
{ {
mid = low + (high - low)/2; mid = low + (high - low) / 2;
edge = g_array_index (edges, MetaEdge*, mid); edge = g_array_index (edges, MetaEdge *, mid);
compare = horizontal ? edge->rect.x : edge->rect.y; compare = horizontal ? edge->rect.x : edge->rect.y;
if (compare == position) if (compare == position)
@ -130,13 +130,13 @@ find_index_of_edge_near_position (const GArray *edges,
while (compare >= position && mid > 0) while (compare >= position && mid > 0)
{ {
mid--; mid--;
edge = g_array_index (edges, MetaEdge*, mid); edge = g_array_index (edges, MetaEdge *, mid);
compare = horizontal ? edge->rect.x : edge->rect.y; compare = horizontal ? edge->rect.x : edge->rect.y;
} }
while (compare < position && mid < (int)edges->len - 1) while (compare < position && mid < (int) edges->len - 1)
{ {
mid++; mid++;
edge = g_array_index (edges, MetaEdge*, mid); edge = g_array_index (edges, MetaEdge *, mid);
compare = horizontal ? edge->rect.x : edge->rect.y; compare = horizontal ? edge->rect.x : edge->rect.y;
} }
@ -149,16 +149,16 @@ find_index_of_edge_near_position (const GArray *edges,
} }
else else
{ {
while (compare <= position && mid < (int)edges->len - 1) while (compare <= position && mid < (int) edges->len - 1)
{ {
mid++; mid++;
edge = g_array_index (edges, MetaEdge*, mid); edge = g_array_index (edges, MetaEdge *, mid);
compare = horizontal ? edge->rect.x : edge->rect.y; compare = horizontal ? edge->rect.x : edge->rect.y;
} }
while (compare > position && mid > 0) while (compare > position && mid > 0)
{ {
mid--; mid--;
edge = g_array_index (edges, MetaEdge*, mid); edge = g_array_index (edges, MetaEdge *, mid);
compare = horizontal ? edge->rect.x : edge->rect.y; compare = horizontal ? edge->rect.x : edge->rect.y;
} }
@ -199,17 +199,17 @@ find_nearest_position (const GArray *edges,
/* Initialize mid, edge, & compare in the off change that the array only /* Initialize mid, edge, & compare in the off change that the array only
* has one element. * has one element.
*/ */
mid = 0; mid = 0;
edge = g_array_index (edges, MetaEdge*, mid); edge = g_array_index (edges, MetaEdge *, mid);
compare = horizontal ? edge->rect.x : edge->rect.y; compare = horizontal ? edge->rect.x : edge->rect.y;
/* Begin the search... */ /* Begin the search... */
low = 0; low = 0;
high = edges->len - 1; high = edges->len - 1;
while (low < high) while (low < high)
{ {
mid = low + (high - low)/2; mid = low + (high - low) / 2;
edge = g_array_index (edges, MetaEdge*, mid); edge = g_array_index (edges, MetaEdge *, mid);
compare = horizontal ? edge->rect.x : edge->rect.y; compare = horizontal ? edge->rect.x : edge->rect.y;
if (compare == position) if (compare == position)
@ -229,7 +229,7 @@ find_nearest_position (const GArray *edges,
best_dist = INT_MAX; best_dist = INT_MAX;
/* Start the search at mid */ /* Start the search at mid */
edge = g_array_index (edges, MetaEdge*, mid); edge = g_array_index (edges, MetaEdge *, mid);
compare = horizontal ? edge->rect.x : edge->rect.y; compare = horizontal ? edge->rect.x : edge->rect.y;
edges_align = meta_rectangle_edge_aligns (new_rect, edge); edges_align = meta_rectangle_edge_aligns (new_rect, edge);
if (edges_align && if (edges_align &&
@ -244,14 +244,14 @@ find_nearest_position (const GArray *edges,
} }
/* Now start searching higher than mid */ /* Now start searching higher than mid */
for (i = mid + 1; i < (int)edges->len; i++) for (i = mid + 1; i < (int) edges->len; i++)
{ {
edge = g_array_index (edges, MetaEdge*, i); edge = g_array_index (edges, MetaEdge *, i);
compare = horizontal ? edge->rect.x : edge->rect.y; compare = horizontal ? edge->rect.x : edge->rect.y;
edges_align = horizontal ? edges_align = horizontal ?
meta_rectangle_vert_overlap (&edge->rect, new_rect) : meta_rectangle_vert_overlap (&edge->rect, new_rect) :
meta_rectangle_horiz_overlap (&edge->rect, new_rect); meta_rectangle_horiz_overlap (&edge->rect, new_rect);
if (edges_align && if (edges_align &&
(!only_forward || (!only_forward ||
@ -268,14 +268,14 @@ find_nearest_position (const GArray *edges,
} }
/* Now start searching lower than mid */ /* Now start searching lower than mid */
for (i = mid-1; i >= 0; i--) for (i = mid - 1; i >= 0; i--)
{ {
edge = g_array_index (edges, MetaEdge*, i); edge = g_array_index (edges, MetaEdge *, i);
compare = horizontal ? edge->rect.x : edge->rect.y; compare = horizontal ? edge->rect.x : edge->rect.y;
edges_align = horizontal ? edges_align = horizontal ?
meta_rectangle_vert_overlap (&edge->rect, new_rect) : meta_rectangle_vert_overlap (&edge->rect, new_rect) :
meta_rectangle_horiz_overlap (&edge->rect, new_rect); meta_rectangle_horiz_overlap (&edge->rect, new_rect);
if (edges_align && if (edges_align &&
(!only_forward || (!only_forward ||
@ -324,31 +324,31 @@ edge_resistance_timeout (gpointer data)
} }
static int static int
apply_edge_resistance (MetaWindow *window, apply_edge_resistance (MetaWindow *window,
int old_pos, int old_pos,
int new_pos, int new_pos,
const MetaRectangle *old_rect, const MetaRectangle *old_rect,
const MetaRectangle *new_rect, const MetaRectangle *new_rect,
GArray *edges, GArray *edges,
ResistanceDataForAnEdge *resistance_data, ResistanceDataForAnEdge *resistance_data,
GSourceFunc timeout_func, GSourceFunc timeout_func,
gboolean xdir, gboolean xdir,
gboolean keyboard_op) gboolean keyboard_op)
{ {
int i, begin, end; int i, begin, end;
int last_edge; int last_edge;
gboolean increasing = new_pos > old_pos; gboolean increasing = new_pos > old_pos;
int increment = increasing ? 1 : -1; int increment = increasing ? 1 : -1;
const int PIXEL_DISTANCE_THRESHOLD_TOWARDS_WINDOW = 16; const int PIXEL_DISTANCE_THRESHOLD_TOWARDS_WINDOW = 16;
const int PIXEL_DISTANCE_THRESHOLD_AWAYFROM_WINDOW = 0; const int PIXEL_DISTANCE_THRESHOLD_AWAYFROM_WINDOW = 0;
const int PIXEL_DISTANCE_THRESHOLD_TOWARDS_MONITOR = 32; const int PIXEL_DISTANCE_THRESHOLD_TOWARDS_MONITOR = 32;
const int PIXEL_DISTANCE_THRESHOLD_AWAYFROM_MONITOR = 0; const int PIXEL_DISTANCE_THRESHOLD_AWAYFROM_MONITOR = 0;
const int PIXEL_DISTANCE_THRESHOLD_TOWARDS_SCREEN = 32; const int PIXEL_DISTANCE_THRESHOLD_TOWARDS_SCREEN = 32;
const int PIXEL_DISTANCE_THRESHOLD_AWAYFROM_SCREEN = 0; const int PIXEL_DISTANCE_THRESHOLD_AWAYFROM_SCREEN = 0;
const int TIMEOUT_RESISTANCE_LENGTH_MS_WINDOW = 0; const int TIMEOUT_RESISTANCE_LENGTH_MS_WINDOW = 0;
const int TIMEOUT_RESISTANCE_LENGTH_MS_MONITOR = 0; const int TIMEOUT_RESISTANCE_LENGTH_MS_MONITOR = 0;
const int TIMEOUT_RESISTANCE_LENGTH_MS_SCREEN = 0; const int TIMEOUT_RESISTANCE_LENGTH_MS_SCREEN = 0;
/* Quit if no movement was specified */ /* Quit if no movement was specified */
if (old_pos == new_pos) if (old_pos == new_pos)
@ -357,7 +357,7 @@ apply_edge_resistance (MetaWindow *window,
/* Remove the old timeout if it's no longer relevant */ /* Remove the old timeout if it's no longer relevant */
if (resistance_data->timeout_setup && if (resistance_data->timeout_setup &&
((resistance_data->timeout_edge_pos > old_pos && ((resistance_data->timeout_edge_pos > old_pos &&
resistance_data->timeout_edge_pos > new_pos) || resistance_data->timeout_edge_pos > new_pos) ||
(resistance_data->timeout_edge_pos < old_pos && (resistance_data->timeout_edge_pos < old_pos &&
resistance_data->timeout_edge_pos < new_pos))) resistance_data->timeout_edge_pos < new_pos)))
{ {
@ -370,27 +370,27 @@ apply_edge_resistance (MetaWindow *window,
} }
/* Get the range of indices in the edge array that we move past/to. */ /* Get the range of indices in the edge array that we move past/to. */
begin = find_index_of_edge_near_position (edges, old_pos, increasing, xdir); begin = find_index_of_edge_near_position (edges, old_pos, increasing, xdir);
end = find_index_of_edge_near_position (edges, new_pos, !increasing, xdir); end = find_index_of_edge_near_position (edges, new_pos, !increasing, xdir);
/* begin and end can be outside the array index, if the window is partially /* begin and end can be outside the array index, if the window is partially
* off the screen * off the screen
*/ */
last_edge = edges->len - 1; last_edge = edges->len - 1;
begin = CLAMP (begin, 0, last_edge); begin = CLAMP (begin, 0, last_edge);
end = CLAMP (end, 0, last_edge); end = CLAMP (end, 0, last_edge);
/* Loop over all these edges we're moving past/to. */ /* Loop over all these edges we're moving past/to. */
i = begin; i = begin;
while ((increasing && i <= end) || while ((increasing && i <= end) ||
(!increasing && i >= end)) (!increasing && i >= end))
{ {
gboolean edges_align; gboolean edges_align;
MetaEdge *edge = g_array_index (edges, MetaEdge*, i); MetaEdge *edge = g_array_index (edges, MetaEdge *, i);
int compare = xdir ? edge->rect.x : edge->rect.y; int compare = xdir ? edge->rect.x : edge->rect.y;
/* Find out if this edge is relevant */ /* Find out if this edge is relevant */
edges_align = meta_rectangle_edge_aligns (new_rect, edge) || edges_align = meta_rectangle_edge_aligns (new_rect, edge) ||
meta_rectangle_edge_aligns (old_rect, edge); meta_rectangle_edge_aligns (old_rect, edge);
/* Nothing to do unless the edges align */ /* Nothing to do unless the edges align */
@ -550,8 +550,8 @@ apply_edge_resistance_to_each_side (MetaDisplay *display,
gboolean is_resize) gboolean is_resize)
{ {
MetaEdgeResistanceData *edge_data; MetaEdgeResistanceData *edge_data;
MetaRectangle modified_rect; MetaRectangle modified_rect;
gboolean modified; gboolean modified;
int new_left, new_right, new_top, new_bottom; int new_left, new_right, new_top, new_bottom;
if (display->grab_edge_resistance_data == NULL) if (display->grab_edge_resistance_data == NULL)
@ -566,26 +566,26 @@ apply_edge_resistance_to_each_side (MetaDisplay *display,
* sides of windows to both left and right edges. * sides of windows to both left and right edges.
*/ */
new_left = apply_edge_snapping (BOX_LEFT (*old_outer), new_left = apply_edge_snapping (BOX_LEFT (*old_outer),
BOX_LEFT (*new_outer), BOX_LEFT (*new_outer),
new_outer, new_outer,
edge_data->left_edges, edge_data->left_edges,
TRUE, TRUE,
keyboard_op); keyboard_op);
new_right = apply_edge_snapping (BOX_RIGHT (*old_outer), new_right = apply_edge_snapping (BOX_RIGHT (*old_outer),
BOX_RIGHT (*new_outer), BOX_RIGHT (*new_outer),
new_outer, new_outer,
edge_data->right_edges, edge_data->right_edges,
TRUE, TRUE,
keyboard_op); keyboard_op);
new_top = apply_edge_snapping (BOX_TOP (*old_outer), new_top = apply_edge_snapping (BOX_TOP (*old_outer),
BOX_TOP (*new_outer), BOX_TOP (*new_outer),
new_outer, new_outer,
edge_data->top_edges, edge_data->top_edges,
FALSE, FALSE,
keyboard_op); keyboard_op);
new_bottom = apply_edge_snapping (BOX_BOTTOM (*old_outer), new_bottom = apply_edge_snapping (BOX_BOTTOM (*old_outer),
BOX_BOTTOM (*new_outer), BOX_BOTTOM (*new_outer),
@ -600,13 +600,13 @@ apply_edge_resistance_to_each_side (MetaDisplay *display,
guint i; guint i;
const gfloat tile_edges[] = const gfloat tile_edges[] =
{ {
1./4., 1. / 4.,
1./3., 1. / 3.,
1./2., 1. / 2.,
2./3., 2. / 3.,
3./4., 3. / 4.,
}; };
meta_window_get_work_area_current_monitor (window, &workarea); meta_window_get_work_area_current_monitor (window, &workarea);
@ -624,7 +624,8 @@ apply_edge_resistance_to_each_side (MetaDisplay *display,
*/ */
for (i = 0; i < G_N_ELEMENTS (tile_edges); i++) for (i = 0; i < G_N_ELEMENTS (tile_edges); i++)
{ {
guint horizontal_point = workarea.x + floor (workarea.width * tile_edges[i]); guint horizontal_point = workarea.x + floor (
workarea.width * tile_edges[i]);
if (ABS (horizontal_point - new_left) < 16) if (ABS (horizontal_point - new_left) < 16)
{ {
@ -647,45 +648,45 @@ apply_edge_resistance_to_each_side (MetaDisplay *display,
if (!is_resize || window->size_hints.width_inc == 1) if (!is_resize || window->size_hints.width_inc == 1)
{ {
/* Now, apply the normal horizontal edge resistance */ /* Now, apply the normal horizontal edge resistance */
new_left = apply_edge_resistance (window, new_left = apply_edge_resistance (window,
BOX_LEFT (*old_outer), BOX_LEFT (*old_outer),
BOX_LEFT (*new_outer), BOX_LEFT (*new_outer),
old_outer, old_outer,
new_outer, new_outer,
edge_data->left_edges, edge_data->left_edges,
&edge_data->left_data, &edge_data->left_data,
timeout_func, timeout_func,
TRUE, TRUE,
keyboard_op); keyboard_op);
new_right = apply_edge_resistance (window, new_right = apply_edge_resistance (window,
BOX_RIGHT (*old_outer), BOX_RIGHT (*old_outer),
BOX_RIGHT (*new_outer), BOX_RIGHT (*new_outer),
old_outer, old_outer,
new_outer, new_outer,
edge_data->right_edges, edge_data->right_edges,
&edge_data->right_data, &edge_data->right_data,
timeout_func, timeout_func,
TRUE, TRUE,
keyboard_op); keyboard_op);
} }
else else
{ {
new_left = new_outer->x; new_left = new_outer->x;
new_right = new_outer->x + new_outer->width; new_right = new_outer->x + new_outer->width;
} }
/* Same for vertical resizes... */ /* Same for vertical resizes... */
if (!is_resize || window->size_hints.height_inc == 1) if (!is_resize || window->size_hints.height_inc == 1)
{ {
new_top = apply_edge_resistance (window, new_top = apply_edge_resistance (window,
BOX_TOP (*old_outer), BOX_TOP (*old_outer),
BOX_TOP (*new_outer), BOX_TOP (*new_outer),
old_outer, old_outer,
new_outer, new_outer,
edge_data->top_edges, edge_data->top_edges,
&edge_data->top_data, &edge_data->top_data,
timeout_func, timeout_func,
FALSE, FALSE,
keyboard_op); keyboard_op);
new_bottom = apply_edge_resistance (window, new_bottom = apply_edge_resistance (window,
BOX_BOTTOM (*old_outer), BOX_BOTTOM (*old_outer),
BOX_BOTTOM (*new_outer), BOX_BOTTOM (*new_outer),
@ -699,7 +700,7 @@ apply_edge_resistance_to_each_side (MetaDisplay *display,
} }
else else
{ {
new_top = new_outer->y; new_top = new_outer->y;
new_bottom = new_outer->y + new_outer->height; new_bottom = new_outer->y + new_outer->height;
} }
} }
@ -717,7 +718,7 @@ apply_edge_resistance_to_each_side (MetaDisplay *display,
void void
meta_display_cleanup_edges (MetaDisplay *display) meta_display_cleanup_edges (MetaDisplay *display)
{ {
guint i,j; guint i, j;
MetaEdgeResistanceData *edge_data = display->grab_edge_resistance_data; MetaEdgeResistanceData *edge_data = display->grab_edge_resistance_data;
GHashTable *edges_to_be_freed; GHashTable *edges_to_be_freed;
@ -755,7 +756,7 @@ meta_display_cleanup_edges (MetaDisplay *display)
for (j = 0; j < tmp->len; j++) for (j = 0; j < tmp->len; j++)
{ {
MetaEdge *edge = g_array_index (tmp, MetaEdge*, j); MetaEdge *edge = g_array_index (tmp, MetaEdge *, j);
if (edge->edge_type == META_EDGE_WINDOW && if (edge->edge_type == META_EDGE_WINDOW &&
edge->side_type == side) edge->side_type == side)
{ {
@ -783,14 +784,14 @@ meta_display_cleanup_edges (MetaDisplay *display)
edge_data->bottom_edges = NULL; edge_data->bottom_edges = NULL;
/* Cleanup the timeouts */ /* Cleanup the timeouts */
if (edge_data->left_data.timeout_setup && if (edge_data->left_data.timeout_setup &&
edge_data->left_data.timeout_id != 0) edge_data->left_data.timeout_id != 0)
g_source_remove (edge_data->left_data.timeout_id); g_source_remove (edge_data->left_data.timeout_id);
if (edge_data->right_data.timeout_setup && if (edge_data->right_data.timeout_setup &&
edge_data->right_data.timeout_id != 0) edge_data->right_data.timeout_id != 0)
g_source_remove (edge_data->right_data.timeout_id); g_source_remove (edge_data->right_data.timeout_id);
if (edge_data->top_data.timeout_setup && if (edge_data->top_data.timeout_setup &&
edge_data->top_data.timeout_id != 0) edge_data->top_data.timeout_id != 0)
g_source_remove (edge_data->top_data.timeout_id); g_source_remove (edge_data->top_data.timeout_id);
if (edge_data->bottom_data.timeout_setup && if (edge_data->bottom_data.timeout_setup &&
edge_data->bottom_data.timeout_id != 0) edge_data->bottom_data.timeout_id != 0)
@ -811,9 +812,9 @@ stupid_sort_requiring_extra_pointer_dereference (gconstpointer a,
static void static void
cache_edges (MetaDisplay *display, cache_edges (MetaDisplay *display,
GList *window_edges, GList *window_edges,
GList *monitor_edges, GList *monitor_edges,
GList *screen_edges) GList *screen_edges)
{ {
MetaEdgeResistanceData *edge_data; MetaEdgeResistanceData *edge_data;
GList *tmp; GList *tmp;
@ -824,12 +825,12 @@ cache_edges (MetaDisplay *display,
* 0th: Print debugging information to the log about the edges * 0th: Print debugging information to the log about the edges
*/ */
#ifdef WITH_VERBOSE_MODE #ifdef WITH_VERBOSE_MODE
if (meta_is_verbose()) if (meta_is_verbose ())
{ {
int max_edges = MAX (MAX( g_list_length (window_edges), int max_edges = MAX (MAX (g_list_length (window_edges),
g_list_length (monitor_edges)), g_list_length (monitor_edges)),
g_list_length (screen_edges)); g_list_length (screen_edges));
char big_buffer[(EDGE_LENGTH+2)*max_edges]; char big_buffer[(EDGE_LENGTH + 2) * max_edges];
meta_rectangle_edge_list_to_string (window_edges, ", ", big_buffer); meta_rectangle_edge_list_to_string (window_edges, ", ", big_buffer);
meta_topic (META_DEBUG_EDGE_RESISTANCE, meta_topic (META_DEBUG_EDGE_RESISTANCE,
@ -897,21 +898,21 @@ cache_edges (MetaDisplay *display,
g_assert (display->grab_edge_resistance_data == NULL); g_assert (display->grab_edge_resistance_data == NULL);
display->grab_edge_resistance_data = g_new0 (MetaEdgeResistanceData, 1); display->grab_edge_resistance_data = g_new0 (MetaEdgeResistanceData, 1);
edge_data = display->grab_edge_resistance_data; edge_data = display->grab_edge_resistance_data;
edge_data->left_edges = g_array_sized_new (FALSE, edge_data->left_edges = g_array_sized_new (FALSE,
FALSE, FALSE,
sizeof(MetaEdge*), sizeof (MetaEdge *),
num_left + num_right); num_left + num_right);
edge_data->right_edges = g_array_sized_new (FALSE, edge_data->right_edges = g_array_sized_new (FALSE,
FALSE, FALSE,
sizeof(MetaEdge*), sizeof (MetaEdge *),
num_left + num_right); num_left + num_right);
edge_data->top_edges = g_array_sized_new (FALSE, edge_data->top_edges = g_array_sized_new (FALSE,
FALSE, FALSE,
sizeof(MetaEdge*), sizeof (MetaEdge *),
num_top + num_bottom); num_top + num_bottom);
edge_data->bottom_edges = g_array_sized_new (FALSE, edge_data->bottom_edges = g_array_sized_new (FALSE,
FALSE, FALSE,
sizeof(MetaEdge*), sizeof (MetaEdge *),
num_top + num_bottom); num_top + num_bottom);
/* /*
@ -978,14 +979,14 @@ initialize_grab_edge_resistance_data (MetaDisplay *display)
{ {
MetaEdgeResistanceData *edge_data = display->grab_edge_resistance_data; MetaEdgeResistanceData *edge_data = display->grab_edge_resistance_data;
edge_data->left_data.timeout_setup = FALSE; edge_data->left_data.timeout_setup = FALSE;
edge_data->right_data.timeout_setup = FALSE; edge_data->right_data.timeout_setup = FALSE;
edge_data->top_data.timeout_setup = FALSE; edge_data->top_data.timeout_setup = FALSE;
edge_data->bottom_data.timeout_setup = FALSE; edge_data->bottom_data.timeout_setup = FALSE;
edge_data->left_data.keyboard_buildup = 0; edge_data->left_data.keyboard_buildup = 0;
edge_data->right_data.keyboard_buildup = 0; edge_data->right_data.keyboard_buildup = 0;
edge_data->top_data.keyboard_buildup = 0; edge_data->top_data.keyboard_buildup = 0;
edge_data->bottom_data.keyboard_buildup = 0; edge_data->bottom_data.keyboard_buildup = 0;
} }
@ -1055,8 +1056,8 @@ compute_resistance_and_snapping_edges (MetaDisplay *display)
cur_window_iter = stacked_windows; cur_window_iter = stacked_windows;
while (cur_window_iter != NULL) while (cur_window_iter != NULL)
{ {
MetaRectangle cur_rect; MetaRectangle cur_rect;
MetaWindow *cur_window = cur_window_iter->data; MetaWindow *cur_window = cur_window_iter->data;
meta_window_get_frame_rect (cur_window, &cur_rect); meta_window_get_frame_rect (cur_window, &cur_rect);
/* Check if we want to use this window's edges for edge /* Check if we want to use this window's edges for edge
@ -1132,7 +1133,7 @@ compute_resistance_and_snapping_edges (MetaDisplay *display)
while (rem_win_stacking && while (rem_win_stacking &&
stack_position >= GPOINTER_TO_INT (rem_win_stacking->data)) stack_position >= GPOINTER_TO_INT (rem_win_stacking->data))
{ {
rem_windows = rem_windows->next; rem_windows = rem_windows->next;
rem_win_stacking = rem_win_stacking->next; rem_win_stacking = rem_win_stacking->next;
} }
@ -1160,7 +1161,7 @@ compute_resistance_and_snapping_edges (MetaDisplay *display)
* to free a list instead of four ugly ones? * to free a list instead of four ugly ones?
*/ */
g_slist_foreach (obscuring_windows, g_slist_foreach (obscuring_windows,
(void (*)(gpointer,gpointer))&g_free, /* ew, for ugly */ (void (*)(gpointer, gpointer)) & g_free, /* ew, for ugly */
NULL); NULL);
g_slist_free (obscuring_windows); g_slist_free (obscuring_windows);
@ -1187,12 +1188,12 @@ compute_resistance_and_snapping_edges (MetaDisplay *display)
} }
void void
meta_window_edge_resistance_for_move (MetaWindow *window, meta_window_edge_resistance_for_move (MetaWindow *window,
int *new_x, int *new_x,
int *new_y, int *new_y,
GSourceFunc timeout_func, GSourceFunc timeout_func,
gboolean snap, gboolean snap,
gboolean is_keyboard_op) gboolean is_keyboard_op)
{ {
MetaRectangle old_outer, proposed_outer, new_outer; MetaRectangle old_outer, proposed_outer, new_outer;
gboolean is_resize; gboolean is_resize;
@ -1230,9 +1231,9 @@ meta_window_edge_resistance_for_move (MetaWindow *window,
else else
reference = &old_outer; reference = &old_outer;
left_change = BOX_LEFT (new_outer) - BOX_LEFT (*reference); left_change = BOX_LEFT (new_outer) - BOX_LEFT (*reference);
right_change = BOX_RIGHT (new_outer) - BOX_RIGHT (*reference); right_change = BOX_RIGHT (new_outer) - BOX_RIGHT (*reference);
if ( snap && is_keyboard_op && left_change == 0) if (snap && is_keyboard_op && left_change == 0)
smaller_x_change = right_change; smaller_x_change = right_change;
else if (snap && is_keyboard_op && right_change == 0) else if (snap && is_keyboard_op && right_change == 0)
smaller_x_change = left_change; smaller_x_change = left_change;
@ -1241,9 +1242,9 @@ meta_window_edge_resistance_for_move (MetaWindow *window,
else else
smaller_x_change = right_change; smaller_x_change = right_change;
top_change = BOX_TOP (new_outer) - BOX_TOP (*reference); top_change = BOX_TOP (new_outer) - BOX_TOP (*reference);
bottom_change = BOX_BOTTOM (new_outer) - BOX_BOTTOM (*reference); bottom_change = BOX_BOTTOM (new_outer) - BOX_BOTTOM (*reference);
if ( snap && is_keyboard_op && top_change == 0) if (snap && is_keyboard_op && top_change == 0)
smaller_y_change = bottom_change; smaller_y_change = bottom_change;
else if (snap && is_keyboard_op && bottom_change == 0) else if (snap && is_keyboard_op && bottom_change == 0)
smaller_y_change = top_change; smaller_y_change = top_change;
@ -1253,9 +1254,9 @@ meta_window_edge_resistance_for_move (MetaWindow *window,
smaller_y_change = bottom_change; smaller_y_change = bottom_change;
*new_x = old_outer.x + smaller_x_change + *new_x = old_outer.x + smaller_x_change +
(BOX_LEFT (*reference) - BOX_LEFT (old_outer)); (BOX_LEFT (*reference) - BOX_LEFT (old_outer));
*new_y = old_outer.y + smaller_y_change + *new_y = old_outer.y + smaller_y_change +
(BOX_TOP (*reference) - BOX_TOP (old_outer)); (BOX_TOP (*reference) - BOX_TOP (old_outer));
meta_topic (META_DEBUG_EDGE_RESISTANCE, meta_topic (META_DEBUG_EDGE_RESISTANCE,
"outer x & y move-to coordinate changed from %d,%d to %d,%d\n", "outer x & y move-to coordinate changed from %d,%d to %d,%d\n",
@ -1265,19 +1266,19 @@ meta_window_edge_resistance_for_move (MetaWindow *window,
} }
void void
meta_window_edge_resistance_for_resize (MetaWindow *window, meta_window_edge_resistance_for_resize (MetaWindow *window,
int *new_width, int *new_width,
int *new_height, int *new_height,
int gravity, int gravity,
GSourceFunc timeout_func, GSourceFunc timeout_func,
gboolean snap, gboolean snap,
gboolean is_keyboard_op) gboolean is_keyboard_op)
{ {
MetaRectangle old_outer, new_outer; MetaRectangle old_outer, new_outer;
int proposed_outer_width, proposed_outer_height; int proposed_outer_width, proposed_outer_height;
meta_window_get_frame_rect (window, &old_outer); meta_window_get_frame_rect (window, &old_outer);
proposed_outer_width = *new_width; proposed_outer_width = *new_width;
proposed_outer_height = *new_height; proposed_outer_height = *new_height;
meta_rectangle_resize_with_gravity (&old_outer, meta_rectangle_resize_with_gravity (&old_outer,
&new_outer, &new_outer,

Some files were not shown because too many files have changed in this diff Show More