/[rdesktop]/sourceforge.net/trunk/rdesktop/ewmhints.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /sourceforge.net/trunk/rdesktop/ewmhints.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1225 by astrand, Sun Apr 9 20:22:11 2006 UTC revision 1413 by ossman_, Mon Jun 18 12:00:34 2007 UTC
# Line 4  Line 4 
4     Support functions for Extended Window Manager Hints,     Support functions for Extended Window Manager Hints,
5     http://www.freedesktop.org/wiki/Standards_2fwm_2dspec     http://www.freedesktop.org/wiki/Standards_2fwm_2dspec
6    
7     Copyright (C) Peter Astrand <astrand@cendio.se> 2005     Copyright 2005 Peter Astrand <astrand@cendio.se> for Cendio AB
8       Copyright 2007 Pierre Ossman <ossman@cendio.se> for Cendio AB
9        
10     This program is free software; you can redistribute it and/or modify     This program is free software; you can redistribute it and/or modify
11     it under the terms of the GNU General Public License as published by     it under the terms of the GNU General Public License as published by
# Line 34  extern Display *g_display; Line 35  extern Display *g_display;
35    
36  static Atom g_net_wm_state_maximized_vert_atom, g_net_wm_state_maximized_horz_atom,  static Atom g_net_wm_state_maximized_vert_atom, g_net_wm_state_maximized_horz_atom,
37          g_net_wm_state_hidden_atom, g_net_wm_name_atom, g_utf8_string_atom,          g_net_wm_state_hidden_atom, g_net_wm_name_atom, g_utf8_string_atom,
38          g_net_wm_state_skip_taskbar_atom, g_net_wm_state_skip_pager_atom, g_net_wm_state_modal_atom;          g_net_wm_state_skip_taskbar_atom, g_net_wm_state_skip_pager_atom,
39            g_net_wm_state_modal_atom, g_net_wm_icon_atom;
40    
41  Atom g_net_wm_state_atom, g_net_wm_desktop_atom;  Atom g_net_wm_state_atom, g_net_wm_desktop_atom;
42    
# Line 187  ewmh_init() Line 189  ewmh_init()
189          g_net_wm_state_atom = XInternAtom(g_display, "_NET_WM_STATE", False);          g_net_wm_state_atom = XInternAtom(g_display, "_NET_WM_STATE", False);
190          g_net_wm_desktop_atom = XInternAtom(g_display, "_NET_WM_DESKTOP", False);          g_net_wm_desktop_atom = XInternAtom(g_display, "_NET_WM_DESKTOP", False);
191          g_net_wm_name_atom = XInternAtom(g_display, "_NET_WM_NAME", False);          g_net_wm_name_atom = XInternAtom(g_display, "_NET_WM_NAME", False);
192            g_net_wm_icon_atom = XInternAtom(g_display, "_NET_WM_ICON", False);
193          g_utf8_string_atom = XInternAtom(g_display, "UTF8_STRING", False);          g_utf8_string_atom = XInternAtom(g_display, "UTF8_STRING", False);
194  }  }
195    
# Line 202  ewmh_get_window_state(Window w) Line 205  ewmh_get_window_state(Window w)
205          unsigned char *prop_return;          unsigned char *prop_return;
206          uint32 *return_words;          uint32 *return_words;
207          unsigned long item;          unsigned long item;
208          BOOL maximized_vert, maximized_horz, hidden;          RD_BOOL maximized_vert, maximized_horz, hidden;
209    
210          maximized_vert = maximized_horz = hidden = False;          maximized_vert = maximized_horz = hidden = False;
211    
# Line 423  ewmh_set_window_modal(Window wnd) Line 426  ewmh_set_window_modal(Window wnd)
426          return 0;          return 0;
427  }  }
428    
429    void
430    ewmh_set_icon(Window wnd, int width, int height, const char *rgba_data)
431    {
432            unsigned long nitems, i;
433            unsigned char *props;
434            uint32 *cur_set, *new_set;
435            uint32 *icon;
436    
437            cur_set = NULL;
438            new_set = NULL;
439    
440            if (get_property_value(wnd, "_NET_WM_ICON", 10000, &nitems, &props, 1) >= 0)
441            {
442                    cur_set = (uint32 *) props;
443    
444                    for (i = 0; i < nitems;)
445                    {
446                            if (cur_set[i] == width && cur_set[i + 1] == height)
447                                    break;
448    
449                            i += 2 + cur_set[i] * cur_set[i + 1];
450                    }
451    
452                    if (i != nitems)
453                            icon = cur_set + i;
454                    else
455                    {
456                            new_set = xmalloc((nitems + width * height + 2) * 4);
457                            memcpy(new_set, cur_set, nitems * 4);
458                            icon = new_set + nitems;
459                            nitems += width * height + 2;
460                    }
461            }
462            else
463            {
464                    new_set = xmalloc((width * height + 2) * 4);
465                    icon = new_set;
466                    nitems = width * height + 2;
467            }
468    
469            icon[0] = width;
470            icon[1] = height;
471    
472            /* Convert RGBA -> ARGB */
473            for (i = 0; i < width * height; i++)
474            {
475                    icon[i + 2] =
476                            rgba_data[i * 4 + 3] << 24 |
477                            ((rgba_data[i * 4 + 0] << 16) & 0x00FF0000) |
478                            ((rgba_data[i * 4 + 1] << 8) & 0x0000FF00) |
479                            ((rgba_data[i * 4 + 2] << 0) & 0x000000FF);
480            }
481    
482            XChangeProperty(g_display, wnd, g_net_wm_icon_atom, XA_CARDINAL, 32,
483                            PropModeReplace, (unsigned char *) (new_set ? new_set : cur_set), nitems);
484    
485            if (cur_set)
486                    XFree(cur_set);
487            if (new_set)
488                    xfree(new_set);
489    }
490    
491    void
492    ewmh_del_icon(Window wnd, int width, int height)
493    {
494            unsigned long nitems, i, icon_size;
495            unsigned char *props;
496            uint32 *cur_set, *new_set;
497    
498            cur_set = NULL;
499            new_set = NULL;
500    
501            if (get_property_value(wnd, "_NET_WM_ICON", 10000, &nitems, &props, 1) < 0)
502                    return;
503    
504            cur_set = (uint32 *) props;
505    
506            for (i = 0; i < nitems;)
507            {
508                    if (cur_set[i] == width && cur_set[i + 1] == height)
509                            break;
510    
511                    i += 2 + cur_set[i] * cur_set[i + 1];
512            }
513    
514            if (i == nitems)
515                    goto out;
516    
517            icon_size = width * height + 2;
518            new_set = xmalloc((nitems - icon_size) * 4);
519    
520            if (i != 0)
521                    memcpy(new_set, cur_set, i * 4);
522            if (i != nitems - icon_size)
523                    memcpy(new_set + i * 4, cur_set + i * 4 + icon_size, nitems - icon_size);
524    
525            nitems -= icon_size;
526    
527            XChangeProperty(g_display, wnd, g_net_wm_icon_atom, XA_CARDINAL, 32,
528                            PropModeReplace, (unsigned char *) new_set, nitems);
529    
530            xfree(new_set);
531    
532          out:
533            XFree(cur_set);
534    }
535    
536  #endif /* MAKE_PROTO */  #endif /* MAKE_PROTO */
537    
538    

Legend:
Removed from v.1225  
changed lines
  Added in v.1413

  ViewVC Help
Powered by ViewVC 1.1.26