File: sort_button_callback.C

package info (click to toggle)
peruser 4b33-10
  • links: PTS
  • area: main
  • in suites: woody
  • size: 2,944 kB
  • ctags: 1,064
  • sloc: cpp: 22,397; perl: 2,733; makefile: 345; sh: 335
file content (107 lines) | stat: -rw-r--r-- 2,752 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include "npconfig.h"

void sort_button_callback( GtkWidget *widget, gpointer data )
{
   NP_Config *config = ( NP_Config *)data;

   if ( !config->active_groups )
      return;

   char buffer[ 256 ];

   int which_list = ( int )gtk_object_get_data( GTK_OBJECT( widget ), "list" );

   config->busy_cursor_and_block_signals( 1 );

   if ( which_list )
   {
      if ( !config->group_clist_lines || config->group_clist_lines == 1 )
      {
         config->busy_cursor_and_block_signals( 0 );
         return;
      }
      
      struct array_t
      {
         char *name;
         char *number;
      }
      *array;

      if (( array = ( array_t *)calloc( config->group_clist_lines,
                                        sizeof *array )) == NULL )
      {
         perror( "calloc" );
         exit( 1 );
      }

      struct array_t *pointer = array;
      
      for( int i = 0; i < config->group_clist_lines; ++i )
      {
         char *text;
         gtk_clist_get_text( GTK_CLIST( config->edit_group_clist ),
                             i, 0, &text );
         
         if (( pointer->name = strdup( text )) == NULL )
         {
            perror( "strdup" );
            exit( 1 );
         }

         gtk_clist_get_text( GTK_CLIST( config->edit_group_clist ),
                             i, 1, &text );
         
         if (( pointer->number = strdup( text )) == NULL )
         {
            perror( "strdup" );
            exit( 1 );
         }

         ++pointer;
      }

      qsort( array, config->group_clist_lines, sizeof *array, compare );

      gtk_clist_freeze( GTK_CLIST( config->edit_group_clist ));
      gtk_clist_clear( GTK_CLIST( config->edit_group_clist ));

      pointer = array;
      for( int i = 0; i < config->group_clist_lines; ++i )
      {
         char *text[ 2 ];
         text[ 0 ] = pointer->name;
         text[ 1 ] = pointer->number;
         
         gtk_clist_append( GTK_CLIST( config->edit_group_clist ), text );

         free( pointer->name );
         free( pointer->number );
         ++pointer;
      }

      free( array );

      gtk_clist_thaw( GTK_CLIST( config->edit_group_clist ));
   }
   else
   {
      if ( config->server.sort_list(
         ( char *)config->subscription[ config->current_server ],
         SIGALRM_handler ) )
      {
         snprintf( buffer, sizeof buffer, "sort_button_callback(): %s",
                   config->server.get_error() );
         config->show_message( buffer, 0 );
      }

      GtkWidget *active
         = ( GtkWidget *)gtk_object_get_data( GTK_OBJECT( widget->parent ),
                                              "active" );
      config->load_clist( active );
   }

   config->busy_cursor_and_block_signals( 0 );
   
   return;
}