~xig-team/xig/debian

« back to all changes in this revision

Viewing changes to src/xig-window.c

  • Committer: Robert Ancell
  • Date: 2011-11-29 01:32:22 UTC
  • mfrom: (119.1.16 xig)
  • Revision ID: robert.ancell@canonical.com-20111129013222-ze72jct47juqdod9
MergeĀ upstream

Show diffs side-by-side

added added

removed removed

Lines of Context:
12
12
#include "xig-window-private.h"
13
13
#include "xig-drawable-private.h"
14
14
#include "xig-remote-client-private.h"
 
15
#include "xig-server-private.h"
15
16
 
16
17
G_DEFINE_TYPE (XigWindow, xig_window, xig_drawable_get_type ());
17
18
 
18
19
struct XigWindowPrivate
19
20
{
 
21
    XigServer *server;
20
22
    XigRemoteClient *client;
21
23
 
22
24
    XigWindow *parent;
75
77
static guint signals[LAST_SIGNAL] = { 0 };
76
78
 
77
79
XigWindow *
78
 
_xig_window_new (XigRemoteClient *client, guint32 wid, XigWindow *parent, XigWindowClassType class, gint16 x, gint16 y, guint16 width, guint16 height, guint16 border_width, XigVisual *visual)
 
80
_xig_window_new (XigServer *server, XigRemoteClient *client, guint32 wid, XigWindow *parent, XigWindowClassType class, gint16 x, gint16 y, guint16 width, guint16 height, guint16 border_width, XigVisual *visual)
79
81
{
80
82
    XigWindow *window = g_object_new (xig_window_get_type (), NULL);
81
83
 
84
86
    if (parent)
85
87
        parent->priv->children = g_list_append (parent->priv->children, window);
86
88
 
 
89
    window->priv->server = server;
87
90
    window->priv->client = client;
88
91
    window->priv->parent = parent;
89
92
    window->priv->class = class;
100
103
    return window;
101
104
}
102
105
 
 
106
XigServer *
 
107
xig_window_get_server (XigWindow *window)
 
108
{
 
109
    return window->priv->server;
 
110
}
 
111
 
103
112
XigRemoteClient *
104
113
xig_window_get_client (XigWindow *window)
105
114
{
118
127
    return window->priv->class;
119
128
}
120
129
 
121
 
static void
122
 
destroy_recursive (XigWindow *window)
123
 
{
124
 
    GList *link;
125
 
 
126
 
    /* Destroy all children first */
127
 
    for (link = window->priv->children; link; link = link->next)
128
 
    {
129
 
        XigWindow *w = link->data;
130
 
        destroy_recursive (w);
131
 
    }
132
 
 
133
 
    g_signal_emit (window, signals[DESTROY_NOTIFY], 0);
134
 
    g_signal_emit (window->priv->parent, signals[CHILD_DESTROY_NOTIFY], 0, window);
135
 
 
136
 
    g_object_unref (window);
137
 
}
138
 
 
139
 
void
140
 
xig_window_destroy (XigWindow *window)
141
 
{
142
 
    window->priv->parent->priv->children = g_list_remove (window->priv->parent->priv->children, window);
143
 
    destroy_recursive (window);
144
 
}
145
 
 
146
 
void
147
 
xig_window_destroy_subwindows (XigWindow *window)
148
 
{
149
 
    GList *link;
150
 
    for (link = window->priv->children; link; link = link->next)
151
 
    {
152
 
        XigWindow *w = link->data;
153
 
        destroy_recursive (w);
154
 
    }
155
 
    g_list_free (window->priv->children);
156
 
    window->priv->children = NULL;
 
130
gint16
 
131
xig_window_get_x (XigWindow *window)
 
132
{
 
133
    return window->priv->x;
 
134
}
 
135
 
 
136
gint16
 
137
xig_window_get_y (XigWindow *window)
 
138
{
 
139
    return window->priv->y;
 
140
}
 
141
 
 
142
guint16
 
143
xig_window_get_width (XigWindow *window)
 
144
{
 
145
    return window->priv->width;
 
146
}
 
147
 
 
148
guint16
 
149
xig_window_get_height (XigWindow *window)
 
150
{
 
151
    return window->priv->height;
 
152
}
 
153
 
 
154
guint16
 
155
xig_window_get_border_width (XigWindow *window)
 
156
{
 
157
    return window->priv->border_width;
 
158
}
 
159
 
 
160
XigVisual *
 
161
xig_window_get_visual (XigWindow *window)
 
162
{
 
163
    return window->priv->visual;
 
164
}
 
165
 
 
166
XigPixmap *
 
167
xig_window_get_background_pixmap (XigWindow *window)
 
168
{
 
169
    return window->priv->background_pixmap;
 
170
}
 
171
 
 
172
guint32
 
173
xig_window_get_background_pixel (XigWindow *window)
 
174
{
 
175
    return window->priv->background_pixel;
 
176
}
 
177
 
 
178
XigPixmap *
 
179
xig_window_get_border_pixmap (XigWindow *window)
 
180
{
 
181
    return window->priv->border_pixmap;
 
182
}
 
183
 
 
184
guint32
 
185
xig_window_get_border_pixel (XigWindow *window)
 
186
{
 
187
    return window->priv->border_pixel;
 
188
}
 
189
 
 
190
XigBitGravity
 
191
xig_window_get_bit_gravity (XigWindow *window)
 
192
{
 
193
    return window->priv->bit_gravity;
 
194
}
 
195
 
 
196
XigWinGravity
 
197
xig_window_get_win_gravity (XigWindow *window)
 
198
{
 
199
    return window->priv->win_gravity;
 
200
}
 
201
 
 
202
guint8
 
203
xig_window_get_backing_store (XigWindow *window)
 
204
{
 
205
    return window->priv->backing_store;
 
206
}
 
207
 
 
208
guint32
 
209
xig_window_get_backing_planes (XigWindow *window)
 
210
{
 
211
    return window->priv->backing_planes;
 
212
}
 
213
 
 
214
guint32
 
215
xig_window_get_backing_pixel (XigWindow *window)
 
216
{
 
217
    return window->priv->backing_pixel;
 
218
}
 
219
 
 
220
gboolean
 
221
xig_window_get_override_redirect (XigWindow *window)
 
222
{
 
223
    return window->priv->override_redirect;  
 
224
}
 
225
 
 
226
gboolean
 
227
xig_window_get_save_under (XigWindow *window)
 
228
{
 
229
    return window->priv->save_under;  
 
230
}
 
231
 
 
232
GHashTable *
 
233
xig_window_get_properties (XigWindow *window)
 
234
{
 
235
    return window->priv->properties;
 
236
}
 
237
 
 
238
XigWindowProperty *
 
239
xig_window_get_property (XigWindow *window, const gchar *name)
 
240
{
 
241
    return g_hash_table_lookup (window->priv->properties, name);
 
242
}
 
243
 
 
244
GList *
 
245
xig_window_get_children (XigWindow *window)
 
246
{
 
247
    return window->priv->children;
 
248
}
 
249
 
 
250
gboolean
 
251
xig_window_is_root (XigWindow *window)
 
252
{
 
253
    return window->priv->parent == NULL;
 
254
}
 
255
 
 
256
XigWindow *
 
257
xig_window_get_root (XigWindow *window)
 
258
{
 
259
    while (window->priv->parent)
 
260
        window = window->priv->parent;
 
261
    return window;
 
262
}
 
263
 
 
264
XigWindow *
 
265
xig_window_get_parent (XigWindow *window)
 
266
{
 
267
    return window->priv->parent;
 
268
}
 
269
 
 
270
XigWindow *
 
271
xig_window_get_window_below (XigWindow *window)
 
272
{
 
273
    XigWindow *parent = window->priv->parent;
 
274
    GList *link;
 
275
  
 
276
    link = g_list_find (parent->priv->children, window);
 
277
    if (link && link->prev)
 
278
        return link->prev->data;
 
279
    else
 
280
        return NULL;
 
281
}
 
282
 
 
283
XigWindow *
 
284
xig_window_get_window_above (XigWindow *window)
 
285
{
 
286
    XigWindow *parent = window->priv->parent;
 
287
    GList *link;
 
288
  
 
289
    link = g_list_find (parent->priv->children, window);
 
290
    if (link && link->next)
 
291
        return link->next->data;
 
292
    else
 
293
        return NULL;
 
294
}
 
295
 
 
296
gboolean
 
297
xig_window_has_child (XigWindow *window, XigWindow *child)
 
298
{
 
299
    return g_list_find (window->priv->children, child) != NULL;
 
300
}
 
301
 
 
302
gboolean
 
303
xig_window_get_is_on_bottom (XigWindow *window)
 
304
{
 
305
    GList *link;
 
306
 
 
307
    link = g_list_find (window->priv->parent->priv->children, window);
 
308
    g_return_val_if_fail (link != NULL, FALSE);
 
309
 
 
310
    return link->prev == NULL;
 
311
}
 
312
 
 
313
gboolean
 
314
xig_window_get_is_on_top (XigWindow *window)
 
315
{
 
316
    GList *link;
 
317
 
 
318
    link = g_list_find (window->priv->parent->priv->children, window);
 
319
    g_return_val_if_fail (link != NULL, FALSE);
 
320
 
 
321
    return link->next == NULL;
 
322
}
 
323
 
 
324
gboolean
 
325
xig_window_has_sibling (XigWindow *window, XigWindow *sibling)
 
326
{
 
327
    return xig_window_has_child (window->priv->parent, sibling);
 
328
}
 
329
 
 
330
XigWindow *
 
331
xig_window_add_child (XigWindow *window, XigRemoteClient *client, guint32 wid, XigWindowClassType class, gint16 x, gint16 y, guint16 width, guint16 height, guint16 border_width, XigVisual *visual, XigCreateWindowValueMask value_mask, XigPixmap *background_pixmap, guint32 background_pixel, XigPixmap *border_pixmap, guint32 border_pixel, XigBitGravity bit_gravity, XigWinGravity win_gravity, guint8 backing_store, guint32 backing_planes, guint32 backing_pixel, gboolean override_redirect, gboolean save_under)
 
332
{
 
333
    XigWindow *child;
 
334
 
 
335
    child = _xig_window_new (window->priv->server, client, wid, window, class, x, y, width, height, border_width, visual);
 
336
    xig_window_change_attributes (child, value_mask, background_pixmap, background_pixel, border_pixmap, border_pixel, bit_gravity, win_gravity, backing_store, backing_planes, backing_pixel, override_redirect, save_under);
 
337
    _xig_server_add_window (xig_window_get_server (window), child);
 
338
 
 
339
    return child;
 
340
}
 
341
 
 
342
void
 
343
xig_window_change_attributes (XigWindow *window, XigCreateWindowValueMask value_mask, XigPixmap *background_pixmap, guint32 background_pixel, XigPixmap *border_pixmap, guint32 border_pixel, XigBitGravity bit_gravity, XigWinGravity win_gravity, guint8 backing_store, guint32 backing_planes, guint32 backing_pixel, gboolean override_redirect, gboolean save_under)
 
344
{
 
345
    if (value_mask & XIG_WINDOW_VALUE_MASK_background_pixmap)
 
346
    {
 
347
        if (window->priv->background_pixmap)
 
348
            g_object_unref (window->priv->background_pixmap);
 
349
        window->priv->background_pixmap = NULL;
 
350
        if (background_pixmap)
 
351
            window->priv->background_pixmap = g_object_ref (background_pixmap);
 
352
    }
 
353
    if (value_mask & XIG_WINDOW_VALUE_MASK_background_pixel)
 
354
        window->priv->background_pixel = background_pixel;
 
355
    if (value_mask & XIG_WINDOW_VALUE_MASK_border_pixmap)
 
356
    {
 
357
        if (window->priv->border_pixmap)
 
358
            g_object_unref (window->priv->border_pixmap);
 
359
        window->priv->border_pixmap = NULL;
 
360
        if (border_pixmap)
 
361
            window->priv->border_pixmap = g_object_ref (border_pixmap);
 
362
    }
 
363
    if (value_mask & XIG_WINDOW_VALUE_MASK_border_pixel)
 
364
        window->priv->border_pixel = border_pixel;
 
365
    if (value_mask & XIG_WINDOW_VALUE_MASK_bit_gravity)
 
366
        window->priv->bit_gravity = bit_gravity;
 
367
    if (value_mask & XIG_WINDOW_VALUE_MASK_win_gravity)
 
368
        window->priv->win_gravity = win_gravity;
 
369
    if (value_mask & XIG_WINDOW_VALUE_MASK_backing_store)
 
370
        window->priv->backing_store = backing_store;
 
371
    if (value_mask & XIG_WINDOW_VALUE_MASK_backing_planes)
 
372
        window->priv->backing_planes = backing_planes;
 
373
    if (value_mask & XIG_WINDOW_VALUE_MASK_backing_pixel)
 
374
        window->priv->backing_pixel = backing_pixel;
 
375
    if (value_mask & XIG_WINDOW_VALUE_MASK_override_redirect)
 
376
        window->priv->override_redirect = override_redirect;
 
377
    if (value_mask & XIG_WINDOW_VALUE_MASK_save_under)
 
378
        window->priv->save_under = save_under;
157
379
}
158
380
 
159
381
void
188
410
{
189
411
    XigRemoteClient *redirect_client;
190
412
 
191
 
    redirect_client = xig_server_get_substructure_redirect_client (xig_remote_client_get_server (client), window);
 
413
    redirect_client = xig_server_get_substructure_redirect_client (xig_window_get_server (window), window);
192
414
    if (!xig_window_get_override_redirect (window) && redirect_client != NULL && redirect_client != client)
193
415
    {
194
416
        _xig_remote_client_map_request (redirect_client, window);
226
448
    XigRemoteClient *redirect_client;
227
449
    gboolean changed = FALSE;
228
450
 
229
 
    redirect_client = xig_server_get_substructure_redirect_client (xig_remote_client_get_server (client), window);
 
451
    redirect_client = xig_server_get_substructure_redirect_client (xig_window_get_server (window), window);
230
452
    if (!xig_window_get_override_redirect (window) && redirect_client != NULL && redirect_client != client)
231
453
    {
232
454
        _xig_remote_client_configure_request (redirect_client, window, x, y, width, height, border_width, sibling, stack_mode, value_mask);
297
519
    XigRemoteClient *redirect_client;
298
520
    XigWindow *child;
299
521
 
300
 
    redirect_client = xig_server_get_substructure_redirect_client (xig_remote_client_get_server (client), window);
 
522
    redirect_client = xig_server_get_substructure_redirect_client (xig_window_get_server (window), window);
301
523
    if (!xig_window_get_override_redirect (window) && redirect_client != NULL && redirect_client != client)
302
524
    {
303
525
        _xig_remote_client_circulate_request (redirect_client, window, direction);
332
554
    g_signal_emit (window, signals[CHILD_CIRCULATE_NOTIFY], 0, child);
333
555
}
334
556
 
335
 
gint16
336
 
xig_window_get_x (XigWindow *window)
337
 
{
338
 
    return window->priv->x;
339
 
}
340
 
 
341
 
gint16
342
 
xig_window_get_y (XigWindow *window)
343
 
{
344
 
    return window->priv->y;
345
 
}
346
 
 
347
 
guint16
348
 
xig_window_get_width (XigWindow *window)
349
 
{
350
 
    return window->priv->width;
351
 
}
352
 
 
353
 
guint16
354
 
xig_window_get_height (XigWindow *window)
355
 
{
356
 
    return window->priv->height;
357
 
}
358
 
 
359
 
guint16
360
 
xig_window_get_border_width (XigWindow *window)
361
 
{
362
 
    return window->priv->border_width;
363
 
}
364
 
 
365
 
XigVisual *
366
 
xig_window_get_visual (XigWindow *window)
367
 
{
368
 
    return window->priv->visual;
369
 
}
370
 
 
371
 
XigPixmap *
372
 
xig_window_get_background_pixmap (XigWindow *window)
373
 
{
374
 
    return window->priv->background_pixmap;
375
 
}
376
 
 
377
 
void
378
 
xig_window_set_background_pixmap (XigWindow *window, XigPixmap *pixmap)
379
 
{
380
 
    window->priv->background_pixmap = g_object_ref (pixmap);
381
 
}
382
 
 
383
 
void
384
 
xig_window_set_background_pixel (XigWindow *window, guint32 pixel)
385
 
{
386
 
    window->priv->background_pixel = pixel;
387
 
}
388
 
 
389
 
guint32
390
 
xig_window_get_background_pixel (XigWindow *window)
391
 
{
392
 
    return window->priv->background_pixel;
393
 
}
394
 
 
395
 
XigPixmap *
396
 
xig_window_get_border_pixmap (XigWindow *window)
397
 
{
398
 
    return window->priv->border_pixmap;
399
 
}
400
 
 
401
 
void
402
 
xig_window_set_border_pixmap (XigWindow *window, XigPixmap *pixmap)
403
 
{
404
 
    window->priv->border_pixmap = g_object_ref (pixmap);
405
 
}
406
 
 
407
 
void
408
 
xig_window_set_border_pixel (XigWindow *window, guint32 pixel)
409
 
{
410
 
    window->priv->border_pixel = pixel;
411
 
}
412
 
 
413
 
guint32
414
 
xig_window_get_border_pixel (XigWindow *window)
415
 
{
416
 
    return window->priv->border_pixel;
417
 
}
418
 
 
419
 
XigBitGravity
420
 
xig_window_get_bit_gravity (XigWindow *window)
421
 
{
422
 
    return window->priv->bit_gravity;
423
 
}
424
 
 
425
 
void
426
 
xig_window_set_bit_gravity (XigWindow *window, XigBitGravity gravity)
427
 
{
428
 
    window->priv->bit_gravity = gravity;
429
 
}
430
 
 
431
 
XigWinGravity
432
 
xig_window_get_win_gravity (XigWindow *window)
433
 
{
434
 
    return window->priv->win_gravity;
435
 
}
436
 
 
437
 
void
438
 
xig_window_set_win_gravity (XigWindow *window, XigWinGravity gravity)
439
 
{
440
 
    window->priv->win_gravity = gravity;
441
 
}
442
 
 
443
 
void
444
 
xig_window_set_backing_store (XigWindow *window, guint8 store)
445
 
{
446
 
    window->priv->backing_store = store;
447
 
}
448
 
 
449
 
guint8
450
 
xig_window_get_backing_store (XigWindow *window)
451
 
{
452
 
    return window->priv->backing_store;
453
 
}
454
 
 
455
 
void
456
 
xig_window_set_backing_planes (XigWindow *window, guint32 planes)
457
 
{
458
 
    window->priv->backing_planes = planes;
459
 
}
460
 
 
461
 
guint32
462
 
xig_window_get_backing_planes (XigWindow *window)
463
 
{
464
 
    return window->priv->backing_planes;
465
 
}
466
 
 
467
 
void
468
 
xig_window_set_backing_pixel (XigWindow *window, guint32 pixel)
469
 
{
470
 
    window->priv->backing_pixel = pixel;
471
 
}
472
 
 
473
 
guint32
474
 
xig_window_get_backing_pixel (XigWindow *window)
475
 
{
476
 
    return window->priv->backing_pixel;
477
 
}
478
 
 
479
 
void
480
 
xig_window_set_override_redirect (XigWindow *window, gboolean override_redirect)
481
 
{
482
 
    window->priv->override_redirect = override_redirect;
483
 
}
484
 
 
485
 
gboolean
486
 
xig_window_get_override_redirect (XigWindow *window)
487
 
{
488
 
    return window->priv->override_redirect;  
489
 
}
490
 
 
491
 
void
492
 
xig_window_set_save_under (XigWindow *window, gboolean save_under)
493
 
{
494
 
    window->priv->save_under = save_under;
495
 
}
496
 
 
497
 
gboolean
498
 
xig_window_get_save_under (XigWindow *window)
499
 
{
500
 
    return window->priv->save_under;  
501
 
}
502
 
 
503
 
GHashTable *
504
 
xig_window_get_properties (XigWindow *window)
505
 
{
506
 
    return window->priv->properties;
507
 
}
508
 
 
509
 
XigWindowProperty *
510
 
xig_window_get_property (XigWindow *window, const gchar *name)
511
 
{
512
 
    return g_hash_table_lookup (window->priv->properties, name);
513
 
}
514
 
 
515
557
static void
516
558
property_free (XigWindowProperty *property)
517
559
{
585
627
    g_signal_emit (window, signals[PROPERTY_NOTIFY], 0, name);
586
628
}
587
629
 
588
 
GList *
589
 
xig_window_get_children (XigWindow *window)
590
 
{
591
 
    return window->priv->children;
592
 
}
593
 
 
594
 
gboolean
595
 
xig_window_is_root (XigWindow *window)
596
 
{
597
 
    return window->priv->parent == NULL;
598
 
}
599
 
 
600
 
XigWindow *
601
 
xig_window_get_root (XigWindow *window)
602
 
{
603
 
    while (window->priv->parent)
604
 
        window = window->priv->parent;
605
 
    return window;
606
 
}
607
 
 
608
 
XigWindow *
609
 
xig_window_get_parent (XigWindow *window)
610
 
{
611
 
    return window->priv->parent;
612
 
}
613
 
 
614
 
XigWindow *
615
 
xig_window_get_window_below (XigWindow *window)
616
 
{
617
 
    XigWindow *parent = window->priv->parent;
618
 
    GList *link;
619
 
  
620
 
    link = g_list_find (parent->priv->children, window);
621
 
    if (link && link->prev)
622
 
        return link->prev->data;
623
 
    else
624
 
        return NULL;
625
 
}
626
 
 
627
 
XigWindow *
628
 
xig_window_get_window_above (XigWindow *window)
629
 
{
630
 
    XigWindow *parent = window->priv->parent;
631
 
    GList *link;
632
 
  
633
 
    link = g_list_find (parent->priv->children, window);
634
 
    if (link && link->next)
635
 
        return link->next->data;
636
 
    else
637
 
        return NULL;
638
 
}
639
 
 
640
 
gboolean
641
 
xig_window_has_child (XigWindow *window, XigWindow *child)
642
 
{
643
 
    return g_list_find (window->priv->children, child) != NULL;
644
 
}
645
 
 
646
 
gboolean
647
 
xig_window_get_is_on_bottom (XigWindow *window)
648
 
{
649
 
    GList *link;
650
 
 
651
 
    link = g_list_find (window->priv->parent->priv->children, window);
652
 
    g_return_val_if_fail (link != NULL, FALSE);
653
 
 
654
 
    return link->prev == NULL;
655
 
}
656
 
 
657
 
gboolean
658
 
xig_window_get_is_on_top (XigWindow *window)
659
 
{
660
 
    GList *link;
661
 
 
662
 
    link = g_list_find (window->priv->parent->priv->children, window);
663
 
    g_return_val_if_fail (link != NULL, FALSE);
664
 
 
665
 
    return link->next == NULL;
666
 
}
667
 
 
668
 
gboolean
669
 
xig_window_has_sibling (XigWindow *window, XigWindow *sibling)
670
 
{
671
 
    return xig_window_has_child (window->priv->parent, sibling);
 
630
static void
 
631
destroy_recursive (XigWindow *window)
 
632
{
 
633
    GList *link;
 
634
 
 
635
    /* Destroy all children first */
 
636
    for (link = window->priv->children; link; link = link->next)
 
637
    {
 
638
        XigWindow *w = link->data;
 
639
        destroy_recursive (w);
 
640
    }
 
641
 
 
642
    g_signal_emit (window, signals[DESTROY_NOTIFY], 0);
 
643
    g_signal_emit (window->priv->parent, signals[CHILD_DESTROY_NOTIFY], 0, window);
 
644
 
 
645
    g_object_unref (window);
 
646
}
 
647
 
 
648
void
 
649
xig_window_destroy (XigWindow *window)
 
650
{
 
651
    window->priv->parent->priv->children = g_list_remove (window->priv->parent->priv->children, window);
 
652
    destroy_recursive (window);
 
653
}
 
654
 
 
655
void
 
656
xig_window_destroy_subwindows (XigWindow *window)
 
657
{
 
658
    GList *link;
 
659
    for (link = window->priv->children; link; link = link->next)
 
660
    {
 
661
        XigWindow *w = link->data;
 
662
        destroy_recursive (w);
 
663
    }
 
664
    g_list_free (window->priv->children);
 
665
    window->priv->children = NULL;
672
666
}
673
667
 
674
668
static void