X-Git-Url: http://gitweb.hugovil.com/?a=blobdiff_plain;f=src%2Fdockapp.c;h=b50a373d81500ddd9eae4093c7cc343910b6d57a;hb=a6c4c0c8d8224cdc455f0d184e91d0cf881f0077;hp=5cdbefad9780ce8f050594ef6a9d83a98611f61d;hpb=36eddd2c06ce9b09c83102353deb213e065e901d;p=dockapps%2Fwmnotify.git diff --git a/src/dockapp.c b/src/dockapp.c index 5cdbefa..b50a373 100644 --- a/src/dockapp.c +++ b/src/dockapp.c @@ -46,101 +46,109 @@ #define ICON_SIZE 64 -static void -CreateIconFromXpmData( char *pixmap_data[] ) +static void CreateIconFromXpmData(char *pixmap_data[]) { - int status; - - dockapp.xpm_icon.attributes.valuemask |= - ( XpmReturnPixels | XpmReturnExtensions ); - - /* Using the XPM library to read XPM data from the array in the included XPM - file. The 'shapemask' Pixmap variable is set to an additional 1-bit deep - pixmap that can then be used as a shape mask for the XShapeCombineMask() - function. */ - status = XpmCreatePixmapFromData( dockapp.display, dockapp.root_win, - pixmap_data, &dockapp.xpm_icon.image, - &dockapp.xpm_icon.shapemask, - &dockapp.xpm_icon.attributes ); - if( status != XpmSuccess ) { - fprintf( stderr, "%s: XpmCreatePixmapFromData() failed\n", PACKAGE ); - ErrorLocation( __FILE__, __LINE__ ); - exit( EXIT_FAILURE ); - } + int status; + + dockapp.xpm_icon.attributes.valuemask |= + (XpmReturnPixels | XpmReturnExtensions); + + /* + * Using the XPM library to read XPM data from the array in the included + * XPM file. The 'shapemask' Pixmap variable is set to an additional + * 1-bit deep pixmap that can then be used as a shape mask for the + * XShapeCombineMask() function. + */ + status = XpmCreatePixmapFromData(dockapp.display, dockapp.root_win, + pixmap_data, + &dockapp.xpm_icon.image, + &dockapp.xpm_icon.shapemask, + &dockapp.xpm_icon.attributes); + if (status != XpmSuccess) { + fprintf(stderr, "%s: XpmCreatePixmapFromData() failed\n", + PACKAGE); + ErrorLocation(__FILE__, __LINE__); + exit(EXIT_FAILURE); + } } -static Pixel -GetColor( char *name ) +static Pixel GetColor(char *name) { - int status; - bool res; - XColor color; - XWindowAttributes attributes; - - status = XGetWindowAttributes( dockapp.display, dockapp.root_win, - &attributes ); - if( status == XLIB_FAILURE ) { - fprintf( stderr, "%s: XGetWindowAttributes() failed\n", PACKAGE ); - ErrorLocation( __FILE__, __LINE__ ); - exit( EXIT_FAILURE ); - } - - color.pixel = 0; - res = (bool) XParseColor( dockapp.display, attributes.colormap, name, - &color ); - if( res == false ) { - fprintf( stderr, "%s: Can't parse %s.\n", PACKAGE, name ); - ErrorLocation( __FILE__, __LINE__ ); - exit( EXIT_FAILURE ); - } - - res = (bool) XAllocColor( dockapp.display, attributes.colormap, &color ); - if( res == false ) { - fprintf( stderr, "%s: Can't allocate %s.\n", PACKAGE, name ); - ErrorLocation( __FILE__, __LINE__ ); - exit( EXIT_FAILURE ); - } - - return color.pixel; + int status; + bool res; + XColor color; + XWindowAttributes attributes; + + status = XGetWindowAttributes(dockapp.display, dockapp.root_win, + &attributes); + if (status == XLIB_FAILURE) { + fprintf(stderr, "%s: XGetWindowAttributes() failed\n", + PACKAGE); + ErrorLocation(__FILE__, __LINE__); + exit(EXIT_FAILURE); + } + + color.pixel = 0; + res = + (bool) XParseColor(dockapp.display, attributes.colormap, name, + &color); + if (res == false) { + fprintf(stderr, "%s: Can't parse %s.\n", PACKAGE, name); + ErrorLocation(__FILE__, __LINE__); + exit(EXIT_FAILURE); + } + + res = + (bool) XAllocColor(dockapp.display, attributes.colormap, + &color); + if (res == false) { + fprintf(stderr, "%s: Can't allocate %s.\n", PACKAGE, name); + ErrorLocation(__FILE__, __LINE__); + exit(EXIT_FAILURE); + } + + return color.pixel; } -static void -flush_expose( Window win ) +static void flush_expose(Window win) { - XEvent dummy; - bool res = true; + XEvent dummy; + bool res = true; - while( res != false ) { - res = (bool) XCheckTypedWindowEvent( dockapp.display, win, Expose, &dummy ); - } + while (res != false) { + res = + (bool) XCheckTypedWindowEvent(dockapp.display, win, + Expose, &dummy); + } } -void -RedrawWindow( void ) +void RedrawWindow(void) { - flush_expose( dockapp.iconwin ); - - (void) XCopyArea( dockapp.display, dockapp.xpm_icon.image, dockapp.iconwin, - dockapp.NormalGC, 0, 0, dockapp.xpm_icon.attributes.width, - dockapp.xpm_icon.attributes.height, 0, 0 ); - - flush_expose( dockapp.win ); - - (void) XCopyArea( dockapp.display, dockapp.xpm_icon.image, dockapp.win, - dockapp.NormalGC, 0, 0, dockapp.xpm_icon.attributes.width, - dockapp.xpm_icon.attributes.height, 0, 0 ); + flush_expose(dockapp.iconwin); + + (void) XCopyArea(dockapp.display, dockapp.xpm_icon.image, + dockapp.iconwin, dockapp.NormalGC, 0, 0, + dockapp.xpm_icon.attributes.width, + dockapp.xpm_icon.attributes.height, 0, 0); + + flush_expose(dockapp.win); + + (void) XCopyArea(dockapp.display, dockapp.xpm_icon.image, + dockapp.win, dockapp.NormalGC, 0, 0, + dockapp.xpm_icon.attributes.width, + dockapp.xpm_icon.attributes.height, 0, 0); } void -copyXPMArea( int x, int y, unsigned int sx, unsigned int sy, int dx, int dy ) +copyXPMArea(int x, int y, unsigned int sx, unsigned int sy, int dx, int dy) { - (void) XCopyArea( dockapp.display, dockapp.xpm_icon.image, - dockapp.xpm_icon.image, dockapp.NormalGC, x, y, sx, sy, - dx, dy ); + (void) XCopyArea(dockapp.display, dockapp.xpm_icon.image, + dockapp.xpm_icon.image, dockapp.NormalGC, x, y, + sx, sy, dx, dy); } @@ -148,153 +156,178 @@ copyXPMArea( int x, int y, unsigned int sx, unsigned int sy, int dx, int dy ) * New window creation and initialization for a Dockable Application ******************************************************************************/ void -InitDockAppWindow( int argc, char *argv[], char *pixmap_data[], - char *display_arg, char *geometry_arg ) +InitDockAppWindow(int argc, char *argv[], char *pixmap_data[], + char *display_arg, char *geometry_arg) { - XGCValues gcv; - XSizeHints size_hints; - XWMHints wm_hints; - int status; - int gravity = 0; /* Used to store the gravity value returned by XWMGeometry, - but not used. */ - - /* Opening a connection to the X server. */ - dockapp.display = XOpenDisplay( display_arg ); - if( dockapp.display == NULL ) { - fprintf( stderr, "%s: Can't open display: %s\n", PACKAGE, - XDisplayName( display_arg ) ); - ErrorLocation( __FILE__, __LINE__ ); - exit( EXIT_FAILURE ); - } - - dockapp.screen = DefaultScreen( dockapp.display ); - dockapp.root_win = RootWindow( dockapp.display, dockapp.screen ); - dockapp.d_depth = DefaultDepth( dockapp.display, dockapp.screen ); - - /* Create a window to hold the stuff */ - size_hints.flags = USSize | USPosition; - size_hints.x = 0; - size_hints.y = 0; - - /* Constructing window's geometry information. */ - /* XWMGeometry() returns an 'int', but Xlib documentation doesn't explain - it's meaning. */ - XWMGeometry( dockapp.display, dockapp.screen, geometry_arg, NULL, BWIDTH, - &size_hints, &size_hints.x, &size_hints.y, &size_hints.width, - &size_hints.height, &gravity ); - - size_hints.width = ICON_SIZE; - size_hints.height = ICON_SIZE; - dockapp.back_pix = GetColor("white"); - dockapp.fore_pix = GetColor("black"); - - dockapp.win = XCreateSimpleWindow( dockapp.display, dockapp.root_win, - size_hints.x, size_hints.y, - (unsigned int) size_hints.width, - (unsigned int) size_hints.height, - BWIDTH, dockapp.fore_pix, - dockapp.back_pix ); - - dockapp.iconwin = XCreateSimpleWindow( dockapp.display, dockapp.win, - size_hints.x, size_hints.y, - (unsigned int) size_hints.width, - (unsigned int) size_hints.height, - BWIDTH, dockapp.fore_pix, - dockapp.back_pix ); - - /* Configuring Client to Window Manager Communications. */ - - /* WM_NORMAL_HINTS property: size hints for a window in it's normal state. */ - /* Replaces the size hints for the WM_NORMAL_HINTS property on the specified - window. */ - XSetWMNormalHints( dockapp.display, dockapp.win, &size_hints ); - - /* Setting the WM_CLASS property. */ - { - char *app_name = argv[0]; - XClassHint wm_class; - - /* The res_name member contains the application name. - The res_class member contains the application class. */ - /* The name set in this property may differ from the name set as WM_NAME. - That is, WM_NAME specifies what should be displayed in the title bar and, - therefore, can contain temporal information (for example, the name of a - file currently in an editor's buffer). On the other hand, the name - specified as part of WM_CLASS is the formal name of the application that - should be used when retrieving the application's resources from the - resource database. */ - wm_class.res_name = app_name; - wm_class.res_class = app_name; - (void) XSetClassHint( dockapp.display, dockapp.win, &wm_class ); - } - - /* Setting the WM_NAME property. - This specifies what should be displayed in the title bar (usually the - application name). */ - { - XTextProperty text_prop; - - char *app_name = argv[0]; - const int string_count = 1; - - status = XStringListToTextProperty( &app_name, string_count, &text_prop ); - if( status == 0 ) { - fprintf( stderr, "%s: XStringListToTextProperty() failed\n", PACKAGE ); - ErrorLocation( __FILE__, __LINE__ ); - exit( EXIT_FAILURE ); - } - - XSetWMName( dockapp.display, dockapp.win, &text_prop ); - - /* Freing the storage for the value field. */ - (void) XFree( text_prop.value ); - } - - /* WM_HINTS --> Additional hints set by the client for use by the Window - Manager. */ - /* XWMHints wm_hints; */ - - /* WithdrawnState, NormalState or IconicState. Must be set to WithdrawnState - for DockApp. */ - wm_hints.flags = StateHint | IconWindowHint | IconPositionHint | - WindowGroupHint; - wm_hints.initial_state = WithdrawnState; /* Withdrawn, Normal */ - wm_hints.icon_window = dockapp.iconwin; - wm_hints.icon_x = size_hints.x; - wm_hints.icon_y = size_hints.y; - wm_hints.window_group = dockapp.win; - (void) XSetWMHints( dockapp.display, dockapp.win, &wm_hints ); - - /* Sets the WM_COMMAND property. This sets the command and arguments used to - invoke the application. */ - (void) XSetCommand( dockapp.display, dockapp.win, argv, argc ); - - /* ... */ - (void) XSelectInput( dockapp.display, dockapp.win, - ButtonPressMask | ExposureMask | ButtonReleaseMask | - PointerMotionMask | StructureNotifyMask ); - - (void) XSelectInput( dockapp.display, dockapp.iconwin, - ButtonPressMask | ExposureMask | ButtonReleaseMask | - PointerMotionMask | StructureNotifyMask ); - - /* Create GC for drawing */ - gcv.foreground = dockapp.fore_pix; - gcv.background = dockapp.back_pix; - gcv.graphics_exposures = 0; - dockapp.NormalGC = XCreateGC( dockapp.display, dockapp.root_win, - GCForeground | GCBackground | - GCGraphicsExposures, &gcv ); - - /* Convert XPM data to XImage */ - CreateIconFromXpmData( pixmap_data ); - - XShapeCombineMask( dockapp.display, dockapp.win, ShapeBounding, 0, 0, - dockapp.xpm_icon.shapemask, ShapeSet ); - - XShapeCombineMask( dockapp.display, dockapp.iconwin, ShapeBounding, 0, 0, - dockapp.xpm_icon.shapemask, ShapeSet ); - - /* Making the new window visible. */ - (void) XMapWindow( dockapp.display, dockapp.win ); + XGCValues gcv; + XSizeHints size_hints; + XWMHints wm_hints; + int status; + int gravity = 0; /* + * Used to store the gravity value returned by + * XWMGeometry, but not used. + */ + + /* Opening a connection to the X server. */ + dockapp.display = XOpenDisplay(display_arg); + if (dockapp.display == NULL) { + fprintf(stderr, "%s: Can't open display: %s\n", PACKAGE, + XDisplayName(display_arg)); + ErrorLocation(__FILE__, __LINE__); + exit(EXIT_FAILURE); + } + + dockapp.screen = DefaultScreen(dockapp.display); + dockapp.root_win = RootWindow(dockapp.display, dockapp.screen); + dockapp.d_depth = DefaultDepth(dockapp.display, dockapp.screen); + + /* Create a window to hold the stuff */ + size_hints.flags = USSize | USPosition; + size_hints.x = 0; + size_hints.y = 0; + + /* + * Constructing window's geometry information. + * XWMGeometry() returns an 'int', but Xlib documentation doesn't + * explain it's meaning. + */ + XWMGeometry(dockapp.display, dockapp.screen, geometry_arg, NULL, + BWIDTH, &size_hints, &size_hints.x, &size_hints.y, + &size_hints.width, &size_hints.height, &gravity); + + size_hints.width = ICON_SIZE; + size_hints.height = ICON_SIZE; + dockapp.back_pix = GetColor("white"); + dockapp.fore_pix = GetColor("black"); + + dockapp.win = + XCreateSimpleWindow(dockapp.display, dockapp.root_win, + size_hints.x, size_hints.y, + (unsigned int) size_hints.width, + (unsigned int) size_hints.height, BWIDTH, + dockapp.fore_pix, dockapp.back_pix); + + dockapp.iconwin = XCreateSimpleWindow(dockapp.display, dockapp.win, + size_hints.x, size_hints.y, + (unsigned int) size_hints. + width, + (unsigned int) size_hints. + height, BWIDTH, + dockapp.fore_pix, + dockapp.back_pix); + + /* Configuring Client to Window Manager Communications. */ + + /* + * WM_NORMAL_HINTS property: size hints for a window in it's normal + * state. + * Replaces the size hints for the WM_NORMAL_HINTS property on the + * specified window. + */ + XSetWMNormalHints(dockapp.display, dockapp.win, &size_hints); + + /* Setting the WM_CLASS property. */ + { + char *app_name = argv[0]; + XClassHint wm_class; + + /* + * The res_name member contains the application name. + * The res_class member contains the application class. + */ + /* + * The name set in this property may differ from the name set as + * WM_NAME. That is, WM_NAME specifies what should be displayed + * in the title bar and, therefore, can contain temporal + * information (for example, the name of a file currently in an + * editor's buffer). On the other hand, the name specified as + * part of WM_CLASS is the formal name of the application that + * should be used when retrieving the application's resources + * from the resource database. + */ + wm_class.res_name = app_name; + wm_class.res_class = app_name; + (void) XSetClassHint(dockapp.display, dockapp.win, + &wm_class); + } + + /* Setting the WM_NAME property. + This specifies what should be displayed in the title bar (usually the + application name). */ + { + XTextProperty text_prop; + + char *app_name = argv[0]; + const int string_count = 1; + + status = + XStringListToTextProperty(&app_name, string_count, + &text_prop); + if (status == 0) { + fprintf(stderr, + "%s: XStringListToTextProperty() failed\n", + PACKAGE); + ErrorLocation(__FILE__, __LINE__); + exit(EXIT_FAILURE); + } + + XSetWMName(dockapp.display, dockapp.win, &text_prop); + + /* Freing the storage for the value field. */ + (void) XFree(text_prop.value); + } + + /* WM_HINTS --> Additional hints set by the client for use by the Window + Manager. */ + /* XWMHints wm_hints; */ + + /* + * WithdrawnState, NormalState or IconicState. Must be set to + * WithdrawnState for DockApp. + */ + wm_hints.flags = StateHint | IconWindowHint | IconPositionHint | + WindowGroupHint; + wm_hints.initial_state = WithdrawnState; /* Withdrawn, Normal */ + wm_hints.icon_window = dockapp.iconwin; + wm_hints.icon_x = size_hints.x; + wm_hints.icon_y = size_hints.y; + wm_hints.window_group = dockapp.win; + (void) XSetWMHints(dockapp.display, dockapp.win, &wm_hints); + + /* + * Sets the WM_COMMAND property. This sets the command and arguments + * used to invoke the application. + */ + (void) XSetCommand(dockapp.display, dockapp.win, argv, argc); + + /* ... */ + (void) XSelectInput(dockapp.display, dockapp.win, + ButtonPressMask | ExposureMask | + ButtonReleaseMask | PointerMotionMask | + StructureNotifyMask); + + (void) XSelectInput(dockapp.display, dockapp.iconwin, + ButtonPressMask | ExposureMask | + ButtonReleaseMask | PointerMotionMask | + StructureNotifyMask); + + /* Create GC for drawing */ + gcv.foreground = dockapp.fore_pix; + gcv.background = dockapp.back_pix; + gcv.graphics_exposures = 0; + dockapp.NormalGC = XCreateGC(dockapp.display, dockapp.root_win, + GCForeground | GCBackground | + GCGraphicsExposures, &gcv); + + /* Convert XPM data to XImage */ + CreateIconFromXpmData(pixmap_data); + + XShapeCombineMask(dockapp.display, dockapp.win, ShapeBounding, 0, + 0, dockapp.xpm_icon.shapemask, ShapeSet); + + XShapeCombineMask(dockapp.display, dockapp.iconwin, ShapeBounding, + 0, 0, dockapp.xpm_icon.shapemask, ShapeSet); + + /* Making the new window visible. */ + (void) XMapWindow(dockapp.display, dockapp.win); }